Merge "hwui/debug: Remove glMultiDrawElementsBaseVertexOES stubs." into pi-dev
diff --git a/Android.bp b/Android.bp
index ce93568..9c76e14 100644
--- a/Android.bp
+++ b/Android.bp
@@ -145,7 +145,7 @@
         ":libcamera_client_framework_aidl",
         "core/java/android/hardware/IConsumerIrService.aidl",
         "core/java/android/hardware/ISerialManager.aidl",
-        "core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl",
+        "core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl",
         "core/java/android/hardware/display/IDisplayManager.aidl",
         "core/java/android/hardware/display/IDisplayManagerCallback.aidl",
         "core/java/android/hardware/display/IVirtualDisplayCallback.aidl",
diff --git a/apct-tests/perftests/core/AndroidTest.xml b/apct-tests/perftests/core/AndroidTest.xml
index 6aa34a6..1b28913 100644
--- a/apct-tests/perftests/core/AndroidTest.xml
+++ b/apct-tests/perftests/core/AndroidTest.xml
@@ -23,5 +23,6 @@
 
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.perftests.core" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/apct-tests/perftests/multiuser/AndroidTest.xml b/apct-tests/perftests/multiuser/AndroidTest.xml
index 6ede827..512dbc9 100644
--- a/apct-tests/perftests/multiuser/AndroidTest.xml
+++ b/apct-tests/perftests/multiuser/AndroidTest.xml
@@ -23,5 +23,6 @@
 
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.perftests.multiuser" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/api/current.txt b/api/current.txt
index 992c60c..423e0ae 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -5393,7 +5393,7 @@
     method public android.app.Notification.Builder addAction(android.app.Notification.Action);
     method public android.app.Notification.Builder addExtras(android.os.Bundle);
     method public deprecated android.app.Notification.Builder addPerson(java.lang.String);
-    method public android.app.Notification.Builder addPerson(android.app.Notification.Person);
+    method public android.app.Notification.Builder addPerson(android.app.Person);
     method public android.app.Notification build();
     method public android.widget.RemoteViews createBigContentView();
     method public android.widget.RemoteViews createContentView();
@@ -5518,15 +5518,15 @@
 
   public static class Notification.MessagingStyle extends android.app.Notification.Style {
     ctor public deprecated Notification.MessagingStyle(java.lang.CharSequence);
-    ctor public Notification.MessagingStyle(android.app.Notification.Person);
+    ctor public Notification.MessagingStyle(android.app.Person);
     method public android.app.Notification.MessagingStyle addHistoricMessage(android.app.Notification.MessagingStyle.Message);
     method public deprecated android.app.Notification.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
-    method public android.app.Notification.MessagingStyle addMessage(java.lang.CharSequence, long, android.app.Notification.Person);
+    method public android.app.Notification.MessagingStyle addMessage(java.lang.CharSequence, long, android.app.Person);
     method public android.app.Notification.MessagingStyle addMessage(android.app.Notification.MessagingStyle.Message);
     method public java.lang.CharSequence getConversationTitle();
     method public java.util.List<android.app.Notification.MessagingStyle.Message> getHistoricMessages();
     method public java.util.List<android.app.Notification.MessagingStyle.Message> getMessages();
-    method public android.app.Notification.Person getUser();
+    method public android.app.Person getUser();
     method public deprecated java.lang.CharSequence getUserDisplayName();
     method public boolean isGroupConversation();
     method public android.app.Notification.MessagingStyle setConversationTitle(java.lang.CharSequence);
@@ -5536,37 +5536,17 @@
 
   public static final class Notification.MessagingStyle.Message {
     ctor public deprecated Notification.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
-    ctor public Notification.MessagingStyle.Message(java.lang.CharSequence, long, android.app.Notification.Person);
+    ctor public Notification.MessagingStyle.Message(java.lang.CharSequence, long, android.app.Person);
     method public java.lang.String getDataMimeType();
     method public android.net.Uri getDataUri();
     method public android.os.Bundle getExtras();
     method public deprecated java.lang.CharSequence getSender();
-    method public android.app.Notification.Person getSenderPerson();
+    method public android.app.Person getSenderPerson();
     method public java.lang.CharSequence getText();
     method public long getTimestamp();
     method public android.app.Notification.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
   }
 
-  public static final class Notification.Person implements android.os.Parcelable {
-    ctor protected Notification.Person(android.os.Parcel);
-    ctor public Notification.Person();
-    method public int describeContents();
-    method public android.graphics.drawable.Icon getIcon();
-    method public java.lang.String getKey();
-    method public java.lang.CharSequence getName();
-    method public java.lang.String getUri();
-    method public boolean isBot();
-    method public boolean isImportant();
-    method public android.app.Notification.Person setBot(boolean);
-    method public android.app.Notification.Person setIcon(android.graphics.drawable.Icon);
-    method public android.app.Notification.Person setImportant(boolean);
-    method public android.app.Notification.Person setKey(java.lang.String);
-    method public android.app.Notification.Person setName(java.lang.CharSequence);
-    method public android.app.Notification.Person setUri(java.lang.String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.app.Notification.Person> CREATOR;
-  }
-
   public static abstract class Notification.Style {
     ctor public Notification.Style();
     method public android.app.Notification build();
@@ -5817,6 +5797,30 @@
     method public abstract void onSendFinished(android.app.PendingIntent, android.content.Intent, int, java.lang.String, android.os.Bundle);
   }
 
+  public final class Person implements android.os.Parcelable {
+    method public int describeContents();
+    method public android.graphics.drawable.Icon getIcon();
+    method public java.lang.String getKey();
+    method public java.lang.CharSequence getName();
+    method public java.lang.String getUri();
+    method public boolean isBot();
+    method public boolean isImportant();
+    method public android.app.Person.Builder toBuilder();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.app.Person> CREATOR;
+  }
+
+  public static class Person.Builder {
+    ctor public Person.Builder();
+    method public android.app.Person build();
+    method public android.app.Person.Builder setBot(boolean);
+    method public android.app.Person.Builder setIcon(android.graphics.drawable.Icon);
+    method public android.app.Person.Builder setImportant(boolean);
+    method public android.app.Person.Builder setKey(java.lang.String);
+    method public android.app.Person.Builder setName(java.lang.CharSequence);
+    method public android.app.Person.Builder setUri(java.lang.String);
+  }
+
   public final class PictureInPictureParams implements android.os.Parcelable {
     method public int describeContents();
     method public void writeToParcel(android.os.Parcel, int);
@@ -6511,6 +6515,7 @@
     method public boolean isApplicationHidden(android.content.ComponentName, java.lang.String);
     method public boolean isBackupServiceEnabled(android.content.ComponentName);
     method public deprecated boolean isCallerApplicationRestrictionsManagingPackage();
+    method public boolean isDeviceIdAttestationSupported();
     method public boolean isDeviceOwnerApp(java.lang.String);
     method public boolean isEphemeralUser(android.content.ComponentName);
     method public boolean isLockTaskPermitted(java.lang.String);
@@ -6748,6 +6753,12 @@
     field public static final android.os.Parcelable.Creator<android.app.admin.DnsEvent> CREATOR;
   }
 
+  public class FreezePeriod {
+    ctor public FreezePeriod(java.time.MonthDay, java.time.MonthDay);
+    method public java.time.MonthDay getEnd();
+    method public java.time.MonthDay getStart();
+  }
+
   public abstract class NetworkEvent implements android.os.Parcelable {
     method public int describeContents();
     method public long getId();
@@ -6818,16 +6829,16 @@
     field public static final int SECURITY_PATCH_STATE_UNKNOWN = 0; // 0x0
   }
 
-  public class SystemUpdatePolicy implements android.os.Parcelable {
+  public final class SystemUpdatePolicy implements android.os.Parcelable {
     method public static android.app.admin.SystemUpdatePolicy createAutomaticInstallPolicy();
     method public static android.app.admin.SystemUpdatePolicy createPostponeInstallPolicy();
     method public static android.app.admin.SystemUpdatePolicy createWindowedInstallPolicy(int, int);
     method public int describeContents();
-    method public java.util.List<android.util.Pair<java.lang.Integer, java.lang.Integer>> getFreezePeriods();
+    method public java.util.List<android.app.admin.FreezePeriod> getFreezePeriods();
     method public int getInstallWindowEnd();
     method public int getInstallWindowStart();
     method public int getPolicyType();
-    method public android.app.admin.SystemUpdatePolicy setFreezePeriods(java.util.List<android.util.Pair<java.lang.Integer, java.lang.Integer>>);
+    method public android.app.admin.SystemUpdatePolicy setFreezePeriods(java.util.List<android.app.admin.FreezePeriod>);
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.admin.SystemUpdatePolicy> CREATOR;
     field public static final int TYPE_INSTALL_AUTOMATIC = 1; // 0x1
@@ -6840,11 +6851,12 @@
     method public int getErrorCode();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.admin.SystemUpdatePolicy.ValidationFailedException> CREATOR;
-    field public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE = 5; // 0x5
-    field public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG = 4; // 0x4
-    field public static final int ERROR_DUPLICATE_OR_OVERLAP = 1; // 0x1
-    field public static final int ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE = 3; // 0x3
-    field public static final int ERROR_NEW_FREEZE_PERIOD_TOO_LONG = 2; // 0x2
+    field public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE = 6; // 0x6
+    field public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG = 5; // 0x5
+    field public static final int ERROR_DUPLICATE_OR_OVERLAP = 2; // 0x2
+    field public static final int ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE = 4; // 0x4
+    field public static final int ERROR_NEW_FREEZE_PERIOD_TOO_LONG = 3; // 0x3
+    field public static final int ERROR_UNKNOWN = 1; // 0x1
   }
 
 }
@@ -7360,8 +7372,8 @@
     method public int getCount();
     method public int getEventType();
     method public long getFirstTimeStamp();
+    method public long getLastEventTime();
     method public long getLastTimeStamp();
-    method public long getLastTimeUsed();
     method public long getTotalTime();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.usage.EventStats> CREATOR;
@@ -7418,8 +7430,9 @@
 
   public class NetworkStatsManager {
     method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException;
+    method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws java.lang.SecurityException;
     method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws java.lang.SecurityException;
+    method public android.app.usage.NetworkStats queryDetailsForUidTagState(int, java.lang.String, long, long, int, int, int) throws java.lang.SecurityException;
     method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
@@ -7469,6 +7482,8 @@
     method public int getStandbyBucket();
     method public long getTimeStamp();
     field public static final int CONFIGURATION_CHANGE = 5; // 0x5
+    field public static final int KEYGUARD_HIDDEN = 18; // 0x12
+    field public static final int KEYGUARD_SHOWN = 17; // 0x11
     field public static final int MOVE_TO_BACKGROUND = 2; // 0x2
     field public static final int MOVE_TO_FOREGROUND = 1; // 0x1
     field public static final int NONE = 0; // 0x0
@@ -13349,9 +13364,13 @@
     method public void rotate(float);
     method public final void rotate(float, float, float);
     method public int save();
+    method public deprecated int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
     method public int saveLayer(android.graphics.RectF, android.graphics.Paint);
+    method public deprecated int saveLayer(float, float, float, float, android.graphics.Paint, int);
     method public int saveLayer(float, float, float, float, android.graphics.Paint);
+    method public deprecated int saveLayerAlpha(android.graphics.RectF, int, int);
     method public int saveLayerAlpha(android.graphics.RectF, int);
+    method public deprecated int saveLayerAlpha(float, float, float, float, int, int);
     method public int saveLayerAlpha(float, float, float, float, int);
     method public void scale(float, float);
     method public final void scale(float, float, float, float);
@@ -13361,6 +13380,7 @@
     method public void setMatrix(android.graphics.Matrix);
     method public void skew(float, float);
     method public void translate(float, float);
+    field public static final int ALL_SAVE_FLAG = 31; // 0x1f
   }
 
   public static final class Canvas.EdgeType extends java.lang.Enum {
@@ -13649,17 +13669,17 @@
     method public static android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
     method public static android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source) throws java.io.IOException;
     method public int getAllocator();
-    method public boolean getConserveMemory();
     method public android.graphics.Rect getCrop();
+    method public int getMemorySizePolicy();
     method public android.graphics.ImageDecoder.OnPartialImageListener getOnPartialImageListener();
     method public android.graphics.PostProcessor getPostProcessor();
     method public boolean isDecodeAsAlphaMaskEnabled();
     method public boolean isMutableRequired();
     method public boolean isUnpremultipliedRequired();
     method public void setAllocator(int);
-    method public void setConserveMemory(boolean);
     method public void setCrop(android.graphics.Rect);
     method public void setDecodeAsAlphaMaskEnabled(boolean);
+    method public void setMemorySizePolicy(int);
     method public void setMutableRequired(boolean);
     method public void setOnPartialImageListener(android.graphics.ImageDecoder.OnPartialImageListener);
     method public void setPostProcessor(android.graphics.PostProcessor);
@@ -13671,6 +13691,8 @@
     field public static final int ALLOCATOR_HARDWARE = 3; // 0x3
     field public static final int ALLOCATOR_SHARED_MEMORY = 2; // 0x2
     field public static final int ALLOCATOR_SOFTWARE = 1; // 0x1
+    field public static final int MEMORY_POLICY_DEFAULT = 1; // 0x1
+    field public static final int MEMORY_POLICY_LOW_RAM = 0; // 0x0
   }
 
   public static final class ImageDecoder.DecodeException extends java.io.IOException {
@@ -15747,9 +15769,9 @@
 
 package android.hardware.biometrics {
 
-  public class BiometricDialog {
-    method public void authenticate(android.hardware.biometrics.BiometricDialog.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricDialog.AuthenticationCallback);
-    method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricDialog.AuthenticationCallback);
+  public class BiometricPrompt {
+    method public void authenticate(android.hardware.biometrics.BiometricPrompt.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
+    method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback);
     field public static final int BIOMETRIC_ACQUIRED_GOOD = 0; // 0x0
     field public static final int BIOMETRIC_ACQUIRED_IMAGER_DIRTY = 3; // 0x3
     field public static final int BIOMETRIC_ACQUIRED_INSUFFICIENT = 2; // 0x2
@@ -15769,31 +15791,31 @@
     field public static final int BIOMETRIC_ERROR_VENDOR = 8; // 0x8
   }
 
-  public static abstract class BiometricDialog.AuthenticationCallback {
-    ctor public BiometricDialog.AuthenticationCallback();
+  public static abstract class BiometricPrompt.AuthenticationCallback {
+    ctor public BiometricPrompt.AuthenticationCallback();
     method public void onAuthenticationError(int, java.lang.CharSequence);
     method public void onAuthenticationFailed();
     method public void onAuthenticationHelp(int, java.lang.CharSequence);
-    method public void onAuthenticationSucceeded(android.hardware.biometrics.BiometricDialog.AuthenticationResult);
+    method public void onAuthenticationSucceeded(android.hardware.biometrics.BiometricPrompt.AuthenticationResult);
   }
 
-  public static class BiometricDialog.AuthenticationResult {
-    method public android.hardware.biometrics.BiometricDialog.CryptoObject getCryptoObject();
+  public static class BiometricPrompt.AuthenticationResult {
+    method public android.hardware.biometrics.BiometricPrompt.CryptoObject getCryptoObject();
   }
 
-  public static class BiometricDialog.Builder {
-    ctor public BiometricDialog.Builder(android.content.Context);
-    method public android.hardware.biometrics.BiometricDialog build();
-    method public android.hardware.biometrics.BiometricDialog.Builder setDescription(java.lang.CharSequence);
-    method public android.hardware.biometrics.BiometricDialog.Builder setNegativeButton(java.lang.CharSequence, java.util.concurrent.Executor, android.content.DialogInterface.OnClickListener);
-    method public android.hardware.biometrics.BiometricDialog.Builder setSubtitle(java.lang.CharSequence);
-    method public android.hardware.biometrics.BiometricDialog.Builder setTitle(java.lang.CharSequence);
+  public static class BiometricPrompt.Builder {
+    ctor public BiometricPrompt.Builder(android.content.Context);
+    method public android.hardware.biometrics.BiometricPrompt build();
+    method public android.hardware.biometrics.BiometricPrompt.Builder setDescription(java.lang.CharSequence);
+    method public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(java.lang.CharSequence, java.util.concurrent.Executor, android.content.DialogInterface.OnClickListener);
+    method public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(java.lang.CharSequence);
+    method public android.hardware.biometrics.BiometricPrompt.Builder setTitle(java.lang.CharSequence);
   }
 
-  public static final class BiometricDialog.CryptoObject {
-    ctor public BiometricDialog.CryptoObject(java.security.Signature);
-    ctor public BiometricDialog.CryptoObject(javax.crypto.Cipher);
-    ctor public BiometricDialog.CryptoObject(javax.crypto.Mac);
+  public static final class BiometricPrompt.CryptoObject {
+    ctor public BiometricPrompt.CryptoObject(java.security.Signature);
+    ctor public BiometricPrompt.CryptoObject(javax.crypto.Cipher);
+    ctor public BiometricPrompt.CryptoObject(javax.crypto.Mac);
     method public javax.crypto.Cipher getCipher();
     method public javax.crypto.Mac getMac();
     method public java.security.Signature getSignature();
@@ -23157,6 +23179,7 @@
     field public static final int AACObjectMain = 1; // 0x1
     field public static final int AACObjectSSR = 3; // 0x3
     field public static final int AACObjectScalable = 6; // 0x6
+    field public static final int AACObjectXHE = 42; // 0x2a
     field public static final int AVCLevel1 = 1; // 0x1
     field public static final int AVCLevel11 = 4; // 0x4
     field public static final int AVCLevel12 = 8; // 0x8
@@ -27604,6 +27627,7 @@
   public class X509TrustManagerExtensions {
     ctor public X509TrustManagerExtensions(javax.net.ssl.X509TrustManager) throws java.lang.IllegalArgumentException;
     method public java.util.List<java.security.cert.X509Certificate> checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, java.lang.String) throws java.security.cert.CertificateException;
+    method public boolean isSameTrustConfiguration(java.lang.String, java.lang.String);
     method public boolean isUserAddedCertificate(java.security.cert.X509Certificate);
   }
 
@@ -33148,6 +33172,7 @@
     method public android.os.StrictMode.VmPolicy.Builder detectLeakedClosableObjects();
     method public android.os.StrictMode.VmPolicy.Builder detectLeakedRegistrationObjects();
     method public android.os.StrictMode.VmPolicy.Builder detectLeakedSqlLiteObjects();
+    method public android.os.StrictMode.VmPolicy.Builder detectNonSdkApiUsage();
     method public android.os.StrictMode.VmPolicy.Builder detectUntaggedSockets();
     method public android.os.StrictMode.VmPolicy.Builder penaltyDeath();
     method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnCleartextNetwork();
@@ -33155,6 +33180,7 @@
     method public android.os.StrictMode.VmPolicy.Builder penaltyDropBox();
     method public android.os.StrictMode.VmPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnVmViolationListener);
     method public android.os.StrictMode.VmPolicy.Builder penaltyLog();
+    method public android.os.StrictMode.VmPolicy.Builder permitNonSdkApiUsage();
     method public android.os.StrictMode.VmPolicy.Builder setClassInstanceLimit(java.lang.Class, int);
   }
 
@@ -33569,6 +33595,9 @@
   public final class NetworkViolation extends android.os.strictmode.Violation {
   }
 
+  public final class NonSdkApiUsedViolation extends android.os.strictmode.Violation {
+  }
+
   public final class ResourceMismatchViolation extends android.os.strictmode.Violation {
   }
 
@@ -36667,6 +36696,7 @@
     field public static final java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
     field public static final java.lang.String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
     field public static final java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
+    field public static final java.lang.String RTT_CALLING_MODE = "rtt_calling_mode";
     field public static final java.lang.String SELECTED_INPUT_METHOD_SUBTYPE = "selected_input_method_subtype";
     field public static final java.lang.String SETTINGS_CLASSNAME = "settings_classname";
     field public static final java.lang.String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
@@ -36772,7 +36802,6 @@
     field public static final deprecated java.lang.String RADIO_NFC = "nfc";
     field public static final deprecated java.lang.String RADIO_WIFI = "wifi";
     field public static final java.lang.String RINGTONE = "ringtone";
-    field public static final java.lang.String RTT_CALLING_MODE = "rtt_calling_mode";
     field public static final java.lang.String SCREEN_BRIGHTNESS = "screen_brightness";
     field public static final java.lang.String SCREEN_BRIGHTNESS_MODE = "screen_brightness_mode";
     field public static final int SCREEN_BRIGHTNESS_MODE_AUTOMATIC = 1; // 0x1
@@ -38386,17 +38415,17 @@
 
 package android.se.omapi {
 
-  public class Channel {
+  public final class Channel implements java.nio.channels.Channel {
     method public void close();
     method public byte[] getSelectResponse();
     method public android.se.omapi.Session getSession();
     method public boolean isBasicChannel();
-    method public boolean isClosed();
+    method public boolean isOpen();
     method public boolean selectNext() throws java.io.IOException;
     method public byte[] transmit(byte[]) throws java.io.IOException;
   }
 
-  public class Reader {
+  public final class Reader {
     method public void closeSessions();
     method public java.lang.String getName();
     method public android.se.omapi.SEService getSEService();
@@ -38404,26 +38433,28 @@
     method public android.se.omapi.Session openSession() throws java.io.IOException;
   }
 
-  public class SEService {
-    ctor public SEService(android.content.Context, android.se.omapi.SEService.SecureElementListener);
+  public final class SEService {
+    ctor public SEService(android.content.Context, java.util.concurrent.Executor, android.se.omapi.SEService.OnConnectedListener);
     method public android.se.omapi.Reader[] getReaders();
     method public java.lang.String getVersion();
     method public boolean isConnected();
     method public void shutdown();
   }
 
-  public static abstract interface SEService.SecureElementListener {
-    method public abstract void onServiceConnected();
+  public static abstract interface SEService.OnConnectedListener {
+    method public abstract void onConnected();
   }
 
-  public class Session {
+  public final class Session {
     method public void close();
     method public void closeChannels();
     method public byte[] getATR();
     method public android.se.omapi.Reader getReader();
     method public boolean isClosed();
     method public android.se.omapi.Channel openBasicChannel(byte[], byte) throws java.io.IOException;
+    method public android.se.omapi.Channel openBasicChannel(byte[]) throws java.io.IOException;
     method public android.se.omapi.Channel openLogicalChannel(byte[], byte) throws java.io.IOException;
+    method public android.se.omapi.Channel openLogicalChannel(byte[]) throws java.io.IOException;
   }
 
 }
@@ -38442,23 +38473,10 @@
 
   public abstract class ConfirmationCallback {
     ctor public ConfirmationCallback();
-    method public void onConfirmedByUser(byte[]);
-    method public void onDismissedByApplication();
-    method public void onDismissedByUser();
-    method public void onError(java.lang.Exception);
-  }
-
-  public class ConfirmationDialog {
-    method public void cancelPrompt();
-    method public static boolean isSupported();
-    method public void presentPrompt(java.util.concurrent.Executor, android.security.ConfirmationCallback) throws android.security.ConfirmationAlreadyPresentingException, android.security.ConfirmationNotAvailableException;
-  }
-
-  public static class ConfirmationDialog.Builder {
-    ctor public ConfirmationDialog.Builder();
-    method public android.security.ConfirmationDialog build(android.content.Context);
-    method public android.security.ConfirmationDialog.Builder setExtraData(byte[]);
-    method public android.security.ConfirmationDialog.Builder setPromptText(java.lang.CharSequence);
+    method public void onCanceled();
+    method public void onConfirmed(byte[]);
+    method public void onDismissed();
+    method public void onError(java.lang.Throwable);
   }
 
   public class ConfirmationNotAvailableException extends java.lang.Exception {
@@ -38466,6 +38484,19 @@
     ctor public ConfirmationNotAvailableException(java.lang.String);
   }
 
+  public class ConfirmationPrompt {
+    method public void cancelPrompt();
+    method public static boolean isSupported(android.content.Context);
+    method public void presentPrompt(java.util.concurrent.Executor, android.security.ConfirmationCallback) throws android.security.ConfirmationAlreadyPresentingException, android.security.ConfirmationNotAvailableException;
+  }
+
+  public static final class ConfirmationPrompt.Builder {
+    ctor public ConfirmationPrompt.Builder(android.content.Context);
+    method public android.security.ConfirmationPrompt build();
+    method public android.security.ConfirmationPrompt.Builder setExtraData(byte[]);
+    method public android.security.ConfirmationPrompt.Builder setPromptText(java.lang.CharSequence);
+  }
+
   public final class KeyChain {
     ctor public KeyChain();
     method public static void choosePrivateKeyAlias(android.app.Activity, android.security.KeyChainAliasCallback, java.lang.String[], java.security.Principal[], java.lang.String, int, java.lang.String);
@@ -38572,11 +38603,11 @@
     method public boolean isInvalidatedByBiometricEnrollment();
     method public boolean isRandomizedEncryptionRequired();
     method public boolean isStrongBoxBacked();
-    method public boolean isTrustedUserPresenceRequired();
     method public boolean isUnlockedDeviceRequired();
     method public boolean isUserAuthenticationRequired();
     method public boolean isUserAuthenticationValidWhileOnBody();
     method public boolean isUserConfirmationRequired();
+    method public boolean isUserPresenceRequired();
   }
 
   public static final class KeyGenParameterSpec.Builder {
@@ -38600,12 +38631,12 @@
     method public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date);
     method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
     method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
-    method public android.security.keystore.KeyGenParameterSpec.Builder setTrustedUserPresenceRequired(boolean);
     method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
     method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
     method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
     method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int);
     method public android.security.keystore.KeyGenParameterSpec.Builder setUserConfirmationRequired(boolean);
+    method public android.security.keystore.KeyGenParameterSpec.Builder setUserPresenceRequired(boolean);
   }
 
   public class KeyInfo implements java.security.spec.KeySpec {
@@ -38693,11 +38724,11 @@
     method public boolean isDigestsSpecified();
     method public boolean isInvalidatedByBiometricEnrollment();
     method public boolean isRandomizedEncryptionRequired();
-    method public boolean isTrustedUserPresenceRequired();
     method public boolean isUnlockedDeviceRequired();
     method public boolean isUserAuthenticationRequired();
     method public boolean isUserAuthenticationValidWhileOnBody();
     method public boolean isUserConfirmationRequired();
+    method public boolean isUserPresenceRequired();
   }
 
   public static final class KeyProtection.Builder {
@@ -38713,15 +38744,26 @@
     method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
     method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
     method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
-    method public android.security.keystore.KeyProtection.Builder setTrustedUserPresenceRequired(boolean);
     method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
     method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
     method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
     method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int);
     method public android.security.keystore.KeyProtection.Builder setUserConfirmationRequired(boolean);
+    method public android.security.keystore.KeyProtection.Builder setUserPresenceRequired(boolean);
+  }
+
+  public class SecureKeyImportUnavailableException extends java.security.ProviderException {
+    ctor public SecureKeyImportUnavailableException();
+    ctor public SecureKeyImportUnavailableException(java.lang.String);
+    ctor public SecureKeyImportUnavailableException(java.lang.String, java.lang.Throwable);
+    ctor public SecureKeyImportUnavailableException(java.lang.Throwable);
   }
 
   public class StrongBoxUnavailableException extends java.security.ProviderException {
+    ctor public StrongBoxUnavailableException();
+    ctor public StrongBoxUnavailableException(java.lang.String);
+    ctor public StrongBoxUnavailableException(java.lang.String, java.lang.Throwable);
+    ctor public StrongBoxUnavailableException(java.lang.Throwable);
   }
 
   public class UserNotAuthenticatedException extends java.security.InvalidKeyException {
@@ -38730,7 +38772,7 @@
     ctor public UserNotAuthenticatedException(java.lang.String, java.lang.Throwable);
   }
 
-  public class UserPresenceUnavailableException extends java.security.InvalidAlgorithmParameterException {
+  public class UserPresenceUnavailableException extends java.security.InvalidKeyException {
     ctor public UserPresenceUnavailableException();
     ctor public UserPresenceUnavailableException(java.lang.String);
     ctor public UserPresenceUnavailableException(java.lang.String, java.lang.Throwable);
@@ -40935,7 +40977,7 @@
     method public final void putExtras(android.os.Bundle);
     method public final void removeExtras(java.util.List<java.lang.String>);
     method public final void removeExtras(java.lang.String...);
-    method public void requestBluetoothAudio(java.lang.String);
+    method public void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
     method public void sendConnectionEvent(java.lang.String, android.os.Bundle);
     method public final void sendRemoteRttRequest();
     method public final void sendRttInitiationFailure(int);
@@ -41146,7 +41188,7 @@
     method public void onCanAddCallChanged(boolean);
     method public void onConnectionEvent(android.telecom.Call, java.lang.String, android.os.Bundle);
     method public void onSilenceRinger();
-    method public final void requestBluetoothAudio(java.lang.String);
+    method public final void requestBluetoothAudio(android.bluetooth.BluetoothDevice);
     method public final void setAudioRoute(int);
     method public final void setMuted(boolean);
     field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.InCallService";
@@ -42364,7 +42406,7 @@
   }
 
   public final class SubscriptionPlan implements android.os.Parcelable {
-    method public java.util.Iterator<android.util.Pair<java.time.ZonedDateTime, java.time.ZonedDateTime>> cycleIterator();
+    method public java.util.Iterator<android.util.Range<java.time.ZonedDateTime>> cycleIterator();
     method public int describeContents();
     method public int getDataLimitBehavior();
     method public long getDataLimitBytes();
@@ -42386,9 +42428,7 @@
   public static class SubscriptionPlan.Builder {
     method public android.telephony.SubscriptionPlan build();
     method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+    method public static android.telephony.SubscriptionPlan.Builder createRecurring(java.time.ZonedDateTime, java.time.Period);
     method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
     method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
     method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
@@ -43356,6 +43396,7 @@
   public class PrecomputedText implements android.text.Spannable {
     method public char charAt(int);
     method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params);
+    method public void getBounds(int, int, android.graphics.Rect);
     method public int getParagraphCount();
     method public int getParagraphEnd(int);
     method public int getParagraphStart(int);
@@ -43364,7 +43405,7 @@
     method public int getSpanFlags(java.lang.Object);
     method public int getSpanStart(java.lang.Object);
     method public <T> T[] getSpans(int, int, java.lang.Class<T>);
-    method public java.lang.CharSequence getText();
+    method public float getWidth(int, int);
     method public int length();
     method public int nextSpanTransition(int, int, java.lang.Class);
     method public void removeSpan(java.lang.Object);
@@ -44654,14 +44695,9 @@
     method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
     method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
     method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
-    method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.widget.TextView, android.view.textclassifier.TextLinks.Options);
-    method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.widget.TextView, android.view.textclassifier.TextLinks.Options, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>);
-    method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, android.view.textclassifier.TextLinks.Options);
-    method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, int);
-    method public static java.util.concurrent.Future<java.lang.Void> addLinksAsync(android.text.Spannable, android.view.textclassifier.TextClassifier, android.view.textclassifier.TextLinks.Options, java.util.concurrent.Executor, java.util.function.Consumer<java.lang.Integer>);
     field public static final int ALL = 15; // 0xf
     field public static final int EMAIL_ADDRESSES = 2; // 0x2
-    field public static final int MAP_ADDRESSES = 8; // 0x8
+    field public static final deprecated int MAP_ADDRESSES = 8; // 0x8
     field public static final int PHONE_NUMBERS = 4; // 0x4
     field public static final int WEB_URLS = 1; // 0x1
     field public static final android.text.util.Linkify.MatchFilter sPhoneNumberMatchFilter;
@@ -47852,7 +47888,7 @@
     method public void setVerticalScrollBarEnabled(boolean);
     method public void setVerticalScrollbarPosition(int);
     method public void setVisibility(int);
-    method public void setWillNotCacheDrawing(boolean);
+    method public deprecated void setWillNotCacheDrawing(boolean);
     method public void setWillNotDraw(boolean);
     method public void setX(float);
     method public void setY(float);
@@ -47870,7 +47906,7 @@
     method public void unscheduleDrawable(android.graphics.drawable.Drawable);
     method public final void updateDragShadow(android.view.View.DragShadowBuilder);
     method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
-    method public boolean willNotCacheDrawing();
+    method public deprecated boolean willNotCacheDrawing();
     method public boolean willNotDraw();
     field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
     field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
@@ -50371,8 +50407,8 @@
     method public int getEventType();
     method public int getInvocationMethod();
     method public java.lang.String getPackageName();
+    method public java.lang.String getResultId();
     method public android.view.textclassifier.TextClassificationSessionId getSessionId();
-    method public java.lang.String getSignature();
     method public int getSmartEnd();
     method public int getSmartStart();
     method public int getStart();
@@ -50409,10 +50445,10 @@
     method public java.lang.String getEntity(int);
     method public int getEntityCount();
     method public deprecated android.graphics.drawable.Drawable getIcon();
+    method public java.lang.String getId();
     method public deprecated android.content.Intent getIntent();
     method public deprecated java.lang.CharSequence getLabel();
     method public deprecated android.view.View.OnClickListener getOnClickListener();
-    method public java.lang.String getSignature();
     method public java.lang.String getText();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification> CREATOR;
@@ -50424,28 +50460,38 @@
     method public android.view.textclassifier.TextClassification build();
     method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
     method public deprecated android.view.textclassifier.TextClassification.Builder setIcon(android.graphics.drawable.Drawable);
+    method public android.view.textclassifier.TextClassification.Builder setId(java.lang.String);
     method public deprecated android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
     method public deprecated android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
     method public deprecated android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
-    method public android.view.textclassifier.TextClassification.Builder setSignature(java.lang.String);
     method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
   }
 
-  public static final class TextClassification.Options implements android.os.Parcelable {
-    ctor public TextClassification.Options();
+  public static final class TextClassification.Request implements android.os.Parcelable {
     method public int describeContents();
     method public android.os.LocaleList getDefaultLocales();
+    method public int getEndIndex();
     method public java.time.ZonedDateTime getReferenceTime();
-    method public android.view.textclassifier.TextClassification.Options setDefaultLocales(android.os.LocaleList);
-    method public android.view.textclassifier.TextClassification.Options setReferenceTime(java.time.ZonedDateTime);
+    method public int getStartIndex();
+    method public java.lang.CharSequence getText();
     method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Options> CREATOR;
+    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Request> CREATOR;
   }
 
-  public final class TextClassificationContext {
+  public static final class TextClassification.Request.Builder {
+    ctor public TextClassification.Request.Builder(java.lang.CharSequence, int, int);
+    method public android.view.textclassifier.TextClassification.Request build();
+    method public android.view.textclassifier.TextClassification.Request.Builder setDefaultLocales(android.os.LocaleList);
+    method public android.view.textclassifier.TextClassification.Request.Builder setReferenceTime(java.time.ZonedDateTime);
+  }
+
+  public final class TextClassificationContext implements android.os.Parcelable {
+    method public int describeContents();
     method public java.lang.String getPackageName();
     method public java.lang.String getWidgetType();
     method public java.lang.String getWidgetVersion();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassificationContext> CREATOR;
   }
 
   public static final class TextClassificationContext.Builder {
@@ -50472,17 +50518,14 @@
   }
 
   public abstract interface TextClassifier {
-    method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.view.textclassifier.TextClassification.Options);
-    method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int);
+    method public default android.view.textclassifier.TextClassification classifyText(android.view.textclassifier.TextClassification.Request);
     method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
     method public default void destroy();
-    method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options);
-    method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence);
+    method public default android.view.textclassifier.TextLinks generateLinks(android.view.textclassifier.TextLinks.Request);
     method public default int getMaxGenerateLinksTextLength();
     method public default boolean isDestroyed();
     method public default void onSelectionEvent(android.view.textclassifier.SelectionEvent);
-    method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options);
-    method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int);
+    method public default android.view.textclassifier.TextSelection suggestSelection(android.view.textclassifier.TextSelection.Request);
     method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
     field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
     field public static final java.lang.String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
@@ -50508,17 +50551,18 @@
   }
 
   public static final class TextClassifier.EntityConfig implements android.os.Parcelable {
-    method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>);
     method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>);
-    method public static android.view.textclassifier.TextClassifier.EntityConfig createWithEntityList(java.util.Collection<java.lang.String>);
+    method public static android.view.textclassifier.TextClassifier.EntityConfig createWithExplicitEntityList(java.util.Collection<java.lang.String>);
+    method public static android.view.textclassifier.TextClassifier.EntityConfig createWithHints(java.util.Collection<java.lang.String>);
     method public int describeContents();
     method public java.util.Collection<java.lang.String> getHints();
-    method public java.util.List<java.lang.String> resolveEntityListModifications(java.util.Collection<java.lang.String>);
+    method public java.util.Collection<java.lang.String> resolveEntityListModifications(java.util.Collection<java.lang.String>);
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifier.EntityConfig> CREATOR;
   }
 
   public final class TextLinks implements android.os.Parcelable {
+    method public int apply(android.text.Spannable, int, java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan>);
     method public int describeContents();
     method public java.util.Collection<android.view.textclassifier.TextLinks.TextLink> getLinks();
     method public void writeToParcel(android.os.Parcel, int);
@@ -50538,20 +50582,20 @@
     method public android.view.textclassifier.TextLinks.Builder clearTextLinks();
   }
 
-  public static final class TextLinks.Options implements android.os.Parcelable {
-    ctor public TextLinks.Options();
+  public static final class TextLinks.Request implements android.os.Parcelable {
     method public int describeContents();
-    method public static android.view.textclassifier.TextLinks.Options fromLinkMask(int);
-    method public int getApplyStrategy();
     method public android.os.LocaleList getDefaultLocales();
     method public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
-    method public java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan> getSpanFactory();
-    method public android.view.textclassifier.TextLinks.Options setApplyStrategy(int);
-    method public android.view.textclassifier.TextLinks.Options setDefaultLocales(android.os.LocaleList);
-    method public android.view.textclassifier.TextLinks.Options setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
-    method public android.view.textclassifier.TextLinks.Options setSpanFactory(java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.view.textclassifier.TextLinks.TextLinkSpan>);
+    method public java.lang.CharSequence getText();
     method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Options> CREATOR;
+    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Request> CREATOR;
+  }
+
+  public static final class TextLinks.Request.Builder {
+    ctor public TextLinks.Request.Builder(java.lang.CharSequence);
+    method public android.view.textclassifier.TextLinks.Request build();
+    method public android.view.textclassifier.TextLinks.Request.Builder setDefaultLocales(android.os.LocaleList);
+    method public android.view.textclassifier.TextLinks.Request.Builder setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
   }
 
   public static final class TextLinks.TextLink implements android.os.Parcelable {
@@ -50576,9 +50620,9 @@
     method public float getConfidenceScore(java.lang.String);
     method public java.lang.String getEntity(int);
     method public int getEntityCount();
+    method public java.lang.String getId();
     method public int getSelectionEndIndex();
     method public int getSelectionStartIndex();
-    method public java.lang.String getSignature();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection> CREATOR;
   }
@@ -50587,16 +50631,23 @@
     ctor public TextSelection.Builder(int, int);
     method public android.view.textclassifier.TextSelection build();
     method public android.view.textclassifier.TextSelection.Builder setEntityType(java.lang.String, float);
-    method public android.view.textclassifier.TextSelection.Builder setSignature(java.lang.String);
+    method public android.view.textclassifier.TextSelection.Builder setId(java.lang.String);
   }
 
-  public static final class TextSelection.Options implements android.os.Parcelable {
-    ctor public TextSelection.Options();
+  public static final class TextSelection.Request implements android.os.Parcelable {
     method public int describeContents();
     method public android.os.LocaleList getDefaultLocales();
-    method public android.view.textclassifier.TextSelection.Options setDefaultLocales(android.os.LocaleList);
+    method public int getEndIndex();
+    method public int getStartIndex();
+    method public java.lang.CharSequence getText();
     method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Options> CREATOR;
+    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Request> CREATOR;
+  }
+
+  public static final class TextSelection.Request.Builder {
+    ctor public TextSelection.Request.Builder(java.lang.CharSequence, int, int);
+    method public android.view.textclassifier.TextSelection.Request build();
+    method public android.view.textclassifier.TextSelection.Request.Builder setDefaultLocales(android.os.LocaleList);
   }
 
 }
@@ -51265,7 +51316,7 @@
     method public void documentHasImages(android.os.Message);
     method public static void enableSlowWholeDocumentDraw();
     method public void evaluateJavascript(java.lang.String, android.webkit.ValueCallback<java.lang.String>);
-    method public static java.lang.String findAddress(java.lang.String);
+    method public static deprecated java.lang.String findAddress(java.lang.String);
     method public deprecated int findAll(java.lang.String);
     method public void findAllAsync(java.lang.String);
     method public void findNext(boolean);
@@ -51277,7 +51328,6 @@
     method public android.graphics.Bitmap getFavicon();
     method public android.webkit.WebView.HitTestResult getHitTestResult();
     method public deprecated java.lang.String[] getHttpAuthUsernamePassword(java.lang.String, java.lang.String);
-    method public android.os.Looper getLooper();
     method public java.lang.String getOriginalUrl();
     method public int getProgress();
     method public boolean getRendererPriorityWaivedWhenNotVisible();
diff --git a/api/removed.txt b/api/removed.txt
index 2d76c5a..8d72483 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -169,11 +169,6 @@
     method public deprecated boolean clipRegion(android.graphics.Region, android.graphics.Region.Op);
     method public deprecated boolean clipRegion(android.graphics.Region);
     method public deprecated int save(int);
-    method public deprecated int saveLayer(android.graphics.RectF, android.graphics.Paint, int);
-    method public deprecated int saveLayer(float, float, float, float, android.graphics.Paint, int);
-    method public deprecated int saveLayerAlpha(android.graphics.RectF, int, int);
-    method public deprecated int saveLayerAlpha(float, float, float, float, int, int);
-    field public static final int ALL_SAVE_FLAG = 31; // 0x1f
     field public static final deprecated int CLIP_SAVE_FLAG = 2; // 0x2
     field public static final deprecated int CLIP_TO_LAYER_SAVE_FLAG = 16; // 0x10
     field public static final deprecated int FULL_COLOR_LAYER_SAVE_FLAG = 8; // 0x8
@@ -183,10 +178,12 @@
 
   public final class ImageDecoder implements java.lang.AutoCloseable {
     method public deprecated boolean getAsAlphaMask();
+    method public deprecated boolean getConserveMemory();
     method public deprecated boolean getDecodeAsAlphaMask();
     method public deprecated boolean getMutable();
     method public deprecated boolean getRequireUnpremultiplied();
     method public deprecated android.graphics.ImageDecoder setAsAlphaMask(boolean);
+    method public deprecated void setConserveMemory(boolean);
     method public deprecated android.graphics.ImageDecoder setDecodeAsAlphaMask(boolean);
     method public deprecated android.graphics.ImageDecoder setMutable(boolean);
     method public deprecated android.graphics.ImageDecoder setRequireUnpremultiplied(boolean);
@@ -294,6 +291,14 @@
   public static abstract class NetworkBadging.Badging implements java.lang.annotation.Annotation {
   }
 
+  public class NetworkRequest implements android.os.Parcelable {
+    method public boolean hasUnwantedCapability(int);
+  }
+
+  public static class NetworkRequest.Builder {
+    method public android.net.NetworkRequest.Builder addUnwantedCapability(int);
+  }
+
   public class SSLCertificateSocketFactory extends javax.net.ssl.SSLSocketFactory {
     method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
   }
diff --git a/api/system-current.txt b/api/system-current.txt
index fbd9e43..a559b7a 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -163,6 +163,7 @@
     field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";
     field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS";
     field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
+    field public static final java.lang.String SEND_SHOW_SUSPENDED_APP_DETAILS = "android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS";
     field public static final java.lang.String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION";
     field public static final java.lang.String SERIAL_PORT = "android.permission.SERIAL_PORT";
     field public static final java.lang.String SET_ACTIVITY_WATCHER = "android.permission.SET_ACTIVITY_WATCHER";
@@ -316,6 +317,7 @@
 
   public class BroadcastOptions {
     method public static android.app.BroadcastOptions makeBasic();
+    method public void setDontSendToRestrictedApps(boolean);
     method public void setTemporaryAppWhitelistDuration(long);
     method public android.os.Bundle toBundle();
   }
@@ -451,7 +453,7 @@
     field public static final int STATE_USER_UNMANAGED = 0; // 0x0
   }
 
-  public class SystemUpdatePolicy implements android.os.Parcelable {
+  public final class SystemUpdatePolicy implements android.os.Parcelable {
     method public int describeContents();
     method public android.app.admin.SystemUpdatePolicy.InstallationOption getInstallationOptionAt(long);
     method public void writeToParcel(android.os.Parcel, int);
@@ -878,6 +880,7 @@
     field public static final java.lang.String ACTION_QUERY_PACKAGE_RESTART = "android.intent.action.QUERY_PACKAGE_RESTART";
     field public static final java.lang.String ACTION_RESOLVE_INSTANT_APP_PACKAGE = "android.intent.action.RESOLVE_INSTANT_APP_PACKAGE";
     field public static final java.lang.String ACTION_REVIEW_PERMISSIONS = "android.intent.action.REVIEW_PERMISSIONS";
+    field public static final java.lang.String ACTION_SHOW_SUSPENDED_APP_DETAILS = "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
     field public static final deprecated java.lang.String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
     field public static final java.lang.String ACTION_SPLIT_CONFIGURATION_CHANGED = "android.intent.action.SPLIT_CONFIGURATION_CHANGED";
     field public static final java.lang.String ACTION_UPGRADE_SETUP = "android.intent.action.UPGRADE_SETUP";
@@ -1024,7 +1027,6 @@
     method public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(java.lang.String);
     method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int);
     method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle);
-    method public android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String);
     method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle);
     method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException;
     method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
@@ -1036,7 +1038,6 @@
     method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int);
     method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence);
     method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String);
-    method public void setSuspendedPackageAppExtras(java.lang.String, android.os.PersistableBundle);
     method public abstract void setUpdateAvailable(java.lang.String, boolean);
     method public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int);
     method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle);
@@ -1252,6 +1253,7 @@
     method public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration();
     method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
     method public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration();
+    method public android.util.Pair<float[], float[]> getMinimumBrightnessCurve();
     method public android.graphics.Point getStableDisplaySize();
     method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
     method public void setSaturationLevel(float);
@@ -3081,10 +3083,10 @@
   }
 
   public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
-    method public void addAddress(android.net.LinkAddress) throws java.io.IOException;
+    method public void addAddress(java.net.InetAddress, int) throws java.io.IOException;
     method public void close();
     method public java.lang.String getInterfaceName();
-    method public void removeAddress(android.net.LinkAddress) throws java.io.IOException;
+    method public void removeAddress(java.net.InetAddress, int) throws java.io.IOException;
   }
 
   public final class IpSecTransform implements java.lang.AutoCloseable {
@@ -4771,10 +4773,12 @@
     ctor public TextClassifierService();
     method public final android.view.textclassifier.TextClassifier getLocalTextClassifier();
     method public final android.os.IBinder onBind(android.content.Intent);
-    method public abstract void onClassifyText(java.lang.CharSequence, int, int, android.view.textclassifier.TextClassification.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
-    method public abstract void onGenerateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
-    method public void onSelectionEvent(android.view.textclassifier.SelectionEvent);
-    method public abstract void onSuggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
+    method public abstract void onClassifyText(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextClassification.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>);
+    method public void onCreateTextClassificationSession(android.view.textclassifier.TextClassificationContext, android.view.textclassifier.TextClassificationSessionId);
+    method public void onDestroyTextClassificationSession(android.view.textclassifier.TextClassificationSessionId);
+    method public abstract void onGenerateLinks(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextLinks.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>);
+    method public void onSelectionEvent(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.SelectionEvent);
+    method public abstract void onSuggestSelection(android.view.textclassifier.TextClassificationSessionId, android.view.textclassifier.TextSelection.Request, android.os.CancellationSignal, android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>);
     field public static final java.lang.String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService";
   }
 
@@ -5117,6 +5121,7 @@
   }
 
   public abstract class NetworkService extends android.app.Service {
+    ctor public NetworkService();
     method protected abstract android.telephony.NetworkService.NetworkServiceProvider createNetworkServiceProvider(int);
     field public static final java.lang.String NETWORK_SERVICE_EXTRA_SLOT_ID = "android.telephony.extra.SLOT_ID";
     field public static final java.lang.String NETWORK_SERVICE_INTERFACE = "android.telephony.NetworkService";
@@ -5185,7 +5190,7 @@
   }
 
   public final class SubscriptionPlan implements android.os.Parcelable {
-    method public java.util.Iterator<android.util.Pair<java.time.ZonedDateTime, java.time.ZonedDateTime>> cycleIterator();
+    method public java.util.Iterator<android.util.Range<java.time.ZonedDateTime>> cycleIterator();
     method public int describeContents();
     method public int getDataLimitBehavior();
     method public long getDataLimitBytes();
@@ -5207,9 +5212,10 @@
   public static class SubscriptionPlan.Builder {
     method public android.telephony.SubscriptionPlan build();
     method public static android.telephony.SubscriptionPlan.Builder createNonrecurring(java.time.ZonedDateTime, java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
-    method public static android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
+    method public static android.telephony.SubscriptionPlan.Builder createRecurring(java.time.ZonedDateTime, java.time.Period);
+    method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringDaily(java.time.ZonedDateTime);
+    method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringMonthly(java.time.ZonedDateTime);
+    method public static deprecated android.telephony.SubscriptionPlan.Builder createRecurringWeekly(java.time.ZonedDateTime);
     method public android.telephony.SubscriptionPlan.Builder setDataLimit(long, int);
     method public android.telephony.SubscriptionPlan.Builder setDataUsage(long, long);
     method public android.telephony.SubscriptionPlan.Builder setSummary(java.lang.CharSequence);
@@ -5398,6 +5404,7 @@
   }
 
   public abstract class DataService extends android.app.Service {
+    ctor public DataService();
     method public abstract android.telephony.data.DataService.DataServiceProvider createDataServiceProvider(int);
     field public static final java.lang.String DATA_SERVICE_EXTRA_SLOT_ID = "android.telephony.data.extra.SLOT_ID";
     field public static final java.lang.String DATA_SERVICE_INTERFACE = "android.telephony.data.DataService";
diff --git a/api/test-current.txt b/api/test-current.txt
index f66fafe..94154c2 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -245,6 +245,8 @@
     method public abstract int getInstallReason(java.lang.String, android.os.UserHandle);
     method public abstract java.lang.String[] getNamesForUids(int[]);
     method public abstract java.lang.String getPermissionControllerPackageName();
+    method public abstract java.lang.String getServicesSystemSharedLibraryPackageName();
+    method public abstract java.lang.String getSharedSystemSharedLibraryPackageName();
     method public abstract boolean isPermissionReviewModeEnabled();
     field public static final java.lang.String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage";
     field public static final java.lang.String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption";
@@ -465,6 +467,70 @@
     method public void setType(int);
   }
 
+  public class LocationManager {
+    method public java.lang.String[] getBackgroundThrottlingWhitelist();
+  }
+
+}
+
+package android.media {
+
+  public final class AudioFocusRequest {
+    method public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener();
+  }
+
+  public final class AudioFormat implements android.os.Parcelable {
+    method public static int channelCountFromInChannelMask(int);
+    method public static int channelCountFromOutChannelMask(int);
+    method public static int getBytesPerSample(int);
+    method public static boolean isEncodingLinearPcm(int);
+  }
+
+  public final class AudioPresentation {
+    ctor public AudioPresentation(int, int, java.util.Map<java.lang.String, java.lang.String>, java.lang.String, int, boolean, boolean, boolean);
+    method public int getPresentationId();
+    method public int getProgramId();
+  }
+
+  public final class PlaybackParams implements android.os.Parcelable {
+    method public int getAudioStretchMode();
+    method public android.media.PlaybackParams setAudioStretchMode(int);
+  }
+
+  public static final class VolumeShaper.Configuration.Builder {
+    method public android.media.VolumeShaper.Configuration.Builder setOptionFlags(int);
+  }
+
+}
+
+package android.media.audiofx {
+
+  public class AudioEffect {
+    method public static int byteArrayToInt(byte[]);
+    method public static short byteArrayToShort(byte[]);
+    method public int getParameter(byte[], byte[]) throws java.lang.IllegalStateException;
+    method public int getParameter(int, byte[]) throws java.lang.IllegalStateException;
+    method public int getParameter(int, int[]) throws java.lang.IllegalStateException;
+    method public int getParameter(int, short[]) throws java.lang.IllegalStateException;
+    method public int getParameter(int[], short[]) throws java.lang.IllegalStateException;
+    method public static byte[] intToByteArray(int);
+    method public static boolean isEffectTypeAvailable(java.util.UUID);
+    method public static boolean isError(int);
+    method public int setParameter(byte[], byte[]) throws java.lang.IllegalStateException;
+    method public int setParameter(int, int) throws java.lang.IllegalStateException;
+    method public int setParameter(int, short) throws java.lang.IllegalStateException;
+    method public int setParameter(int, byte[]) throws java.lang.IllegalStateException;
+    method public int setParameter(int[], int[]) throws java.lang.IllegalStateException;
+    method public int setParameter(int[], byte[]) throws java.lang.IllegalStateException;
+    method public void setParameterListener(android.media.audiofx.AudioEffect.OnParameterChangeListener);
+    method public static byte[] shortToByteArray(short);
+    field public static final java.util.UUID EFFECT_TYPE_NULL;
+  }
+
+  public static abstract interface AudioEffect.OnParameterChangeListener {
+    method public abstract void onParameterChange(android.media.audiofx.AudioEffect, int, byte[], byte[]);
+  }
+
 }
 
 package android.net {
@@ -489,6 +555,15 @@
     field public static final int RESOURCES_SDK_INT;
   }
 
+  public class DeviceIdleManager {
+    method public java.lang.String[] getSystemPowerWhitelist();
+    method public java.lang.String[] getSystemPowerWhitelistExceptIdle();
+  }
+
+  public class Environment {
+    method public static java.io.File buildPath(java.io.File, java.lang.String...);
+  }
+
   public class IncidentManager {
     method public void reportIncident(android.os.IncidentReportArgs);
   }
@@ -527,6 +602,7 @@
     field public static final int DETECT_VM_CURSOR_LEAKS = 256; // 0x100
     field public static final int DETECT_VM_FILE_URI_EXPOSURE = 8192; // 0x2000
     field public static final int DETECT_VM_INSTANCE_LEAKS = 2048; // 0x800
+    field public static final int DETECT_VM_NON_SDK_API_USAGE = 1073741824; // 0x40000000
     field public static final int DETECT_VM_REGISTRATION_LEAKS = 4096; // 0x1000
     field public static final int DETECT_VM_UNTAGGED_SOCKET = -2147483648; // 0x80000000
   }
@@ -555,12 +631,18 @@
     method public abstract void log(android.os.StrictMode.ViolationInfo);
   }
 
+  public class SystemProperties {
+    method public static java.lang.String get(java.lang.String, java.lang.String);
+  }
+
   public final class UserHandle implements android.os.Parcelable {
     method public static int getAppId(int);
     method public int getIdentifier();
+    field public static final android.os.UserHandle SYSTEM;
   }
 
   public class UserManager {
+    method public static boolean isSplitSystemUser();
     field public static final java.lang.String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
   }
 
@@ -777,6 +859,16 @@
 
   public class ServiceState implements android.os.Parcelable {
     method public void setCdmaSystemAndNetworkId(int, int);
+    method public void setCellBandwidths(int[]);
+    method public void setChannelNumber(int);
+    method public void setRilDataRadioTechnology(int);
+    method public void setRilVoiceRadioTechnology(int);
+  }
+
+  public class TelephonyManager {
+    method public int getCarrierIdListVersion();
+    method public void setCarrierTestOverride(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+    field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff
   }
 
 }
diff --git a/cmds/incident_helper/src/TextParserBase.cpp b/cmds/incident_helper/src/TextParserBase.cpp
index a8f9968..e9bc70f 100644
--- a/cmds/incident_helper/src/TextParserBase.cpp
+++ b/cmds/incident_helper/src/TextParserBase.cpp
@@ -21,7 +21,6 @@
 #include <android-base/file.h>
 
 using namespace android::base;
-using namespace std;
 
 // ================================================================================
 status_t NoopParser::Parse(const int in, const int out) const
diff --git a/cmds/incident_helper/src/TextParserBase.h b/cmds/incident_helper/src/TextParserBase.h
index 1667966..784c181 100644
--- a/cmds/incident_helper/src/TextParserBase.h
+++ b/cmds/incident_helper/src/TextParserBase.h
@@ -21,6 +21,7 @@
 #include <utils/String8.h>
 
 using namespace android;
+using namespace std;
 
 /**
  * Base class for text parser
diff --git a/cmds/incident_helper/src/ih_util.cpp b/cmds/incident_helper/src/ih_util.cpp
index 5b413e9..4c4d1b9 100644
--- a/cmds/incident_helper/src/ih_util.cpp
+++ b/cmds/incident_helper/src/ih_util.cpp
@@ -98,9 +98,9 @@
     size_t lastIndex = 0;
     int i = 0;
     while (headerNames[i] != NULL) {
-        string s = headerNames[i];
+        std::string s = headerNames[i];
         lastIndex = line.find(s, lastIndex);
-        if (lastIndex == string::npos) {
+        if (lastIndex == std::string::npos) {
             fprintf(stderr, "Bad Task Header: %s\n", line.c_str());
             return false;
         }
@@ -271,7 +271,7 @@
         :mEnums(),
          mEnumValuesByName()
 {
-    map<std::string, uint64_t> fields;
+    std::map<std::string, uint64_t> fields;
     for (int i = 0; i < count; i++) {
         fields[names[i]] = ids[i];
     }
@@ -286,11 +286,11 @@
 Table::addEnumTypeMap(const char* field, const char* enumNames[], const int enumValues[], const int enumSize)
 {
     if (mFields.find(field) == mFields.end()) {
-        fprintf(stderr, "Field '%s' not found", string(field).c_str());
+        fprintf(stderr, "Field '%s' not found", field);
         return;
     }
 
-    map<std::string, int> enu;
+    std::map<std::string, int> enu;
     for (int i = 0; i < enumSize; i++) {
         enu[enumNames[i]] = enumValues[i];
     }
@@ -420,10 +420,10 @@
 
     // Try to find the message field which is the prefix of name, so the value would be inserted
     // recursively into the submessage.
-    string mutableName = name;
+    std::string mutableName = name;
     for (auto iter = mSubMessages.begin(); iter != mSubMessages.end(); iter++) {
-        string fieldName = iter->first;
-        string prefix = fieldName + "_"; // underscore is the delimiter in the name
+        std::string fieldName = iter->first;
+        std::string prefix = fieldName + "_"; // underscore is the delimiter in the name
         if (stripPrefix(&mutableName, prefix.c_str())) {
             if (mPreviousField != fieldName) {
                 endSession(proto);
@@ -437,7 +437,7 @@
 }
 
 void
-Message::startSession(ProtoOutputStream* proto, const string& name)
+Message::startSession(ProtoOutputStream* proto, const std::string& name)
 {
     uint64_t fieldId = mTable->mFields[name];
     uint64_t token = proto->start(fieldId);
diff --git a/cmds/incident_helper/src/ih_util.h b/cmds/incident_helper/src/ih_util.h
index c4eda4a..c02a349 100644
--- a/cmds/incident_helper/src/ih_util.h
+++ b/cmds/incident_helper/src/ih_util.h
@@ -150,9 +150,9 @@
     // Return false if the given name can't be found.
     bool insertField(ProtoOutputStream* proto, const std::string& name, const std::string& value);
 private:
-    map<std::string, uint64_t> mFields;
-    map<std::string, map<std::string, int>> mEnums;
-    map<std::string, int> mEnumValuesByName;
+    std::map<std::string, uint64_t> mFields;
+    std::map<std::string, std::map<std::string, int>> mEnums;
+    std::map<std::string, int> mEnumValuesByName;
 };
 
 /**
@@ -187,15 +187,15 @@
     bool insertField(ProtoOutputStream* proto, const std::string& name, const std::string& value);
 
     // Starts a new message field proto session.
-    void startSession(ProtoOutputStream* proto, const string& name);
+    void startSession(ProtoOutputStream* proto, const std::string& name);
 
     // Ends the previous message field proto session.
     void endSession(ProtoOutputStream* proto);
 private:
     Table* mTable;
     std::string mPreviousField;
-    stack<uint64_t> mTokens;
-    map<std::string, Message*> mSubMessages;
+    std::stack<uint64_t> mTokens;
+    std::map<std::string, Message*> mSubMessages;
 };
 
 #endif  // INCIDENT_HELPER_UTIL_H
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index c6e561f..0885b134 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -26,6 +26,10 @@
 #include <unistd.h>
 #include <wait.h>
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 const ssize_t BUFFER_SIZE = 16 * 1024;  // 16 KB
 const ssize_t MAX_BUFFER_COUNT = 256;   // 4 MB max
 
@@ -206,7 +210,7 @@
             }
             if (amt < 0) {
                 if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
-                    VLOG("Fail to write toFd.get() %d: %s", toFd.get(), strerror(errno));
+                    VLOG("Fail to write toFd %d: %s", toFd.get(), strerror(errno));
                     return -errno;
                 }  // otherwise just continue
             } else {
@@ -234,11 +238,11 @@
         ssize_t amt = ::read(fromFd.get(), mBuffer.writeBuffer(), mBuffer.currentToWrite());
         if (amt < 0) {
             if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
-                VLOG("Fail to read fromFd.get() %d: %s", fromFd.get(), strerror(errno));
+                VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
                 return -errno;
             }  // otherwise just continue
         } else if (amt == 0) {
-            VLOG("Reached EOF of fromFd.get() %d", fromFd.get());
+            VLOG("Reached EOF of fromFd %d", fromFd.get());
             break;
         } else {
             mBuffer.wp()->move(amt);
@@ -252,3 +256,7 @@
 size_t FdBuffer::size() const { return mBuffer.size(); }
 
 EncodedBuffer::iterator FdBuffer::data() const { return mBuffer.begin(); }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/incidentd/src/FdBuffer.h b/cmds/incidentd/src/FdBuffer.h
index f467da8..20deefd 100644
--- a/cmds/incidentd/src/FdBuffer.h
+++ b/cmds/incidentd/src/FdBuffer.h
@@ -22,10 +22,12 @@
 #include <android/util/EncodedBuffer.h>
 #include <utils/Errors.h>
 
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
+
 using namespace android::base;
 using namespace android::util;
-using namespace std;
 
 /**
  * Reads data from fd into a buffer, fd must be closed explicitly.
@@ -104,4 +106,8 @@
     bool mTruncated;
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // FD_BUFFER_H
diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp
index d02b4dd..e305b54 100644
--- a/cmds/incidentd/src/IncidentService.cpp
+++ b/cmds/incidentd/src/IncidentService.cpp
@@ -34,9 +34,6 @@
 
 #include <unistd.h>
 
-using namespace android;
-using namespace android::base;
-
 enum { WHAT_RUN_REPORT = 1, WHAT_SEND_BACKLOG_TO_DROPBOX = 2 };
 
 #define DEFAULT_BACKLOG_DELAY_NS (1000000000LL)
@@ -44,7 +41,10 @@
 #define DEFAULT_BYTES_SIZE_LIMIT (20 * 1024 * 1024)        // 20MB
 #define DEFAULT_REFACTORY_PERIOD_MS (24 * 60 * 60 * 1000)  // 1 Day
 
-// ================================================================================
+namespace android {
+namespace os {
+namespace incidentd {
+
 String16 const DUMP_PERMISSION("android.permission.DUMP");
 String16 const USAGE_STATS_PERMISSION("android.permission.PACKAGE_USAGE_STATS");
 
@@ -94,6 +94,7 @@
     }
     return Status::ok();
 }
+
 // ================================================================================
 ReportRequestQueue::ReportRequestQueue() {}
 
@@ -373,3 +374,7 @@
     }
     return NO_ERROR;
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/incidentd/src/IncidentService.h b/cmds/incidentd/src/IncidentService.h
index 0ab34ed..e176bfd 100644
--- a/cmds/incidentd/src/IncidentService.h
+++ b/cmds/incidentd/src/IncidentService.h
@@ -28,11 +28,14 @@
 
 #include "Throttler.h"
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 using namespace android;
 using namespace android::base;
 using namespace android::binder;
 using namespace android::os;
-using namespace std;
 
 // ================================================================================
 class ReportRequestQueue : public virtual RefBase {
@@ -126,4 +129,8 @@
     status_t cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<String8>& args);
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // INCIDENT_SERVICE_H
diff --git a/cmds/incidentd/src/Privacy.cpp b/cmds/incidentd/src/Privacy.cpp
index c42a87b..6e55f90 100644
--- a/cmds/incidentd/src/Privacy.cpp
+++ b/cmds/incidentd/src/Privacy.cpp
@@ -19,6 +19,10 @@
 #include <android/os/IncidentReportArgs.h>
 #include <stdlib.h>
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 uint64_t encode_field_id(const Privacy* p) { return (uint64_t)p->type << 32 | p->field_id; }
 
 const Privacy* lookup(const Privacy* p, uint32_t fieldId) {
@@ -65,3 +69,7 @@
             return PrivacySpec(android::os::DEST_AUTOMATIC);
     }
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/incidentd/src/Privacy.h b/cmds/incidentd/src/Privacy.h
index 6b6de9c..a3df490 100644
--- a/cmds/incidentd/src/Privacy.h
+++ b/cmds/incidentd/src/Privacy.h
@@ -20,6 +20,10 @@
 
 #include <stdint.h>
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 // This is the default value of DEST enum, sync with privacy.proto
 const uint8_t DEST_UNSET = 255;  // DEST_UNSET is not exposed to libincident
 const uint8_t DEST_DEFAULT_VALUE = DEST_UNSET;
@@ -82,4 +86,8 @@
     PrivacySpec(uint8_t dest) : dest(dest) {}
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // PRIVACY_H
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
index f1f7c589..d753e5e 100644
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ b/cmds/incidentd/src/PrivacyBuffer.cpp
@@ -23,7 +23,9 @@
 #include <android/util/protobuf.h>
 #include <cutils/log.h>
 
-using namespace android::util;
+namespace android {
+namespace os {
+namespace incidentd {
 
 /**
  * Write the field to buf based on the wire type, iterator will point to next field.
@@ -32,7 +34,7 @@
 void PrivacyBuffer::writeFieldOrSkip(uint32_t fieldTag, bool skip) {
     uint8_t wireType = read_wire_type(fieldTag);
     size_t bytesToWrite = 0;
-    uint32_t varint = 0;
+    uint64_t varint = 0;
 
     switch (wireType) {
         case WIRE_TYPE_VARINT:
@@ -140,3 +142,7 @@
     }
     return NO_ERROR;
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/incidentd/src/PrivacyBuffer.h b/cmds/incidentd/src/PrivacyBuffer.h
index cd29d8b..eac3862 100644
--- a/cmds/incidentd/src/PrivacyBuffer.h
+++ b/cmds/incidentd/src/PrivacyBuffer.h
@@ -25,7 +25,10 @@
 #include <stdint.h>
 #include <utils/Errors.h>
 
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
+
 using namespace android::util;
 
 /**
@@ -69,4 +72,8 @@
     void writeFieldOrSkip(uint32_t fieldTag, bool skip);
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // PRIVACY_BUFFER_H
\ No newline at end of file
diff --git a/cmds/incidentd/src/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp
index fc8a6db..103004d 100644
--- a/cmds/incidentd/src/Reporter.cpp
+++ b/cmds/incidentd/src/Reporter.cpp
@@ -37,6 +37,10 @@
  */
 static const char* INCIDENT_DIRECTORY = "/data/misc/incidents/";
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 // ================================================================================
 ReportRequest::ReportRequest(const IncidentReportArgs& a,
                              const sp<IIncidentReportStatusListener>& l, int f)
@@ -320,3 +324,7 @@
 
     return REPORT_FINISHED;
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/incidentd/src/Reporter.h b/cmds/incidentd/src/Reporter.h
index f9a092a..45fd944 100644
--- a/cmds/incidentd/src/Reporter.h
+++ b/cmds/incidentd/src/Reporter.h
@@ -30,9 +30,9 @@
 #include "Throttler.h"
 #include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
 
-using namespace android;
-using namespace android::os;
-using namespace std;
+namespace android {
+namespace os {
+namespace incidentd {
 
 // ================================================================================
 struct ReportRequest : public virtual RefBase {
@@ -110,4 +110,8 @@
     bool isTest = true;  // default to true for testing
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // REPORTER_H
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 3f693fa..45d6281 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -43,9 +43,12 @@
 #include "frameworks/base/core/proto/android/util/log.proto.h"
 #include "incidentd_util.h"
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 using namespace android::base;
 using namespace android::util;
-using namespace std;
 
 // special section ids
 const int FIELD_ID_INCIDENT_HEADER = 1;
@@ -321,8 +324,8 @@
     }
     VLOG("GZipSection is using file %s, fd=%d", mFilenames[index], fd.get());
     if (fd.get() == -1) {
-      ALOGW("GZipSection %s can't open all the files", this->name.string());
-      return NO_ERROR; // e.g. LAST_KMSG will reach here in user build.
+        ALOGW("GZipSection %s can't open all the files", this->name.string());
+        return NO_ERROR;  // e.g. LAST_KMSG will reach here in user build.
     }
     FdBuffer buffer;
     Fpipe p2cPipe;
@@ -909,7 +912,7 @@
             dump[i] = iterator.next();
             i++;
         }
-        long long token = proto.start(android::os::BackTraceProto::TRACES);
+        uint64_t token = proto.start(android::os::BackTraceProto::TRACES);
         proto.write(android::os::BackTraceProto::Stack::PID, pid);
         proto.write(android::os::BackTraceProto::Stack::DUMP, dump.get(), i);
         proto.write(android::os::BackTraceProto::Stack::DUMP_DURATION_NS,
@@ -921,3 +924,7 @@
     proto.flush(pipeWriteFd);
     return err;
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/Section.h b/cmds/incidentd/src/Section.h
index 19ef7ee..20ecdb1 100644
--- a/cmds/incidentd/src/Section.h
+++ b/cmds/incidentd/src/Section.h
@@ -27,9 +27,11 @@
 #include <utils/String8.h>
 #include <utils/Vector.h>
 
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
 
-const int64_t REMOTE_CALL_TIMEOUT_MS = 10 * 1000;  // 10 seconds
+const int64_t REMOTE_CALL_TIMEOUT_MS = 30 * 1000;  // 30 seconds
 
 /**
  * Base class for sections
@@ -175,4 +177,8 @@
     std::string mType;
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // SECTIONS_H
diff --git a/cmds/incidentd/src/Throttler.cpp b/cmds/incidentd/src/Throttler.cpp
index 1abf267..2b790ca 100644
--- a/cmds/incidentd/src/Throttler.cpp
+++ b/cmds/incidentd/src/Throttler.cpp
@@ -20,6 +20,10 @@
 
 #include <utils/SystemClock.h>
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 Throttler::Throttler(size_t limit, int64_t refractoryPeriodMs)
     : mSizeLimit(limit),
       mRefractoryPeriodMs(refractoryPeriodMs),
@@ -48,3 +52,7 @@
     fprintf(out, "mRefractoryPeriodMs=%d\n", (int)mRefractoryPeriodMs);
     fprintf(out, "mLastRefractoryMs=%d\n", (int)mLastRefractoryMs);
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/Throttler.h b/cmds/incidentd/src/Throttler.h
index c56f753..e8f317d7 100644
--- a/cmds/incidentd/src/Throttler.h
+++ b/cmds/incidentd/src/Throttler.h
@@ -20,6 +20,10 @@
 #include <utils/RefBase.h>
 
 #include <unistd.h>
+
+namespace android {
+namespace os {
+namespace incidentd {
 /**
  * This is a size-based throttler which prevents incidentd to take more data.
  */
@@ -45,4 +49,8 @@
     int64_t mLastRefractoryMs;
 };
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // THROTTLER_H
diff --git a/cmds/incidentd/src/incidentd_util.cpp b/cmds/incidentd/src/incidentd_util.cpp
index 7db1fa7..af685d8 100644
--- a/cmds/incidentd/src/incidentd_util.cpp
+++ b/cmds/incidentd/src/incidentd_util.cpp
@@ -23,6 +23,12 @@
 
 #include "section_list.h"
 
+namespace android {
+namespace os {
+namespace incidentd {
+
+using namespace android::base;
+
 const Privacy* get_privacy_of_section(int id) {
     int l = 0;
     int r = PRIVACY_POLICY_COUNT - 1;
@@ -149,3 +155,7 @@
     if (!died) return kill_child(pid);
     return statusCode(status);
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/incidentd_util.h b/cmds/incidentd/src/incidentd_util.h
index b5f6e21..3dac2c4 100644
--- a/cmds/incidentd/src/incidentd_util.h
+++ b/cmds/incidentd/src/incidentd_util.h
@@ -26,7 +26,10 @@
 
 #include "Privacy.h"
 
-using namespace android;
+namespace android {
+namespace os {
+namespace incidentd {
+
 using namespace android::base;
 
 /**
@@ -75,4 +78,8 @@
 status_t kill_child(pid_t pid);
 status_t wait_child(pid_t pid);
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // INCIDENTD_UTIL_H
diff --git a/cmds/incidentd/src/main.cpp b/cmds/incidentd/src/main.cpp
index 38b7449..4948823 100644
--- a/cmds/incidentd/src/main.cpp
+++ b/cmds/incidentd/src/main.cpp
@@ -29,6 +29,7 @@
 #include <sys/types.h>
 
 using namespace android;
+using namespace android::os::incidentd;
 
 // ================================================================================
 int main(int /*argc*/, char** /*argv*/) {
@@ -43,7 +44,7 @@
     IPCThreadState::self()->disableBackgroundScheduling(true);
 
     // Create the service
-    android::sp<IncidentService> service = new IncidentService(looper);
+    sp<IncidentService> service = new IncidentService(looper);
     if (defaultServiceManager()->addService(String16("incident"), service) != 0) {
         ALOGE("Failed to add service");
         return -1;
diff --git a/cmds/incidentd/src/report_directory.cpp b/cmds/incidentd/src/report_directory.cpp
index f023ee1..e2883ba 100644
--- a/cmds/incidentd/src/report_directory.cpp
+++ b/cmds/incidentd/src/report_directory.cpp
@@ -29,8 +29,9 @@
 
 #include <vector>
 
-using namespace android;
-using namespace std;
+namespace android {
+namespace os {
+namespace incidentd {
 
 status_t create_directory(const char* directory) {
     struct stat st;
@@ -89,8 +90,8 @@
     return err;
 }
 
-static bool stat_mtime_cmp(const pair<String8, struct stat>& a,
-                           const pair<String8, struct stat>& b) {
+static bool stat_mtime_cmp(const std::pair<String8, struct stat>& a,
+                           const std::pair<String8, struct stat>& b) {
     return a.second.st_mtime < b.second.st_mtime;
 }
 
@@ -99,7 +100,7 @@
     struct dirent* entry;
     struct stat st;
 
-    vector<pair<String8, struct stat>> files;
+    std::vector<std::pair<String8, struct stat>> files;
 
     if ((dir = opendir(directory)) == NULL) {
         ALOGE("Couldn't open incident directory: %s", directory);
@@ -125,7 +126,7 @@
         if (!S_ISREG(st.st_mode)) {
             continue;
         }
-        files.push_back(pair<String8, struct stat>(filename, st));
+        files.push_back(std::pair<String8, struct stat>(filename, st));
 
         totalSize += st.st_size;
         totalCount++;
@@ -142,10 +143,14 @@
     sort(files.begin(), files.end(), stat_mtime_cmp);
 
     // Remove files until we're under our limits.
-    for (vector<pair<String8, struct stat>>::iterator it = files.begin();
+    for (std::vector<std::pair<String8, struct stat>>::iterator it = files.begin();
          it != files.end() && totalSize >= maxSize && totalCount >= maxCount; it++) {
         remove(it->first.string());
         totalSize -= it->second.st_size;
         totalCount--;
     }
 }
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/incidentd/src/report_directory.h b/cmds/incidentd/src/report_directory.h
index 2a3cf4c..a63f8df 100644
--- a/cmds/incidentd/src/report_directory.h
+++ b/cmds/incidentd/src/report_directory.h
@@ -21,7 +21,15 @@
 #include <sys/types.h>
 #include <utils/Errors.h>
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 android::status_t create_directory(const char* directory);
 void clean_directory(const char* directory, off_t maxSize, size_t maxCount);
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // DIRECTORY_CLEANER_H
diff --git a/cmds/incidentd/src/section_list.h b/cmds/incidentd/src/section_list.h
index 697e66f..1498127 100644
--- a/cmds/incidentd/src/section_list.h
+++ b/cmds/incidentd/src/section_list.h
@@ -23,6 +23,10 @@
 #include "Privacy.h"
 #include "Section.h"
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 /**
  * This is the mapping of section IDs to the commands that are run to get those commands.
  * The section IDs are guaranteed in ascending order, NULL-terminated.
@@ -37,4 +41,8 @@
 
 extern const int PRIVACY_POLICY_COUNT;
 
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
+
 #endif  // SECTION_LIST_H
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index 7a05d7e..9d208df 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -24,15 +24,16 @@
 #include <signal.h>
 #include <string.h>
 
+using namespace android;
+using namespace android::base;
+using namespace android::os::incidentd;
+using ::testing::Test;
+
 const int READ_TIMEOUT = 5 * 1000;
 const int BUFFER_SIZE = 16 * 1024;
 const int QUICK_TIMEOUT_MS = 100;
 const std::string HEAD = "[OK]";
 
-using namespace android;
-using namespace android::base;
-using ::testing::Test;
-
 class FdBufferTest : public Test {
 public:
     virtual void SetUp() override {
diff --git a/cmds/incidentd/tests/PrivacyBuffer_test.cpp b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
index 10c2981..685759f 100644
--- a/cmds/incidentd/tests/PrivacyBuffer_test.cpp
+++ b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
@@ -27,7 +27,7 @@
 using namespace android;
 using namespace android::base;
 using namespace android::os;
-using namespace std;
+using namespace android::os::incidentd;
 using ::testing::StrEq;
 using ::testing::Test;
 using ::testing::internal::CaptureStdout;
@@ -36,12 +36,12 @@
 const uint8_t OTHER_TYPE = 1;
 const uint8_t STRING_TYPE = 9;
 const uint8_t MESSAGE_TYPE = 11;
-const string STRING_FIELD_0 = "\x02\viamtestdata";
-const string VARINT_FIELD_1 = "\x08\x96\x01";  // 150
-const string STRING_FIELD_2 = "\x12\vandroidwins";
-const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff";  // -1
-const string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff";                  // -1
-const string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
+const std::string STRING_FIELD_0 = "\x02\viamtestdata";
+const std::string VARINT_FIELD_1 = "\x08\x96\x01";  // 150
+const std::string STRING_FIELD_2 = "\x12\vandroidwins";
+const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff";  // -1
+const std::string FIX32_FIELD_4 = "\x25\xff\xff\xff\xff";                  // -1
+const std::string MESSAGE_FIELD_5 = "\x2a\x10" + VARINT_FIELD_1 + STRING_FIELD_2;
 
 class PrivacyBufferTest : public Test {
 public:
@@ -56,20 +56,20 @@
 
     virtual void SetUp() override { ASSERT_NE(tf.fd, -1); }
 
-    void writeToFdBuffer(string str) {
+    void writeToFdBuffer(std::string str) {
         ASSERT_TRUE(WriteStringToFile(str, tf.path));
         ASSERT_EQ(NO_ERROR, buffer.read(tf.fd, 10000));
         ASSERT_EQ(str.size(), buffer.size());
     }
 
-    void assertBuffer(PrivacyBuffer& buf, string expected) {
+    void assertBuffer(PrivacyBuffer& buf, std::string expected) {
         ASSERT_EQ(buf.size(), expected.size());
         CaptureStdout();
         ASSERT_EQ(buf.flush(STDOUT_FILENO), NO_ERROR);
         ASSERT_THAT(GetCapturedStdout(), StrEq(expected));
     }
 
-    void assertStrip(uint8_t dest, string expected, Privacy* policy) {
+    void assertStrip(uint8_t dest, std::string expected, Privacy* policy) {
         PrivacySpec spec = PrivacySpec::new_spec(dest);
         EncodedBuffer::iterator bufData = buffer.data();
         PrivacyBuffer privacyBuf(policy, bufData);
@@ -77,7 +77,7 @@
         assertBuffer(privacyBuf, expected);
     }
 
-    void assertStripByFields(uint8_t dest, string expected, int size, Privacy* privacy, ...) {
+    void assertStripByFields(uint8_t dest, std::string expected, int size, Privacy* privacy, ...) {
         Privacy* list[size + 1];
         list[0] = privacy;
         va_list args;
@@ -194,7 +194,7 @@
 TEST_F(PrivacyBufferTest, StripVarintAndString) {
     writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
                     FIX32_FIELD_4);
-    string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
+    std::string expected = STRING_FIELD_0 + FIX64_FIELD_3 + FIX32_FIELD_4;
     assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
                         create_privacy(2, STRING_TYPE, DEST_LOCAL));
 }
@@ -202,7 +202,7 @@
 TEST_F(PrivacyBufferTest, StripVarintAndFixed64) {
     writeToFdBuffer(STRING_FIELD_0 + VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3 +
                     FIX32_FIELD_4);
-    string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
+    std::string expected = STRING_FIELD_0 + STRING_FIELD_2 + FIX32_FIELD_4;
     assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(1, OTHER_TYPE, DEST_LOCAL),
                         create_privacy(3, OTHER_TYPE, DEST_LOCAL));
 }
@@ -210,14 +210,14 @@
 TEST_F(PrivacyBufferTest, StripVarintInNestedMessage) {
     writeToFdBuffer(STRING_FIELD_0 + MESSAGE_FIELD_5);
     Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
-    string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+    std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
     assertStripByFields(DEST_EXPLICIT, expected, 1, create_message_privacy(5, list));
 }
 
 TEST_F(PrivacyBufferTest, StripFix64AndVarintInNestedMessage) {
     writeToFdBuffer(STRING_FIELD_0 + FIX64_FIELD_3 + MESSAGE_FIELD_5);
     Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
-    string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
+    std::string expected = STRING_FIELD_0 + "\x2a\xd" + STRING_FIELD_2;
     assertStripByFields(DEST_EXPLICIT, expected, 2, create_privacy(3, OTHER_TYPE, DEST_LOCAL),
                         create_message_privacy(5, list));
 }
@@ -262,7 +262,7 @@
     Privacy* field5 = create_message_privacy(5, NULL);
     Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), field5, NULL};
     field5->children = list;
-    string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
+    std::string expected = "\x2a\x1c" + STRING_FIELD_2 + "\x2a\xd" + STRING_FIELD_2;
     assertStrip(DEST_EXPLICIT, expected, field5);
 }
 
@@ -271,6 +271,6 @@
     Privacy* list[] = {create_privacy(1, OTHER_TYPE, DEST_LOCAL), NULL};
     Privacy* autoMsg = create_privacy(5, MESSAGE_TYPE, DEST_AUTOMATIC);
     autoMsg->children = list;
-    string expected = "\x2a\xd" + STRING_FIELD_2;
+    std::string expected = "\x2a\xd" + STRING_FIELD_2;
     assertStripByFields(DEST_AUTOMATIC, expected, 1, autoMsg);
 }
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index 42d94f0..cf107c8 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -30,6 +30,7 @@
 using namespace android::base;
 using namespace android::binder;
 using namespace android::os;
+using namespace android::os::incidentd;
 using namespace std;
 using ::testing::StrEq;
 using ::testing::Test;
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index 2f6698b..9f92353 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -25,25 +25,26 @@
 #include <gtest/gtest.h>
 #include <string.h>
 
+using namespace android;
+using namespace android::base;
+using namespace android::binder;
+using namespace android::os;
+using namespace android::os::incidentd;
+using namespace android::util;
+using ::testing::StrEq;
+using ::testing::Test;
+using ::testing::internal::CaptureStdout;
+using ::testing::internal::GetCapturedStdout;
+
 const int TIMEOUT_PARSER = -1;
 const int NOOP_PARSER = 0;
 const int REVERSE_PARSER = 1;
 
 const int QUICK_TIMEOUT_MS = 100;
 
-const string VARINT_FIELD_1 = "\x08\x96\x01";  // 150
-const string STRING_FIELD_2 = "\x12\vandroidwins";
-const string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff";  // -1
-
-using namespace android::base;
-using namespace android::binder;
-using namespace android::os;
-using namespace android::util;
-using namespace std;
-using ::testing::StrEq;
-using ::testing::Test;
-using ::testing::internal::CaptureStdout;
-using ::testing::internal::GetCapturedStdout;
+const std::string VARINT_FIELD_1 = "\x08\x96\x01";  // 150
+const std::string STRING_FIELD_2 = "\x12\vandroidwins";
+const std::string FIX64_FIELD_3 = "\x19\xff\xff\xff\xff\xff\xff\xff\xff";  // -1
 
 // NOTICE: this test requires /system/bin/incident_helper is installed.
 class SectionTest : public Test {
@@ -101,7 +102,7 @@
     requests.add(new ReportRequest(args2, new SimpleListener(), tf.fd));
     requests.setMainFd(STDOUT_FILENO);
 
-    string content;
+    std::string content;
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, hs.Execute(&requests));
     EXPECT_THAT(GetCapturedStdout(), StrEq("\n\x5"
@@ -163,9 +164,9 @@
     size_t fileLen = testFile.size();
     size_t totalLen = 1 + get_varint_size(fileLen) + fileLen + 3 + gzFile.size();
     uint8_t header[20];
-    header[0] = '\x2'; // header 0 << 3 + 2
+    header[0] = '\x2';  // header 0 << 3 + 2
     uint8_t* ptr = write_raw_varint(header + 1, totalLen);
-    *ptr = '\n'; // header 1 << 3 + 2
+    *ptr = '\n';  // header 1 << 3 + 2
     ptr = write_raw_varint(++ptr, fileLen);
     expected.assign((const char*)header, ptr - header);
     expected += testFile + "\x12\x9F\x6" + gzFile;
@@ -227,7 +228,7 @@
     requests.setMainFd(STDOUT_FILENO);
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
-    string results = GetCapturedStdout();
+    std::string results = GetCapturedStdout();
     EXPECT_FALSE(results.empty());
 }
 
@@ -236,7 +237,7 @@
     requests.setMainFd(STDOUT_FILENO);
     CaptureStdout();
     ASSERT_EQ(NO_ERROR, ls.Execute(&requests));
-    string results = GetCapturedStdout();
+    std::string results = GetCapturedStdout();
     EXPECT_FALSE(results.empty());
 }
 
@@ -304,7 +305,7 @@
     ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
     EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
 
-    string content, expect;
+    std::string content, expect;
     expect = VARINT_FIELD_1 + STRING_FIELD_2 + FIX64_FIELD_3;
     char c = (char)expect.size();
     EXPECT_TRUE(ReadFileToString(output1.path, &content));
@@ -346,7 +347,7 @@
     ASSERT_EQ(NO_ERROR, fs.Execute(&requests));
     EXPECT_THAT(GetCapturedStdout(), StrEq("\x02\r" + STRING_FIELD_2));
 
-    string content, expect;
+    std::string content, expect;
     expect = STRING_FIELD_2 + FIX64_FIELD_3;
     char c = (char)expect.size();
 
diff --git a/cmds/incidentd/tests/Throttler_test.cpp b/cmds/incidentd/tests/Throttler_test.cpp
index 213dcef..8488c99 100644
--- a/cmds/incidentd/tests/Throttler_test.cpp
+++ b/cmds/incidentd/tests/Throttler_test.cpp
@@ -20,6 +20,8 @@
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+using namespace android::os::incidentd;
+
 TEST(ThrottlerTest, DataSizeExceeded) {
     Throttler t(100, 100000);
     EXPECT_FALSE(t.shouldThrottle());
diff --git a/cmds/incidentd/tests/section_list.cpp b/cmds/incidentd/tests/section_list.cpp
index bd2d15c..1d7f2b6 100644
--- a/cmds/incidentd/tests/section_list.cpp
+++ b/cmds/incidentd/tests/section_list.cpp
@@ -1,6 +1,10 @@
 // This file is a dummy section_list.cpp used for test only.
 #include "section_list.h"
 
+namespace android {
+namespace os {
+namespace incidentd {
+
 const Section* SECTION_LIST[] = {NULL};
 
 Privacy sub_field_1{1, 1, NULL, DEST_LOCAL, NULL};
@@ -16,3 +20,7 @@
 const Privacy** PRIVACY_POLICY_LIST = const_cast<const Privacy**>(final_list);
 
 const int PRIVACY_POLICY_COUNT = 2;
+
+}  // namespace incidentd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 7723615..8e46714 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -209,7 +209,9 @@
     tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp \
     tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp \
     tests/e2e/Anomaly_count_e2e_test.cpp \
-    tests/e2e/Anomaly_duration_sum_e2e_test.cpp
+    tests/e2e/Anomaly_duration_sum_e2e_test.cpp \
+    tests/e2e/ConfigTtl_e2e_test.cpp \
+    tests/e2e/PartialBucket_e2e_test.cpp
 
 LOCAL_STATIC_LIBRARIES := \
     $(statsd_common_static_libraries) \
diff --git a/cmds/statsd/benchmark/metric_util.cpp b/cmds/statsd/benchmark/metric_util.cpp
index 50b05cd..7d6c47b 100644
--- a/cmds/statsd/benchmark/metric_util.cpp
+++ b/cmds/statsd/benchmark/metric_util.cpp
@@ -366,7 +366,7 @@
     sp<AlarmMonitor> periodicAlarmMonitor;
     sp<StatsLogProcessor> processor = new StatsLogProcessor(
         uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){});
-    processor->OnConfigUpdated(key, config);
+    processor->OnConfigUpdated(timeBaseSec * NS_PER_SEC, key, config);
     return processor;
 }
 
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index 13f2679..90ce735 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -65,6 +65,7 @@
 const int FIELD_ID_LAST_REPORT_WALL_CLOCK_NANOS = 5;
 const int FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS = 6;
 
+#define NS_PER_HOUR 3600 * NS_PER_SEC
 
 #define STATS_DATA_DIR "/data/misc/stats-data"
 
@@ -85,7 +86,7 @@
 }
 
 void StatsLogProcessor::onAnomalyAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     for (const auto& itr : mMetricsManagers) {
@@ -93,7 +94,7 @@
     }
 }
 void StatsLogProcessor::onPeriodicAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) {
 
     std::lock_guard<std::mutex> lock(mMetricsMutex);
@@ -156,10 +157,17 @@
 
 void StatsLogProcessor::OnLogEvent(LogEvent* event) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
-    if (event->GetElapsedTimestampNs() < mLastLogTimestamp) {
+    const int64_t currentTimestampNs = event->GetElapsedTimestampNs();
+
+    if (currentTimestampNs < mLastLogTimestamp) {
+        StatsdStats::getInstance().noteLogEventSkipped(
+            event->GetTagId(), event->GetElapsedTimestampNs());
         return;
     }
-    mLastLogTimestamp = event->GetElapsedTimestampNs();
+
+    resetIfConfigTtlExpiredLocked(currentTimestampNs);
+
+    mLastLogTimestamp = currentTimestampNs;
     StatsdStats::getInstance().noteAtomLogged(
         event->GetTagId(), event->GetElapsedTimestampNs() / NS_PER_SEC);
 
@@ -173,12 +181,13 @@
         return;
     }
 
-    uint64_t curTimeSec = getElapsedRealtimeSec();
+    int64_t curTimeSec = getElapsedRealtimeSec();
     if (curTimeSec - mLastPullerCacheClearTimeSec > StatsdStats::kPullerCacheClearIntervalSec) {
         mStatsPullerManager.ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC);
         mLastPullerCacheClearTimeSec = curTimeSec;
     }
 
+
     if (event->GetTagId() != android::util::ISOLATED_UID_CHANGED) {
         // Map the isolated uid to host uid if necessary.
         mapIsolatedUidToHostUidIfNecessaryLocked(event);
@@ -191,13 +200,22 @@
     }
 }
 
-void StatsLogProcessor::OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) {
+void StatsLogProcessor::OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+                                        const StatsdConfig& config) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
+    OnConfigUpdatedLocked(timestampNs, key, config);
+}
+
+void StatsLogProcessor::OnConfigUpdatedLocked(
+        const int64_t timestampNs, const ConfigKey& key, const StatsdConfig& config) {
     VLOG("Updated configuration for key %s", key.ToString().c_str());
     sp<MetricsManager> newMetricsManager =
-        new MetricsManager(key, config, mTimeBaseSec, mUidMap,
+        new MetricsManager(key, config, mTimeBaseSec, (timestampNs - 1) / NS_PER_SEC + 1, mUidMap,
                            mAnomalyAlarmMonitor, mPeriodicAlarmMonitor);
-
+    auto it = mMetricsManagers.find(key);
+    if (it != mMetricsManagers.end()) {
+        WriteDataToDiskLocked(it->first);
+    }
     if (newMetricsManager->isConfigValid()) {
         mUidMap->OnConfigUpdated(key);
         if (newMetricsManager->shouldAddUidMapListener()) {
@@ -205,6 +223,7 @@
             // not safe to create wp or sp from this pointer inside its constructor.
             mUidMap->addListener(newMetricsManager.get());
         }
+        newMetricsManager->refreshTtl(timestampNs);
         mMetricsManagers[key] = newMetricsManager;
         VLOG("StatsdConfig valid");
     } else {
@@ -234,20 +253,11 @@
 /*
  * onDumpReport dumps serialized ConfigMetricsReportList into outData.
  */
-void StatsLogProcessor::onDumpReport(const ConfigKey& key, const uint64_t dumpTimeStampNs,
+void StatsLogProcessor::onDumpReport(const ConfigKey& key, const int64_t dumpTimeStampNs,
+                                     const bool include_current_partial_bucket,
                                      vector<uint8_t>* outData) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
 
-    auto it = mMetricsManagers.find(key);
-    if (it == mMetricsManagers.end()) {
-        ALOGW("Config source %s does not exist", key.ToString().c_str());
-        return;
-    }
-
-    // This allows another broadcast to be sent within the rate-limit period if we get close to
-    // filling the buffer again soon.
-    mLastBroadcastTimes.erase(key);
-
     ProtoOutputStream proto;
 
     // Start of ConfigKey.
@@ -257,18 +267,26 @@
     proto.end(configKeyToken);
     // End of ConfigKey.
 
-    // Start of ConfigMetricsReport (reports).
-    uint64_t reportsToken =
-            proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS);
-    onConfigMetricsReportLocked(key, dumpTimeStampNs, &proto);
-    proto.end(reportsToken);
-    // End of ConfigMetricsReport (reports).
-
-
     // Then, check stats-data directory to see there's any file containing
     // ConfigMetricsReport from previous shutdowns to concatenate to reports.
     StorageManager::appendConfigMetricsReport(key, &proto);
 
+    auto it = mMetricsManagers.find(key);
+    if (it != mMetricsManagers.end()) {
+        // This allows another broadcast to be sent within the rate-limit period if we get close to
+        // filling the buffer again soon.
+        mLastBroadcastTimes.erase(key);
+
+        // Start of ConfigMetricsReport (reports).
+        uint64_t reportsToken =
+                proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_REPORTS);
+        onConfigMetricsReportLocked(key, dumpTimeStampNs, include_current_partial_bucket, &proto);
+        proto.end(reportsToken);
+        // End of ConfigMetricsReport (reports).
+    } else {
+        ALOGW("Config source %s does not exist", key.ToString().c_str());
+    }
+
     if (outData != nullptr) {
         outData->clear();
         outData->resize(proto.size());
@@ -282,28 +300,32 @@
         }
     }
 
-    StatsdStats::getInstance().noteMetricsReportSent(key);
+    StatsdStats::getInstance().noteMetricsReportSent(key, proto.size());
 }
 
 /*
  * onConfigMetricsReportLocked dumps serialized ConfigMetricsReport into outData.
  */
 void StatsLogProcessor::onConfigMetricsReportLocked(const ConfigKey& key,
-                                                    const uint64_t dumpTimeStampNs,
+                                                    const int64_t dumpTimeStampNs,
+                                                    const bool include_current_partial_bucket,
                                                     ProtoOutputStream* proto) {
     // We already checked whether key exists in mMetricsManagers in
     // WriteDataToDisk.
     auto it = mMetricsManagers.find(key);
+    if (it == mMetricsManagers.end()) {
+        return;
+    }
     int64_t lastReportTimeNs = it->second->getLastReportTimeNs();
     int64_t lastReportWallClockNs = it->second->getLastReportWallClockNs();
 
     // First, fill in ConfigMetricsReport using current data on memory, which
     // starts from filling in StatsLogReport's.
-    it->second->onDumpReport(dumpTimeStampNs, proto);
+    it->second->onDumpReport(dumpTimeStampNs, include_current_partial_bucket, proto);
 
     // Fill in UidMap.
     uint64_t uidMapToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_ID_UID_MAP);
-    mUidMap->appendUidMap(key, proto);
+    mUidMap->appendUidMap(dumpTimeStampNs, key, proto);
     proto->end(uidMapToken);
 
     // Fill in the timestamps.
@@ -315,14 +337,36 @@
                 (long long)lastReportWallClockNs);
     proto->write(FIELD_TYPE_INT64 | FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS,
                 (long long)getWallClockNs());
+}
 
+void StatsLogProcessor::resetIfConfigTtlExpiredLocked(const int64_t timestampNs) {
+    std::vector<ConfigKey> configKeysTtlExpired;
+    for (auto it = mMetricsManagers.begin(); it != mMetricsManagers.end(); it++) {
+        if (it->second != nullptr && !it->second->isInTtl(timestampNs)) {
+            configKeysTtlExpired.push_back(it->first);
+        }
+    }
 
+    for (const auto& key : configKeysTtlExpired) {
+        StatsdConfig config;
+        if (StorageManager::readConfigFromDisk(key, &config)) {
+            OnConfigUpdatedLocked(timestampNs, key, config);
+            StatsdStats::getInstance().noteConfigReset(key);
+        } else {
+            ALOGE("Failed to read backup config from disk for : %s", key.ToString().c_str());
+            auto it = mMetricsManagers.find(key);
+            if (it != mMetricsManagers.end()) {
+                it->second->refreshTtl(timestampNs);
+            }
+        }
+    }
 }
 
 void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     auto it = mMetricsManagers.find(key);
     if (it != mMetricsManagers.end()) {
+        WriteDataToDiskLocked(key);
         mMetricsManagers.erase(it);
         mUidMap->OnConfigRemoved(key);
     }
@@ -336,7 +380,7 @@
 }
 
 void StatsLogProcessor::flushIfNecessaryLocked(
-    uint64_t timestampNs, const ConfigKey& key, MetricsManager& metricsManager) {
+    int64_t timestampNs, const ConfigKey& key, MetricsManager& metricsManager) {
     auto lastCheckTime = mLastByteSizeTimes.find(key);
     if (lastCheckTime != mLastByteSizeTimes.end()) {
         if (timestampNs - lastCheckTime->second < StatsdStats::kMinByteSizeCheckPeriodNs) {
@@ -368,22 +412,30 @@
     }
 }
 
+void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key) {
+    ProtoOutputStream proto;
+    onConfigMetricsReportLocked(key, getElapsedRealtimeNs(),
+                                true /* include_current_partial_bucket*/, &proto);
+    string file_name = StringPrintf("%s/%ld_%d_%lld", STATS_DATA_DIR,
+         (long)getWallClockSec(), key.GetUid(), (long long)key.GetId());
+    android::base::unique_fd fd(open(file_name.c_str(),
+                                O_WRONLY | O_CREAT | O_CLOEXEC, S_IRUSR | S_IWUSR));
+    if (fd == -1) {
+        ALOGE("Attempt to write %s but failed", file_name.c_str());
+        return;
+    }
+    proto.flush(fd.get());
+}
+
+void StatsLogProcessor::WriteDataToDiskLocked() {
+    for (auto& pair : mMetricsManagers) {
+        WriteDataToDiskLocked(pair.first);
+    }
+}
+
 void StatsLogProcessor::WriteDataToDisk() {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
-    for (auto& pair : mMetricsManagers) {
-        const ConfigKey& key = pair.first;
-        ProtoOutputStream proto;
-        onConfigMetricsReportLocked(key, getElapsedRealtimeNs(), &proto);
-        string file_name = StringPrintf("%s/%ld_%d_%lld", STATS_DATA_DIR,
-             (long)getWallClockSec(), key.GetUid(), (long long)key.GetId());
-        android::base::unique_fd fd(open(file_name.c_str(),
-                                    O_WRONLY | O_CREAT | O_CLOEXEC, S_IRUSR | S_IWUSR));
-        if (fd == -1) {
-            VLOG("Attempt to write %s but failed", file_name.c_str());
-            return;
-        }
-        proto.flush(fd.get());
-    }
+    WriteDataToDiskLocked();
 }
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 387a929..1e82b1e 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -42,21 +42,23 @@
 
     void OnLogEvent(LogEvent* event);
 
-    void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config);
+    void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+                         const StatsdConfig& config);
     void OnConfigRemoved(const ConfigKey& key);
 
     size_t GetMetricsSize(const ConfigKey& key) const;
 
-    void onDumpReport(const ConfigKey& key, const uint64_t dumpTimeNs, vector<uint8_t>* outData);
+    void onDumpReport(const ConfigKey& key, const int64_t dumpTimeNs,
+                      const bool include_current_partial_bucket, vector<uint8_t>* outData);
 
     /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */
     void onAnomalyAlarmFired(
-            const uint64_t& timestampNs,
+            const int64_t& timestampNs,
             unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
 
     /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */
     void onPeriodicAlarmFired(
-            const uint64_t& timestampNs,
+            const int64_t& timestampNs,
             unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
 
     /* Flushes data to disk. Data on memory will be gone after written to disk. */
@@ -68,6 +70,7 @@
 
     void dumpStates(FILE* out, bool verbose);
 
+
 private:
     // For testing only.
     inline sp<AlarmMonitor> getAnomalyAlarmMonitor() const {
@@ -95,12 +98,21 @@
 
     sp<AlarmMonitor> mPeriodicAlarmMonitor;
 
-    void onConfigMetricsReportLocked(const ConfigKey& key, const uint64_t dumpTimeStampNs,
+    void resetIfConfigTtlExpiredLocked(const int64_t timestampNs);
+
+    void OnConfigUpdatedLocked(
+        const int64_t currentTimestampNs, const ConfigKey& key, const StatsdConfig& config);
+
+    void WriteDataToDiskLocked();
+    void WriteDataToDiskLocked(const ConfigKey& key);
+
+    void onConfigMetricsReportLocked(const ConfigKey& key, const int64_t dumpTimeStampNs,
+                                     const bool include_current_partial_bucket,
                                      util::ProtoOutputStream* proto);
 
     /* Check if we should send a broadcast if approaching memory limits and if we're over, we
      * actually delete the data. */
-    void flushIfNecessaryLocked(uint64_t timestampNs, const ConfigKey& key,
+    void flushIfNecessaryLocked(int64_t timestampNs, const ConfigKey& key,
                                 MetricsManager& metricsManager);
 
     // Maps the isolated uid in the log event to host uid if the log event contains uid fields.
@@ -151,7 +163,9 @@
     FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
     FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
     FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
+
     FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
+    FRIEND_TEST(ConfigTtlE2eTest, TestCountMetric);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 7b0d5d9..d3cda63 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -178,23 +178,34 @@
     }
 
     bool verbose = false;
+    bool proto = false;
     if (args.size() > 0 && !args[0].compare(String16("-v"))) {
         verbose = true;
     }
+    if (args.size() > 0 && !args[args.size()-1].compare(String16("--proto"))) {
+        proto = true;
+    }
 
-    // TODO: Proto format for incident reports
-    dump_impl(out, verbose);
+    dump_impl(out, verbose, proto);
 
     fclose(out);
     return NO_ERROR;
 }
 
 /**
- * Write debugging data about statsd in text format.
+ * Write debugging data about statsd in text or proto format.
  */
-void StatsService::dump_impl(FILE* out, bool verbose) {
-    StatsdStats::getInstance().dumpStats(out);
-    mProcessor->dumpStates(out, verbose);
+void StatsService::dump_impl(FILE* out, bool verbose, bool proto) {
+    if (proto) {
+        vector<uint8_t> data;
+        StatsdStats::getInstance().dumpStats(&data, false); // does not reset statsdStats.
+        for (size_t i = 0; i < data.size(); i ++) {
+            fprintf(out, "%c", data[i]);
+        }
+    } else {
+        StatsdStats::getInstance().dumpStats(out);
+        mProcessor->dumpStates(out, verbose);
+    }
 }
 
 /**
@@ -325,6 +336,7 @@
     fprintf(out, "\n");
     fprintf(out, "usage: adb shell cmd stats print-stats\n");
     fprintf(out, "  Prints some basic stats.\n");
+    fprintf(out, "  --proto       Print proto binary instead of string format.\n");
     fprintf(out, "\n");
     fprintf(out, "\n");
     fprintf(out, "usage: adb shell cmd stats clear-puller-cache\n");
@@ -501,7 +513,7 @@
         if (good) {
             vector<uint8_t> data;
             mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), getElapsedRealtimeNs(),
-                                     &data);
+                                     false /* include_current_bucket*/, &data);
             // TODO: print the returned StatsLogReport to file instead of printing to logcat.
             if (proto) {
                 for (size_t i = 0; i < data.size(); i ++) {
@@ -524,13 +536,28 @@
 }
 
 status_t StatsService::cmd_print_stats(FILE* out, const Vector<String8>& args) {
-    vector<ConfigKey> configs = mConfigManager->GetAllConfigKeys();
-    for (const ConfigKey& key : configs) {
-        fprintf(out, "Config %s uses %zu bytes\n", key.ToString().c_str(),
-                mProcessor->GetMetricsSize(key));
+    int argCount = args.size();
+    bool proto = false;
+    if (!std::strcmp("--proto", args[argCount-1].c_str())) {
+        proto = true;
+        argCount -= 1;
     }
     StatsdStats& statsdStats = StatsdStats::getInstance();
-    statsdStats.dumpStats(out);
+    if (proto) {
+        vector<uint8_t> data;
+        statsdStats.dumpStats(&data, false); // does not reset statsdStats.
+        for (size_t i = 0; i < data.size(); i ++) {
+            fprintf(out, "%c", data[i]);
+        }
+
+    } else {
+        vector<ConfigKey> configs = mConfigManager->GetAllConfigKeys();
+        for (const ConfigKey& key : configs) {
+            fprintf(out, "Config %s uses %zu bytes\n", key.ToString().c_str(),
+                    mProcessor->GetMetricsSize(key));
+        }
+        statsdStats.dumpStats(out);
+    }
     return NO_ERROR;
 }
 
@@ -640,7 +667,7 @@
                                          "Only system uid can call informAllUidData");
     }
 
-    mUidMap->updateMap(uid, version, app);
+    mUidMap->updateMap(getElapsedRealtimeNs(), uid, version, app);
     VLOG("StatsService::informAllUidData succeeded");
 
     return Status::ok();
@@ -653,7 +680,7 @@
         return Status::fromExceptionCode(Status::EX_SECURITY,
                                          "Only system uid can call informOnePackage");
     }
-    mUidMap->updateApp(app, uid, version);
+    mUidMap->updateApp(getElapsedRealtimeNs(), app, uid, version);
     return Status::ok();
 }
 
@@ -664,7 +691,7 @@
         return Status::fromExceptionCode(Status::EX_SECURITY,
                                          "Only system uid can call informOnePackageRemoved");
     }
-    mUidMap->removeApp(app, uid);
+    mUidMap->removeApp(getElapsedRealtimeNs(), app, uid);
     mConfigManager->RemoveConfigs(uid);
     return Status::ok();
 }
@@ -677,7 +704,7 @@
                                          "Only system uid can call informAnomalyAlarmFired");
     }
 
-    uint64_t currentTimeSec = getElapsedRealtimeSec();
+    int64_t currentTimeSec = getElapsedRealtimeSec();
     std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet =
             mAnomalyAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
     if (alarmSet.size() > 0) {
@@ -698,7 +725,7 @@
                 "Only system uid can call informAlarmForSubscriberTriggeringFired");
     }
 
-    uint64_t currentTimeSec = getElapsedRealtimeSec();
+    int64_t currentTimeSec = getElapsedRealtimeSec();
     std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet =
             mPeriodicAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
     if (alarmSet.size() > 0) {
@@ -800,7 +827,8 @@
     VLOG("StatsService::getData with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid());
     if (checkCallingPermission(String16(kPermissionDump))) {
         ConfigKey configKey(ipc->getCallingUid(), key);
-        mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(), output);
+        mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(),
+                                 false /* include_current_bucket*/, output);
         return Status::ok();
     } else {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 8d2fd33..648e9c5 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -149,9 +149,9 @@
                                          uint32_t serial);
 
     /**
-     * Text output of dumpsys.
+     * Text or proto output of dumpsys.
      */
-    void dump_impl(FILE* out, bool verbose);
+    void dump_impl(FILE* out, bool verbose, bool proto);
 
     /**
      * Print usage information for the commands
@@ -262,6 +262,10 @@
     FRIEND_TEST(StatsServiceTest, TestAddConfig_simple);
     FRIEND_TEST(StatsServiceTest, TestAddConfig_empty);
     FRIEND_TEST(StatsServiceTest, TestAddConfig_invalid);
+    FRIEND_TEST(PartialBucketE2eTest, TestCountMetricNoSplitOnNewApp);
+    FRIEND_TEST(PartialBucketE2eTest, TestCountMetricSplitOnUpgrade);
+    FRIEND_TEST(PartialBucketE2eTest, TestCountMetricSplitOnRemoval);
+    FRIEND_TEST(PartialBucketE2eTest, TestCountMetricWithoutSplit);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/anomaly/AlarmTracker.cpp b/cmds/statsd/src/anomaly/AlarmTracker.cpp
index 249cb59..c8e406f 100644
--- a/cmds/statsd/src/anomaly/AlarmTracker.cpp
+++ b/cmds/statsd/src/anomaly/AlarmTracker.cpp
@@ -30,7 +30,8 @@
 namespace os {
 namespace statsd {
 
-AlarmTracker::AlarmTracker(uint64_t startMillis,
+AlarmTracker::AlarmTracker(const int64_t startMillis,
+                           const int64_t currentMillis,
                            const Alarm& alarm, const ConfigKey& configKey,
                            const sp<AlarmMonitor>& alarmMonitor)
     : mAlarmConfig(alarm),
@@ -38,7 +39,11 @@
       mAlarmMonitor(alarmMonitor) {
     VLOG("AlarmTracker() called");
     mAlarmSec = (startMillis + mAlarmConfig.offset_millis()) / MS_PER_SEC;
+    // startMillis is the time statsd is created. We need to find the 1st alarm timestamp after
+    // the config is added to statsd.
+    mAlarmSec = findNextAlarmSec(currentMillis / MS_PER_SEC);  // round up
     mInternalAlarm = new InternalAlarm{static_cast<uint32_t>(mAlarmSec)};
+    VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec);
     if (mAlarmMonitor != nullptr) {
         mAlarmMonitor->add(mInternalAlarm);
     }
@@ -55,25 +60,31 @@
     mSubscriptions.push_back(subscription);
 }
 
-uint64_t AlarmTracker::findNextAlarmSec(uint64_t currentTimeSec) {
-    int periodsForward = (currentTimeSec - mAlarmSec) * MS_PER_SEC / mAlarmConfig.period_millis();
-    return mAlarmSec + (periodsForward + 1) * mAlarmConfig.period_millis() / MS_PER_SEC;
+int64_t AlarmTracker::findNextAlarmSec(int64_t currentTimeSec) {
+    if (currentTimeSec <= mAlarmSec) {
+        return mAlarmSec;
+    }
+    int64_t periodsForward =
+        ((currentTimeSec - mAlarmSec) * MS_PER_SEC - 1) / mAlarmConfig.period_millis() + 1;
+    return mAlarmSec + periodsForward * mAlarmConfig.period_millis() / MS_PER_SEC;
 }
 
 void AlarmTracker::informAlarmsFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) {
     if (firedAlarms.empty() || mInternalAlarm == nullptr ||
         firedAlarms.find(mInternalAlarm) == firedAlarms.end()) {
         return;
     }
     if (!mSubscriptions.empty()) {
+        VLOG("AlarmTracker triggers the subscribers.");
         triggerSubscribers(mAlarmConfig.id(), DEFAULT_METRIC_DIMENSION_KEY, mConfigKey,
                            mSubscriptions);
     }
     firedAlarms.erase(mInternalAlarm);
     mAlarmSec = findNextAlarmSec((timestampNs-1) / NS_PER_SEC + 1); // round up
     mInternalAlarm = new InternalAlarm{static_cast<uint32_t>(mAlarmSec)};
+    VLOG("AlarmTracker sets the periodic alarm at: %lld", (long long)mAlarmSec);
     if (mAlarmMonitor != nullptr) {
         mAlarmMonitor->add(mInternalAlarm);
     }
diff --git a/cmds/statsd/src/anomaly/AlarmTracker.h b/cmds/statsd/src/anomaly/AlarmTracker.h
index 13180a5..2fb3e3b 100644
--- a/cmds/statsd/src/anomaly/AlarmTracker.h
+++ b/cmds/statsd/src/anomaly/AlarmTracker.h
@@ -34,7 +34,8 @@
 
 class AlarmTracker : public virtual RefBase {
 public:
-    AlarmTracker(uint64_t startMillis,
+    AlarmTracker(const int64_t startMillis,
+                 const int64_t currentMillis,
                  const Alarm& alarm, const ConfigKey& configKey,
                  const sp<AlarmMonitor>& subscriberAlarmMonitor);
 
@@ -44,22 +45,22 @@
 
     void addSubscription(const Subscription& subscription);
 
-    void informAlarmsFired(const uint64_t& timestampNs,
+    void informAlarmsFired(const int64_t& timestampNs,
             unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms);
 
 protected:
     // For test only. Returns the alarm timestamp in seconds. Otherwise returns 0.
-    inline uint32_t getAlarmTimestampSec() const {
+    inline int32_t getAlarmTimestampSec() const {
         return mInternalAlarm == nullptr ? 0 : mInternalAlarm->timestampSec;
     }
 
-    uint64_t findNextAlarmSec(uint64_t currentTimeMillis);
+    int64_t findNextAlarmSec(int64_t currentTimeMillis);
 
     // statsd_config.proto Alarm message that defines this tracker.
     const Alarm mAlarmConfig;
 
     // A reference to the Alarm's config key.
-    const ConfigKey& mConfigKey;
+    const ConfigKey mConfigKey;
 
     // The subscriptions that depend on this alarm.
     std::vector<Subscription> mSubscriptions;
@@ -68,7 +69,7 @@
     sp<AlarmMonitor> mAlarmMonitor;
 
     // The current expected alarm time in seconds.
-    uint64_t mAlarmSec;
+    int64_t mAlarmSec;
 
     // The current alarm.
     sp<const InternalAlarm> mInternalAlarm;
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
index f0960e3..f32efee 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
@@ -207,7 +207,7 @@
            getSumOverPastBuckets(key) + currentBucketValue > mAlert.trigger_if_sum_gt();
 }
 
-void AnomalyTracker::declareAnomaly(const uint64_t& timestampNs, const MetricDimensionKey& key) {
+void AnomalyTracker::declareAnomaly(const int64_t& timestampNs, const MetricDimensionKey& key) {
     // TODO: Why receive timestamp? RefractoryPeriod should always be based on real time right now.
     if (isInRefractoryPeriod(timestampNs, key)) {
         VLOG("Skipping anomaly declaration since within refractory period");
@@ -235,7 +235,7 @@
                                mConfigKey.GetId(), mAlert.id());
 }
 
-void AnomalyTracker::detectAndDeclareAnomaly(const uint64_t& timestampNs,
+void AnomalyTracker::detectAndDeclareAnomaly(const int64_t& timestampNs,
                                              const int64_t& currBucketNum,
                                              const MetricDimensionKey& key,
                                              const int64_t& currentBucketValue) {
@@ -244,11 +244,11 @@
     }
 }
 
-bool AnomalyTracker::isInRefractoryPeriod(const uint64_t& timestampNs,
+bool AnomalyTracker::isInRefractoryPeriod(const int64_t& timestampNs,
                                           const MetricDimensionKey& key) const {
     const auto& it = mRefractoryPeriodEndsSec.find(key);
     if (it != mRefractoryPeriodEndsSec.end()) {
-        return timestampNs < it->second * NS_PER_SEC;
+        return timestampNs < (it->second *  (int64_t)NS_PER_SEC);
     }
     return false;
 }
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.h b/cmds/statsd/src/anomaly/AnomalyTracker.h
index ae0af64..927e2df 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.h
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.h
@@ -67,13 +67,13 @@
                        const int64_t& currentBucketValue);
 
     // Informs incidentd about the detected alert.
-    void declareAnomaly(const uint64_t& timestampNs, const MetricDimensionKey& key);
+    void declareAnomaly(const int64_t& timestampNs, const MetricDimensionKey& key);
 
     // Detects if, based on past buckets plus the new currentBucketValue (which generally
     // represents the partially-filled current bucket), an anomaly has happened, and if so,
     // declares an anomaly and informs relevant subscribers.
     // Also advances to currBucketNum-1.
-    void detectAndDeclareAnomaly(const uint64_t& timestampNs, const int64_t& currBucketNum,
+    void detectAndDeclareAnomaly(const int64_t& timestampNs, const int64_t& currBucketNum,
                                  const MetricDimensionKey& key, const int64_t& currentBucketValue);
 
     // Init the AlarmMonitor which is shared across anomaly trackers.
@@ -107,7 +107,7 @@
 
     // Declares an anomaly for each alarm in firedAlarms that belongs to this AnomalyTracker,
     // and removes it from firedAlarms. Does NOT remove the alarm from the AlarmMonitor.
-    virtual void informAlarmsFired(const uint64_t& timestampNs,
+    virtual void informAlarmsFired(const int64_t& timestampNs,
             unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) {
         return; // The base AnomalyTracker class doesn't have alarms.
     }
@@ -127,7 +127,7 @@
     std::vector<Subscription> mSubscriptions;
 
     // A reference to the Alert's config key.
-    const ConfigKey& mConfigKey;
+    const ConfigKey mConfigKey;
 
     // Number of past buckets. One less than the total number of buckets needed
     // for the anomaly detection (since the current bucket is not in the past).
@@ -166,7 +166,7 @@
     void subtractValueFromSum(const MetricDimensionKey& key, const int64_t& bucketValue);
 
     // Returns true if in the refractory period, else false.
-    bool isInRefractoryPeriod(const uint64_t& timestampNs, const MetricDimensionKey& key) const;
+    bool isInRefractoryPeriod(const int64_t& timestampNs, const MetricDimensionKey& key) const;
 
     // Calculates the corresponding bucket index within the circular array.
     // Requires bucketNum >= 0.
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
index cdc4251..3acfd17 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.cpp
@@ -36,7 +36,7 @@
 }
 
 void DurationAnomalyTracker::startAlarm(const MetricDimensionKey& dimensionKey,
-                                        const uint64_t& timestampNs) {
+                                        const int64_t& timestampNs) {
     // Alarms are stored in secs. Must round up, since if it fires early, it is ignored completely.
     uint32_t timestampSec = static_cast<uint32_t>((timestampNs -1) / NS_PER_SEC) + 1; // round up
     if (isInRefractoryPeriod(timestampNs, dimensionKey)) {
@@ -57,14 +57,14 @@
 }
 
 void DurationAnomalyTracker::stopAlarm(const MetricDimensionKey& dimensionKey,
-                                       const uint64_t& timestampNs) {
+                                       const int64_t& timestampNs) {
     const auto itr = mAlarms.find(dimensionKey);
     if (itr == mAlarms.end()) {
         return;
     }
 
     // If the alarm is set in the past but hasn't fired yet (due to lag), catch it now.
-    if (itr->second != nullptr && timestampNs >= NS_PER_SEC * itr->second->timestampSec) {
+    if (itr->second != nullptr && timestampNs >= (int64_t)NS_PER_SEC * itr->second->timestampSec) {
         declareAnomaly(timestampNs, dimensionKey);
     }
     if (mAlarmMonitor != nullptr) {
@@ -82,7 +82,7 @@
     mAlarms.clear();
 }
 
-void DurationAnomalyTracker::informAlarmsFired(const uint64_t& timestampNs,
+void DurationAnomalyTracker::informAlarmsFired(const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) {
 
     if (firedAlarms.empty() || mAlarms.empty()) return;
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
index 53155d9..686d8f9 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
@@ -34,12 +34,12 @@
 
     // Sets an alarm for the given timestamp.
     // Replaces previous alarm if one already exists.
-    void startAlarm(const MetricDimensionKey& dimensionKey, const uint64_t& eventTime);
+    void startAlarm(const MetricDimensionKey& dimensionKey, const int64_t& eventTime);
 
     // Stops the alarm.
     // If it should have already fired, but hasn't yet (e.g. because the AlarmManager is delayed),
     // declare the anomaly now.
-    void stopAlarm(const MetricDimensionKey& dimensionKey, const uint64_t& timestampNs);
+    void stopAlarm(const MetricDimensionKey& dimensionKey, const int64_t& timestampNs);
 
     // Stop all the alarms owned by this tracker. Does not declare any anomalies.
     void cancelAllAlarms();
@@ -48,7 +48,7 @@
     // and removes it from firedAlarms. The AlarmMonitor is not informed.
     // Note that this will generally be called from a different thread from the other functions;
     // the caller is responsible for thread safety.
-    void informAlarmsFired(const uint64_t& timestampNs,
+    void informAlarmsFired(const int64_t& timestampNs,
             unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& firedAlarms) override;
 
 protected:
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 7fe8e62..ab9c7e8 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -108,7 +108,7 @@
         ResourceConfigurationChanged resource_configuration_changed = 66;
         BluetoothEnabledStateChanged bluetooth_enabled_state_changed = 67;
         BluetoothConnectionStateChanged bluetooth_connection_state_changed = 68;
-        BluetoothA2dpAudioStateChanged bluetooth_a2dp_audio_state_changed = 69;
+        // 69 is blank but need not be.
         UsbConnectorStateChanged usb_connector_state_changed = 70;
         SpeakerImpedanceReported speaker_impedance_reported = 71;
         HardwareFailed hardware_failed = 72;
@@ -1008,22 +1008,6 @@
 }
 
 /**
- * Logs when Bluetooth A2dp audio streaming state changes.
- *
- * Logged from:
- *    TODO(b/73971848)
- */
-message BluetoothA2dpAudioStateChanged {
-    // Whether or not audio is being played using Bluetooth A2dp.
-    enum State {
-        UNKNOWN = 0;
-        PLAY = 1;
-        STOP = 2;
-    }
-    optional State state = 1;
-}
-
-/**
  * Logs when something is plugged into or removed from the USB-C connector.
  *
  * Logged from:
@@ -1225,6 +1209,22 @@
 
     // The pid if available. -1 means not available.
     optional sint32 pid = 4;
+
+    optional string package_name = 5;
+
+    enum InstantApp {
+        UNAVAILABLE = 0;
+        FALSE = 1;
+        TRUE = 2;
+    }
+    optional InstantApp is_instant_app = 6;
+
+    enum ForegroundState {
+        UNKNOWN = 0;
+        BACKGROUND = 1;
+        FOREGROUND = 2;
+    }
+    optional ForegroundState foreground_state = 7;
 }
 
 /**
@@ -1266,6 +1266,20 @@
     optional string short_component_name = 3;
 
     optional string reason = 4;
+
+    enum InstantApp {
+        UNAVAILABLE = 0;
+        FALSE = 1;
+        TRUE = 2;
+    }
+    optional InstantApp is_instant_app = 5;
+
+    enum ForegroundState {
+        UNKNOWN = 0;
+        BACKGROUND = 1;
+        FOREGROUND = 2;
+    }
+    optional ForegroundState foreground_state = 6;
 }
 
 /*
diff --git a/cmds/statsd/src/config/ConfigListener.h b/cmds/statsd/src/config/ConfigListener.h
index 19ccfcf..54e7770 100644
--- a/cmds/statsd/src/config/ConfigListener.h
+++ b/cmds/statsd/src/config/ConfigListener.h
@@ -40,7 +40,8 @@
     /**
      * A configuration was added or updated.
      */
-    virtual void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config) = 0;
+    virtual void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
+                                 const StatsdConfig& config) = 0;
 
     /**
      * A configuration was removed.
diff --git a/cmds/statsd/src/config/ConfigManager.cpp b/cmds/statsd/src/config/ConfigManager.cpp
index ff25091..16b7e79 100644
--- a/cmds/statsd/src/config/ConfigManager.cpp
+++ b/cmds/statsd/src/config/ConfigManager.cpp
@@ -21,7 +21,9 @@
 #include "storage/StorageManager.h"
 
 #include "guardrail/StatsdStats.h"
+#include "stats_log_util.h"
 #include "stats_util.h"
+#include "stats_log_util.h"
 
 #include <android-base/file.h>
 #include <dirent.h>
@@ -109,9 +111,10 @@
         }
     }
 
+    const int64_t timestampNs = getElapsedRealtimeNs();
     // Tell everyone
-    for (sp<ConfigListener> listener:broadcastList) {
-        listener->OnConfigUpdated(key, config);
+    for (sp<ConfigListener> listener : broadcastList) {
+        listener->OnConfigUpdated(timestampNs, key, config);
     }
 }
 
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index 22ff942..b589d0d 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -49,20 +49,25 @@
 const int FIELD_ID_ANOMALY_ALARM_STATS = 9;
 // const int FIELD_ID_PULLED_ATOM_STATS = 10; // The proto is written in stats_log_util.cpp
 const int FIELD_ID_LOGGER_ERROR_STATS = 11;
-const int FIELD_ID_SUBSCRIBER_ALARM_STATS = 12;
+const int FIELD_ID_PERIODIC_ALARM_STATS = 12;
+const int FIELD_ID_SKIPPED_LOG_EVENT_STATS = 13;
 
 const int FIELD_ID_ATOM_STATS_TAG = 1;
 const int FIELD_ID_ATOM_STATS_COUNT = 2;
 
 const int FIELD_ID_ANOMALY_ALARMS_REGISTERED = 1;
-const int FIELD_ID_SUBSCRIBER_ALARMS_REGISTERED = 1;
+const int FIELD_ID_PERIODIC_ALARMS_REGISTERED = 1;
 
 const int FIELD_ID_LOGGER_STATS_TIME = 1;
 const int FIELD_ID_LOGGER_STATS_ERROR_CODE = 2;
 
+const int FIELD_ID_SKIPPED_LOG_EVENT_STATS_TAG = 1;
+const int FIELD_ID_SKIPPED_LOG_EVENT_STATS_TIMESTAMP = 2;
+
 const int FIELD_ID_CONFIG_STATS_UID = 1;
 const int FIELD_ID_CONFIG_STATS_ID = 2;
 const int FIELD_ID_CONFIG_STATS_CREATION = 3;
+const int FIELD_ID_CONFIG_STATS_RESET = 19;
 const int FIELD_ID_CONFIG_STATS_DELETION = 4;
 const int FIELD_ID_CONFIG_STATS_METRIC_COUNT = 5;
 const int FIELD_ID_CONFIG_STATS_CONDITION_COUNT = 6;
@@ -71,12 +76,16 @@
 const int FIELD_ID_CONFIG_STATS_VALID = 9;
 const int FIELD_ID_CONFIG_STATS_BROADCAST = 10;
 const int FIELD_ID_CONFIG_STATS_DATA_DROP = 11;
-const int FIELD_ID_CONFIG_STATS_DUMP_REPORT = 12;
+const int FIELD_ID_CONFIG_STATS_DUMP_REPORT_TIME = 12;
+const int FIELD_ID_CONFIG_STATS_DUMP_REPORT_BYTES = 20;
 const int FIELD_ID_CONFIG_STATS_MATCHER_STATS = 13;
 const int FIELD_ID_CONFIG_STATS_CONDITION_STATS = 14;
 const int FIELD_ID_CONFIG_STATS_METRIC_STATS = 15;
 const int FIELD_ID_CONFIG_STATS_ALERT_STATS = 16;
 const int FIELD_ID_CONFIG_STATS_METRIC_DIMENSION_IN_CONDITION_STATS = 17;
+const int FIELD_ID_CONFIG_STATS_ANNOTATION = 18;
+const int FIELD_ID_CONFIG_STATS_ANNOTATION_INT64 = 1;
+const int FIELD_ID_CONFIG_STATS_ANNOTATION_INT32 = 2;
 
 const int FIELD_ID_MATCHER_STATS_ID = 1;
 const int FIELD_ID_MATCHER_STATS_COUNT = 2;
@@ -87,11 +96,10 @@
 const int FIELD_ID_ALERT_STATS_ID = 1;
 const int FIELD_ID_ALERT_STATS_COUNT = 2;
 
-const int FIELD_ID_UID_MAP_SNAPSHOTS = 1;
-const int FIELD_ID_UID_MAP_CHANGES = 2;
-const int FIELD_ID_UID_MAP_BYTES_USED = 3;
-const int FIELD_ID_UID_MAP_DROPPED_SNAPSHOTS = 4;
-const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 5;
+const int FIELD_ID_UID_MAP_CHANGES = 1;
+const int FIELD_ID_UID_MAP_BYTES_USED = 2;
+const int FIELD_ID_UID_MAP_DROPPED_CHANGES = 3;
+const int FIELD_ID_UID_MAP_DELETED_APPS = 4;
 
 const std::map<int, std::pair<size_t, size_t>> StatsdStats::kAtomDimensionKeySizeLimitMap = {
         {android::util::CPU_TIME_PER_UID_FREQ, {6000, 10000}},
@@ -116,8 +124,10 @@
     mIceBox.push_back(stats);
 }
 
-void StatsdStats::noteConfigReceived(const ConfigKey& key, int metricsCount, int conditionsCount,
-                                     int matchersCount, int alertsCount, bool isValid) {
+void StatsdStats::noteConfigReceived(
+        const ConfigKey& key, int metricsCount, int conditionsCount, int matchersCount,
+        int alertsCount, const std::list<std::pair<const int64_t, const int32_t>>& annotations,
+        bool isValid) {
     lock_guard<std::mutex> lock(mLock);
     int32_t nowTimeSec = getWallClockSec();
 
@@ -133,6 +143,9 @@
     configStats->matcher_count = matchersCount;
     configStats->alert_count = alertsCount;
     configStats->is_valid = isValid;
+    for (auto& v : annotations) {
+        configStats->annotations.emplace_back(v);
+    }
 
     if (isValid) {
         mConfigStats[key] = configStats;
@@ -157,6 +170,18 @@
     noteConfigRemovedInternalLocked(key);
 }
 
+void StatsdStats::noteConfigResetInternalLocked(const ConfigKey& key) {
+    auto it = mConfigStats.find(key);
+    if (it != mConfigStats.end()) {
+        it->second->reset_time_sec = getWallClockSec();
+    }
+}
+
+void StatsdStats::noteConfigReset(const ConfigKey& key) {
+    lock_guard<std::mutex> lock(mLock);
+    noteConfigResetInternalLocked(key);
+}
+
 void StatsdStats::noteBroadcastSent(const ConfigKey& key) {
     noteBroadcastSent(key, getWallClockSec());
 }
@@ -191,32 +216,32 @@
     it->second->data_drop_time_sec.push_back(timeSec);
 }
 
-void StatsdStats::noteMetricsReportSent(const ConfigKey& key) {
-    noteMetricsReportSent(key, getWallClockSec());
+void StatsdStats::noteMetricsReportSent(const ConfigKey& key, const size_t num_bytes) {
+    noteMetricsReportSent(key, num_bytes, getWallClockSec());
 }
 
-void StatsdStats::noteMetricsReportSent(const ConfigKey& key, int32_t timeSec) {
+void StatsdStats::noteMetricsReportSent(const ConfigKey& key, const size_t num_bytes,
+                                        int32_t timeSec) {
     lock_guard<std::mutex> lock(mLock);
     auto it = mConfigStats.find(key);
     if (it == mConfigStats.end()) {
         ALOGE("Config key %s not found!", key.ToString().c_str());
         return;
     }
-    if (it->second->dump_report_time_sec.size() == kMaxTimestampCount) {
-        it->second->dump_report_time_sec.pop_front();
+    if (it->second->dump_report_stats.size() == kMaxTimestampCount) {
+        it->second->dump_report_stats.pop_front();
     }
-    it->second->dump_report_time_sec.push_back(timeSec);
+    it->second->dump_report_stats.push_back(std::make_pair(timeSec, num_bytes));
 }
 
-void StatsdStats::noteUidMapDropped(int snapshots, int deltas) {
+void StatsdStats::noteUidMapDropped(int deltas) {
     lock_guard<std::mutex> lock(mLock);
-    mUidMapStats.dropped_snapshots += mUidMapStats.dropped_snapshots + snapshots;
     mUidMapStats.dropped_changes += mUidMapStats.dropped_changes + deltas;
 }
 
-void StatsdStats::setUidMapSnapshots(int snapshots) {
+void StatsdStats::noteUidMapAppDeletionDropped() {
     lock_guard<std::mutex> lock(mLock);
-    mUidMapStats.snapshots = snapshots;
+    mUidMapStats.deleted_apps++;
 }
 
 void StatsdStats::setUidMapChanges(int changes) {
@@ -325,6 +350,15 @@
     mPushedAtomStats[atomId]++;
 }
 
+void StatsdStats::noteLogEventSkipped(int tag, int64_t timestamp) {
+    lock_guard<std::mutex> lock(mLock);
+    // grows strictly one at a time. so it won't > kMaxSkippedLogEvents
+    if (mSkippedLogEvents.size() == kMaxSkippedLogEvents) {
+        mSkippedLogEvents.pop_front();
+    }
+    mSkippedLogEvents.push_back(std::make_pair(tag, timestamp));
+}
+
 void StatsdStats::noteLoggerError(int error) {
     lock_guard<std::mutex> lock(mLock);
     // grows strictly one at a time. so it won't > kMaxLoggerErrors
@@ -347,10 +381,12 @@
     mAnomalyAlarmRegisteredStats = 0;
     mPeriodicAlarmRegisteredStats = 0;
     mLoggerErrors.clear();
+    mSkippedLogEvents.clear();
     for (auto& config : mConfigStats) {
         config.second->broadcast_sent_time_sec.clear();
         config.second->data_drop_time_sec.clear();
-        config.second->dump_report_time_sec.clear();
+        config.second->dump_report_stats.clear();
+        config.second->annotations.clear();
         config.second->matcher_stats.clear();
         config.second->condition_stats.clear();
         config.second->metric_stats.clear();
@@ -369,10 +405,11 @@
     fprintf(out, "%lu Config in icebox: \n", (unsigned long)mIceBox.size());
     for (const auto& configStats : mIceBox) {
         fprintf(out,
-                "Config {%d_%lld}: creation=%d, deletion=%d, #metric=%d, #condition=%d, "
+                "Config {%d_%lld}: creation=%d, deletion=%d, reset=%d, #metric=%d, #condition=%d, "
                 "#matcher=%d, #alert=%d,  valid=%d\n",
                 configStats->uid, (long long)configStats->id, configStats->creation_time_sec,
-                configStats->deletion_time_sec, configStats->metric_count,
+                configStats->deletion_time_sec, configStats->reset_time_sec,
+                configStats->metric_count,
                 configStats->condition_count, configStats->matcher_count, configStats->alert_count,
                 configStats->is_valid);
 
@@ -394,6 +431,11 @@
                 configStats->deletion_time_sec, configStats->metric_count,
                 configStats->condition_count, configStats->matcher_count, configStats->alert_count,
                 configStats->is_valid);
+        for (const auto& annotation : configStats->annotations) {
+            fprintf(out, "\tannotation: %lld, %d\n", (long long)annotation.first,
+                    annotation.second);
+        }
+
         for (const auto& broadcastTime : configStats->broadcast_sent_time_sec) {
             fprintf(out, "\tbroadcast time: %d\n", broadcastTime);
         }
@@ -402,8 +444,8 @@
             fprintf(out, "\tdata drop time: %d\n", dataDropTime);
         }
 
-        for (const auto& dumpTime : configStats->dump_report_time_sec) {
-            fprintf(out, "\tdump report time: %d\n", dumpTime);
+        for (const auto& dump : configStats->dump_report_stats) {
+            fprintf(out, "\tdump report time: %d bytes: %lld\n", dump.first, (long long)dump.second);
         }
 
         for (const auto& stats : pair.second->matcher_stats) {
@@ -450,11 +492,9 @@
         fprintf(out, "Subscriber alarm registrations: %d\n", mPeriodicAlarmRegisteredStats);
     }
 
-    fprintf(out,
-            "UID map stats: bytes=%d, snapshots=%d, changes=%d, snapshots lost=%d, changes "
-            "lost=%d\n",
-            mUidMapStats.bytes_used, mUidMapStats.snapshots, mUidMapStats.changes,
-            mUidMapStats.dropped_snapshots, mUidMapStats.dropped_changes);
+    fprintf(out, "UID map stats: bytes=%d, changes=%d, deleted=%d, changes lost=%d\n",
+            mUidMapStats.bytes_used, mUidMapStats.changes, mUidMapStats.deleted_apps,
+            mUidMapStats.dropped_changes);
 
     for (const auto& error : mLoggerErrors) {
         time_t error_time = error.first;
@@ -463,6 +503,9 @@
         strftime(buffer, sizeof(buffer), "%Y-%m-%d %I:%M%p\n", error_tm);
         fprintf(out, "Logger error %d at %s\n", error.second, buffer);
     }
+    for (const auto& skipped : mSkippedLogEvents) {
+        fprintf(out, "Log event (%d) skipped at %lld\n", skipped.first, (long long)skipped.second);
+    }
 }
 
 void addConfigStatsToProto(const ConfigStats& configStats, ProtoOutputStream* proto) {
@@ -471,6 +514,9 @@
     proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_UID, configStats.uid);
     proto->write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_STATS_ID, (long long)configStats.id);
     proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_CREATION, configStats.creation_time_sec);
+    if (configStats.reset_time_sec != 0) {
+        proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_RESET, configStats.reset_time_sec);
+    }
     if (configStats.deletion_time_sec != 0) {
         proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_DELETION,
                      configStats.deletion_time_sec);
@@ -492,9 +538,25 @@
                      drop);
     }
 
-    for (const auto& dump : configStats.dump_report_time_sec) {
-        proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_DUMP_REPORT | FIELD_COUNT_REPEATED,
-                     dump);
+    for (const auto& dump : configStats.dump_report_stats) {
+        proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_DUMP_REPORT_TIME |
+                     FIELD_COUNT_REPEATED,
+                     dump.first);
+    }
+
+    for (const auto& dump : configStats.dump_report_stats) {
+        proto->write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_STATS_DUMP_REPORT_BYTES |
+                     FIELD_COUNT_REPEATED,
+                     (long long)dump.second);
+    }
+
+    for (const auto& annotation : configStats.annotations) {
+        uint64_t token = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+                                      FIELD_ID_CONFIG_STATS_ANNOTATION);
+        proto->write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_STATS_ANNOTATION_INT64,
+                     (long long)annotation.first);
+        proto->write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_STATS_ANNOTATION_INT32, annotation.second);
+        proto->end(token);
     }
 
     for (const auto& pair : configStats.matcher_stats) {
@@ -577,19 +639,17 @@
     }
 
     if (mPeriodicAlarmRegisteredStats > 0) {
-        uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_SUBSCRIBER_ALARM_STATS);
-        proto.write(FIELD_TYPE_INT32 | FIELD_ID_SUBSCRIBER_ALARMS_REGISTERED,
+        uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_PERIODIC_ALARM_STATS);
+        proto.write(FIELD_TYPE_INT32 | FIELD_ID_PERIODIC_ALARMS_REGISTERED,
                     mPeriodicAlarmRegisteredStats);
         proto.end(token);
     }
 
     uint64_t uidMapToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_UIDMAP_STATS);
-    proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_SNAPSHOTS, mUidMapStats.snapshots);
     proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_CHANGES, mUidMapStats.changes);
     proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_BYTES_USED, mUidMapStats.bytes_used);
-    proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_DROPPED_SNAPSHOTS,
-                mUidMapStats.dropped_snapshots);
     proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_DROPPED_CHANGES, mUidMapStats.dropped_changes);
+    proto.write(FIELD_TYPE_INT32 | FIELD_ID_UID_MAP_DELETED_APPS, mUidMapStats.deleted_apps);
     proto.end(uidMapToken);
 
     for (const auto& error : mLoggerErrors) {
@@ -600,6 +660,15 @@
         proto.end(token);
     }
 
+    for (const auto& skipped : mSkippedLogEvents) {
+        uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_SKIPPED_LOG_EVENT_STATS |
+                                      FIELD_COUNT_REPEATED);
+        proto.write(FIELD_TYPE_INT32 | FIELD_ID_SKIPPED_LOG_EVENT_STATS_TAG, skipped.first);
+        proto.write(FIELD_TYPE_INT64 | FIELD_ID_SKIPPED_LOG_EVENT_STATS_TIMESTAMP,
+                    (long long)skipped.second);
+        proto.end(token);
+    }
+
     output->clear();
     size_t bufferSize = proto.size();
     output->resize(bufferSize);
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index bd395c4..123a703 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -34,6 +34,7 @@
     int64_t id;
     int32_t creation_time_sec;
     int32_t deletion_time_sec = 0;
+    int32_t reset_time_sec = 0;
     int32_t metric_count;
     int32_t condition_count;
     int32_t matcher_count;
@@ -42,7 +43,7 @@
 
     std::list<int32_t> broadcast_sent_time_sec;
     std::list<int32_t> data_drop_time_sec;
-    std::list<int32_t> dump_report_time_sec;
+    std::list<std::pair<int32_t, int64_t>> dump_report_stats;
 
     // Stores how many times a matcher have been matched. The map size is capped by kMaxConfigCount.
     std::map<const int64_t, int> matcher_stats;
@@ -66,14 +67,16 @@
     // Stores the number of times an anomaly detection alert has been declared.
     // The map size is capped by kMaxConfigCount.
     std::map<const int64_t, int> alert_stats;
+
+    // Stores the config ID for each sub-config used.
+    std::list<std::pair<const int64_t, const int32_t>> annotations;
 };
 
 struct UidMapStats {
-    int32_t snapshots;
     int32_t changes;
     int32_t bytes_used;
-    int32_t dropped_snapshots;
     int32_t dropped_changes;
+    int32_t deleted_apps = 0;
 };
 
 // Keeps track of stats of statsd.
@@ -101,6 +104,8 @@
 
     const static int kMaxLoggerErrors = 10;
 
+    const static int kMaxSkippedLogEvents = 200;
+
     const static int kMaxTimestampCount = 20;
 
     const static int kMaxLogSourceCount = 50;
@@ -117,11 +122,14 @@
     // is critical for understanding the metrics.
     const static size_t kMaxBytesUsedUidMap = 50 * 1024;
 
+    // The number of deleted apps that are stored in the uid map.
+    const static int kMaxDeletedAppsInUidMap = 100;
+
     /* Minimum period between two broadcasts in nanoseconds. */
-    static const unsigned long long kMinBroadcastPeriodNs = 60 * NS_PER_SEC;
+    static const int64_t kMinBroadcastPeriodNs = 60 * NS_PER_SEC;
 
     /* Min period between two checks of byte size per config key in nanoseconds. */
-    static const unsigned long long kMinByteSizeCheckPeriodNs = 10 * NS_PER_SEC;
+    static const int64_t kMinByteSizeCheckPeriodNs = 10 * NS_PER_SEC;
 
     // Maximum age (30 days) that files on disk can exist in seconds.
     static const int kMaxAgeSecond = 60 * 60 * 24 * 30;
@@ -142,11 +150,17 @@
      * If the config is not valid, this config stats will be put into icebox immediately.
      */
     void noteConfigReceived(const ConfigKey& key, int metricsCount, int conditionsCount,
-                            int matchersCount, int alertCount, bool isValid);
+                            int matchersCount, int alertCount,
+                            const std::list<std::pair<const int64_t, const int32_t>>& annotations,
+                            bool isValid);
     /**
      * Report a config has been removed.
      */
     void noteConfigRemoved(const ConfigKey& key);
+   /**
+     * Report a config has been reset when ttl expires.
+     */
+    void noteConfigReset(const ConfigKey& key);
 
     /**
      * Report a broadcast has been sent to a config owner to collect the data.
@@ -163,7 +177,7 @@
      *
      * The report may be requested via StatsManager API, or through adb cmd.
      */
-    void noteMetricsReportSent(const ConfigKey& key);
+    void noteMetricsReportSent(const ConfigKey& key, const size_t num_bytes);
 
     /**
      * Report the size of output tuple of a condition.
@@ -234,14 +248,18 @@
     void noteRegisteredPeriodicAlarmChanged();
 
     /**
-     * Records the number of snapshot and delta entries that are being dropped from the uid map.
+     * Records the number of delta entries that are being dropped from the uid map.
      */
-    void noteUidMapDropped(int snapshots, int deltas);
+    void noteUidMapDropped(int deltas);
 
     /**
-     * Updates the number of snapshots currently stored in the uid map.
+     * Records that an app was deleted (from statsd's map).
      */
-    void setUidMapSnapshots(int snapshots);
+    void noteUidMapAppDeletionDropped();
+
+    /**
+     * Updates the number of changes currently stored in the uid map.
+     */
     void setUidMapChanges(int changes);
     void setCurrentUidMapMemory(int bytes);
 
@@ -260,6 +278,11 @@
     void noteLoggerError(int error);
 
     /**
+     * Records statsd skipped an event.
+     */
+    void noteLogEventSkipped(int tag, int64_t timestamp);
+
+    /**
      * 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.
@@ -314,6 +337,9 @@
     // Logd errors. Size capped by kMaxLoggerErrors.
     std::list<const std::pair<int, int>> mLoggerErrors;
 
+    // Skipped log events.
+    std::list<const std::pair<int, int64_t>> mSkippedLogEvents;
+
     // Stores the number of times statsd modified the anomaly alarm registered with
     // StatsCompanionService.
     int mAnomalyAlarmRegisteredStats = 0;
@@ -321,6 +347,7 @@
     // Stores the number of times statsd registers the periodic alarm changes
     int mPeriodicAlarmRegisteredStats = 0;
 
+    void noteConfigResetInternalLocked(const ConfigKey& key);
 
     void noteConfigRemovedInternalLocked(const ConfigKey& key);
 
@@ -328,7 +355,7 @@
 
     void noteDataDropped(const ConfigKey& key, int32_t timeSec);
 
-    void noteMetricsReportSent(const ConfigKey& key, int32_t timeSec);
+    void noteMetricsReportSent(const ConfigKey& key, const size_t num_bytes, int32_t timeSec);
 
     void noteBroadcastSent(const ConfigKey& key, int32_t timeSec);
 
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp
index afa5140..c77e07b 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp
@@ -59,7 +59,7 @@
 CountMetricProducer::CountMetricProducer(const ConfigKey& key, const CountMetric& metric,
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard,
-                                         const uint64_t startTimeNs)
+                                         const int64_t startTimeNs)
     : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard) {
     // TODO: evaluate initial conditions. and set mConditionMet.
     if (metric.has_bucket()) {
@@ -118,13 +118,18 @@
 }
 
 void CountMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                           const uint64_t eventTime) {
+                                                           const int64_t eventTime) {
     VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
 }
 
-void CountMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
+void CountMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
+                                             const bool include_current_partial_bucket,
                                              ProtoOutputStream* protoOutput) {
-    flushIfNeededLocked(dumpTimeNs);
+    if (include_current_partial_bucket) {
+        flushLocked(dumpTimeNs);
+    } else {
+        flushIfNeededLocked(dumpTimeNs);
+    }
     if (mPastBuckets.empty()) {
         return;
     }
@@ -173,13 +178,13 @@
     mPastBuckets.clear();
 }
 
-void CountMetricProducer::dropDataLocked(const uint64_t dropTimeNs) {
+void CountMetricProducer::dropDataLocked(const int64_t dropTimeNs) {
     flushIfNeededLocked(dropTimeNs);
     mPastBuckets.clear();
 }
 
 void CountMetricProducer::onConditionChangedLocked(const bool conditionMet,
-                                                   const uint64_t eventTime) {
+                                                   const int64_t eventTime) {
     VLOG("Metric %lld onConditionChanged", (long long)mMetricId);
     mCondition = conditionMet;
 }
@@ -208,7 +213,7 @@
         const size_t matcherIndex, const MetricDimensionKey& eventKey,
         const ConditionKey& conditionKey, bool condition,
         const LogEvent& event) {
-    uint64_t eventTimeNs = event.GetElapsedTimestampNs();
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
     flushIfNeededLocked(eventTimeNs);
 
     if (condition == false) {
@@ -244,23 +249,23 @@
 
 // When a new matched event comes in, we check if event falls into the current
 // bucket. If not, flush the old counter to past buckets and initialize the new bucket.
-void CountMetricProducer::flushIfNeededLocked(const uint64_t& eventTimeNs) {
-    uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void CountMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) {
+    int64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
     if (eventTimeNs < currentBucketEndTimeNs) {
         return;
     }
 
     flushCurrentBucketLocked(eventTimeNs);
     // Setup the bucket start time and number.
-    uint64_t numBucketsForward = 1 + (eventTimeNs - currentBucketEndTimeNs) / mBucketSizeNs;
+    int64_t numBucketsForward = 1 + (eventTimeNs - currentBucketEndTimeNs) / mBucketSizeNs;
     mCurrentBucketStartTimeNs = currentBucketEndTimeNs + (numBucketsForward - 1) * mBucketSizeNs;
     mCurrentBucketNum += numBucketsForward;
     VLOG("metric %lld: new bucket start time: %lld", (long long)mMetricId,
          (long long)mCurrentBucketStartTimeNs);
 }
 
-void CountMetricProducer::flushCurrentBucketLocked(const uint64_t& eventTimeNs) {
-    uint64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void CountMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
+    int64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
     CountBucket info;
     info.mBucketStartNs = mCurrentBucketStartTimeNs;
     if (eventTimeNs < fullBucketEndTimeNs) {
diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h
index fd9f0e0..cafc882 100644
--- a/cmds/statsd/src/metrics/CountMetricProducer.h
+++ b/cmds/statsd/src/metrics/CountMetricProducer.h
@@ -43,7 +43,7 @@
     // TODO: Pass in the start time from MetricsManager, it should be consistent for all metrics.
     CountMetricProducer(const ConfigKey& key, const CountMetric& countMetric,
                         const int conditionIndex, const sp<ConditionWizard>& wizard,
-                        const uint64_t startTimeNs);
+                        const int64_t startTimeNs);
 
     virtual ~CountMetricProducer();
 
@@ -54,26 +54,28 @@
             const LogEvent& event) override;
 
 private:
-    void onDumpReportLocked(const uint64_t dumpTimeNs,
+
+    void onDumpReportLocked(const int64_t dumpTimeNs,
+                            const bool include_current_partial_bucket,
                             android::util::ProtoOutputStream* protoOutput) override;
 
     // Internal interface to handle condition change.
-    void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
+    void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
 
     // Internal interface to handle sliced condition change.
-    void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
+    void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
 
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
 
     void dumpStatesLocked(FILE* out, bool verbose) const override;
 
-    void dropDataLocked(const uint64_t dropTimeNs) override;
+    void dropDataLocked(const int64_t dropTimeNs) override;
 
     // Util function to flush the old packet.
-    void flushIfNeededLocked(const uint64_t& newEventTime) override;
+    void flushIfNeededLocked(const int64_t& newEventTime) override;
 
-    void flushCurrentBucketLocked(const uint64_t& eventTimeNs) override;
+    void flushCurrentBucketLocked(const int64_t& eventTimeNs) override;
 
     // TODO: Add a lock to mPastBuckets.
     std::unordered_map<MetricDimensionKey, std::vector<CountBucket>> mPastBuckets;
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
index f02f307..3125fa7 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp
@@ -61,7 +61,7 @@
                                                const bool nesting,
                                                const sp<ConditionWizard>& wizard,
                                                const FieldMatcher& internalDimensions,
-                                               const uint64_t startTimeNs)
+                                               const int64_t startTimeNs)
     : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard),
       mAggregationType(metric.aggregation_type()),
       mStartIndex(startIndex),
@@ -170,7 +170,7 @@
 // 2. No condition in dimension
 // 3. The links covers all dimension fields in the sliced child condition predicate.
 void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt1(bool condition,
-                                                                   const uint64_t eventTime) {
+                                                                   const int64_t eventTime) {
     if (mMetric2ConditionLinks.size() != 1 ||
         !mHasLinksToAllConditionDimensionsInTracker ||
         !mDimensionsInCondition.empty()) {
@@ -243,7 +243,7 @@
 // 1. If combination condition, logical operation is AND, only one sliced child predicate.
 // 2. Has dimensions_in_condition and it equals to the output dimensions of the sliced predicate.
 void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt2(bool condition,
-                                                                   const uint64_t eventTime) {
+                                                                   const int64_t eventTime) {
     if (mMetric2ConditionLinks.size() > 1 || !mSameConditionDimensionsInTracker) {
         return;
     }
@@ -328,7 +328,7 @@
 }
 
 void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                              const uint64_t eventTime) {
+                                                              const int64_t eventTime) {
     VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
     flushIfNeededLocked(eventTime);
 
@@ -420,7 +420,7 @@
 }
 
 void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet,
-                                                      const uint64_t eventTime) {
+                                                      const int64_t eventTime) {
     VLOG("Metric %lld onConditionChanged", (long long)mMetricId);
     mCondition = conditionMet;
     flushIfNeededLocked(eventTime);
@@ -433,14 +433,19 @@
     }
 }
 
-void DurationMetricProducer::dropDataLocked(const uint64_t dropTimeNs) {
+void DurationMetricProducer::dropDataLocked(const int64_t dropTimeNs) {
     flushIfNeededLocked(dropTimeNs);
     mPastBuckets.clear();
 }
 
-void DurationMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
+void DurationMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
+                                                const bool include_current_partial_bucket,
                                                 ProtoOutputStream* protoOutput) {
-    flushIfNeededLocked(dumpTimeNs);
+    if (include_current_partial_bucket) {
+        flushLocked(dumpTimeNs);
+    } else {
+        flushIfNeededLocked(dumpTimeNs);
+    }
     if (mPastBuckets.empty()) {
         VLOG(" Duration metric, empty return");
         return;
@@ -492,8 +497,8 @@
     mPastBuckets.clear();
 }
 
-void DurationMetricProducer::flushIfNeededLocked(const uint64_t& eventTimeNs) {
-    uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void DurationMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) {
+    int64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
 
     if (currentBucketEndTimeNs > eventTimeNs) {
         return;
@@ -522,7 +527,7 @@
     mCurrentBucketNum += numBucketsForward;
 }
 
-void DurationMetricProducer::flushCurrentBucketLocked(const uint64_t& eventTimeNs) {
+void DurationMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
     for (auto whatIt = mCurrentSlicedDurationTrackerMap.begin();
             whatIt != mCurrentSlicedDurationTrackerMap.end();) {
         for (auto it = whatIt->second.begin(); it != whatIt->second.end();) {
@@ -644,7 +649,7 @@
 
 void DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex,
                                                      const LogEvent& event) {
-    uint64_t eventTimeNs = event.GetElapsedTimestampNs();
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
     if (eventTimeNs < mStartTimeNs) {
         return;
     }
diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h
index 75f2391..80fbdde 100644
--- a/cmds/statsd/src/metrics/DurationMetricProducer.h
+++ b/cmds/statsd/src/metrics/DurationMetricProducer.h
@@ -42,7 +42,7 @@
                            const int conditionIndex, const size_t startIndex,
                            const size_t stopIndex, const size_t stopAllIndex, const bool nesting,
                            const sp<ConditionWizard>& wizard,
-                           const FieldMatcher& internalDimensions, const uint64_t startTimeNs);
+                           const FieldMatcher& internalDimensions, const int64_t startTimeNs);
 
     virtual ~DurationMetricProducer();
 
@@ -61,29 +61,30 @@
     void handleStartEvent(const MetricDimensionKey& eventKey, const ConditionKey& conditionKeys,
                           bool condition, const LogEvent& event);
 
-    void onDumpReportLocked(const uint64_t dumpTimeNs,
+    void onDumpReportLocked(const int64_t dumpTimeNs,
+                            const bool include_current_partial_bucket,
                             android::util::ProtoOutputStream* protoOutput) override;
 
     // Internal interface to handle condition change.
-    void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
+    void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
 
     // Internal interface to handle sliced condition change.
-    void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
+    void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
 
-    void onSlicedConditionMayChangeLocked_opt1(bool overallCondition, const uint64_t eventTime);
-    void onSlicedConditionMayChangeLocked_opt2(bool overallCondition, const uint64_t eventTime);
+    void onSlicedConditionMayChangeLocked_opt1(bool overallCondition, const int64_t eventTime);
+    void onSlicedConditionMayChangeLocked_opt2(bool overallCondition, const int64_t eventTime);
 
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
 
     void dumpStatesLocked(FILE* out, bool verbose) const override;
 
-    void dropDataLocked(const uint64_t dropTimeNs) override;
+    void dropDataLocked(const int64_t dropTimeNs) override;
 
     // Util function to flush the old packet.
-    void flushIfNeededLocked(const uint64_t& eventTime);
+    void flushIfNeededLocked(const int64_t& eventTime);
 
-    void flushCurrentBucketLocked(const uint64_t& eventTimeNs) override;
+    void flushCurrentBucketLocked(const int64_t& eventTimeNs) override;
 
     const DurationMetric_AggregationType mAggregationType;
 
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index 42a5a3a..33ab9aa 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -54,7 +54,7 @@
 EventMetricProducer::EventMetricProducer(const ConfigKey& key, const EventMetric& metric,
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard,
-                                         const uint64_t startTimeNs)
+                                         const int64_t startTimeNs)
     : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard) {
     if (metric.links().size() > 0) {
         for (const auto& link : metric.links()) {
@@ -75,12 +75,12 @@
     VLOG("~EventMetricProducer() called");
 }
 
-void EventMetricProducer::dropDataLocked(const uint64_t dropTimeNs) {
+void EventMetricProducer::dropDataLocked(const int64_t dropTimeNs) {
     mProto->clear();
 }
 
 void EventMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                           const uint64_t eventTime) {
+                                                           const int64_t eventTime) {
 }
 
 std::unique_ptr<std::vector<uint8_t>> serializeProtoLocked(ProtoOutputStream& protoOutput) {
@@ -100,7 +100,8 @@
     return buffer;
 }
 
-void EventMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
+void EventMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
+                                             const bool include_current_partial_bucket,
                                              ProtoOutputStream* protoOutput) {
     if (mProto->size() <= 0) {
         return;
@@ -119,7 +120,7 @@
 }
 
 void EventMetricProducer::onConditionChangedLocked(const bool conditionMet,
-                                                   const uint64_t eventTime) {
+                                                   const int64_t eventTime) {
     VLOG("Metric %lld onConditionChanged", (long long)mMetricId);
     mCondition = conditionMet;
 }
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h
index 93c6c9a..5c29174 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.h
+++ b/cmds/statsd/src/metrics/EventMetricProducer.h
@@ -36,7 +36,7 @@
     // TODO: Pass in the start time from MetricsManager, it should be consistent for all metrics.
     EventMetricProducer(const ConfigKey& key, const EventMetric& eventMetric,
                         const int conditionIndex, const sp<ConditionWizard>& wizard,
-                        const uint64_t startTimeNs);
+                        const int64_t startTimeNs);
 
     virtual ~EventMetricProducer();
 
@@ -46,16 +46,17 @@
             const ConditionKey& conditionKey, bool condition,
             const LogEvent& event) override;
 
-    void onDumpReportLocked(const uint64_t dumpTimeNs,
+    void onDumpReportLocked(const int64_t dumpTimeNs,
+                            const bool include_current_partial_bucket,
                             android::util::ProtoOutputStream* protoOutput) override;
 
     // Internal interface to handle condition change.
-    void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
+    void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
 
     // Internal interface to handle sliced condition change.
-    void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
+    void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
 
-    void dropDataLocked(const uint64_t dropTimeNs) override;
+    void dropDataLocked(const int64_t dropTimeNs) override;
 
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index b13c3e7..3c77aae 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -61,7 +61,7 @@
 GaugeMetricProducer::GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& metric,
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard, const int pullTagId,
-                                         const uint64_t startTimeNs,
+                                         const int64_t startTimeNs,
                                          shared_ptr<StatsPullerManager> statsPullerManager)
     : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard),
       mStatsPullerManager(statsPullerManager),
@@ -155,9 +155,15 @@
     }
 }
 
-void GaugeMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
+void GaugeMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
+                                             const bool include_current_partial_bucket,
                                              ProtoOutputStream* protoOutput) {
     VLOG("Gauge metric %lld report now...", (long long)mMetricId);
+    if (include_current_partial_bucket) {
+        flushLocked(dumpTimeNs);
+    } else {
+        flushIfNeededLocked(dumpTimeNs);
+    }
 
     flushIfNeededLocked(dumpTimeNs);
     if (mPastBuckets.empty()) {
@@ -267,7 +273,7 @@
 }
 
 void GaugeMetricProducer::onConditionChangedLocked(const bool conditionMet,
-                                                   const uint64_t eventTime) {
+                                                   const int64_t eventTime) {
     VLOG("GaugeMetric %lld onConditionChanged", (long long)mMetricId);
     flushIfNeededLocked(eventTime);
     mCondition = conditionMet;
@@ -278,7 +284,7 @@
 }
 
 void GaugeMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                           const uint64_t eventTime) {
+                                                           const int64_t eventTime) {
     VLOG("GaugeMetric %lld onSlicedConditionMayChange overall condition %d", (long long)mMetricId,
          overallCondition);
     flushIfNeededLocked(eventTime);
@@ -336,7 +342,7 @@
     if (condition == false) {
         return;
     }
-    uint64_t eventTimeNs = event.GetElapsedTimestampNs();
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
     mTagId = event.GetTagId();
     if (eventTimeNs < mCurrentBucketStartTimeNs) {
         VLOG("Gauge Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
@@ -391,7 +397,7 @@
     }
 }
 
-void GaugeMetricProducer::dropDataLocked(const uint64_t dropTimeNs) {
+void GaugeMetricProducer::dropDataLocked(const int64_t dropTimeNs) {
     flushIfNeededLocked(dropTimeNs);
     mPastBuckets.clear();
 }
@@ -401,8 +407,8 @@
 // bucket.
 // if data is pushed, onMatchedLogEvent will only be called through onConditionChanged() inside
 // the GaugeMetricProducer while holding the lock.
-void GaugeMetricProducer::flushIfNeededLocked(const uint64_t& eventTimeNs) {
-    uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void GaugeMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) {
+    int64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
 
     if (eventTimeNs < currentBucketEndTimeNs) {
         VLOG("Gauge eventTime is %lld, less than next bucket start time %lld",
@@ -420,8 +426,8 @@
          (long long)mCurrentBucketStartTimeNs);
 }
 
-void GaugeMetricProducer::flushCurrentBucketLocked(const uint64_t& eventTimeNs) {
-    uint64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void GaugeMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
+    int64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
 
     GaugeBucket info;
     info.mBucketStartNs = mCurrentBucketStartTimeNs;
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h
index 9605b13..04b7df9 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.h
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h
@@ -65,7 +65,7 @@
     void onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& data) override;
 
     // GaugeMetric needs to immediately trigger another pull when we create the partial bucket.
-    void notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
+    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                           const int64_t version) override {
         std::lock_guard<std::mutex> lock(mMutex);
 
@@ -87,32 +87,33 @@
             const LogEvent& event) override;
 
 private:
-    void onDumpReportLocked(const uint64_t dumpTimeNs,
+    void onDumpReportLocked(const int64_t dumpTimeNs,
+                            const bool include_current_partial_bucket,
                             android::util::ProtoOutputStream* protoOutput) override;
 
     // for testing
     GaugeMetricProducer(const ConfigKey& key, const GaugeMetric& gaugeMetric,
                         const int conditionIndex, const sp<ConditionWizard>& wizard,
-                        const int pullTagId, const uint64_t startTimeNs,
+                        const int pullTagId, const int64_t startTimeNs,
                         std::shared_ptr<StatsPullerManager> statsPullerManager);
 
     // Internal interface to handle condition change.
-    void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
+    void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
 
     // Internal interface to handle sliced condition change.
-    void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
+    void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
 
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
 
     void dumpStatesLocked(FILE* out, bool verbose) const override;
 
-    void dropDataLocked(const uint64_t dropTimeNs) override;
+    void dropDataLocked(const int64_t dropTimeNs) override;
 
     // Util function to flush the old packet.
-    void flushIfNeededLocked(const uint64_t& eventTime) override;
+    void flushIfNeededLocked(const int64_t& eventTime) override;
 
-    void flushCurrentBucketLocked(const uint64_t& eventTimeNs) override;
+    void flushCurrentBucketLocked(const int64_t& eventTimeNs) override;
 
     void pullLocked();
 
diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp
index bf529c8..bcf0e62 100644
--- a/cmds/statsd/src/metrics/MetricProducer.cpp
+++ b/cmds/statsd/src/metrics/MetricProducer.cpp
@@ -25,7 +25,7 @@
 using std::map;
 
 void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) {
-    uint64_t eventTimeNs = event.GetElapsedTimestampNs();
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
     // this is old event, maybe statsd restarted?
     if (eventTimeNs < mStartTimeNs) {
         return;
diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h
index 0b3d677..f931e57 100644
--- a/cmds/statsd/src/metrics/MetricProducer.h
+++ b/cmds/statsd/src/metrics/MetricProducer.h
@@ -64,7 +64,7 @@
      * the flush again when the end timestamp is forced to be now, and then after flushing, update
      * the start timestamp to be now.
      */
-    void notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
+    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                           const int64_t version) override {
         std::lock_guard<std::mutex> lock(mMutex);
 
@@ -79,12 +79,14 @@
         // is a partial bucket and can merge it with the previous bucket.
     };
 
-    void notifyAppRemoved(const uint64_t& eventTimeNs, const string& apk, const int uid) override{
-            // TODO: Implement me.
+    void notifyAppRemoved(const int64_t& eventTimeNs, const string& apk, const int uid) override{
+        // Force buckets to split on removal also.
+        notifyAppUpgrade(eventTimeNs, apk, uid, 0);
     };
 
-    void onUidMapReceived(const uint64_t& eventTimeNs) override{
-            // TODO: Implement me.
+    void onUidMapReceived(const int64_t& eventTimeNs) override{
+            // Purposefully don't flush partial buckets on a new snapshot.
+            // This occurs if a new user is added/removed or statsd crashes.
     };
 
     // Consume the parsed stats log entry that already matched the "what" of the metric.
@@ -93,12 +95,12 @@
         onMatchedLogEventLocked(matcherIndex, event);
     }
 
-    void onConditionChanged(const bool condition, const uint64_t eventTime) {
+    void onConditionChanged(const bool condition, const int64_t eventTime) {
         std::lock_guard<std::mutex> lock(mMutex);
         onConditionChangedLocked(condition, eventTime);
     }
 
-    void onSlicedConditionMayChange(bool overallCondition, const uint64_t eventTime) {
+    void onSlicedConditionMayChange(bool overallCondition, const int64_t eventTime) {
         std::lock_guard<std::mutex> lock(mMutex);
         onSlicedConditionMayChangeLocked(overallCondition, eventTime);
     }
@@ -110,9 +112,11 @@
 
     // Output the metrics data to [protoOutput]. All metrics reports end with the same timestamp.
     // This method clears all the past buckets.
-    void onDumpReport(const uint64_t dumpTimeNs, android::util::ProtoOutputStream* protoOutput) {
+    void onDumpReport(const int64_t dumpTimeNs,
+                      const bool include_current_partial_bucket,
+                      android::util::ProtoOutputStream* protoOutput) {
         std::lock_guard<std::mutex> lock(mMutex);
-        return onDumpReportLocked(dumpTimeNs, protoOutput);
+        return onDumpReportLocked(dumpTimeNs, include_current_partial_bucket, protoOutput);
     }
 
     void dumpStates(FILE* out, bool verbose) const {
@@ -156,24 +160,34 @@
     // We still need to keep future data valid and anomaly tracking work, which means we will
     // have to flush old data, informing anomaly trackers then safely drop old data.
     // We still keep current bucket data for future metrics' validity.
-    void dropData(const uint64_t dropTimeNs) {
+    void dropData(const int64_t dropTimeNs) {
         std::lock_guard<std::mutex> lock(mMutex);
         dropDataLocked(dropTimeNs);
     }
 
 protected:
-    virtual void onConditionChangedLocked(const bool condition, const uint64_t eventTime) = 0;
+    virtual void onConditionChangedLocked(const bool condition, const int64_t eventTime) = 0;
     virtual void onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                  const uint64_t eventTime) = 0;
-    virtual void onDumpReportLocked(const uint64_t dumpTimeNs,
+                                                  const int64_t eventTime) = 0;
+    virtual void onDumpReportLocked(const int64_t dumpTimeNs,
+                                    const bool include_current_partial_bucket,
                                     android::util::ProtoOutputStream* protoOutput) = 0;
     virtual size_t byteSizeLocked() const = 0;
     virtual void dumpStatesLocked(FILE* out, bool verbose) const = 0;
 
     /**
-     * Flushes the current bucket if the eventTime is after the current bucket's end time.
+     * Flushes the current bucket if the eventTime is after the current bucket's end time. This will
+       also flush the current partial bucket in memory.
      */
-    virtual void flushIfNeededLocked(const uint64_t& eventTime){};
+    virtual void flushIfNeededLocked(const int64_t& eventTime){};
+
+    /**
+     * Flushes all the data including the current partial bucket.
+     */
+    virtual void flushLocked(const int64_t& eventTime) {
+        flushIfNeededLocked(eventTime);
+        flushCurrentBucketLocked(eventTime);
+    };
 
     /**
      * For metrics that aggregate (ie, every metric producer except for EventMetricProducer),
@@ -185,15 +199,15 @@
      * flushIfNeededLocked or the app upgrade handler; the caller MUST update the bucket timestamp
      * and bucket number as needed.
      */
-    virtual void flushCurrentBucketLocked(const uint64_t& eventTimeNs){};
+    virtual void flushCurrentBucketLocked(const int64_t& eventTimeNs){};
 
     // Convenience to compute the current bucket's end time, which is always aligned with the
     // start time of the metric.
-    uint64_t getCurrentBucketEndTimeNs() const {
+    int64_t getCurrentBucketEndTimeNs() const {
         return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs;
     }
 
-    virtual void dropDataLocked(const uint64_t dropTimeNs) = 0;
+    virtual void dropDataLocked(const int64_t dropTimeNs) = 0;
 
     const int64_t mMetricId;
 
@@ -201,15 +215,15 @@
 
     // The time when this metric producer was first created. The end time for the current bucket
     // can be computed from this based on mCurrentBucketNum.
-    uint64_t mStartTimeNs;
+    int64_t mStartTimeNs;
 
     // Start time may not be aligned with the start of statsd if there is an app upgrade in the
     // middle of a bucket.
-    uint64_t mCurrentBucketStartTimeNs;
+    int64_t mCurrentBucketStartTimeNs;
 
     // Used by anomaly detector to track which bucket we are in. This is not sent with the produced
     // report.
-    uint64_t mCurrentBucketNum;
+    int64_t mCurrentBucketNum;
 
     int64_t mBucketSizeNs;
 
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp
index 00188e8..b7f1bd5 100644
--- a/cmds/statsd/src/metrics/MetricsManager.cpp
+++ b/cmds/statsd/src/metrics/MetricsManager.cpp
@@ -33,6 +33,8 @@
 #include <utils/SystemClock.h>
 
 using android::util::FIELD_COUNT_REPEATED;
+using android::util::FIELD_TYPE_INT32;
+using android::util::FIELD_TYPE_INT64;
 using android::util::FIELD_TYPE_MESSAGE;
 using android::util::ProtoOutputStream;
 
@@ -47,18 +49,26 @@
 namespace statsd {
 
 const int FIELD_ID_METRICS = 1;
+const int FIELD_ID_ANNOTATIONS = 7;
+const int FIELD_ID_ANNOTATIONS_INT64 = 1;
+const int FIELD_ID_ANNOTATIONS_INT32 = 2;
 
 MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config,
-                               const long timeBaseSec,
+                               const long timeBaseSec, const long currentTimeSec,
                                const sp<UidMap> &uidMap,
                                const sp<AlarmMonitor>& anomalyAlarmMonitor,
                                const sp<AlarmMonitor>& periodicAlarmMonitor)
     : mConfigKey(key), mUidMap(uidMap),
+      mTtlNs(config.has_ttl_in_seconds() ? config.ttl_in_seconds() * NS_PER_SEC : -1),
+      mTtlEndNs(-1),
       mLastReportTimeNs(timeBaseSec * NS_PER_SEC),
       mLastReportWallClockNs(getWallClockNs()) {
+    // Init the ttl end timestamp.
+    refreshTtl(timeBaseSec * NS_PER_SEC);
+
     mConfigValid =
             initStatsdConfig(key, config, *uidMap, anomalyAlarmMonitor, periodicAlarmMonitor,
-                             timeBaseSec, mTagIds, mAllAtomMatchers,
+                             timeBaseSec, currentTimeSec, mTagIds, mAllAtomMatchers,
                              mAllConditionTrackers, mAllMetricProducers, mAllAnomalyTrackers,
                              mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap,
                              mTrackerToConditionMap, mNoReportMetricIds);
@@ -85,6 +95,11 @@
         }
     }
 
+    // Store the sub-configs used.
+    for (const auto& annotation : config.annotation()) {
+        mAnnotations.emplace_back(annotation.field_int64(), annotation.field_int32());
+    }
+
     // Guardrail. Reject the config if it's too big.
     if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig ||
         mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig ||
@@ -97,11 +112,9 @@
         mConfigValid = false;
     }
     // no matter whether this config is valid, log it in the stats.
-    StatsdStats::getInstance().noteConfigReceived(key, mAllMetricProducers.size(),
-                                                  mAllConditionTrackers.size(),
-                                                  mAllAtomMatchers.size(),
-                                                  mAllAnomalyTrackers.size(),
-                                                  mConfigValid);
+    StatsdStats::getInstance().noteConfigReceived(
+            key, mAllMetricProducers.size(), mAllConditionTrackers.size(), mAllAtomMatchers.size(),
+            mAllAnomalyTrackers.size(), mAnnotations, mConfigValid);
 }
 
 MetricsManager::~MetricsManager() {
@@ -128,7 +141,7 @@
     return mConfigValid;
 }
 
-void MetricsManager::notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
+void MetricsManager::notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                                       const int64_t version) {
     // check if we care this package
     if (std::find(mAllowedPkg.begin(), mAllowedPkg.end(), apk) == mAllowedPkg.end()) {
@@ -139,7 +152,7 @@
     initLogSourceWhiteList();
 }
 
-void MetricsManager::notifyAppRemoved(const uint64_t& eventTimeNs, const string& apk,
+void MetricsManager::notifyAppRemoved(const int64_t& eventTimeNs, const string& apk,
                                       const int uid) {
     // check if we care this package
     if (std::find(mAllowedPkg.begin(), mAllowedPkg.end(), apk) == mAllowedPkg.end()) {
@@ -150,7 +163,7 @@
     initLogSourceWhiteList();
 }
 
-void MetricsManager::onUidMapReceived(const uint64_t& eventTimeNs) {
+void MetricsManager::onUidMapReceived(const int64_t& eventTimeNs) {
     if (mAllowedPkg.size() == 0) {
         return;
     }
@@ -171,23 +184,33 @@
     }
 }
 
-void MetricsManager::dropData(const uint64_t dropTimeNs) {
+void MetricsManager::dropData(const int64_t dropTimeNs) {
     for (const auto& producer : mAllMetricProducers) {
         producer->dropData(dropTimeNs);
     }
 }
 
-void MetricsManager::onDumpReport(const uint64_t dumpTimeStampNs, ProtoOutputStream* protoOutput) {
+void MetricsManager::onDumpReport(const int64_t dumpTimeStampNs,
+                                  const bool include_current_partial_bucket,
+                                  ProtoOutputStream* protoOutput) {
     VLOG("=========================Metric Reports Start==========================");
     // one StatsLogReport per MetricProduer
     for (const auto& producer : mAllMetricProducers) {
         if (mNoReportMetricIds.find(producer->getMetricId()) == mNoReportMetricIds.end()) {
             uint64_t token =
                     protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_METRICS);
-            producer->onDumpReport(dumpTimeStampNs, protoOutput);
+            producer->onDumpReport(dumpTimeStampNs, include_current_partial_bucket, protoOutput);
             protoOutput->end(token);
         }
     }
+    for (const auto& annotation : mAnnotations) {
+        uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+                                            FIELD_ID_ANNOTATIONS);
+        protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ANNOTATIONS_INT64,
+                           (long long)annotation.first);
+        protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_ANNOTATIONS_INT32, annotation.second);
+        protoOutput->end(token);
+    }
     mLastReportTimeNs = dumpTimeStampNs;
     mLastReportWallClockNs = getWallClockNs();
     VLOG("=========================Metric Reports End==========================");
@@ -272,7 +295,7 @@
     }
 
     int tagId = event.GetTagId();
-    uint64_t eventTime = event.GetElapsedTimestampNs();
+    int64_t eventTime = event.GetElapsedTimestampNs();
     if (mTagIds.find(tagId) == mTagIds.end()) {
         // not interesting...
         return;
@@ -351,7 +374,7 @@
 }
 
 void MetricsManager::onAnomalyAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet) {
     for (const auto& itr : mAllAnomalyTrackers) {
         itr->informAlarmsFired(timestampNs, alarmSet);
@@ -359,7 +382,7 @@
 }
 
 void MetricsManager::onPeriodicAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet) {
     for (const auto& itr : mAllPeriodicAlarmTrackers) {
         itr->informAlarmsFired(timestampNs, alarmSet);
diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h
index da0cd4a..6aa260a 100644
--- a/cmds/statsd/src/metrics/MetricsManager.h
+++ b/cmds/statsd/src/metrics/MetricsManager.h
@@ -36,7 +36,8 @@
 // A MetricsManager is responsible for managing metrics from one single config source.
 class MetricsManager : public PackageInfoListener {
 public:
-    MetricsManager(const ConfigKey& configKey, const StatsdConfig& config, const long timeBaseSec,
+    MetricsManager(const ConfigKey& configKey, const StatsdConfig& config,
+                   const long timeBaseSec, const long currentTimeSec,
                    const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor,
                    const sp<AlarmMonitor>& periodicAlarmMonitor);
 
@@ -48,19 +49,19 @@
     void onLogEvent(const LogEvent& event);
 
     void onAnomalyAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet);
 
     void onPeriodicAlarmFired(
-        const uint64_t& timestampNs,
+        const int64_t& timestampNs,
         unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>>& alarmSet);
 
-    void notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
+    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                           const int64_t version) override;
 
-    void notifyAppRemoved(const uint64_t& eventTimeNs, const string& apk, const int uid) override;
+    void notifyAppRemoved(const int64_t& eventTimeNs, const string& apk, const int uid) override;
 
-    void onUidMapReceived(const uint64_t& eventTimeNs) override;
+    void onUidMapReceived(const int64_t& eventTimeNs) override;
 
     bool shouldAddUidMapListener() const {
         return !mAllowedPkg.empty();
@@ -68,6 +69,16 @@
 
     void dumpStates(FILE* out, bool verbose);
 
+    inline bool isInTtl(const int64_t timestampNs) const {
+        return mTtlNs <= 0 || timestampNs < mTtlEndNs;
+    };
+
+    void refreshTtl(const int64_t currentTimestampNs) {
+        if (mTtlNs > 0) {
+            mTtlEndNs = currentTimestampNs + mTtlNs;
+        }
+    };
+
     // Returns the elapsed realtime when this metric manager last reported metrics.
     inline int64_t getLastReportTimeNs() const {
         return mLastReportTimeNs;
@@ -77,22 +88,29 @@
         return mLastReportWallClockNs;
     };
 
-    virtual void dropData(const uint64_t dropTimeNs);
+    virtual void dropData(const int64_t dropTimeNs);
 
-    // Config source owner can call onDumpReport() to get all the metrics collected.
-    virtual void onDumpReport(const uint64_t dumpTimeNs,
+    virtual void onDumpReport(const int64_t dumpTimeNs,
+                              const bool include_current_partial_bucket,
                               android::util::ProtoOutputStream* protoOutput);
 
     // Computes the total byte size of all metrics managed by a single config source.
     // Does not change the state.
     virtual size_t byteSize();
+
 private:
+    // For test only.
+    inline int64_t getTtlEndNs() const { return mTtlEndNs; }
+
     const ConfigKey mConfigKey;
 
     sp<UidMap> mUidMap;
 
     bool mConfigValid = false;
 
+    const int64_t mTtlNs;
+    int64_t mTtlEndNs;
+
     int64_t mLastReportTimeNs;
     int64_t mLastReportWallClockNs;
 
@@ -106,6 +124,9 @@
     // Logs from uids that are not in the list will be ignored to avoid spamming.
     std::set<int32_t> mAllowedLogSources;
 
+    // Contains the annotations passed in with StatsdConfig.
+    std::list<std::pair<const int64_t, const int32_t>> mAnnotations;
+
     // To guard access to mAllowedLogSources
     mutable std::mutex mAllowedLogSourcesMutex;
 
@@ -185,6 +206,7 @@
     FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
 
     FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
+    FRIEND_TEST(ConfigTtlE2eTest, TestCountMetric);
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index d0f510d..51fac8c 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -63,7 +63,7 @@
 ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric& metric,
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard, const int pullTagId,
-                                         const uint64_t startTimeNs,
+                                         const int64_t startTimeNs,
                                          shared_ptr<StatsPullerManager> statsPullerManager)
     : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard),
       mValueField(metric.value_field()),
@@ -124,7 +124,7 @@
 ValueMetricProducer::ValueMetricProducer(const ConfigKey& key, const ValueMetric& metric,
                                          const int conditionIndex,
                                          const sp<ConditionWizard>& wizard, const int pullTagId,
-                                         const uint64_t startTimeNs)
+                                         const int64_t startTimeNs)
     : ValueMetricProducer(key, metric, conditionIndex, wizard, pullTagId, startTimeNs,
                           make_shared<StatsPullerManager>()) {
 }
@@ -137,19 +137,24 @@
 }
 
 void ValueMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition,
-                                                           const uint64_t eventTime) {
+                                                           const int64_t eventTime) {
     VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId);
 }
 
-void ValueMetricProducer::dropDataLocked(const uint64_t dropTimeNs) {
+void ValueMetricProducer::dropDataLocked(const int64_t dropTimeNs) {
     flushIfNeededLocked(dropTimeNs);
     mPastBuckets.clear();
 }
 
-void ValueMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs,
+void ValueMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs,
+                                             const bool include_current_partial_bucket,
                                              ProtoOutputStream* protoOutput) {
     VLOG("metric %lld dump report now...", (long long)mMetricId);
-    flushIfNeededLocked(dumpTimeNs);
+    if (include_current_partial_bucket) {
+        flushLocked(dumpTimeNs);
+    } else {
+        flushIfNeededLocked(dumpTimeNs);
+    }
     if (mPastBuckets.empty()) {
         return;
     }
@@ -197,7 +202,7 @@
 }
 
 void ValueMetricProducer::onConditionChangedLocked(const bool condition,
-                                                   const uint64_t eventTimeNs) {
+                                                   const int64_t eventTimeNs) {
     mCondition = condition;
 
     if (eventTimeNs < mCurrentBucketStartTimeNs) {
@@ -231,8 +236,8 @@
         }
         // For scheduled pulled data, the effective event time is snap to the nearest
         // bucket boundary to make bucket finalize.
-        uint64_t realEventTime = allData.at(0)->GetElapsedTimestampNs();
-        uint64_t eventTime = mStartTimeNs +
+        int64_t realEventTime = allData.at(0)->GetElapsedTimestampNs();
+        int64_t eventTime = mStartTimeNs +
             ((realEventTime - mStartTimeNs) / mBucketSizeNs) * mBucketSizeNs;
 
         mCondition = false;
@@ -290,7 +295,7 @@
         const size_t matcherIndex, const MetricDimensionKey& eventKey,
         const ConditionKey& conditionKey, bool condition,
         const LogEvent& event) {
-    uint64_t eventTimeNs = event.GetElapsedTimestampNs();
+    int64_t eventTimeNs = event.GetElapsedTimestampNs();
     if (eventTimeNs < mCurrentBucketStartTimeNs) {
         VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs,
              (long long)mCurrentBucketStartTimeNs);
@@ -349,8 +354,8 @@
     }
 }
 
-void ValueMetricProducer::flushIfNeededLocked(const uint64_t& eventTimeNs) {
-    uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
+void ValueMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) {
+    int64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs();
 
     if (currentBucketEndTimeNs > eventTimeNs) {
         VLOG("eventTime is %lld, less than next bucket start time %lld", (long long)eventTimeNs,
@@ -371,10 +376,10 @@
          (long long)mCurrentBucketStartTimeNs);
 }
 
-void ValueMetricProducer::flushCurrentBucketLocked(const uint64_t& eventTimeNs) {
+void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
     VLOG("finalizing bucket for %ld, dumping %d slices", (long)mCurrentBucketStartTimeNs,
          (int)mCurrentSlicedBucket.size());
-    uint64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
+    int64_t fullBucketEndTimeNs = getCurrentBucketEndTimeNs();
 
     ValueBucket info;
     info.mBucketStartNs = mCurrentBucketStartTimeNs;
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h
index 45d9531..b5f6429 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.h
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.h
@@ -40,14 +40,14 @@
 public:
     ValueMetricProducer(const ConfigKey& key, const ValueMetric& valueMetric,
                         const int conditionIndex, const sp<ConditionWizard>& wizard,
-                        const int pullTagId, const uint64_t startTimeNs);
+                        const int pullTagId, const int64_t startTimeNs);
 
     virtual ~ValueMetricProducer();
 
     void onDataPulled(const std::vector<std::shared_ptr<LogEvent>>& data) override;
 
     // ValueMetric needs special logic if it's a pulled atom.
-    void notifyAppUpgrade(const uint64_t& eventTimeNs, const string& apk, const int uid,
+    void notifyAppUpgrade(const int64_t& eventTimeNs, const string& apk, const int uid,
                           const int64_t version) override {
         std::lock_guard<std::mutex> lock(mMutex);
 
@@ -86,14 +86,15 @@
             const LogEvent& event) override;
 
 private:
-    void onDumpReportLocked(const uint64_t dumpTimeNs,
+    void onDumpReportLocked(const int64_t dumpTimeNs,
+                            const bool include_current_partial_bucket,
                             android::util::ProtoOutputStream* protoOutput) override;
 
     // Internal interface to handle condition change.
-    void onConditionChangedLocked(const bool conditionMet, const uint64_t eventTime) override;
+    void onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) override;
 
     // Internal interface to handle sliced condition change.
-    void onSlicedConditionMayChangeLocked(bool overallCondition, const uint64_t eventTime) override;
+    void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override;
 
     // Internal function to calculate the current used bytes.
     size_t byteSizeLocked() const override;
@@ -101,11 +102,11 @@
     void dumpStatesLocked(FILE* out, bool verbose) const override;
 
     // Util function to flush the old packet.
-    void flushIfNeededLocked(const uint64_t& eventTime) override;
+    void flushIfNeededLocked(const int64_t& eventTime) override;
 
-    void flushCurrentBucketLocked(const uint64_t& eventTimeNs) override;
+    void flushCurrentBucketLocked(const int64_t& eventTimeNs) override;
 
-    void dropDataLocked(const uint64_t dropTimeNs) override;
+    void dropDataLocked(const int64_t dropTimeNs) override;
 
     const FieldMatcher mValueField;
 
@@ -114,7 +115,7 @@
     // for testing
     ValueMetricProducer(const ConfigKey& key, const ValueMetric& valueMetric,
                         const int conditionIndex, const sp<ConditionWizard>& wizard,
-                        const int pullTagId, const uint64_t startTimeNs,
+                        const int pullTagId, const int64_t startTimeNs,
                         std::shared_ptr<StatsPullerManager> statsPullerManager);
 
     // tagId for pulled data. -1 if this is not pulled
diff --git a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
index 4132703..149b318 100644
--- a/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/DurationTracker.h
@@ -52,9 +52,9 @@
 };
 
 struct DurationBucket {
-    uint64_t mBucketStartNs;
-    uint64_t mBucketEndNs;
-    uint64_t mDuration;
+    int64_t mBucketStartNs;
+    int64_t mBucketEndNs;
+    int64_t mDuration;
 };
 
 class DurationTracker {
@@ -62,8 +62,8 @@
     DurationTracker(const ConfigKey& key, const int64_t& id, const MetricDimensionKey& eventKey,
                     sp<ConditionWizard> wizard, int conditionIndex,
                     const std::vector<Matcher>& dimensionInCondition, bool nesting,
-                    uint64_t currentBucketStartNs, uint64_t currentBucketNum, uint64_t startTimeNs,
-                    uint64_t bucketSizeNs, bool conditionSliced, bool fullLink,
+                    int64_t currentBucketStartNs, int64_t currentBucketNum, int64_t startTimeNs,
+                    int64_t bucketSizeNs, bool conditionSliced, bool fullLink,
                     const std::vector<sp<DurationAnomalyTracker>>& anomalyTrackers)
         : mConfigKey(key),
           mTrackerId(id),
@@ -84,27 +84,27 @@
 
     virtual ~DurationTracker(){};
 
-    virtual unique_ptr<DurationTracker> clone(const uint64_t eventTime) = 0;
+    virtual unique_ptr<DurationTracker> clone(const int64_t eventTime) = 0;
 
     virtual void noteStart(const HashableDimensionKey& key, bool condition,
-                           const uint64_t eventTime, const ConditionKey& conditionKey) = 0;
-    virtual void noteStop(const HashableDimensionKey& key, const uint64_t eventTime,
+                           const int64_t eventTime, const ConditionKey& conditionKey) = 0;
+    virtual void noteStop(const HashableDimensionKey& key, const int64_t eventTime,
                           const bool stopAll) = 0;
-    virtual void noteStopAll(const uint64_t eventTime) = 0;
+    virtual void noteStopAll(const int64_t eventTime) = 0;
 
-    virtual void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) = 0;
-    virtual void onConditionChanged(bool condition, const uint64_t timestamp) = 0;
+    virtual void onSlicedConditionMayChange(bool overallCondition, const int64_t timestamp) = 0;
+    virtual void onConditionChanged(bool condition, const int64_t timestamp) = 0;
 
     // Flush stale buckets if needed, and return true if the tracker has no on-going duration
     // events, so that the owner can safely remove the tracker.
     virtual bool flushIfNeeded(
-            uint64_t timestampNs,
+            int64_t timestampNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) = 0;
 
     // Should only be called during an app upgrade or from this tracker's flushIfNeeded. If from
     // an app upgrade, we assume that we're trying to form a partial bucket.
     virtual bool flushCurrentBucket(
-            const uint64_t& eventTimeNs,
+            const int64_t& eventTimeNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) = 0;
 
     // Predict the anomaly timestamp given the current status.
@@ -118,15 +118,15 @@
     }
 
 protected:
-    uint64_t getCurrentBucketEndTimeNs() const {
+    int64_t getCurrentBucketEndTimeNs() const {
         return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs;
     }
 
     // Starts the anomaly alarm.
-    void startAnomalyAlarm(const uint64_t eventTime) {
+    void startAnomalyAlarm(const int64_t eventTime) {
         for (auto& anomalyTracker : mAnomalyTrackers) {
             if (anomalyTracker != nullptr) {
-                const uint64_t alarmTimestampNs =
+                const int64_t alarmTimestampNs =
                     predictAnomalyTimestampNs(*anomalyTracker, eventTime);
                 if (alarmTimestampNs > 0) {
                     anomalyTracker->startAlarm(mEventKey, alarmTimestampNs);
@@ -136,7 +136,7 @@
     }
 
     // Stops the anomaly alarm. If it should have already fired, declare the anomaly now.
-    void stopAnomalyAlarm(const uint64_t timestamp) {
+    void stopAnomalyAlarm(const int64_t timestamp) {
         for (auto& anomalyTracker : mAnomalyTrackers) {
             if (anomalyTracker != nullptr) {
                 anomalyTracker->stopAlarm(mEventKey, timestamp);
@@ -152,7 +152,7 @@
         }
     }
 
-    void detectAndDeclareAnomaly(const uint64_t& timestamp, const int64_t& currBucketNum,
+    void detectAndDeclareAnomaly(const int64_t& timestamp, const int64_t& currBucketNum,
                                  const int64_t& currentBucketValue) {
         for (auto& anomalyTracker : mAnomalyTrackers) {
             if (anomalyTracker != nullptr) {
@@ -164,7 +164,7 @@
 
     // Convenience to compute the current bucket's end time, which is always aligned with the
     // start time of the metric.
-    uint64_t getCurrentBucketEndTimeNs() {
+    int64_t getCurrentBucketEndTimeNs() {
         return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs;
     }
 
@@ -185,15 +185,15 @@
 
     const bool mNested;
 
-    uint64_t mCurrentBucketStartTimeNs;
+    int64_t mCurrentBucketStartTimeNs;
 
     int64_t mDuration;  // current recorded duration result (for partial bucket)
 
     int64_t mDurationFullBucket;  // Sum of past partial buckets in current full bucket.
 
-    uint64_t mCurrentBucketNum;
+    int64_t mCurrentBucketNum;
 
-    const uint64_t mStartTimeNs;
+    const int64_t mStartTimeNs;
 
     const bool mConditionSliced;
 
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
index 5c1e9c0..6868b8c 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
@@ -28,8 +28,8 @@
                                        const MetricDimensionKey& eventKey,
                                        sp<ConditionWizard> wizard, int conditionIndex,
                                        const vector<Matcher>& dimensionInCondition, bool nesting,
-                                       uint64_t currentBucketStartNs, uint64_t currentBucketNum,
-                                       uint64_t startTimeNs, uint64_t bucketSizeNs,
+                                       int64_t currentBucketStartNs, int64_t currentBucketNum,
+                                       int64_t startTimeNs, int64_t bucketSizeNs,
                                        bool conditionSliced, bool fullLink,
                                        const vector<sp<DurationAnomalyTracker>>& anomalyTrackers)
     : DurationTracker(key, id, eventKey, wizard, conditionIndex, dimensionInCondition, nesting,
@@ -41,7 +41,7 @@
     }
 }
 
-unique_ptr<DurationTracker> MaxDurationTracker::clone(const uint64_t eventTime) {
+unique_ptr<DurationTracker> MaxDurationTracker::clone(const int64_t eventTime) {
     auto clonedTracker = make_unique<MaxDurationTracker>(*this);
     for (auto it = clonedTracker->mInfos.begin(); it != clonedTracker->mInfos.end();) {
         if (it->second.state  != kStopped) {
@@ -80,7 +80,7 @@
 }
 
 void MaxDurationTracker::noteStart(const HashableDimensionKey& key, bool condition,
-                                   const uint64_t eventTime, const ConditionKey& conditionKey) {
+                                   const int64_t eventTime, const ConditionKey& conditionKey) {
     // this will construct a new DurationInfo if this key didn't exist.
     if (hitGuardRail(key)) {
         return;
@@ -114,7 +114,7 @@
 }
 
 
-void MaxDurationTracker::noteStop(const HashableDimensionKey& key, const uint64_t eventTime,
+void MaxDurationTracker::noteStop(const HashableDimensionKey& key, const int64_t eventTime,
                                   bool forceStop) {
     VLOG("MaxDuration: key %s stop", key.toString().c_str());
     if (mInfos.find(key) == mInfos.end()) {
@@ -175,7 +175,7 @@
     return false;
 }
 
-void MaxDurationTracker::noteStopAll(const uint64_t eventTime) {
+void MaxDurationTracker::noteStopAll(const int64_t eventTime) {
     std::set<HashableDimensionKey> keys;
     for (const auto& pair : mInfos) {
         keys.insert(pair.first);
@@ -186,14 +186,14 @@
 }
 
 bool MaxDurationTracker::flushCurrentBucket(
-        const uint64_t& eventTimeNs,
+        const int64_t& eventTimeNs,
         std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) {
     VLOG("MaxDurationTracker flushing.....");
 
     // adjust the bucket start time
     int numBucketsForward = 0;
-    uint64_t fullBucketEnd = getCurrentBucketEndTimeNs();
-    uint64_t currentBucketEndTimeNs;
+    int64_t fullBucketEnd = getCurrentBucketEndTimeNs();
+    int64_t currentBucketEndTimeNs;
     if (eventTimeNs >= fullBucketEnd) {
         numBucketsForward = 1 + (eventTimeNs - fullBucketEnd) / mBucketSizeNs;
         currentBucketEndTimeNs = fullBucketEnd;
@@ -238,7 +238,7 @@
 }
 
 bool MaxDurationTracker::flushIfNeeded(
-        uint64_t eventTimeNs, unordered_map<MetricDimensionKey, vector<DurationBucket>>* output) {
+        int64_t eventTimeNs, unordered_map<MetricDimensionKey, vector<DurationBucket>>* output) {
     if (eventTimeNs < getCurrentBucketEndTimeNs()) {
         return false;
     }
@@ -246,7 +246,7 @@
 }
 
 void MaxDurationTracker::onSlicedConditionMayChange(bool overallCondition,
-                                                    const uint64_t timestamp) {
+                                                    const int64_t timestamp) {
     // Now for each of the on-going event, check if the condition has changed for them.
     for (auto& pair : mInfos) {
         if (pair.second.state == kStopped) {
@@ -268,14 +268,14 @@
     }
 }
 
-void MaxDurationTracker::onConditionChanged(bool condition, const uint64_t timestamp) {
+void MaxDurationTracker::onConditionChanged(bool condition, const int64_t timestamp) {
     for (auto& pair : mInfos) {
         noteConditionChanged(pair.first, condition, timestamp);
     }
 }
 
 void MaxDurationTracker::noteConditionChanged(const HashableDimensionKey& key, bool conditionMet,
-                                              const uint64_t timestamp) {
+                                              const int64_t timestamp) {
     auto it = mInfos.find(key);
     if (it == mInfos.end()) {
         return;
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
index 884e8ac..8e8f2cd 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
@@ -31,30 +31,30 @@
     MaxDurationTracker(const ConfigKey& key, const int64_t& id, const MetricDimensionKey& eventKey,
                        sp<ConditionWizard> wizard, int conditionIndex,
                        const std::vector<Matcher>& dimensionInCondition, bool nesting,
-                       uint64_t currentBucketStartNs, uint64_t currentBucketNum,
-                       uint64_t startTimeNs, uint64_t bucketSizeNs, bool conditionSliced,
+                       int64_t currentBucketStartNs, int64_t currentBucketNum,
+                       int64_t startTimeNs, int64_t bucketSizeNs, bool conditionSliced,
                        bool fullLink,
                        const std::vector<sp<DurationAnomalyTracker>>& anomalyTrackers);
 
     MaxDurationTracker(const MaxDurationTracker& tracker) = default;
 
-    unique_ptr<DurationTracker> clone(const uint64_t eventTime) override;
+    unique_ptr<DurationTracker> clone(const int64_t eventTime) override;
 
-    void noteStart(const HashableDimensionKey& key, bool condition, const uint64_t eventTime,
+    void noteStart(const HashableDimensionKey& key, bool condition, const int64_t eventTime,
                    const ConditionKey& conditionKey) override;
-    void noteStop(const HashableDimensionKey& key, const uint64_t eventTime,
+    void noteStop(const HashableDimensionKey& key, const int64_t eventTime,
                   const bool stopAll) override;
-    void noteStopAll(const uint64_t eventTime) override;
+    void noteStopAll(const int64_t eventTime) override;
 
     bool flushIfNeeded(
-            uint64_t timestampNs,
+            int64_t timestampNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) override;
     bool flushCurrentBucket(
-            const uint64_t& eventTimeNs,
+            const int64_t& eventTimeNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>*) override;
 
-    void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) override;
-    void onConditionChanged(bool condition, const uint64_t timestamp) override;
+    void onSlicedConditionMayChange(bool overallCondition, const int64_t timestamp) override;
+    void onConditionChanged(bool condition, const int64_t timestamp) override;
 
     int64_t predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
                                       const int64_t currentTimestamp) const override;
@@ -67,7 +67,7 @@
     std::unordered_map<HashableDimensionKey, DurationInfo> mInfos;
 
     void noteConditionChanged(const HashableDimensionKey& key, bool conditionMet,
-                              const uint64_t timestamp);
+                              const int64_t timestamp);
 
     // return true if we should not allow newKey to be tracked because we are above the threshold
     bool hitGuardRail(const HashableDimensionKey& newKey);
diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
index 50db9a0..b833dfc 100644
--- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp
@@ -27,8 +27,8 @@
 OringDurationTracker::OringDurationTracker(
         const ConfigKey& key, const int64_t& id, const MetricDimensionKey& eventKey,
         sp<ConditionWizard> wizard, int conditionIndex, const vector<Matcher>& dimensionInCondition,
-        bool nesting, uint64_t currentBucketStartNs, uint64_t currentBucketNum,
-        uint64_t startTimeNs, uint64_t bucketSizeNs, bool conditionSliced, bool fullLink,
+        bool nesting, int64_t currentBucketStartNs, int64_t currentBucketNum,
+        int64_t startTimeNs, int64_t bucketSizeNs, bool conditionSliced, bool fullLink,
         const vector<sp<DurationAnomalyTracker>>& anomalyTrackers)
     : DurationTracker(key, id, eventKey, wizard, conditionIndex, dimensionInCondition, nesting,
                       currentBucketStartNs, currentBucketNum, startTimeNs, bucketSizeNs,
@@ -42,7 +42,7 @@
     }
 }
 
-unique_ptr<DurationTracker> OringDurationTracker::clone(const uint64_t eventTime) {
+unique_ptr<DurationTracker> OringDurationTracker::clone(const int64_t eventTime) {
     auto clonedTracker = make_unique<OringDurationTracker>(*this);
     clonedTracker->mLastStartTime = eventTime;
     clonedTracker->mDuration = 0;
@@ -69,7 +69,7 @@
 }
 
 void OringDurationTracker::noteStart(const HashableDimensionKey& key, bool condition,
-                                     const uint64_t eventTime, const ConditionKey& conditionKey) {
+                                     const int64_t eventTime, const ConditionKey& conditionKey) {
     if (hitGuardRail(key)) {
         return;
     }
@@ -90,7 +90,7 @@
     VLOG("Oring: %s start, condition %d", key.toString().c_str(), condition);
 }
 
-void OringDurationTracker::noteStop(const HashableDimensionKey& key, const uint64_t timestamp,
+void OringDurationTracker::noteStop(const HashableDimensionKey& key, const int64_t timestamp,
                                     const bool stopAll) {
     VLOG("Oring: %s stop", key.toString().c_str());
     auto it = mStarted.find(key);
@@ -121,7 +121,7 @@
     }
 }
 
-void OringDurationTracker::noteStopAll(const uint64_t timestamp) {
+void OringDurationTracker::noteStopAll(const int64_t timestamp) {
     if (!mStarted.empty()) {
         mDuration += (timestamp - mLastStartTime);
         VLOG("Oring Stop all: record duration %lld %lld ", (long long)timestamp - mLastStartTime,
@@ -136,7 +136,7 @@
 }
 
 bool OringDurationTracker::flushCurrentBucket(
-        const uint64_t& eventTimeNs,
+        const int64_t& eventTimeNs,
         std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) {
     VLOG("OringDurationTracker Flushing.............");
 
@@ -144,8 +144,8 @@
     // MetricProducer#notifyAppUpgrade.
 
     int numBucketsForward = 0;
-    uint64_t fullBucketEnd = getCurrentBucketEndTimeNs();
-    uint64_t currentBucketEndTimeNs;
+    int64_t fullBucketEnd = getCurrentBucketEndTimeNs();
+    int64_t currentBucketEndTimeNs;
 
     if (eventTimeNs >= fullBucketEnd) {
         numBucketsForward = 1 + (eventTimeNs - fullBucketEnd) / mBucketSizeNs;
@@ -207,7 +207,7 @@
 }
 
 bool OringDurationTracker::flushIfNeeded(
-        uint64_t eventTimeNs, unordered_map<MetricDimensionKey, vector<DurationBucket>>* output) {
+        int64_t eventTimeNs, unordered_map<MetricDimensionKey, vector<DurationBucket>>* output) {
     if (eventTimeNs < getCurrentBucketEndTimeNs()) {
         return false;
     }
@@ -215,7 +215,7 @@
 }
 
 void OringDurationTracker::onSlicedConditionMayChange(bool overallCondition,
-                                                      const uint64_t timestamp) {
+                                                      const int64_t timestamp) {
     vector<pair<HashableDimensionKey, int>> startedToPaused;
     vector<pair<HashableDimensionKey, int>> pausedToStarted;
     if (!mStarted.empty()) {
@@ -297,7 +297,7 @@
     }
 }
 
-void OringDurationTracker::onConditionChanged(bool condition, const uint64_t timestamp) {
+void OringDurationTracker::onConditionChanged(bool condition, const int64_t timestamp) {
     if (condition) {
         if (!mPaused.empty()) {
             VLOG("Condition true, all started");
diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
index 987e28e..8e73256 100644
--- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.h
@@ -30,29 +30,29 @@
     OringDurationTracker(const ConfigKey& key, const int64_t& id,
                          const MetricDimensionKey& eventKey, sp<ConditionWizard> wizard,
                          int conditionIndex, const std::vector<Matcher>& dimensionInCondition,
-                         bool nesting, uint64_t currentBucketStartNs, uint64_t currentBucketNum,
-                         uint64_t startTimeNs, uint64_t bucketSizeNs, bool conditionSliced,
+                         bool nesting, int64_t currentBucketStartNs, int64_t currentBucketNum,
+                         int64_t startTimeNs, int64_t bucketSizeNs, bool conditionSliced,
                          bool fullLink,
                          const std::vector<sp<DurationAnomalyTracker>>& anomalyTrackers);
 
     OringDurationTracker(const OringDurationTracker& tracker) = default;
 
-    unique_ptr<DurationTracker> clone(const uint64_t eventTime) override;
+    unique_ptr<DurationTracker> clone(const int64_t eventTime) override;
 
-    void noteStart(const HashableDimensionKey& key, bool condition, const uint64_t eventTime,
+    void noteStart(const HashableDimensionKey& key, bool condition, const int64_t eventTime,
                    const ConditionKey& conditionKey) override;
-    void noteStop(const HashableDimensionKey& key, const uint64_t eventTime,
+    void noteStop(const HashableDimensionKey& key, const int64_t eventTime,
                   const bool stopAll) override;
-    void noteStopAll(const uint64_t eventTime) override;
+    void noteStopAll(const int64_t eventTime) override;
 
-    void onSlicedConditionMayChange(bool overallCondition, const uint64_t timestamp) override;
-    void onConditionChanged(bool condition, const uint64_t timestamp) override;
+    void onSlicedConditionMayChange(bool overallCondition, const int64_t timestamp) override;
+    void onConditionChanged(bool condition, const int64_t timestamp) override;
 
     bool flushCurrentBucket(
-            const uint64_t& eventTimeNs,
+            const int64_t& eventTimeNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) override;
     bool flushIfNeeded(
-            uint64_t timestampNs,
+            int64_t timestampNs,
             std::unordered_map<MetricDimensionKey, std::vector<DurationBucket>>* output) override;
 
     int64_t predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.cpp b/cmds/statsd/src/metrics/metrics_manager_util.cpp
index 50eca05..566d34e 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.cpp
+++ b/cmds/statsd/src/metrics/metrics_manager_util.cpp
@@ -263,15 +263,14 @@
 }
 
 bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const long timeBaseSec,
-                 const unordered_map<int64_t, int>& logTrackerMap,
+                 UidMap& uidMap, const unordered_map<int64_t, int>& logTrackerMap,
                  const unordered_map<int64_t, int>& conditionTrackerMap,
                  const vector<sp<LogMatchingTracker>>& allAtomMatchers,
                  vector<sp<ConditionTracker>>& allConditionTrackers,
                  vector<sp<MetricProducer>>& allMetricProducers,
                  unordered_map<int, std::vector<int>>& conditionToMetricMap,
                  unordered_map<int, std::vector<int>>& trackerToMetricMap,
-                 unordered_map<int64_t, int>& metricMap,
-                 std::set<int64_t> &noReportMetricIds) {
+                 unordered_map<int64_t, int>& metricMap, std::set<int64_t>& noReportMetricIds) {
     sp<ConditionWizard> wizard = new ConditionWizard(allConditionTrackers);
     const int allMetricsCount = config.count_metric_size() + config.duration_metric_size() +
                                 config.event_metric_size() + config.value_metric_size();
@@ -538,6 +537,9 @@
         }
         noReportMetricIds.insert(no_report_metric);
     }
+    for (auto it : allMetricProducers) {
+        uidMap.addListener(it);
+    }
     return true;
 }
 
@@ -599,10 +601,11 @@
 
 bool initAlarms(const StatsdConfig& config, const ConfigKey& key,
                 const sp<AlarmMonitor>& periodicAlarmMonitor,
-                const long timeBaseSec,
+                const long timeBaseSec, const long currentTimeSec,
                 vector<sp<AlarmTracker>>& allAlarmTrackers) {
     unordered_map<int64_t, int> alarmTrackerMap;
     uint64_t startMillis = (uint64_t)timeBaseSec * MS_PER_SEC;
+    uint64_t currentTimeMillis = (uint64_t)currentTimeSec * MS_PER_SEC;
     for (int i = 0; i < config.alarm_size(); i++) {
         const Alarm& alarm = config.alarm(i);
         if (alarm.offset_millis() <= 0) {
@@ -615,7 +618,8 @@
         }
         alarmTrackerMap.insert(std::make_pair(alarm.id(), allAlarmTrackers.size()));
         allAlarmTrackers.push_back(
-            new AlarmTracker(startMillis, alarm, key, periodicAlarmMonitor));
+            new AlarmTracker(startMillis, currentTimeMillis,
+                             alarm, key, periodicAlarmMonitor));
     }
     for (int i = 0; i < config.subscription_size(); ++i) {
         const Subscription& subscription = config.subscription(i);
@@ -640,12 +644,10 @@
     return true;
 }
 
-bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config,
-                      const UidMap& uidMap,
+bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
                       const sp<AlarmMonitor>& anomalyAlarmMonitor,
-                      const sp<AlarmMonitor>& periodicAlarmMonitor,
-                      const long timeBaseSec,
-                      set<int>& allTagIds,
+                      const sp<AlarmMonitor>& periodicAlarmMonitor, const long timeBaseSec,
+                      const long currentTimeSec, set<int>& allTagIds,
                       vector<sp<LogMatchingTracker>>& allAtomMatchers,
                       vector<sp<ConditionTracker>>& allConditionTrackers,
                       vector<sp<MetricProducer>>& allMetricProducers,
@@ -654,7 +656,7 @@
                       unordered_map<int, std::vector<int>>& conditionToMetricMap,
                       unordered_map<int, std::vector<int>>& trackerToMetricMap,
                       unordered_map<int, std::vector<int>>& trackerToConditionMap,
-                      std::set<int64_t> &noReportMetricIds) {
+                      std::set<int64_t>& noReportMetricIds) {
     unordered_map<int64_t, int> logTrackerMap;
     unordered_map<int64_t, int> conditionTrackerMap;
     unordered_map<int64_t, int> metricProducerMap;
@@ -671,9 +673,10 @@
         return false;
     }
 
-    if (!initMetrics(key, config, timeBaseSec, logTrackerMap, conditionTrackerMap, allAtomMatchers,
-                     allConditionTrackers, allMetricProducers, conditionToMetricMap,
-                     trackerToMetricMap, metricProducerMap, noReportMetricIds)) {
+    if (!initMetrics(key, config, timeBaseSec, uidMap, logTrackerMap, conditionTrackerMap,
+                     allAtomMatchers, allConditionTrackers, allMetricProducers,
+                     conditionToMetricMap, trackerToMetricMap, metricProducerMap,
+                     noReportMetricIds)) {
         ALOGE("initMetricProducers failed");
         return false;
     }
@@ -682,7 +685,8 @@
         ALOGE("initAlerts failed");
         return false;
     }
-    if (!initAlarms(config, key, periodicAlarmMonitor, timeBaseSec, allPeriodicAlarmTrackers)) {
+    if (!initAlarms(config, key, periodicAlarmMonitor,
+                    timeBaseSec, currentTimeSec, allPeriodicAlarmTrackers)) {
         ALOGE("initAlarms failed");
         return false;
     }
diff --git a/cmds/statsd/src/metrics/metrics_manager_util.h b/cmds/statsd/src/metrics/metrics_manager_util.h
index 386de0b..0ebdcf9 100644
--- a/cmds/statsd/src/metrics/metrics_manager_util.h
+++ b/cmds/statsd/src/metrics/metrics_manager_util.h
@@ -81,7 +81,7 @@
 //                          the list of MetricProducer index
 // [trackerToMetricMap]: contains the mapping from log tracker to MetricProducer index.
 bool initMetrics(
-        const ConfigKey& key, const StatsdConfig& config, const long timeBaseSec,
+        const ConfigKey& key, const StatsdConfig& config, const long timeBaseSec, UidMap& uidMap,
         const std::unordered_map<int64_t, int>& logTrackerMap,
         const std::unordered_map<int64_t, int>& conditionTrackerMap,
         const std::unordered_map<int, std::vector<MetricConditionLink>>& eventConditionLinks,
@@ -90,16 +90,14 @@
         std::vector<sp<MetricProducer>>& allMetricProducers,
         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
-        std::set<int64_t> &noReportMetricIds);
+        std::set<int64_t>& noReportMetricIds);
 
 // Initialize MetricsManager from StatsdConfig.
 // Parameters are the members of MetricsManager. See MetricsManager for declaration.
-bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config,
-                      const UidMap& uidMap,
+bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
                       const sp<AlarmMonitor>& anomalyAlarmMonitor,
-                      const sp<AlarmMonitor>& periodicAlarmMonitor,
-                      const long timeBaseSec,
-                      std::set<int>& allTagIds,
+                      const sp<AlarmMonitor>& periodicAlarmMonitor, const long timeBaseSec,
+                      const long currentTimeSec, std::set<int>& allTagIds,
                       std::vector<sp<LogMatchingTracker>>& allAtomMatchers,
                       std::vector<sp<ConditionTracker>>& allConditionTrackers,
                       std::vector<sp<MetricProducer>>& allMetricProducers,
@@ -108,7 +106,7 @@
                       std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
                       std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
                       std::unordered_map<int, std::vector<int>>& trackerToConditionMap,
-                      std::set<int64_t> &noReportMetricIds);
+                      std::set<int64_t>& noReportMetricIds);
 
 bool isStateTracker(const SimplePredicate& simplePredicate, std::vector<Matcher>* primaryKeys);
 
diff --git a/cmds/statsd/src/packages/PackageInfoListener.h b/cmds/statsd/src/packages/PackageInfoListener.h
index 03cb364..fcdbe69 100644
--- a/cmds/statsd/src/packages/PackageInfoListener.h
+++ b/cmds/statsd/src/packages/PackageInfoListener.h
@@ -28,15 +28,15 @@
 public:
     // Uid map will notify this listener that the app with apk name and uid has been upgraded to
     // the specified version.
-    virtual void notifyAppUpgrade(const uint64_t& eventTimeNs, const std::string& apk,
+    virtual void notifyAppUpgrade(const int64_t& eventTimeNs, const std::string& apk,
                                   const int uid, const int64_t version) = 0;
 
     // Notify interested listeners that the given apk and uid combination no longer exits.
-    virtual void notifyAppRemoved(const uint64_t& eventTimeNs, const std::string& apk,
+    virtual void notifyAppRemoved(const int64_t& eventTimeNs, const std::string& apk,
                                   const int uid) = 0;
 
     // Notify the listener that the UidMap snapshot is available.
-    virtual void onUidMapReceived(const uint64_t& eventTimeNs) = 0;
+    virtual void onUidMapReceived(const int64_t& eventTimeNs) = 0;
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/packages/UidMap.cpp b/cmds/statsd/src/packages/UidMap.cpp
index 8c8152d..b3425a4 100644
--- a/cmds/statsd/src/packages/UidMap.cpp
+++ b/cmds/statsd/src/packages/UidMap.cpp
@@ -45,6 +45,7 @@
 const int FIELD_ID_SNAPSHOT_PACKAGE_NAME = 1;
 const int FIELD_ID_SNAPSHOT_PACKAGE_VERSION = 2;
 const int FIELD_ID_SNAPSHOT_PACKAGE_UID = 3;
+const int FIELD_ID_SNAPSHOT_PACKAGE_DELETED = 4;
 const int FIELD_ID_SNAPSHOT_TIMESTAMP = 1;
 const int FIELD_ID_SNAPSHOT_PACKAGE_INFO = 2;
 const int FIELD_ID_SNAPSHOTS = 1;
@@ -53,7 +54,8 @@
 const int FIELD_ID_CHANGE_TIMESTAMP = 2;
 const int FIELD_ID_CHANGE_PACKAGE = 3;
 const int FIELD_ID_CHANGE_UID = 4;
-const int FIELD_ID_CHANGE_VERSION = 5;
+const int FIELD_ID_CHANGE_NEW_VERSION = 5;
+const int FIELD_ID_CHANGE_PREV_VERSION = 6;
 
 UidMap::UidMap() : mBytesUsed(0) {}
 
@@ -62,13 +64,8 @@
 bool UidMap::hasApp(int uid, const string& packageName) const {
     lock_guard<mutex> lock(mMutex);
 
-    auto range = mMap.equal_range(uid);
-    for (auto it = range.first; it != range.second; ++it) {
-        if (it->second.packageName == packageName) {
-            return true;
-        }
-    }
-    return false;
+    auto it = mMap.find(std::make_pair(uid, packageName));
+    return it != mMap.end() && !it->second.deleted;
 }
 
 string UidMap::normalizeAppName(const string& appName) const {
@@ -84,10 +81,10 @@
 
 std::set<string> UidMap::getAppNamesFromUidLocked(const int32_t& uid, bool returnNormalized) const {
     std::set<string> names;
-    auto range = mMap.equal_range(uid);
-    for (auto it = range.first; it != range.second; ++it) {
-        names.insert(returnNormalized ?
-            normalizeAppName(it->second.packageName) : it->second.packageName);
+    for (const auto& kv : mMap) {
+        if (kv.first.first == uid && !kv.second.deleted) {
+            names.insert(returnNormalized ? normalizeAppName(kv.first.second) : kv.first.second);
+        }
     }
     return names;
 }
@@ -95,18 +92,11 @@
 int64_t UidMap::getAppVersion(int uid, const string& packageName) const {
     lock_guard<mutex> lock(mMutex);
 
-    auto range = mMap.equal_range(uid);
-    for (auto it = range.first; it != range.second; ++it) {
-        if (it->second.packageName == packageName) {
-            return it->second.versionCode;
-        }
+    auto it = mMap.find(std::make_pair(uid, packageName));
+    if (it == mMap.end() || it->second.deleted) {
+        return 0;
     }
-    return 0;
-}
-
-void UidMap::updateMap(const vector<int32_t>& uid, const vector<int64_t>& versionCode,
-                       const vector<String16>& packageName) {
-    updateMap(getElapsedRealtimeNs(), uid, versionCode, packageName);
+    return it->second.versionCode;
 }
 
 void UidMap::updateMap(const int64_t& timestamp, const vector<int32_t>& uid,
@@ -115,20 +105,31 @@
     {
         lock_guard<mutex> lock(mMutex);  // Exclusively lock for updates.
 
-        mMap.clear();
-        vector<const SnapshotPackageInfo> infos;
-        for (size_t j = 0; j < uid.size(); j++) {
-            string package = string(String8(packageName[j]).string());
-            mMap.insert(make_pair(uid[j], AppData(package, versionCode[j])));
-            infos.emplace_back(package, versionCode[j], uid[j]);
+        std::unordered_map<std::pair<int, string>, AppData, PairHash> deletedApps;
+
+        // Copy all the deleted apps.
+        for (const auto& kv : mMap) {
+            if (kv.second.deleted) {
+                deletedApps[kv.first] = kv.second;
+            }
         }
 
-        mSnapshots.emplace_back(timestamp, infos);
+        mMap.clear();
+        for (size_t j = 0; j < uid.size(); j++) {
+            string package = string(String8(packageName[j]).string());
+            mMap[std::make_pair(uid[j], package)] = AppData(versionCode[j]);
+        }
 
-        mBytesUsed += mSnapshots.back().bytes;
+        for (const auto& kv : deletedApps) {
+            auto mMapIt = mMap.find(kv.first);
+            if (mMapIt != mMap.end()) {
+                // Insert this deleted app back into the current map.
+                mMap[kv.first] = kv.second;
+            }
+        }
+
         ensureBytesUsedBelowLimit();
         StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
-        StatsdStats::getInstance().setUidMapSnapshots(mSnapshots.size());
         getListenerListCopyLocked(&broadcastList);
     }
     // To avoid invoking callback while holding the internal lock. we get a copy of the listener
@@ -144,38 +145,34 @@
     }
 }
 
-void UidMap::updateApp(const String16& app_16, const int32_t& uid, const int64_t& versionCode) {
-    updateApp(getElapsedRealtimeNs(), app_16, uid, versionCode);
-}
-
 void UidMap::updateApp(const int64_t& timestamp, const String16& app_16, const int32_t& uid,
                        const int64_t& versionCode) {
     vector<wp<PackageInfoListener>> broadcastList;
     string appName = string(String8(app_16).string());
     {
         lock_guard<mutex> lock(mMutex);
-
-        mChanges.emplace_back(false, timestamp, appName, uid, versionCode);
+        int32_t prevVersion = 0;
+        bool found = false;
+        auto it = mMap.find(std::make_pair(uid, appName));
+        if (it != mMap.end()) {
+            found = true;
+            prevVersion = it->second.versionCode;
+            it->second.versionCode = versionCode;
+            it->second.deleted = false;
+        }
+        if (!found) {
+            // Otherwise, we need to add an app at this uid.
+            mMap[std::make_pair(uid, appName)] = AppData(versionCode);
+        } else {
+            // Only notify the listeners if this is an app upgrade. If this app is being installed
+            // for the first time, then we don't notify the listeners.
+            getListenerListCopyLocked(&broadcastList);
+        }
+        mChanges.emplace_back(false, timestamp, appName, uid, versionCode, prevVersion);
         mBytesUsed += kBytesChangeRecord;
         ensureBytesUsedBelowLimit();
         StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
         StatsdStats::getInstance().setUidMapChanges(mChanges.size());
-
-        auto range = mMap.equal_range(int(uid));
-        bool found = false;
-        for (auto it = range.first; it != range.second; ++it) {
-            // If we find the exact same app name and uid, update the app version directly.
-            if (it->second.packageName == appName) {
-                it->second.versionCode = versionCode;
-                found = true;
-                break;
-            }
-        }
-        if (!found) {
-            // Otherwise, we need to add an app at this uid.
-            mMap.insert(make_pair(uid, AppData(appName, versionCode)));
-        }
-        getListenerListCopyLocked(&broadcastList);
     }
 
     for (auto weakPtr : broadcastList) {
@@ -195,22 +192,14 @@
     }
     while (mBytesUsed > limit) {
         ALOGI("Bytes used %zu is above limit %zu, need to delete something", mBytesUsed, limit);
-        if (mSnapshots.size() > 0) {
-            mBytesUsed -= mSnapshots.front().bytes;
-            mSnapshots.pop_front();
-            StatsdStats::getInstance().noteUidMapDropped(1, 0);
-        } else if (mChanges.size() > 0) {
+        if (mChanges.size() > 0) {
             mBytesUsed -= kBytesChangeRecord;
             mChanges.pop_front();
-            StatsdStats::getInstance().noteUidMapDropped(0, 1);
+            StatsdStats::getInstance().noteUidMapDropped(1);
         }
     }
 }
 
-void UidMap::removeApp(const String16& app_16, const int32_t& uid) {
-    removeApp(getElapsedRealtimeNs(), app_16, uid);
-}
-
 void UidMap::getListenerListCopyLocked(vector<wp<PackageInfoListener>>* output) {
     for (auto weakIt = mSubscribers.begin(); weakIt != mSubscribers.end();) {
         auto strongPtr = weakIt->promote();
@@ -230,19 +219,26 @@
     {
         lock_guard<mutex> lock(mMutex);
 
-        mChanges.emplace_back(true, timestamp, app, uid, 0);
+        int32_t prevVersion = 0;
+        auto key = std::make_pair(uid, app);
+        auto it = mMap.find(key);
+        if (it != mMap.end() && !it->second.deleted) {
+            prevVersion = it->second.versionCode;
+            it->second.deleted = true;
+            mDeletedApps.push_back(key);
+        }
+        if (mDeletedApps.size() > StatsdStats::kMaxDeletedAppsInUidMap) {
+            // Delete the oldest one.
+            auto oldest = mDeletedApps.front();
+            mDeletedApps.pop_front();
+            mMap.erase(oldest);
+            StatsdStats::getInstance().noteUidMapAppDeletionDropped();
+        }
+        mChanges.emplace_back(true, timestamp, app, uid, 0, prevVersion);
         mBytesUsed += kBytesChangeRecord;
         ensureBytesUsedBelowLimit();
         StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
         StatsdStats::getInstance().setUidMapChanges(mChanges.size());
-
-        auto range = mMap.equal_range(int(uid));
-        for (auto it = range.first; it != range.second; ++it) {
-            if (it->second.packageName == app) {
-                mMap.erase(it);
-                break;
-            }
-        }
         getListenerListCopyLocked(&broadcastList);
     }
 
@@ -290,22 +286,20 @@
 }
 
 void UidMap::clearOutput() {
-    mSnapshots.clear();
     mChanges.clear();
     // Also update the guardrail trackers.
     StatsdStats::getInstance().setUidMapChanges(0);
-    StatsdStats::getInstance().setUidMapSnapshots(1);
     mBytesUsed = 0;
     StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
 }
 
 int64_t UidMap::getMinimumTimestampNs() {
     int64_t m = 0;
-    for (auto it : mLastUpdatePerConfigKey) {
+    for (const auto& kv : mLastUpdatePerConfigKey) {
         if (m == 0) {
-            m = it.second;
-        } else if (it.second < m) {
-            m = it.second;
+            m = kv.second;
+        } else if (kv.second < m) {
+            m = kv.second;
         }
     }
     return m;
@@ -315,10 +309,6 @@
     return mBytesUsed;
 }
 
-void UidMap::appendUidMap(const ConfigKey& key, ProtoOutputStream* proto) {
-    appendUidMap(getElapsedRealtimeNs(), key, proto);
-}
-
 void UidMap::appendUidMap(const int64_t& timestamp, const ConfigKey& key,
                           ProtoOutputStream* proto) {
     lock_guard<mutex> lock(mMutex);  // Lock for updates
@@ -332,34 +322,27 @@
                          (long long)record.timestampNs);
             proto->write(FIELD_TYPE_STRING | FIELD_ID_CHANGE_PACKAGE, record.package);
             proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_UID, (int)record.uid);
-            proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_VERSION, (int)record.version);
+            proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_NEW_VERSION, (int)record.version);
+            proto->write(FIELD_TYPE_INT32 | FIELD_ID_CHANGE_PREV_VERSION, (int)record.prevVersion);
             proto->end(changesToken);
         }
     }
 
-    bool atLeastOneSnapshot = false;
-    unsigned int count = 0;
-    for (const SnapshotRecord& record : mSnapshots) {
-        // Ensure that we include at least the latest snapshot.
-        if ((count == mSnapshots.size() - 1 && !atLeastOneSnapshot) ||
-            record.timestampNs > mLastUpdatePerConfigKey[key]) {
-            uint64_t snapshotsToken =
-                    proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_SNAPSHOTS);
-            atLeastOneSnapshot = true;
-            count++;
-            proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP,
-                         (long long)record.timestampNs);
-            for (const SnapshotPackageInfo& info : record.infos) {
-                uint64_t token = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
-                                              FIELD_ID_SNAPSHOT_PACKAGE_INFO);
-                proto->write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_NAME, info.package);
-                proto->write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION, info.version);
-                proto->write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_UID, info.uid);
-                proto->end(token);
-            }
-            proto->end(snapshotsToken);
-        }
+    // Write snapshot from current uid map state.
+    uint64_t snapshotsToken =
+            proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_SNAPSHOTS);
+    proto->write(FIELD_TYPE_INT64 | FIELD_ID_SNAPSHOT_TIMESTAMP, (long long)timestamp);
+    for (const auto& kv : mMap) {
+        uint64_t token = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED |
+                                      FIELD_ID_SNAPSHOT_PACKAGE_INFO);
+        proto->write(FIELD_TYPE_STRING | FIELD_ID_SNAPSHOT_PACKAGE_NAME, kv.first.second);
+        proto->write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_VERSION,
+                     (int)kv.second.versionCode);
+        proto->write(FIELD_TYPE_INT32 | FIELD_ID_SNAPSHOT_PACKAGE_UID, kv.first.first);
+        proto->write(FIELD_TYPE_BOOL | FIELD_ID_SNAPSHOT_PACKAGE_DELETED, kv.second.deleted);
+        proto->end(token);
     }
+    proto->end(snapshotsToken);
 
     int64_t prevMin = getMinimumTimestampNs();
     mLastUpdatePerConfigKey[key] = timestamp;
@@ -368,14 +351,6 @@
     if (newMin > prevMin) {  // Delete anything possible now that the minimum has
                              // moved forward.
         int64_t cutoff_nanos = newMin;
-        for (auto it_snapshots = mSnapshots.begin(); it_snapshots != mSnapshots.end();) {
-            if (it_snapshots->timestampNs < cutoff_nanos) {
-                mBytesUsed -= it_snapshots->bytes;
-                it_snapshots = mSnapshots.erase(it_snapshots);
-            } else {
-                ++it_snapshots;
-            }
-        }
         for (auto it_changes = mChanges.begin(); it_changes != mChanges.end();) {
             if (it_changes->timestampNs < cutoff_nanos) {
                 mBytesUsed -= kBytesChangeRecord;
@@ -384,53 +359,24 @@
                 ++it_changes;
             }
         }
-
-        if (mSnapshots.size() == 0) {
-            // Produce another snapshot. This results in extra data being uploaded but
-            // helps ensure we can re-construct the UID->app name, versionCode mapping
-            // in server.
-            vector<const SnapshotPackageInfo> infos;
-            for (const auto& it : mMap) {
-                infos.emplace_back(it.second.packageName, it.second.versionCode, it.first);
-            }
-
-            mSnapshots.emplace_back(timestamp, infos);
-            mBytesUsed += mSnapshots.back().bytes;
-        }
     }
     StatsdStats::getInstance().setCurrentUidMapMemory(mBytesUsed);
     StatsdStats::getInstance().setUidMapChanges(mChanges.size());
-    StatsdStats::getInstance().setUidMapSnapshots(mSnapshots.size());
 }
 
 void UidMap::printUidMap(FILE* out) const {
     lock_guard<mutex> lock(mMutex);
 
-    for (auto it : mMap) {
-        fprintf(out, "%s, v%" PRId64 " (%i)\n", it.second.packageName.c_str(),
-                it.second.versionCode, it.first);
+    for (const auto& kv : mMap) {
+        if (!kv.second.deleted) {
+            fprintf(out, "%s, v%" PRId64 " (%i)\n", kv.first.second.c_str(), kv.second.versionCode,
+                    kv.first.first);
+        }
     }
 }
 
 void UidMap::OnConfigUpdated(const ConfigKey& key) {
     mLastUpdatePerConfigKey[key] = -1;
-
-    // Ensure there is at least one snapshot available since this configuration also needs to know
-    // what all the uid's represent.
-    if (mSnapshots.size() == 0) {
-        sp<IStatsCompanionService> statsCompanion = nullptr;
-        // Get statscompanion service from service manager
-        const sp<IServiceManager> sm(defaultServiceManager());
-        if (sm != nullptr) {
-            const String16 name("statscompanion");
-            statsCompanion = interface_cast<IStatsCompanionService>(sm->checkService(name));
-            if (statsCompanion == nullptr) {
-                ALOGW("statscompanion service unavailable!");
-                return;
-            }
-            statsCompanion->triggerUidSnapshot();
-        }
-    }
 }
 
 void UidMap::OnConfigRemoved(const ConfigKey& key) {
@@ -441,9 +387,9 @@
     lock_guard<mutex> lock(mMutex);
 
     set<int32_t> results;
-    for (const auto& pair : mMap) {
-        if (pair.second.packageName == package) {
-            results.insert(pair.first);
+    for (const auto& kv : mMap) {
+        if (kv.first.second == package && !kv.second.deleted) {
+            results.insert(kv.first.first);
         }
     }
     return results;
diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h
index a3632d2..7222e85 100644
--- a/cmds/statsd/src/packages/UidMap.h
+++ b/cmds/statsd/src/packages/UidMap.h
@@ -43,10 +43,13 @@
 namespace statsd {
 
 struct AppData {
-    const string packageName;
     int64_t versionCode;
+    bool deleted;
 
-    AppData(const string& a, const int64_t v) : packageName(a), versionCode(v){};
+    // Empty constructor needed for unordered map.
+    AppData() {
+    }
+    AppData(const int64_t v) : versionCode(v), deleted(false){};
 };
 
 // When calling appendUidMap, we retrieve all the ChangeRecords since the last
@@ -57,55 +60,21 @@
     const string package;
     const int32_t uid;
     const int32_t version;
+    const int32_t prevVersion;
 
     ChangeRecord(const bool isDeletion, const int64_t timestampNs, const string& package,
-                 const int32_t uid, const int32_t version)
+                 const int32_t uid, const int32_t version, const int32_t prevVersion)
         : deletion(isDeletion),
           timestampNs(timestampNs),
           package(package),
           uid(uid),
-          version(version) {
+          version(version),
+          prevVersion(prevVersion) {
     }
 };
 
 const unsigned int kBytesChangeRecord = sizeof(struct ChangeRecord);
 
-// Storing the int64 for a timestamp is expected to take 10 bytes (could take
-// less because of varint encoding).
-const unsigned int kBytesTimestampField = 10;
-
-struct SnapshotPackageInfo {
-    const string package;
-    const int32_t version;
-    const int32_t uid;
-    SnapshotPackageInfo(const string& package, const int32_t version, const int32_t uid)
-        : package(package), version(version), uid(uid) {
-    }
-};
-
-const unsigned int kBytesSnapshotInfo = sizeof(struct SnapshotPackageInfo);
-
-// When calling appendUidMap, we retrieve all the snapshots since the last
-// timestamp we called appendUidMap for this configuration key.
-struct SnapshotRecord {
-    const int64_t timestampNs;
-
-    // All the package info known.
-    vector<const SnapshotPackageInfo> infos;
-
-    // Tracks the number of bytes this snapshot consumes.
-    uint32_t bytes;
-
-    SnapshotRecord(const int64_t timestampNs, vector<const SnapshotPackageInfo>& infos)
-        : timestampNs(timestampNs), infos(infos) {
-        bytes = 0;
-        for (auto info : infos) {
-            bytes += info.package.size() + kBytesSnapshotInfo;
-        }
-        bytes += kBytesTimestampField;
-    }
-};
-
 // UidMap keeps track of what the corresponding app name (APK name) and version code for every uid
 // at any given moment. This map must be updated by StatsCompanionService.
 class UidMap : public virtual android::RefBase {
@@ -117,11 +86,12 @@
      * All three inputs must be the same size, and the jth element in each array refers to the same
      * tuple, ie. uid[j] corresponds to packageName[j] with versionCode[j].
      */
-    void updateMap(const vector<int32_t>& uid, const vector<int64_t>& versionCode,
-                   const vector<String16>& packageName);
+    void updateMap(const int64_t& timestamp, const vector<int32_t>& uid,
+                   const vector<int64_t>& versionCode, const vector<String16>& packageName);
 
-    void updateApp(const String16& packageName, const int32_t& uid, const int64_t& versionCode);
-    void removeApp(const String16& packageName, const int32_t& uid);
+    void updateApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid,
+                   const int64_t& versionCode);
+    void removeApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid);
 
     // Returns true if the given uid contains the specified app (eg. com.google.android.gms).
     bool hasApp(int uid, const string& packageName) const;
@@ -157,7 +127,8 @@
     // Gets all snapshots and changes that have occurred since the last output.
     // If every config key has received a change or snapshot record, then this
     // record is deleted.
-    void appendUidMap(const ConfigKey& key, util::ProtoOutputStream* proto);
+    void appendUidMap(const int64_t& timestamp, const ConfigKey& key,
+                      util::ProtoOutputStream* proto);
 
     // Forces the output to be cleared. We still generate a snapshot based on the current state.
     // This results in extra data uploaded but helps us reconstruct the uid mapping on the server
@@ -173,25 +144,20 @@
     std::set<string> getAppNamesFromUidLocked(const int32_t& uid, bool returnNormalized) const;
     string normalizeAppName(const string& appName) const;
 
-    void updateMap(const int64_t& timestamp, const vector<int32_t>& uid,
-                   const vector<int64_t>& versionCode, const vector<String16>& packageName);
-
-    void updateApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid,
-                   const int64_t& versionCode);
-    void removeApp(const int64_t& timestamp, const String16& packageName, const int32_t& uid);
-
-    void appendUidMap(const int64_t& timestamp, const ConfigKey& key,
-                      util::ProtoOutputStream* proto);
-
     void getListenerListCopyLocked(std::vector<wp<PackageInfoListener>>* output);
 
     // TODO: Use shared_mutex for improved read-locking if a library can be found in Android.
     mutable mutex mMutex;
     mutable mutex mIsolatedMutex;
 
-    // Maps uid to application data. This must be multimap since there is a feature in Android for
-    // multiple apps to share the same uid.
-    std::unordered_multimap<int, AppData> mMap;
+    struct PairHash {
+        size_t operator()(std::pair<int, string> p) const noexcept {
+            std::hash<std::string> hash_fn;
+            return hash_fn(std::to_string(p.first) + p.second);
+        }
+    };
+    // Maps uid and package name to application data.
+    std::unordered_map<std::pair<int, string>, AppData, PairHash> mMap;
 
     // Maps isolated uid to the parent uid. Any metrics for an isolated uid will instead contribute
     // to the parent uid.
@@ -200,8 +166,8 @@
     // Record the changes that can be provided with the uploads.
     std::list<ChangeRecord> mChanges;
 
-    // Record the snapshots that can be provided with the uploads.
-    std::list<SnapshotRecord> mSnapshots;
+    // Store which uid and apps represent deleted ones.
+    std::list<std::pair<int, string>> mDeletedApps;
 
     // Metric producers that should be notified if there's an upgrade in any app.
     set<wp<PackageInfoListener>> mSubscribers;
@@ -228,6 +194,8 @@
 
     // Allows unit-test to access private methods.
     FRIEND_TEST(UidMapTest, TestClearingOutput);
+    FRIEND_TEST(UidMapTest, TestRemovedAppRetained);
+    FRIEND_TEST(UidMapTest, TestRemovedAppOverGuardrail);
     FRIEND_TEST(UidMapTest, TestOutputIncludesAtLeastOneSnapshot);
     FRIEND_TEST(UidMapTest, TestMemoryComputed);
     FRIEND_TEST(UidMapTest, TestMemoryGuardrail);
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index a25df3f..36b24c8 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -155,6 +155,8 @@
             optional int64 version = 2;
 
             optional int32 uid = 3;
+
+            optional bool deleted = 4;
         }
         optional int64 elapsed_timestamp_nanos = 1;
 
@@ -169,7 +171,8 @@
         optional string app = 3;
         optional int32 uid = 4;
 
-        optional int64 version = 5;
+        optional int64 new_version = 5;
+        optional int64 prev_version = 6;
     }
     repeated Change changes = 2;
 }
@@ -186,6 +189,12 @@
   optional int64 last_report_wall_clock_nanos = 5;
 
   optional int64 current_report_wall_clock_nanos = 6;
+
+  message Annotation {
+      optional int64 field_int64 = 1;
+      optional int32 field_int32 = 2;
+  }
+  repeated Annotation annotation = 7;
 }
 
 message ConfigMetricsReportList {
@@ -228,20 +237,26 @@
         optional int64 id = 2;
         optional int32 creation_time_sec = 3;
         optional int32 deletion_time_sec = 4;
+        optional int32 reset_time_sec = 19;
         optional int32 metric_count = 5;
         optional int32 condition_count = 6;
         optional int32 matcher_count = 7;
         optional int32 alert_count = 8;
         optional bool is_valid = 9;
-
         repeated int32 broadcast_sent_time_sec = 10;
         repeated int32 data_drop_time_sec = 11;
         repeated int32 dump_report_time_sec = 12;
+        repeated int32 dump_report_data_size = 20;
         repeated MatcherStats matcher_stats = 13;
         repeated ConditionStats condition_stats = 14;
         repeated MetricStats metric_stats = 15;
         repeated AlertStats alert_stats = 16;
         repeated MetricStats metric_dimension_in_condition_stats = 17;
+        message Annotation {
+            optional int64 field_int64 = 1;
+            optional int32 field_int32 = 2;
+        }
+        repeated Annotation annotation = 18;
     }
 
     repeated ConfigStats config_stats = 3;
@@ -254,11 +269,10 @@
     repeated AtomStats atom_stats = 7;
 
     message UidMapStats {
-        optional int32 snapshots = 1;
-        optional int32 changes = 2;
-        optional int32 bytes_used = 3;
-        optional int32 dropped_snapshots = 4;
-        optional int32 dropped_changes = 5;
+        optional int32 changes = 1;
+        optional int32 bytes_used = 2;
+        optional int32 dropped_changes = 3;
+        optional int32 deleted_apps = 4;
     }
     optional UidMapStats uidmap_stats = 8;
 
@@ -280,4 +294,15 @@
         optional int32 error_code = 2;
     }
     repeated LoggerErrorStats logger_error_stats = 11;
+
+    message PeriodicAlarmStats {
+        optional int32 alarms_registered = 1;
+    }
+    optional PeriodicAlarmStats periodic_alarm_stats = 12;
+
+    message  SkippedLogEventStats {
+        optional int32 tag = 1;
+        optional int64 elapsed_timestamp_nanos = 2;
+    }
+    repeated SkippedLogEventStats skipped_log_event_stats = 13;
 }
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
index 93df9b82..870f92e 100644
--- a/cmds/statsd/src/statsd_config.proto
+++ b/cmds/statsd/src/statsd_config.proto
@@ -347,4 +347,15 @@
   repeated string allowed_log_source = 12;
 
   repeated int64 no_report_metric = 13;
+
+  message Annotation {
+    optional int64 field_int64 = 1;
+    optional int32 field_int32 = 2;
+  }
+  repeated Annotation annotation = 14;
+
+  optional int64 ttl_in_seconds = 15;
+
+  // Field number 1000 is reserved for later use.
+  reserved 1000;
 }
diff --git a/cmds/statsd/src/storage/StorageManager.cpp b/cmds/statsd/src/storage/StorageManager.cpp
index 643d2bf..ea8da14 100644
--- a/cmds/statsd/src/storage/StorageManager.cpp
+++ b/cmds/statsd/src/storage/StorageManager.cpp
@@ -252,8 +252,13 @@
     }
 }
 
-bool StorageManager::hasIdenticalConfig(const ConfigKey& key,
-                                        const vector<uint8_t>& config) {
+bool StorageManager::readConfigFromDisk(const ConfigKey& key, StatsdConfig* config) {
+    string content;
+    return config != nullptr &&
+        StorageManager::readConfigFromDisk(key, &content) && config->ParseFromString(content);
+}
+
+bool StorageManager::readConfigFromDisk(const ConfigKey& key, string* content) {
     unique_ptr<DIR, decltype(&closedir)> dir(opendir(STATS_SERVICE_DIR),
                                              closedir);
     if (dir == NULL) {
@@ -262,7 +267,6 @@
     }
 
     string suffix = StringPrintf("%d_%lld", key.GetUid(), (long long)key.GetId());
-
     dirent* de;
     while ((de = readdir(dir.get()))) {
         char* name = de->d_name;
@@ -277,13 +281,8 @@
             int fd = open(StringPrintf("%s/%s", STATS_SERVICE_DIR, name).c_str(),
                                   O_RDONLY | O_CLOEXEC);
             if (fd != -1) {
-                string content;
-                if (android::base::ReadFdToString(fd, &content)) {
-                    vector<uint8_t> vec(content.begin(), content.end());
-                    if (vec == config) {
-                        close(fd);
-                        return true;
-                    }
+                if (android::base::ReadFdToString(fd, content)) {
+                    return true;
                 }
                 close(fd);
             }
@@ -292,6 +291,18 @@
     return false;
 }
 
+bool StorageManager::hasIdenticalConfig(const ConfigKey& key,
+                                        const vector<uint8_t>& config) {
+    string content;
+    if (StorageManager::readConfigFromDisk(key, &content)) {
+        vector<uint8_t> vec(content.begin(), content.end());
+        if (vec == config) {
+            return true;
+        }
+    }
+    return false;
+}
+
 void StorageManager::trimToFit(const char* path) {
     unique_ptr<DIR, decltype(&closedir)> dir(opendir(path), closedir);
     if (dir == NULL) {
diff --git a/cmds/statsd/src/storage/StorageManager.h b/cmds/statsd/src/storage/StorageManager.h
index fb7b085..8953be9 100644
--- a/cmds/statsd/src/storage/StorageManager.h
+++ b/cmds/statsd/src/storage/StorageManager.h
@@ -74,6 +74,13 @@
     static void readConfigFromDisk(std::map<ConfigKey, StatsdConfig>& configsMap);
 
     /**
+     * Call to load the specified config from disk. Returns false if the config file does not
+     * exist or error occurs when reading the file.
+     */
+    static bool readConfigFromDisk(const ConfigKey& key, StatsdConfig* config);
+    static bool readConfigFromDisk(const ConfigKey& key, string* config);
+
+    /**
      * Trims files in the provided directory to limit the total size, number of
      * files, accumulation of outdated files.
      */
diff --git a/cmds/statsd/tests/ConfigManager_test.cpp b/cmds/statsd/tests/ConfigManager_test.cpp
index 838745e..9455304 100644
--- a/cmds/statsd/tests/ConfigManager_test.cpp
+++ b/cmds/statsd/tests/ConfigManager_test.cpp
@@ -44,7 +44,8 @@
  */
 class MockListener : public ConfigListener {
 public:
-    MOCK_METHOD2(OnConfigUpdated, void(const ConfigKey& key, const StatsdConfig& config));
+    MOCK_METHOD3(OnConfigUpdated, void(const int64_t timestampNs, const ConfigKey& key,
+                                       const StatsdConfig& config));
     MOCK_METHOD1(OnConfigRemoved, void(const ConfigKey& key));
 };
 
@@ -88,25 +89,25 @@
         manager->StartupForTest();
 
         // Add another one
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")),
+        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
             StatsdConfigEq(91)))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config91);
 
         // Update It
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("zzz")),
+        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("zzz")),
             StatsdConfigEq(92)))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("zzz")), config92);
 
         // Add one with the same uid but a different name
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(1, StringToId("yyy")),
+        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(1, StringToId("yyy")),
             StatsdConfigEq(93)))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(1, StringToId("yyy")), config93);
 
         // Add one with the same name but a different uid
-        EXPECT_CALL(*(listener.get()), OnConfigUpdated(ConfigKeyEq(2, StringToId("zzz")),
+        EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, ConfigKeyEq(2, StringToId("zzz")),
             StatsdConfigEq(94)))
                 .RetiresOnSaturation();
         manager->UpdateConfig(ConfigKey(2, StringToId("zzz")), config94);
@@ -142,7 +143,7 @@
 
     StatsdConfig config;
 
-    EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _)).Times(5);
+    EXPECT_CALL(*(listener.get()), OnConfigUpdated(_, _, _)).Times(5);
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("xxx"))));
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("yyy"))));
     EXPECT_CALL(*(listener.get()), OnConfigRemoved(ConfigKeyEq(2, StringToId("zzz"))));
diff --git a/cmds/statsd/tests/LogEntryMatcher_test.cpp b/cmds/statsd/tests/LogEntryMatcher_test.cpp
index b0da07b..4c6671d 100644
--- a/cmds/statsd/tests/LogEntryMatcher_test.cpp
+++ b/cmds/statsd/tests/LogEntryMatcher_test.cpp
@@ -146,11 +146,10 @@
     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)->set_eq_string("pkg0");
     EXPECT_FALSE(matchesSimple(uidMap, *simpleMatcher, event));
 
-    uidMap.updateMap({1111, 1111, 2222, 3333, 3333} /* uid list */,
-        {1, 1, 2, 1, 2} /* version list */,
-        {android::String16("pkg0"), android::String16("pkg1"),
-         android::String16("pkg1"), android::String16("Pkg2"),
-         android::String16("PkG3")} /* package name list */);
+    uidMap.updateMap(
+            1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
+            {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
+             android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
 
     EXPECT_TRUE(matchesSimple(uidMap, *simpleMatcher, event));
     attributionMatcher->mutable_matches_tuple()->mutable_field_value_matcher(0)
@@ -297,7 +296,7 @@
 TEST(AtomMatcherTest, TestNeqAnyStringMatcher) {
     UidMap uidMap;
     uidMap.updateMap(
-            {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
+            1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
             {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
              android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
 
@@ -372,7 +371,7 @@
 TEST(AtomMatcherTest, TestEqAnyStringMatcher) {
     UidMap uidMap;
     uidMap.updateMap(
-            {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
+            1, {1111, 1111, 2222, 3333, 3333} /* uid list */, {1, 1, 2, 1, 2} /* version list */,
             {android::String16("pkg0"), android::String16("pkg1"), android::String16("pkg1"),
              android::String16("Pkg2"), android::String16("PkG3")} /* package name list */);
 
diff --git a/cmds/statsd/tests/MetricsManager_test.cpp b/cmds/statsd/tests/MetricsManager_test.cpp
index 5d8c3f7..07378db 100644
--- a/cmds/statsd/tests/MetricsManager_test.cpp
+++ b/cmds/statsd/tests/MetricsManager_test.cpp
@@ -287,7 +287,7 @@
 
     EXPECT_TRUE(initStatsdConfig(kConfigKey, config, uidMap,
                                  anomalyAlarmMonitor, periodicAlarmMonitor,
-                                 timeBaseSec, allTagIds, allAtomMatchers,
+                                 timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                  allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                  allAlarmTrackers,
                                  conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -315,7 +315,7 @@
 
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -340,7 +340,7 @@
 
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -364,7 +364,7 @@
     std::set<int64_t> noReportMetricIds;
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -388,7 +388,7 @@
     std::set<int64_t> noReportMetricIds;
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -413,7 +413,7 @@
 
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
@@ -438,7 +438,7 @@
 
     EXPECT_FALSE(initStatsdConfig(kConfigKey, config, uidMap,
                                   anomalyAlarmMonitor, periodicAlarmMonitor,
-                                  timeBaseSec, allTagIds, allAtomMatchers,
+                                  timeBaseSec, timeBaseSec, allTagIds, allAtomMatchers,
                                   allConditionTrackers, allMetricProducers, allAnomalyTrackers,
                                   allAlarmTrackers,
                                   conditionToMetricMap, trackerToMetricMap, trackerToConditionMap,
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index 4b9a87d..fb8877a 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -43,7 +43,7 @@
 class MockMetricsManager : public MetricsManager {
 public:
     MockMetricsManager() : MetricsManager(
-        ConfigKey(1, 12345), StatsdConfig(), 1000,
+        ConfigKey(1, 12345), StatsdConfig(), 1000, 1000,
         new UidMap(),
         new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t){},
                          [](const sp<IStatsCompanionService>&){}),
@@ -53,7 +53,7 @@
 
     MOCK_METHOD0(byteSize, size_t());
 
-    MOCK_METHOD1(dropData, void(const uint64_t dropTimeNs));
+    MOCK_METHOD1(dropData, void(const int64_t dropTimeNs));
 };
 
 TEST(StatsLogProcessorTest, TestRateLimitByteSize) {
@@ -126,7 +126,7 @@
 TEST(StatsLogProcessorTest, TestUidMapHasSnapshot) {
     // Setup simple config key corresponding to empty config.
     sp<UidMap> m = new UidMap();
-    m->updateMap({1, 2}, {1, 2}, {String16("p1"), String16("p2")});
+    m->updateMap(1, {1, 2}, {1, 2}, {String16("p1"), String16("p2")});
     sp<AlarmMonitor> anomalyAlarmMonitor;
     sp<AlarmMonitor> subscriberAlarmMonitor;
     int broadcastCount = 0;
@@ -135,11 +135,11 @@
     ConfigKey key(3, 4);
     StatsdConfig config;
     config.add_allowed_log_source("AID_ROOT");
-    p.OnConfigUpdated(key, config);
+    p.OnConfigUpdated(0, key, config);
 
     // Expect to get no metrics, but snapshot specified above in uidmap.
     vector<uint8_t> bytes;
-    p.onDumpReport(key, 1, &bytes);
+    p.onDumpReport(key, 1, false, &bytes);
 
     ConfigMetricsReportList output;
     output.ParseFromArray(bytes.data(), bytes.size());
@@ -149,6 +149,35 @@
     EXPECT_EQ(2, uidmap.snapshots(0).package_info_size());
 }
 
+TEST(StatsLogProcessorTest, TestReportIncludesSubConfig) {
+    // Setup simple config key corresponding to empty config.
+    sp<UidMap> m = new UidMap();
+    sp<AlarmMonitor> anomalyAlarmMonitor;
+    sp<AlarmMonitor> subscriberAlarmMonitor;
+    int broadcastCount = 0;
+    StatsLogProcessor p(m, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
+                        [&broadcastCount](const ConfigKey& key) { broadcastCount++; });
+    ConfigKey key(3, 4);
+    StatsdConfig config;
+    auto annotation = config.add_annotation();
+    annotation->set_field_int64(1);
+    annotation->set_field_int32(2);
+    config.add_allowed_log_source("AID_ROOT");
+    p.OnConfigUpdated(1, key, config);
+
+    // Expect to get no metrics, but snapshot specified above in uidmap.
+    vector<uint8_t> bytes;
+    p.onDumpReport(key, 1, false, &bytes);
+
+    ConfigMetricsReportList output;
+    output.ParseFromArray(bytes.data(), bytes.size());
+    EXPECT_TRUE(output.reports_size() > 0);
+    auto report = output.reports(0);
+    EXPECT_EQ(1, report.annotation_size());
+    EXPECT_EQ(1, report.annotation(0).field_int64());
+    EXPECT_EQ(2, report.annotation(0).field_int32());
+}
+
 #else
 GTEST_LOG_(INFO) << "This test does nothing.\n";
 #endif
diff --git a/cmds/statsd/tests/UidMap_test.cpp b/cmds/statsd/tests/UidMap_test.cpp
index a9b67e0..2fab975 100644
--- a/cmds/statsd/tests/UidMap_test.cpp
+++ b/cmds/statsd/tests/UidMap_test.cpp
@@ -76,7 +76,7 @@
     apps.push_back(String16(kApp2.c_str()));
     versions.push_back(4);
     versions.push_back(5);
-    m.updateMap(uids, versions, apps);
+    m.updateMap(1, uids, versions, apps);
     EXPECT_TRUE(m.hasApp(1000, kApp1));
     EXPECT_TRUE(m.hasApp(1000, kApp2));
     EXPECT_FALSE(m.hasApp(1000, "not.app"));
@@ -102,7 +102,7 @@
     apps.push_back(String16(kApp2.c_str()));
     versions.push_back(4);
     versions.push_back(5);
-    m.updateMap(uids, versions, apps);
+    m.updateMap(1, uids, versions, apps);
 
     std::set<string> name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
     EXPECT_EQ(name_set.size(), 2u);
@@ -110,7 +110,7 @@
     EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
 
     // Update the app1 version.
-    m.updateApp(String16(kApp1.c_str()), 1000, 40);
+    m.updateApp(2, String16(kApp1.c_str()), 1000, 40);
     EXPECT_EQ(40, m.getAppVersion(1000, kApp1));
 
     name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
@@ -118,7 +118,7 @@
     EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
     EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
 
-    m.removeApp(String16(kApp1.c_str()), 1000);
+    m.removeApp(3, String16(kApp1.c_str()), 1000);
     EXPECT_FALSE(m.hasApp(1000, kApp1));
     EXPECT_TRUE(m.hasApp(1000, kApp2));
     name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
@@ -127,7 +127,7 @@
     EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
 
     // Remove app2.
-    m.removeApp(String16(kApp2.c_str()), 1000);
+    m.removeApp(4, String16(kApp2.c_str()), 1000);
     EXPECT_FALSE(m.hasApp(1000, kApp1));
     EXPECT_FALSE(m.hasApp(1000, kApp2));
     name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
@@ -136,14 +136,14 @@
 
 TEST(UidMapTest, TestUpdateApp) {
     UidMap m;
-    m.updateMap({1000, 1000}, {4, 5}, {String16(kApp1.c_str()), String16(kApp2.c_str())});
+    m.updateMap(1, {1000, 1000}, {4, 5}, {String16(kApp1.c_str()), String16(kApp2.c_str())});
     std::set<string> name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
     EXPECT_EQ(name_set.size(), 2u);
     EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
     EXPECT_TRUE(name_set.find(kApp2) != name_set.end());
 
     // Adds a new name for uid 1000.
-    m.updateApp(String16("NeW_aPP1_NAmE"), 1000, 40);
+    m.updateApp(2, String16("NeW_aPP1_NAmE"), 1000, 40);
     name_set = m.getAppNamesFromUid(1000, true /* returnNormalized */);
     EXPECT_EQ(name_set.size(), 3u);
     EXPECT_TRUE(name_set.find(kApp1) != name_set.end());
@@ -152,7 +152,7 @@
     EXPECT_TRUE(name_set.find("new_app1_name") != name_set.end());
 
     // This name is also reused by another uid 2000.
-    m.updateApp(String16("NeW_aPP1_NAmE"), 2000, 1);
+    m.updateApp(3, String16("NeW_aPP1_NAmE"), 2000, 1);
     name_set = m.getAppNamesFromUid(2000, true /* returnNormalized */);
     EXPECT_EQ(name_set.size(), 1u);
     EXPECT_TRUE(name_set.find("NeW_aPP1_NAmE") == name_set.end());
@@ -200,6 +200,66 @@
     EXPECT_EQ(1, results.snapshots_size());
 }
 
+TEST(UidMapTest, TestRemovedAppRetained) {
+    UidMap m;
+    // Initialize single config key.
+    ConfigKey config1(1, StringToId("config1"));
+    m.OnConfigUpdated(config1);
+    vector<int32_t> uids;
+    vector<int64_t> versions;
+    vector<String16> apps;
+    uids.push_back(1000);
+    apps.push_back(String16(kApp2.c_str()));
+    versions.push_back(5);
+    m.updateMap(1, uids, versions, apps);
+    m.removeApp(2, String16(kApp2.c_str()), 1000);
+
+    ProtoOutputStream proto;
+    m.appendUidMap(3, config1, &proto);
+
+    // Snapshot should still contain this item as deleted.
+    UidMapping results;
+    protoOutputStreamToUidMapping(&proto, &results);
+    EXPECT_EQ(1, results.snapshots(0).package_info_size());
+    EXPECT_EQ(true, results.snapshots(0).package_info(0).deleted());
+}
+
+TEST(UidMapTest, TestRemovedAppOverGuardrail) {
+    UidMap m;
+    // Initialize single config key.
+    ConfigKey config1(1, StringToId("config1"));
+    m.OnConfigUpdated(config1);
+    vector<int32_t> uids;
+    vector<int64_t> versions;
+    vector<String16> apps;
+    const int maxDeletedApps = StatsdStats::kMaxDeletedAppsInUidMap;
+    for (int j = 0; j < maxDeletedApps + 10; j++) {
+        uids.push_back(j);
+        apps.push_back(String16(kApp1.c_str()));
+        versions.push_back(j);
+    }
+    m.updateMap(1, uids, versions, apps);
+
+    // First, verify that we have the expected number of items.
+    UidMapping results;
+    ProtoOutputStream proto;
+    m.appendUidMap(3, config1, &proto);
+    protoOutputStreamToUidMapping(&proto, &results);
+    EXPECT_EQ(maxDeletedApps + 10, results.snapshots(0).package_info_size());
+
+    // Now remove all the apps.
+    m.updateMap(1, uids, versions, apps);
+    for (int j = 0; j < maxDeletedApps + 10; j++) {
+        m.removeApp(4, String16(kApp1.c_str()), j);
+    }
+
+    proto.clear();
+    m.appendUidMap(5, config1, &proto);
+    // Snapshot drops the first nine items.
+    protoOutputStreamToUidMapping(&proto, &results);
+    EXPECT_EQ(maxDeletedApps, results.snapshots(0).package_info_size());
+}
+
 TEST(UidMapTest, TestClearingOutput) {
     UidMap m;
 
@@ -218,7 +278,6 @@
     versions.push_back(4);
     versions.push_back(5);
     m.updateMap(1, uids, versions, apps);
-    EXPECT_EQ(1U, m.mSnapshots.size());
 
     ProtoOutputStream proto;
     m.appendUidMap(2, config1, &proto);
@@ -227,7 +286,6 @@
     EXPECT_EQ(1, results.snapshots_size());
 
     // We have to keep at least one snapshot in memory at all times.
-    EXPECT_EQ(1U, m.mSnapshots.size());
     proto.clear();
     m.appendUidMap(2, config1, &proto);
     protoOutputStreamToUidMapping(&proto, &results);
@@ -262,7 +320,6 @@
     EXPECT_EQ(1, results.snapshots_size());
     EXPECT_EQ(2, results.changes_size());
     // At this point both should be cleared.
-    EXPECT_EQ(1U, m.mSnapshots.size());
     EXPECT_EQ(0U, m.mChanges.size());
 }
 
@@ -280,11 +337,8 @@
     apps.push_back(String16(kApp1.c_str()));
     versions.push_back(1);
     m.updateMap(1, uids, versions, apps);
-    size_t snapshot_bytes = m.mBytesUsed;
-    EXPECT_TRUE(snapshot_bytes > startBytes);
 
     m.updateApp(3, String16(kApp1.c_str()), 1000, 40);
-    EXPECT_TRUE(m.mBytesUsed > snapshot_bytes);
 
     ProtoOutputStream proto;
     vector<uint8_t> bytes;
@@ -313,16 +367,13 @@
         versions.push_back(1);
     }
     m.updateMap(1, uids, versions, apps);
-    EXPECT_EQ(1U, m.mSnapshots.size());
 
     m.updateApp(3, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 2);
-    EXPECT_EQ(1U, m.mSnapshots.size());
     EXPECT_EQ(1U, m.mChanges.size());
 
     // Now force deletion by limiting the memory to hold one delta change.
     m.maxBytesOverride = 80; // Since the app string alone requires >45 characters.
     m.updateApp(5, String16("EXTREMELY_LONG_STRING_FOR_APP_TO_WASTE_MEMORY.0"), 1000, 4);
-    EXPECT_EQ(0U, m.mSnapshots.size());
     EXPECT_EQ(1U, m.mChanges.size());
 }
 #else
diff --git a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
index 3330ee9..5e6de1c 100644
--- a/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
+++ b/cmds/statsd/tests/anomaly/AlarmTracker_test.cpp
@@ -39,25 +39,24 @@
     Alarm alarm;
     alarm.set_offset_millis(15 * MS_PER_SEC);
     alarm.set_period_millis(60 * 60 * MS_PER_SEC);  // 1hr
-    uint64_t startMillis = 100000000 * MS_PER_SEC;
-    AlarmTracker tracker(startMillis, alarm, kConfigKey,
-                         subscriberAlarmMonitor);
+    int64_t startMillis = 100000000 * MS_PER_SEC;
+    AlarmTracker tracker(startMillis, startMillis, alarm, kConfigKey, subscriberAlarmMonitor);
 
-    EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15);
+    EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
 
     uint64_t currentTimeSec = startMillis / MS_PER_SEC + 10;
     std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarmSet =
         subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
     EXPECT_TRUE(firedAlarmSet.empty());
     tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
-    EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15);
+    EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15));
 
     currentTimeSec = startMillis / MS_PER_SEC + 7000;
     firedAlarmSet = subscriberAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec));
     EXPECT_EQ(firedAlarmSet.size(), 1u);
     tracker.informAlarmsFired(currentTimeSec * NS_PER_SEC, firedAlarmSet);
     EXPECT_TRUE(firedAlarmSet.empty());
-    EXPECT_EQ(tracker.mAlarmSec, startMillis / MS_PER_SEC + 15 + 2 * 60 * 60);
+    EXPECT_EQ(tracker.mAlarmSec, (int64_t)(startMillis / MS_PER_SEC + 15 + 2 * 60 * 60));
 }
 
 }  // namespace statsd
diff --git a/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp b/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
index a04a6f9..4dd0da8 100644
--- a/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
@@ -18,6 +18,7 @@
 #include "src/stats_log_util.h"
 #include "tests/statsd_test_util.h"
 
+#include <iostream>
 #include <vector>
 
 namespace android {
@@ -66,14 +67,10 @@
     EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
 
     // Here it assumes that GMS core has two uids.
-    processor->getUidMap()->updateApp(
-        android::String16("com.android.gmscore"), 222 /* uid */, 1 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("com.android.gmscore"), 444 /* uid */, 1 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("app1"), 111 /* uid */, 2 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("APP3"), 333 /* uid */, 2 /* version code*/);
+    processor->getUidMap()->updateMap(
+            1, {222, 444, 111, 333}, {1, 1, 2, 2},
+            {String16("com.android.gmscore"), String16("com.android.gmscore"), String16("app1"),
+             String16("APP3")});
 
     // GMS core node is in the middle.
     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
@@ -147,7 +144,7 @@
     }
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 4 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 4 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
@@ -212,14 +209,10 @@
     EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
 
     // Here it assumes that GMS core has two uids.
-    processor->getUidMap()->updateApp(
-        android::String16("com.android.gmscore"), 222 /* uid */, 1 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("com.android.gmscore"), 444 /* uid */, 1 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("app1"), 111 /* uid */, 2 /* version code*/);
-    processor->getUidMap()->updateApp(
-        android::String16("APP3"), 333 /* uid */, 2 /* version code*/);
+    processor->getUidMap()->updateMap(
+            1, {222, 444, 111, 333}, {1, 1, 2, 2},
+            {String16("com.android.gmscore"), String16("com.android.gmscore"), String16("app1"),
+             String16("APP3")});
 
     // GMS core node is in the middle.
     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
@@ -293,7 +286,7 @@
     }
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 4 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 4 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
diff --git a/cmds/statsd/tests/e2e/ConfigTtl_e2e_test.cpp b/cmds/statsd/tests/e2e/ConfigTtl_e2e_test.cpp
new file mode 100644
index 0000000..bb3ad64
--- /dev/null
+++ b/cmds/statsd/tests/e2e/ConfigTtl_e2e_test.cpp
@@ -0,0 +1,108 @@
+// 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.
+
+#include <gtest/gtest.h>
+
+#include "src/StatsLogProcessor.h"
+#include "src/stats_log_util.h"
+#include "tests/statsd_test_util.h"
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+
+namespace {
+
+StatsdConfig CreateStatsdConfig(int num_buckets, int threshold) {
+    StatsdConfig config;
+    config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
+    auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
+
+    *config.add_atom_matcher() = wakelockAcquireMatcher;
+
+    auto countMetric = config.add_count_metric();
+    countMetric->set_id(123456);
+    countMetric->set_what(wakelockAcquireMatcher.id());
+    *countMetric->mutable_dimensions_in_what() = CreateAttributionUidDimensions(
+            android::util::WAKELOCK_STATE_CHANGED, {Position::FIRST});
+    countMetric->set_bucket(FIVE_MINUTES);
+
+    auto alert = config.add_alert();
+    alert->set_id(StringToId("alert"));
+    alert->set_metric_id(123456);
+    alert->set_num_buckets(num_buckets);
+    alert->set_refractory_period_secs(10);
+    alert->set_trigger_if_sum_gt(threshold);
+
+    // Two hours
+    config.set_ttl_in_seconds(2 * 3600);
+    return config;
+}
+
+}  // namespace
+
+TEST(ConfigTtlE2eTest, TestCountMetric) {
+    const int num_buckets = 1;
+    const int threshold = 3;
+    auto config = CreateStatsdConfig(num_buckets, threshold);
+    const uint64_t alert_id = config.alert(0).id();
+    const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs();
+
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs =
+        TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000;
+
+    ConfigKey cfgKey;
+    auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
+    EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
+    EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
+
+    std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
+
+    FieldValue fieldValue1(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+                           Value((int32_t)111));
+    HashableDimensionKey whatKey1({fieldValue1});
+    MetricDimensionKey dimensionKey1(whatKey1, DEFAULT_DIMENSION_KEY);
+
+    FieldValue fieldValue2(Field(android::util::WAKELOCK_STATE_CHANGED, (int32_t)0x02010101),
+                           Value((int32_t)222));
+    HashableDimensionKey whatKey2({fieldValue2});
+    MetricDimensionKey dimensionKey2(whatKey2, DEFAULT_DIMENSION_KEY);
+
+    auto event = CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 2);
+    processor->OnLogEvent(event.get());
+
+    event = CreateAcquireWakelockEvent(attributions1, "wl2", bucketStartTimeNs + bucketSizeNs + 2);
+    processor->OnLogEvent(event.get());
+
+    event = CreateAcquireWakelockEvent(
+        attributions1, "wl1", bucketStartTimeNs + 25 * bucketSizeNs + 2);
+    processor->OnLogEvent(event.get());
+
+    EXPECT_EQ((int64_t)(bucketStartTimeNs + 25 * bucketSizeNs + 2 + 2 * 3600 * NS_PER_SEC),
+              processor->mMetricsManagers.begin()->second->getTtlEndNs());
+}
+
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
diff --git a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp
index 63e23ce..eb57d470 100644
--- a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp
+++ b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_AND_cond_test.cpp
@@ -172,7 +172,8 @@
 
             ConfigMetricsReportList reports;
             vector<uint8_t> buffer;
-            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1,
+                                    false, &buffer);
             EXPECT_TRUE(buffer.size() > 0);
             EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -488,7 +489,8 @@
 
             ConfigMetricsReportList reports;
             vector<uint8_t> buffer;
-            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false,
+                                    &buffer);
             EXPECT_TRUE(buffer.size() > 0);
             EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -731,7 +733,7 @@
 
         ConfigMetricsReportList reports;
         vector<uint8_t> buffer;
-        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
         EXPECT_TRUE(buffer.size() > 0);
         EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
diff --git a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
index c2334d8..9729a2e 100644
--- a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
+++ b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_combination_OR_cond_test.cpp
@@ -130,7 +130,7 @@
 
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -342,7 +342,7 @@
 
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -521,7 +521,7 @@
 
         ConfigMetricsReportList reports;
         vector<uint8_t> buffer;
-        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
         EXPECT_TRUE(buffer.size() > 0);
         EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -718,7 +718,7 @@
 
         ConfigMetricsReportList reports;
         vector<uint8_t> buffer;
-        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
         EXPECT_TRUE(buffer.size() > 0);
         EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
diff --git a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp
index ab37140..4e2c36e 100644
--- a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp
+++ b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_simple_cond_test.cpp
@@ -142,7 +142,8 @@
 
             ConfigMetricsReportList reports;
             vector<uint8_t> buffer;
-            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false,
+                                    &buffer);
             EXPECT_TRUE(buffer.size() > 0);
             EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -433,7 +434,8 @@
 
             ConfigMetricsReportList reports;
             vector<uint8_t> buffer;
-            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+            processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false,
+                                    &buffer);
             EXPECT_TRUE(buffer.size() > 0);
             EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -650,7 +652,7 @@
 
         ConfigMetricsReportList reports;
         vector<uint8_t> buffer;
-        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+        processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
         EXPECT_TRUE(buffer.size() > 0);
         EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
diff --git a/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
index 2b91324..18a0485 100644
--- a/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
+++ b/cmds/statsd/tests/e2e/GaugeMetric_e2e_push_test.cpp
@@ -148,7 +148,7 @@
         }
         ConfigMetricsReportList reports;
         vector<uint8_t> buffer;
-        processor->onDumpReport(cfgKey, bucketStartTimeNs + 3 * bucketSizeNs, &buffer);
+        processor->onDumpReport(cfgKey, bucketStartTimeNs + 3 * bucketSizeNs, false, &buffer);
         EXPECT_TRUE(buffer.size() > 0);
         EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
         EXPECT_EQ(1, reports.reports_size());
diff --git a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
index 1440f29..1952a6f 100644
--- a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
@@ -200,7 +200,7 @@
     }
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
@@ -314,7 +314,7 @@
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
 
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
diff --git a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
new file mode 100644
index 0000000..d4892ed
--- /dev/null
+++ b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
@@ -0,0 +1,137 @@
+// 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.
+
+#include <gtest/gtest.h>
+
+#include "src/StatsLogProcessor.h"
+#include "src/StatsService.h"
+#include "src/stats_log_util.h"
+#include "tests/statsd_test_util.h"
+
+#include <vector>
+
+namespace android {
+namespace os {
+namespace statsd {
+
+#ifdef __ANDROID__
+
+const string kApp1 = "app1.sharing.1";
+const int kConfigKey = 789130123;  // Randomly chosen to avoid collisions with existing configs.
+
+void SendConfig(StatsService& service, const StatsdConfig& config) {
+    string str;
+    config.SerializeToString(&str);
+    std::vector<uint8_t> configAsVec(str.begin(), str.end());
+    bool success;
+    service.addConfiguration(kConfigKey, configAsVec, &success);
+}
+
+ConfigMetricsReport GetReports(StatsService& service) {
+    vector<uint8_t> output;
+    service.getData(kConfigKey, &output);
+    ConfigMetricsReportList reports;
+    reports.ParseFromArray(output.data(), output.size());
+    EXPECT_EQ(1, reports.reports_size());
+    return reports.reports(0);
+}
+
+StatsdConfig MakeConfig() {
+    StatsdConfig config;
+    config.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
+
+    auto appCrashMatcher = CreateProcessCrashAtomMatcher();
+    *config.add_atom_matcher() = appCrashMatcher;
+    auto countMetric = config.add_count_metric();
+    countMetric->set_id(StringToId("AppCrashes"));
+    countMetric->set_what(appCrashMatcher.id());
+    countMetric->set_bucket(FIVE_MINUTES);
+    return config;
+}
+
+TEST(PartialBucketE2eTest, TestCountMetricWithoutSplit) {
+    StatsService service(nullptr);
+    SendConfig(service, MakeConfig());
+    const long start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                                // initialized with.
+
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 1).get());
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 2).get());
+
+    ConfigMetricsReport report = GetReports(service);
+    // Expect no metrics since the bucket has not finished yet.
+    EXPECT_EQ(0, report.metrics_size());
+}
+
+TEST(PartialBucketE2eTest, TestCountMetricNoSplitOnNewApp) {
+    StatsService service(nullptr);
+    SendConfig(service, MakeConfig());
+    const long start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                                // initialized with.
+
+    // Force the uidmap to update at timestamp 2.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 1).get());
+    // This is a new installation, so there shouldn't be a split (should be same as the without
+    // split case).
+    service.mUidMap->updateApp(start + 2, String16(kApp1.c_str()), 1, 2);
+    // Goes into the second bucket.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 3).get());
+
+    ConfigMetricsReport report = GetReports(service);
+    EXPECT_EQ(0, report.metrics_size());
+}
+
+TEST(PartialBucketE2eTest, TestCountMetricSplitOnUpgrade) {
+    StatsService service(nullptr);
+    SendConfig(service, MakeConfig());
+    const long start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                                // initialized with.
+    service.mUidMap->updateMap(start, {1}, {1}, {String16(kApp1.c_str())});
+
+    // Force the uidmap to update at timestamp 2.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 1).get());
+    service.mUidMap->updateApp(start + 2, String16(kApp1.c_str()), 1, 2);
+    // Goes into the second bucket.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 3).get());
+
+    ConfigMetricsReport report = GetReports(service);
+    EXPECT_EQ(1, report.metrics_size());
+    EXPECT_EQ(1, report.metrics(0).count_metrics().data(0).bucket_info(0).count());
+}
+
+TEST(PartialBucketE2eTest, TestCountMetricSplitOnRemoval) {
+    StatsService service(nullptr);
+    SendConfig(service, MakeConfig());
+    const long start = getElapsedRealtimeNs();  // This is the start-time the metrics producers are
+                                                // initialized with.
+    service.mUidMap->updateMap(start, {1}, {1}, {String16(kApp1.c_str())});
+
+    // Force the uidmap to update at timestamp 2.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 1).get());
+    service.mUidMap->removeApp(start + 2, String16(kApp1.c_str()), 1);
+    // Goes into the second bucket.
+    service.mProcessor->OnLogEvent(CreateAppCrashEvent(100, start + 3).get());
+
+    ConfigMetricsReport report = GetReports(service);
+    EXPECT_EQ(1, report.metrics_size());
+    EXPECT_EQ(1, report.metrics(0).count_metrics().data(0).bucket_info(0).count());
+}
+
+#else
+GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif
+
+}  // namespace statsd
+}  // namespace os
+}  // namespace android
\ No newline at end of file
diff --git a/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp b/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
index bfae8bc..f2d47c7 100644
--- a/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
@@ -127,7 +127,7 @@
     FeedEvents(config, processor);
     vector<uint8_t> buffer;
     ConfigMetricsReportList reports;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
 
@@ -161,7 +161,7 @@
     vector<uint8_t> buffer;
     ConfigMetricsReportList reports;
 
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
@@ -208,7 +208,7 @@
         processor->OnLogEvent(event.get());
     }
 
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 6 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 6 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
@@ -237,7 +237,7 @@
     FeedEvents(config, processor);
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs - 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
 
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
@@ -262,7 +262,7 @@
     FeedEvents(config, processor);
     ConfigMetricsReportList reports;
     vector<uint8_t> buffer;
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
@@ -304,7 +304,7 @@
         processor->OnLogEvent(event.get());
     }
 
-    processor->onDumpReport(cfgKey, bucketStartTimeNs + 6 * bucketSizeNs + 1, &buffer);
+    processor->onDumpReport(cfgKey, bucketStartTimeNs + 6 * bucketSizeNs + 1, false, &buffer);
     EXPECT_TRUE(buffer.size() > 0);
     EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size()));
     EXPECT_EQ(reports.reports_size(), 1);
diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
index 04ce73a7..e99e402 100644
--- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
+++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp
@@ -34,7 +34,7 @@
     const int conditionsCount = 20;
     const int matchersCount = 30;
     const int alertsCount = 10;
-    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount,
+    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
                              true /*valid config*/);
     vector<uint8_t> output;
     stats.dumpStats(&output, false /*reset stats*/);
@@ -61,7 +61,7 @@
     const int conditionsCount = 20;
     const int matchersCount = 30;
     const int alertsCount = 10;
-    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount,
+    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
                              false /*bad config*/);
     vector<uint8_t> output;
     stats.dumpStats(&output, false);
@@ -82,7 +82,8 @@
     const int conditionsCount = 20;
     const int matchersCount = 30;
     const int alertsCount = 10;
-    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, true);
+    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
+                             true);
     vector<uint8_t> output;
     stats.dumpStats(&output, false);
     StatsdStatsReport report;
@@ -104,7 +105,7 @@
 TEST(StatsdStatsTest, TestSubStats) {
     StatsdStats stats;
     ConfigKey key(0, 12345);
-    stats.noteConfigReceived(key, 2, 3, 4, 5, true);
+    stats.noteConfigReceived(key, 2, 3, 4, 5, {std::make_pair(123, 456)}, true);
 
     stats.noteMatcherMatched(key, StringToId("matcher1"));
     stats.noteMatcherMatched(key, StringToId("matcher1"));
@@ -128,9 +129,9 @@
     stats.noteDataDropped(key);
 
     // dump report -> 3
-    stats.noteMetricsReportSent(key);
-    stats.noteMetricsReportSent(key);
-    stats.noteMetricsReportSent(key);
+    stats.noteMetricsReportSent(key, 0);
+    stats.noteMetricsReportSent(key, 0);
+    stats.noteMetricsReportSent(key, 0);
 
     vector<uint8_t> output;
     stats.dumpStats(&output, true);  // Dump and reset stats
@@ -142,6 +143,10 @@
     EXPECT_EQ(2, configReport.broadcast_sent_time_sec_size());
     EXPECT_EQ(1, configReport.data_drop_time_sec_size());
     EXPECT_EQ(3, configReport.dump_report_time_sec_size());
+    EXPECT_EQ(3, configReport.dump_report_data_size_size());
+    EXPECT_EQ(1, configReport.annotation_size());
+    EXPECT_EQ(123, configReport.annotation(0).field_int64());
+    EXPECT_EQ(456, configReport.annotation(0).field_int32());
 
     EXPECT_EQ(2, configReport.matcher_stats_size());
     // matcher1 is the first in the list
@@ -259,12 +264,12 @@
         timestamps.push_back(i);
     }
     ConfigKey key(0, 12345);
-    stats.noteConfigReceived(key, 2, 3, 4, 5, true);
+    stats.noteConfigReceived(key, 2, 3, 4, 5, {}, true);
 
     for (int i = 0; i < StatsdStats::kMaxTimestampCount; i++) {
         stats.noteDataDropped(key, timestamps[i]);
         stats.noteBroadcastSent(key, timestamps[i]);
-        stats.noteMetricsReportSent(key, timestamps[i]);
+        stats.noteMetricsReportSent(key, 0, timestamps[i]);
     }
 
     int32_t newTimestamp = 10000;
@@ -272,7 +277,7 @@
     // now it should trigger removing oldest timestamp
     stats.noteDataDropped(key, 10000);
     stats.noteBroadcastSent(key, 10000);
-    stats.noteMetricsReportSent(key, 10000);
+    stats.noteMetricsReportSent(key, 0, 10000);
 
     EXPECT_TRUE(stats.mConfigStats.find(key) != stats.mConfigStats.end());
     const auto& configStats = stats.mConfigStats[key];
@@ -280,7 +285,7 @@
     size_t maxCount = StatsdStats::kMaxTimestampCount;
     EXPECT_EQ(maxCount, configStats->broadcast_sent_time_sec.size());
     EXPECT_EQ(maxCount, configStats->data_drop_time_sec.size());
-    EXPECT_EQ(maxCount, configStats->dump_report_time_sec.size());
+    EXPECT_EQ(maxCount, configStats->dump_report_stats.size());
 
     // the oldest timestamp is the second timestamp in history
     EXPECT_EQ(1, configStats->broadcast_sent_time_sec.front());
@@ -290,7 +295,7 @@
     // the last timestamp is the newest timestamp.
     EXPECT_EQ(newTimestamp, configStats->broadcast_sent_time_sec.back());
     EXPECT_EQ(newTimestamp, configStats->data_drop_time_sec.back());
-    EXPECT_EQ(newTimestamp, configStats->dump_report_time_sec.back());
+    EXPECT_EQ(newTimestamp, configStats->dump_report_stats.back().first);
 }
 
 }  // namespace statsd
diff --git a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
index fff1155..9a8919e 100644
--- a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp
@@ -203,9 +203,9 @@
 
 TEST(CountMetricProducerTest, TestEventWithAppUpgrade) {
     sp<AlarmMonitor> alarmMonitor;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
 
     int tagId = 1;
     int conditionTagId = 2;
@@ -244,7 +244,7 @@
     // Anomaly tracker only contains full buckets.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
-    uint64_t lastEndTimeNs = countProducer.getCurrentBucketEndTimeNs();
+    int64_t lastEndTimeNs = countProducer.getCurrentBucketEndTimeNs();
     // Next event occurs in same bucket as partial bucket created.
     LogEvent event2(tagId, bucketStartTimeNs + 59 * NS_PER_SEC + 10);
     event2.write("222");  // uid
@@ -265,9 +265,9 @@
 }
 
 TEST(CountMetricProducerTest, TestEventWithAppUpgradeInNextBucket) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
 
     int tagId = 1;
     int conditionTagId = 2;
@@ -294,7 +294,7 @@
     EXPECT_EQ((int64_t)bucketStartTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs,
-              (uint64_t)countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
+              countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mBucketEndNs);
     EXPECT_EQ(eventUpgradeTimeNs, countProducer.mCurrentBucketStartTimeNs);
 
     // Next event occurs in same bucket as partial bucket created.
@@ -313,7 +313,7 @@
     EXPECT_EQ((int64_t)eventUpgradeTimeNs,
               countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs,
-              (uint64_t)countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mBucketEndNs);
+              countProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mBucketEndNs);
 }
 
 TEST(CountMetricProducerTest, TestAnomalyDetectionUnSliced) {
diff --git a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
index 1b22d75..7ef8c5b 100644
--- a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp
@@ -41,7 +41,7 @@
 
 TEST(DurationMetricTrackerTest, TestNoCondition) {
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
-    uint64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
 
     DurationMetric metric;
@@ -71,15 +71,15 @@
     EXPECT_EQ(2UL, buckets.size());
     EXPECT_EQ(bucketStartTimeNs, buckets[0].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[0].mBucketEndNs);
-    EXPECT_EQ(bucketSizeNs - 1ULL, buckets[0].mDuration);
+    EXPECT_EQ(bucketSizeNs - 1LL, buckets[0].mDuration);
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets[1].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets[1].mBucketEndNs);
-    EXPECT_EQ(2ULL, buckets[1].mDuration);
+    EXPECT_EQ(2LL, buckets[1].mDuration);
 }
 
 TEST(DurationMetricTrackerTest, TestNonSlicedCondition) {
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
-    uint64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketStartTimeNs = 10000000000;
     int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
 
     DurationMetric metric;
@@ -122,7 +122,7 @@
     EXPECT_EQ(1UL, buckets2.size());
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, buckets2[0].mBucketStartNs);
     EXPECT_EQ(bucketStartTimeNs + 2 * bucketSizeNs, buckets2[0].mBucketEndNs);
-    EXPECT_EQ(1ULL, buckets2[0].mDuration);
+    EXPECT_EQ(1LL, buckets2[0].mDuration);
 }
 
 TEST(DurationMetricTrackerTest, TestSumDurationWithUpgrade) {
@@ -135,11 +135,11 @@
      *  - [70,130]: All 60 secs
      *  - [130, 210]: Only 5 secs (event ended at 135sec)
      */
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    uint64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
-    uint64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
 
     int tagId = 1;
 
@@ -190,11 +190,11 @@
      *  - [70,75]: 5 sec
      *  - [75,130]: 55 secs
      */
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
-    uint64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
-    uint64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
 
     int tagId = 1;
 
@@ -240,11 +240,11 @@
 
 TEST(DurationMetricTrackerTest, TestSumDurationAnomalyWithUpgrade) {
     sp<AlarmMonitor> alarmMonitor;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    uint64_t startTimeNs = bucketStartTimeNs + 1;
-    uint64_t endTimeNs = startTimeNs + 65 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    int64_t endTimeNs = startTimeNs + 65 * NS_PER_SEC;
 
     int tagId = 1;
 
@@ -277,15 +277,15 @@
     durationProducer.onMatchedLogEvent(2 /* stop index*/, end_event);
 
     EXPECT_EQ(bucketStartTimeNs + bucketSizeNs - startTimeNs,
-              (uint64_t)anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
+              anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 }
 
 TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgrade) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
-    uint64_t startTimeNs = bucketStartTimeNs + 1;
-    uint64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    int64_t endTimeNs = startTimeNs + 125 * NS_PER_SEC;
 
     int tagId = 1;
 
@@ -329,11 +329,11 @@
 }
 
 TEST(DurationMetricTrackerTest, TestMaxDurationWithUpgradeInNextBucket) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
-    uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
-    uint64_t startTimeNs = bucketStartTimeNs + 1;
-    uint64_t endTimeNs = startTimeNs + 115 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL;
+    int64_t eventUpgradeTimeNs = bucketStartTimeNs + 65 * NS_PER_SEC;
+    int64_t startTimeNs = bucketStartTimeNs + 1;
+    int64_t endTimeNs = startTimeNs + 115 * NS_PER_SEC;
 
     int tagId = 1;
 
diff --git a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
index 23d3171..3a15466 100644
--- a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp
@@ -36,9 +36,9 @@
 const ConfigKey kConfigKey(0, 12345);
 
 TEST(EventMetricProducerTest, TestNoCondition) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
 
     EventMetric metric;
     metric.set_id(1);
@@ -59,9 +59,9 @@
 }
 
 TEST(EventMetricProducerTest, TestEventsWithNonSlicedCondition) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
 
     EventMetric metric;
     metric.set_id(1);
@@ -86,8 +86,8 @@
 }
 
 TEST(EventMetricProducerTest, TestEventsWithSlicedCondition) {
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
 
     int tagId = 1;
     int conditionTagId = 2;
diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
index 7ca66fd..a1f865d 100644
--- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp
@@ -45,7 +45,7 @@
 const int64_t bucket2StartTimeNs = bucketStartTimeNs + bucketSizeNs;
 const int64_t bucket3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs;
 const int64_t bucket4StartTimeNs = bucketStartTimeNs + 3 * bucketSizeNs;
-const uint64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
+const int64_t eventUpgradeTimeNs = bucketStartTimeNs + 15 * NS_PER_SEC;
 
 TEST(GaugeMetricProducerTest, TestNoCondition) {
     GaugeMetric metric;
@@ -160,7 +160,7 @@
     gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
     EXPECT_EQ(0UL, (*gaugeProducer.mCurrentSlicedBucket).count(DEFAULT_METRIC_DIMENSION_KEY));
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(0UL, gaugeProducer.mCurrentBucketNum);
+    EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     // Partial buckets are not sent to anomaly tracker.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
@@ -171,9 +171,9 @@
     event2->write(10);
     event2->init();
     gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
-    EXPECT_EQ(0UL, gaugeProducer.mCurrentBucketNum);
+    EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ((int64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     // Partial buckets are not sent to anomaly tracker.
     EXPECT_EQ(0, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
@@ -184,9 +184,9 @@
     event3->write(10);
     event3->init();
     gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, *event3);
-    EXPECT_EQ(1UL, gaugeProducer.mCurrentBucketNum);
+    EXPECT_EQ(1L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(2UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)bucketStartTimeNs + bucketSizeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ((int64_t)bucketStartTimeNs + bucketSizeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     EXPECT_EQ(1, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 
     // Next event should trigger creation of new bucket.
@@ -196,7 +196,7 @@
     event4->write(10);
     event4->init();
     gaugeProducer.onMatchedLogEvent(1 /*log matcher index*/, *event4);
-    EXPECT_EQ(2UL, gaugeProducer.mCurrentBucketNum);
+    EXPECT_EQ(2L, gaugeProducer.mCurrentBucketNum);
     EXPECT_EQ(3UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
     EXPECT_EQ(2, anomalyTracker->getSumOverPastBuckets(DEFAULT_METRIC_DIMENSION_KEY));
 }
@@ -246,8 +246,8 @@
 
     gaugeProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
     EXPECT_EQ(1UL, gaugeProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ(0UL, gaugeProducer.mCurrentBucketNum);
-    EXPECT_EQ((uint64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(0L, gaugeProducer.mCurrentBucketNum);
+    EXPECT_EQ((int64_t)eventUpgradeTimeNs, gaugeProducer.mCurrentBucketStartTimeNs);
     EXPECT_EQ(1UL, gaugeProducer.mCurrentSlicedBucket->size());
     EXPECT_EQ(2, gaugeProducer.mCurrentSlicedBucket->begin()
                          ->second.front()
diff --git a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
index a0f1c00..bf04752 100644
--- a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
+++ b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
@@ -45,7 +45,7 @@
 const HashableDimensionKey conditionKey = getMockedDimensionKey(TagId, 4, "1");
 const HashableDimensionKey key1 = getMockedDimensionKey(TagId, 1, "1");
 const HashableDimensionKey key2 = getMockedDimensionKey(TagId, 1, "2");
-const uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+const int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
 
 TEST(MaxDurationTrackerTest, TestSimpleMaxDuration) {
     const MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 0, "1");
@@ -58,9 +58,9 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
 
     int64_t metricId = 1;
     MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, -1, dimensionInCondition,
@@ -80,7 +80,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(20ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(20LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(MaxDurationTrackerTest, TestStopAll) {
@@ -93,10 +93,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
 
     int64_t metricId = 1;
     MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, -1, dimensionInCondition,
@@ -129,10 +129,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
 
     int64_t metricId = 1;
     MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, -1, dimensionInCondition,
@@ -170,10 +170,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
 
     int64_t metricId = 1;
     MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, -1, dimensionInCondition,
@@ -213,14 +213,14 @@
     Start in first bucket, stop in second bucket. Condition turns on and off in the first bucket
     and again turns on and off in the second bucket.
     */
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
-    uint64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
-    uint64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
-    uint64_t conditionStarts2 = bucketStartTimeNs + bucketSizeNs + 5 * NS_PER_SEC;
-    uint64_t conditionStops2 = conditionStarts2 + 10 * NS_PER_SEC;
-    uint64_t eventStopTimeNs = conditionStops2 + 8 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+    int64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
+    int64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
+    int64_t conditionStarts2 = bucketStartTimeNs + bucketSizeNs + 5 * NS_PER_SEC;
+    int64_t conditionStops2 = conditionStarts2 + 10 * NS_PER_SEC;
+    int64_t eventStopTimeNs = conditionStops2 + 8 * NS_PER_SEC;
 
     int64_t metricId = 1;
     MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
@@ -242,7 +242,7 @@
     EXPECT_EQ(1U, buckets.size());
     vector<DurationBucket> item = buckets.begin()->second;
     EXPECT_EQ(1UL, item.size());
-    EXPECT_EQ(13ULL * NS_PER_SEC, item[0].mDuration);
+    EXPECT_EQ((int64_t)(13LL * NS_PER_SEC), item[0].mDuration);
 }
 
 TEST(MaxDurationTrackerTest, TestAnomalyDetection) {
@@ -255,11 +255,11 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = 13000000000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = 13000000000;
     int64_t durationTimeNs = 2 * 1000;
 
     int64_t metricId = 1;
@@ -312,15 +312,15 @@
      * dimension has already been running for 4 seconds. Thus, we have 40-4=36 seconds remaining
      * before we trigger the anomaly.
      */
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 5 * NS_PER_SEC;  // Condition is off at start.
-    uint64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
-    uint64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
-    uint64_t conditionStarts2 = bucketStartTimeNs + 20 * NS_PER_SEC;
-    uint64_t eventStartTimeNs2 = conditionStarts2 - 4 * NS_PER_SEC;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 5 * NS_PER_SEC;  // Condition is off at start.
+    int64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
+    int64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
+    int64_t conditionStarts2 = bucketStartTimeNs + 20 * NS_PER_SEC;
+    int64_t eventStartTimeNs2 = conditionStarts2 - 4 * NS_PER_SEC;
 
     int64_t metricId = 1;
     Alert alert;
@@ -344,9 +344,9 @@
     tracker.noteConditionChanged(key1, true, conditionStarts2);
     EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
     auto alarm = anomalyTracker->mAlarms.begin()->second;
-    uint64_t anomalyFireTimeSec = alarm->timestampSec;
+    int64_t anomalyFireTimeSec = alarm->timestampSec;
     EXPECT_EQ(conditionStarts2 + 36 * NS_PER_SEC,
-            (unsigned long long)anomalyFireTimeSec * NS_PER_SEC);
+            (long long)anomalyFireTimeSec * NS_PER_SEC);
 
     // Now we test the calculation now that there's a refractory period.
     // At the correct time, declare the anomaly. This will set a refractory period. Make sure it
@@ -354,23 +354,23 @@
     std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> firedAlarms({alarm});
     anomalyTracker->informAlarmsFired(anomalyFireTimeSec * NS_PER_SEC, firedAlarms);
     EXPECT_EQ(0u, anomalyTracker->mAlarms.size());
-    uint64_t refractoryPeriodEndsSec = anomalyFireTimeSec + refPeriodSec;
+    int64_t refractoryPeriodEndsSec = anomalyFireTimeSec + refPeriodSec;
     EXPECT_EQ(anomalyTracker->getRefractoryPeriodEndsSec(eventKey), refractoryPeriodEndsSec);
 
     // Now stop and start again. Make sure the new predictAnomalyTimestampNs takes into account
     // the refractory period correctly.
-    uint64_t eventStopTimeNs = anomalyFireTimeSec * NS_PER_SEC + 10;
+    int64_t eventStopTimeNs = anomalyFireTimeSec * NS_PER_SEC + 10;
     tracker.noteStop(key1, eventStopTimeNs, false);
     tracker.noteStop(key2, eventStopTimeNs, false);
     tracker.noteStart(key1, true, eventStopTimeNs + 1000000, conditionKey1);
     // Anomaly is ongoing, but we're still in the refractory period.
     EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
     alarm = anomalyTracker->mAlarms.begin()->second;
-    EXPECT_EQ(refractoryPeriodEndsSec, (unsigned long long)(alarm->timestampSec));
+    EXPECT_EQ(refractoryPeriodEndsSec, (long long)(alarm->timestampSec));
 
     // Makes sure it is correct after the refractory period is over.
     tracker.noteStop(key1, eventStopTimeNs + 2000000, false);
-    uint64_t justBeforeRefPeriodNs = (refractoryPeriodEndsSec - 2) * NS_PER_SEC;
+    int64_t justBeforeRefPeriodNs = (refractoryPeriodEndsSec - 2) * NS_PER_SEC;
     tracker.noteStart(key1, true, justBeforeRefPeriodNs, conditionKey1);
     alarm = anomalyTracker->mAlarms.begin()->second;
     EXPECT_EQ(justBeforeRefPeriodNs + 40 * NS_PER_SEC,
@@ -397,13 +397,13 @@
      * nested dimensions, are started for 8 seconds. When we stop, the other nested dimension has
      * been started for 5 seconds. So we can only allow 35 more seconds from now.
      */
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs1 = bucketStartTimeNs + 5 * NS_PER_SEC;  // Condition is off at start.
-    uint64_t eventStopTimeNs1 = bucketStartTimeNs + 13 * NS_PER_SEC;
-    uint64_t eventStartTimeNs2 = bucketStartTimeNs + 8 * NS_PER_SEC;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs1 = bucketStartTimeNs + 5 * NS_PER_SEC;  // Condition is off at start.
+    int64_t eventStopTimeNs1 = bucketStartTimeNs + 13 * NS_PER_SEC;
+    int64_t eventStartTimeNs2 = bucketStartTimeNs + 8 * NS_PER_SEC;
 
     int64_t metricId = 1;
     Alert alert;
diff --git a/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp b/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
index 817dcae..7c2b423 100644
--- a/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
+++ b/cmds/statsd/tests/metrics/OringDurationTracker_test.cpp
@@ -44,7 +44,7 @@
 const HashableDimensionKey kConditionKey1 = getMockedDimensionKey(TagId, 1, "maps");
 const HashableDimensionKey kEventKey1 = getMockedDimensionKey(TagId, 2, "maps");
 const HashableDimensionKey kEventKey2 = getMockedDimensionKey(TagId, 3, "maps");
-const uint64_t bucketSizeNs = 30 * NS_PER_SEC;
+const int64_t bucketSizeNs = 30 * NS_PER_SEC;
 
 TEST(OringDurationTrackerTest, TestDurationOverlap) {
     const MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 0, "event");
@@ -56,11 +56,11 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t durationTimeNs = 2 * 1000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t durationTimeNs = 2 * 1000;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  false, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -89,10 +89,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -107,7 +107,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(2003ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(2003LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(OringDurationTrackerTest, TestStopAll) {
@@ -122,10 +122,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -139,7 +139,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(2003ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(2003LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(OringDurationTrackerTest, TestCrossBucketBoundary) {
@@ -152,11 +152,11 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t durationTimeNs = 2 * 1000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t durationTimeNs = 2 * 1000;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -197,11 +197,11 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t durationTimeNs = 2 * 1000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t durationTimeNs = 2 * 1000;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  false, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -216,7 +216,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(5ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(5LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(OringDurationTrackerTest, TestDurationConditionChange2) {
@@ -237,11 +237,11 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
-    uint64_t durationTimeNs = 2 * 1000;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t durationTimeNs = 2 * 1000;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  false, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -258,7 +258,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(1005ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(1005LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(OringDurationTrackerTest, TestDurationConditionChangeNested) {
@@ -277,10 +277,10 @@
 
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
 
-    uint64_t bucketStartTimeNs = 10000000000;
-    uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
+    int64_t bucketStartTimeNs = 10000000000;
+    int64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 1;
 
     OringDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
                                  true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
@@ -298,7 +298,7 @@
     tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(15ULL, buckets[eventKey][0].mDuration);
+    EXPECT_EQ(15LL, buckets[eventKey][0].mDuration);
 }
 
 TEST(OringDurationTrackerTest, TestPredictAnomalyTimestamp) {
@@ -317,9 +317,9 @@
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
 
-    uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + NS_PER_SEC + 1;
+    int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + NS_PER_SEC + 1;
 
     sp<AlarmMonitor> alarmMonitor;
     sp<DurationAnomalyTracker> anomalyTracker =
@@ -336,26 +336,26 @@
     tracker.noteStop(DEFAULT_DIMENSION_KEY, eventStartTimeNs + 3, false);
     EXPECT_EQ(0u, buckets[eventKey].size());
 
-    uint64_t event1StartTimeNs = eventStartTimeNs + 10;
+    int64_t event1StartTimeNs = eventStartTimeNs + 10;
     tracker.noteStart(kEventKey1, true, event1StartTimeNs, ConditionKey());
     // No past buckets. The anomaly will happen in bucket #0.
     EXPECT_EQ((long long)(event1StartTimeNs + alert.trigger_if_sum_gt() - 3),
               tracker.predictAnomalyTimestampNs(*anomalyTracker, event1StartTimeNs));
 
-    uint64_t event1StopTimeNs = eventStartTimeNs + bucketSizeNs + 10;
+    int64_t event1StopTimeNs = eventStartTimeNs + bucketSizeNs + 10;
     tracker.flushIfNeeded(event1StopTimeNs, &buckets);
     tracker.noteStop(kEventKey1, event1StopTimeNs, false);
 
     EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
     EXPECT_EQ(1u, buckets[eventKey].size());
-    EXPECT_EQ(3ULL + bucketStartTimeNs + bucketSizeNs - eventStartTimeNs - 10,
+    EXPECT_EQ(3LL + bucketStartTimeNs + bucketSizeNs - eventStartTimeNs - 10,
               buckets[eventKey][0].mDuration);
 
     const int64_t bucket0Duration = 3ULL + bucketStartTimeNs + bucketSizeNs - eventStartTimeNs - 10;
     const int64_t bucket1Duration = eventStartTimeNs + 10 - bucketStartTimeNs;
 
     // One past buckets. The anomaly will happen in bucket #1.
-    uint64_t event2StartTimeNs = eventStartTimeNs + bucketSizeNs + 15;
+    int64_t event2StartTimeNs = eventStartTimeNs + bucketSizeNs + 15;
     tracker.noteStart(kEventKey1, true, event2StartTimeNs, ConditionKey());
     EXPECT_EQ((long long)(event2StartTimeNs + alert.trigger_if_sum_gt() - bucket0Duration -
                           bucket1Duration),
@@ -364,7 +364,7 @@
 
     // Only one past buckets is applicable. Bucket +0 should be trashed. The anomaly will happen in
     // bucket #2.
-    uint64_t event3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs - 9 * NS_PER_SEC;
+    int64_t event3StartTimeNs = bucketStartTimeNs + 2 * bucketSizeNs - 9 * NS_PER_SEC;
     tracker.noteStart(kEventKey1, true, event3StartTimeNs, ConditionKey());
     EXPECT_EQ((long long)(event3StartTimeNs + alert.trigger_if_sum_gt() - bucket1Duration - 1LL),
               tracker.predictAnomalyTimestampNs(*anomalyTracker, event3StartTimeNs));
@@ -379,8 +379,8 @@
     alert.set_num_buckets(1);
     alert.set_refractory_period_secs(20);
 
-    uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
-    uint64_t bucketNum = 0;
+    int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+    int64_t bucketNum = 0;
 
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     sp<AlarmMonitor> alarmMonitor;
@@ -391,7 +391,7 @@
                                  true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
                                  bucketSizeNs, true, false, {anomalyTracker});
 
-    uint64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
+    int64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
     tracker.noteStart(DEFAULT_DIMENSION_KEY, true, eventStartTimeNs, ConditionKey());
     // Anomaly happens in the bucket #1.
     EXPECT_EQ((long long)(bucketStartTimeNs + 14 * NS_PER_SEC),
@@ -402,7 +402,7 @@
     EXPECT_EQ((long long)(bucketStartTimeNs + 34 * NS_PER_SEC) / NS_PER_SEC,
               anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY));
 
-    uint64_t event2StartTimeNs = bucketStartTimeNs + 22 * NS_PER_SEC;
+    int64_t event2StartTimeNs = bucketStartTimeNs + 22 * NS_PER_SEC;
     EXPECT_EQ((long long)(bucketStartTimeNs + 34 * NS_PER_SEC) / NS_PER_SEC,
               anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY));
     EXPECT_EQ((long long)(bucketStartTimeNs + 35 * NS_PER_SEC),
@@ -413,7 +413,7 @@
     // Test the cases where the refractory period is smaller than the bucket size, longer than
     // the bucket size, and longer than 2x of the anomaly detection window.
     for (int j = 0; j < 3; j++) {
-        uint64_t thresholdNs = j * bucketSizeNs + 5 * NS_PER_SEC;
+        int64_t thresholdNs = j * bucketSizeNs + 5 * NS_PER_SEC;
         for (int i = 0; i <= 7; ++i) {
             vector<Matcher> dimensionInCondition;
             Alert alert;
@@ -424,8 +424,8 @@
             alert.set_refractory_period_secs(
                 bucketSizeNs / NS_PER_SEC / 2 + i * bucketSizeNs / NS_PER_SEC);
 
-            uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
-            uint64_t bucketNum = 101;
+            int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+            int64_t bucketNum = 101;
 
             sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
             sp<AlarmMonitor> alarmMonitor;
@@ -436,32 +436,32 @@
                                          true, bucketStartTimeNs, bucketNum, bucketStartTimeNs,
                                          bucketSizeNs, true, false, {anomalyTracker});
 
-            uint64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
+            int64_t eventStartTimeNs = bucketStartTimeNs + 9 * NS_PER_SEC;
             tracker.noteStart(DEFAULT_DIMENSION_KEY, true, eventStartTimeNs, ConditionKey());
             EXPECT_EQ((long long)(eventStartTimeNs + thresholdNs),
                       tracker.predictAnomalyTimestampNs(*anomalyTracker, eventStartTimeNs));
-            uint64_t eventStopTimeNs = eventStartTimeNs + thresholdNs + NS_PER_SEC;
+            int64_t eventStopTimeNs = eventStartTimeNs + thresholdNs + NS_PER_SEC;
             tracker.noteStop(DEFAULT_DIMENSION_KEY, eventStopTimeNs, false);
 
-            uint64_t refractoryPeriodEndSec =
+            int64_t refractoryPeriodEndSec =
                 anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY);
-            EXPECT_EQ((long long)(eventStopTimeNs) / NS_PER_SEC + alert.refractory_period_secs(),
+            EXPECT_EQ(eventStopTimeNs / (int64_t)NS_PER_SEC + alert.refractory_period_secs(),
                        refractoryPeriodEndSec);
 
             // Acquire and release a wakelock in the next bucket.
-            uint64_t event2StartTimeNs = eventStopTimeNs + bucketSizeNs;
+            int64_t event2StartTimeNs = eventStopTimeNs + bucketSizeNs;
             tracker.noteStart(DEFAULT_DIMENSION_KEY, true, event2StartTimeNs, ConditionKey());
-            uint64_t event2StopTimeNs = event2StartTimeNs + 4 * NS_PER_SEC;
+            int64_t event2StopTimeNs = event2StartTimeNs + 4 * NS_PER_SEC;
             tracker.noteStop(DEFAULT_DIMENSION_KEY, event2StopTimeNs, false);
 
             // Test the alarm prediction works well when seeing another wakelock start event.
             for (int k = 0; k <= 2; ++k) {
-                uint64_t event3StartTimeNs = event2StopTimeNs + NS_PER_SEC + k * bucketSizeNs;
-                uint64_t alarmTimestampNs =
+                int64_t event3StartTimeNs = event2StopTimeNs + NS_PER_SEC + k * bucketSizeNs;
+                int64_t alarmTimestampNs =
                     tracker.predictAnomalyTimestampNs(*anomalyTracker, event3StartTimeNs);
                 EXPECT_GT(alarmTimestampNs, 0u);
                 EXPECT_GE(alarmTimestampNs, event3StartTimeNs);
-                EXPECT_GE(alarmTimestampNs, refractoryPeriodEndSec * NS_PER_SEC);
+                EXPECT_GE(alarmTimestampNs, refractoryPeriodEndSec *(int64_t) NS_PER_SEC);
             }
         }
     }
@@ -484,9 +484,9 @@
     unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
 
-    uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
-    uint64_t bucketNum = 0;
-    uint64_t eventStartTimeNs = bucketStartTimeNs + NS_PER_SEC + 1;
+    int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+    int64_t bucketNum = 0;
+    int64_t eventStartTimeNs = bucketStartTimeNs + NS_PER_SEC + 1;
 
     sp<AlarmMonitor> alarmMonitor;
     sp<DurationAnomalyTracker> anomalyTracker =
@@ -535,8 +535,8 @@
     sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
     ConditionKey conkey;
     conkey[StringToId("APP_BACKGROUND")] = kConditionKey1;
-    uint64_t bucketStartTimeNs = 10 * NS_PER_SEC;
-    uint64_t bucketSizeNs = 30 * NS_PER_SEC;
+    int64_t bucketStartTimeNs = 10 * NS_PER_SEC;
+    int64_t bucketSizeNs = 30 * NS_PER_SEC;
 
     sp<AlarmMonitor> alarmMonitor;
     sp<DurationAnomalyTracker> anomalyTracker =
diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
index c650a06..a2bb734 100644
--- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
+++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp
@@ -234,7 +234,7 @@
 
     valueProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
 
     shared_ptr<LogEvent> event2 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 59 * NS_PER_SEC);
     event2->write(1);
@@ -242,7 +242,7 @@
     event2->init();
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event2);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
 
     // Next value should create a new bucket.
     shared_ptr<LogEvent> event3 = make_shared<LogEvent>(tagId, bucketStartTimeNs + 65 * NS_PER_SEC);
@@ -251,7 +251,7 @@
     event3->init();
     valueProducer.onMatchedLogEvent(1 /*log matcher index*/, *event3);
     EXPECT_EQ(2UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)bucketStartTimeNs + bucketSizeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(bucketStartTimeNs + bucketSizeNs, valueProducer.mCurrentBucketStartTimeNs);
 }
 
 TEST(ValueMetricProducerTest, TestPulledValueWithUpgrade) {
@@ -294,7 +294,7 @@
 
     valueProducer.notifyAppUpgrade(eventUpgradeTimeNs, "ANY.APP", 1, 1);
     EXPECT_EQ(1UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(eventUpgradeTimeNs, valueProducer.mCurrentBucketStartTimeNs);
     EXPECT_EQ(20L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][0].mValue);
 
     allData.clear();
@@ -305,7 +305,7 @@
     allData.push_back(event);
     valueProducer.onDataPulled(allData);
     EXPECT_EQ(2UL, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY].size());
-    EXPECT_EQ((uint64_t)bucket2StartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
+    EXPECT_EQ(bucket2StartTimeNs, valueProducer.mCurrentBucketStartTimeNs);
     EXPECT_EQ(30L, valueProducer.mPastBuckets[DEFAULT_METRIC_DIMENSION_KEY][1].mValue);
 }
 
diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp
index d0840f0..649c399 100644
--- a/cmds/statsd/tests/statsd_test_util.cpp
+++ b/cmds/statsd/tests/statsd_test_util.cpp
@@ -455,7 +455,7 @@
                 [](const sp<IStatsCompanionService>&){});
     sp<StatsLogProcessor> processor = new StatsLogProcessor(
         uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, [](const ConfigKey&){});
-    processor->OnConfigUpdated(key, config);
+    processor->OnConfigUpdated(timeBaseSec * NS_PER_SEC, key, config);
     return processor;
 }
 
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index 015c4b6..73d1102 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -2,6 +2,7 @@
 Landroid/accounts/IAccountAuthenticatorResponse$Stub;-><init>()V
 Landroid/accounts/IAccountManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/accounts/IAccountManager;
 Landroid/accounts/IAccountManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/animation/LayoutTransition;->cancel(I)V
 Landroid/animation/LayoutTransition;->cancel()V
 Landroid/animation/ValueAnimator;->animateValue(F)V
 Landroid/animation/ValueAnimator;->sDurationScale:F
@@ -152,6 +153,8 @@
 Landroid/app/AlarmManager;->WINDOW_EXACT:J
 Landroid/app/AlarmManager;->WINDOW_HEURISTIC:J
 Landroid/app/AlertDialog$Builder;->P:Lcom/android/internal/app/AlertController$AlertParams;
+Landroid/app/AlertDialog$Builder;->setRecycleOnMeasureEnabled(Z)Landroid/app/AlertDialog$Builder;
+Landroid/app/AlertDialog$Builder;->setView(Landroid/view/View;IIII)Landroid/app/AlertDialog$Builder;
 Landroid/app/AlertDialog;->mAlert:Lcom/android/internal/app/AlertController;
 Landroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application;
 Landroid/app/AppGlobals;->getInitialPackage()Ljava/lang/String;
@@ -189,6 +192,7 @@
 Landroid/app/AppOpsManager;->OP_FINE_LOCATION:I
 Landroid/app/AppOpsManager;->OP_GET_USAGE_STATS:I
 Landroid/app/AppOpsManager;->OP_POST_NOTIFICATION:I
+Landroid/app/AppOpsManager;->OP_PROJECT_MEDIA:I
 Landroid/app/AppOpsManager;->OP_READ_CONTACTS:I
 Landroid/app/AppOpsManager;->OP_READ_PHONE_STATE:I
 Landroid/app/AppOpsManager;->OP_READ_SMS:I
@@ -205,6 +209,7 @@
 Landroid/app/backup/BackupDataOutput;->mBackupWriter:J
 Landroid/app/backup/BackupHelperDispatcher$Header;->chunkSize:I
 Landroid/app/backup/BackupHelperDispatcher$Header;->keyPrefix:Ljava/lang/String;
+Landroid/app/backup/FileBackupHelperBase;->writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V
 Landroid/app/backup/FullBackup;->backupToTar(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/backup/FullBackupDataOutput;)I
 Landroid/app/backup/FullBackupDataOutput;->addSize(J)V
 Landroid/app/backup/FullBackupDataOutput;-><init>(Landroid/os/ParcelFileDescriptor;)V
@@ -258,6 +263,7 @@
 Landroid/app/IActivityManager;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V
 Landroid/app/IActivityManager;->requestBugReport(I)V
 Landroid/app/IActivityManager;->resumeAppSwitches()V
+Landroid/app/IActivityManager;->setActivityController(Landroid/app/IActivityController;Z)V
 Landroid/app/IActivityManager;->setRequestedOrientation(Landroid/os/IBinder;I)V
 Landroid/app/IActivityManager;->setTaskResizeable(II)V
 Landroid/app/IActivityManager;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;I)I
@@ -296,6 +302,7 @@
 Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager;
 Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader;
+Landroid/app/LoadedApk;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
 Landroid/app/LoadedApk;->getDataDirFile()Ljava/io/File;
 Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
 Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread;
@@ -326,6 +333,7 @@
 Landroid/app/Notification$Builder;->mActions:Ljava/util/ArrayList;
 Landroid/app/Notification$Builder;->makePublicContentView()Landroid/widget/RemoteViews;
 Landroid/app/Notification$Builder;->setChannel(Ljava/lang/String;)Landroid/app/Notification$Builder;
+Landroid/app/Notification;-><init>(Landroid/content/Context;ILjava/lang/CharSequence;JLjava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/content/Intent;)V
 Landroid/app/Notification;->isGroupSummary()Z
 Landroid/app/NotificationManager;->getService()Landroid/app/INotificationManager;
 Landroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V
@@ -371,14 +379,17 @@
 Landroid/app/trust/ITrustManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/app/usage/UsageStatsManager;->mService:Landroid/app/usage/IUsageStatsManager;
 Landroid/app/usage/UsageStats;->mLastEvent:I
+Landroid/app/usage/UsageStats;->mLaunchCount:I
 Landroid/app/usage/UsageStats;->mTotalTimeInForeground:J
 Landroid/app/Vr2dDisplayProperties$Builder;->build()Landroid/app/Vr2dDisplayProperties;
 Landroid/app/Vr2dDisplayProperties$Builder;-><init>()V
 Landroid/app/Vr2dDisplayProperties$Builder;->setEnabled(Z)Landroid/app/Vr2dDisplayProperties$Builder;
 Landroid/app/Vr2dDisplayProperties;-><init>(III)V
 Landroid/app/VrManager;->getPersistentVrModeEnabled()Z
+Landroid/app/VrManager;->mService:Landroid/service/vr/IVrManager;
 Landroid/app/VrManager;->registerVrStateCallback(Landroid/app/VrStateCallback;Landroid/os/Handler;)V
 Landroid/app/VrManager;->setVr2dDisplayProperties(Landroid/app/Vr2dDisplayProperties;)V
+Landroid/app/VrManager;->unregisterVrStateCallback(Landroid/app/VrStateCallback;)V
 Landroid/app/WallpaperColors;->getColorHints()I
 Landroid/app/WallpaperManager;->getBitmap()Landroid/graphics/Bitmap;
 Landroid/app/WallpaperManager;->getBitmap(Z)Landroid/graphics/Bitmap;
@@ -390,6 +401,7 @@
 Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;Landroid/os/Bundle;)V
 Landroid/appwidget/AppWidgetManager;->bindAppWidgetId(ILandroid/content/ComponentName;)V
 Landroid/appwidget/AppWidgetManager;->mService:Lcom/android/internal/appwidget/IAppWidgetService;
+Landroid/appwidget/AppWidgetProviderInfo;->providerInfo:Landroid/content/pm/ActivityInfo;
 Landroid/bluetooth/BluetoothA2dp;->connect(Landroid/bluetooth/BluetoothDevice;)Z
 Landroid/bluetooth/BluetoothAdapter;->disable(Z)Z
 Landroid/bluetooth/BluetoothAdapter;->factoryReset()Z
@@ -408,6 +420,10 @@
 Landroid/bluetooth/BluetoothGatt;->mAuthRetryState:I
 Landroid/bluetooth/BluetoothGatt;->refresh()Z
 Landroid/bluetooth/BluetoothHeadset;->close()V
+Landroid/bluetooth/BluetoothHeadset;->connectAudio()Z
+Landroid/bluetooth/BluetoothHeadset;->disconnectAudio()Z
+Landroid/bluetooth/BluetoothHeadset;->startScoUsingVirtualVoiceCall(Landroid/bluetooth/BluetoothDevice;)Z
+Landroid/bluetooth/BluetoothHeadset;->stopScoUsingVirtualVoiceCall(Landroid/bluetooth/BluetoothDevice;)Z
 Landroid/bluetooth/BluetoothMapClient;->sendMessage(Landroid/bluetooth/BluetoothDevice;[Landroid/net/Uri;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)Z
 Landroid/bluetooth/BluetoothPan;->isTetheringOn()Z
 Landroid/bluetooth/BluetoothPan;->setBluetoothTethering(Z)V
@@ -444,9 +460,11 @@
 Landroid/content/ContentResolver;->mPackageName:Ljava/lang/String;
 Landroid/content/ContentResolver;->releaseProvider(Landroid/content/IContentProvider;)Z
 Landroid/content/ContentResolver;->releaseUnstableProvider(Landroid/content/IContentProvider;)Z
+Landroid/content/ContentResolver;->takePersistableUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V
 Landroid/content/ContentResolver;->unstableProviderDied(Landroid/content/IContentProvider;)V
 Landroid/content/ContentValues;-><init>(Ljava/util/HashMap;)V
 Landroid/content/ContentValues;->mValues:Ljava/util/HashMap;
+Landroid/content/Context;->getBasePackageName()Ljava/lang/String;
 Landroid/content/Context;->getSharedPrefsFile(Ljava/lang/String;)Ljava/io/File;
 Landroid/content/Context;->getThemeResId()I
 Landroid/content/Context;->sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;I)V
@@ -468,7 +486,9 @@
 Landroid/content/IntentFilter;->mActions:Ljava/util/ArrayList;
 Landroid/content/Intent;->mExtras:Landroid/os/Bundle;
 Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent;
+Landroid/content/Intent;->toInsecureString()Ljava/lang/String;
 Landroid/content/pm/ActivityInfo;->resizeMode:I
+Landroid/content/pm/ActivityInfo;->supportsPictureInPicture()Z
 Landroid/content/pm/ApplicationInfo;->enabledSetting:I
 Landroid/content/pm/ApplicationInfo;->getBaseResourcePath()Ljava/lang/String;
 Landroid/content/pm/ApplicationInfo;->installLocation:I
@@ -507,6 +527,7 @@
 Landroid/content/pm/LauncherActivityInfo;->mActivityInfo:Landroid/content/pm/ActivityInfo;
 Landroid/content/pm/LauncherApps;->mPm:Landroid/content/pm/PackageManager;
 Landroid/content/pm/LauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)V
+Landroid/content/pm/PackageInfo;->INSTALL_LOCATION_UNSPECIFIED:I
 Landroid/content/pm/PackageItemInfo;->setForceSafeLabels(Z)V
 Landroid/content/pm/PackageManager;->buildRequestPermissionsIntent([Ljava/lang/String;)Landroid/content/Intent;
 Landroid/content/pm/PackageManager;->freeStorageAndNotify(JLandroid/content/pm/IPackageDataObserver;)V
@@ -576,6 +597,7 @@
 Landroid/content/res/AssetFileDescriptor;->mStartOffset:J
 Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I
 Landroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I
+Landroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V
 Landroid/content/res/AssetManager;->getAssignedPackageIdentifiers()Landroid/util/SparseArray;
 Landroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequence;
 Landroid/content/res/AssetManager;->getResourceEntryName(I)Ljava/lang/String;
@@ -591,12 +613,14 @@
 Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;I)Ljava/io/InputStream;
 Landroid/content/res/AssetManager;->openNonAsset(Ljava/lang/String;)Ljava/io/InputStream;
 Landroid/content/res/AssetManager;->resolveAttrs(JII[I[I[I[I)Z
+Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
 Landroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIII)V
 Landroid/content/res/ColorStateList$ColorStateListFactory;-><init>(Landroid/content/res/ColorStateList;)V
 Landroid/content/res/ColorStateList;->getColors()[I
 Landroid/content/res/ColorStateList;->mColors:[I
 Landroid/content/res/ColorStateList;->mDefaultColor:I
 Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory;
+Landroid/content/res/ColorStateList;->mStateSpecs:[[I
 Landroid/content/res/CompatibilityInfo;->applicationScale:F
 Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo;
 Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
@@ -653,6 +677,7 @@
 Landroid/database/AbstractCursor;->mExtras:Landroid/os/Bundle;
 Landroid/database/AbstractCursor;->mNotifyUri:Landroid/net/Uri;
 Landroid/database/AbstractCursor;->mRowIdColumnIndex:I
+Landroid/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V
 Landroid/database/CursorWindow;->mWindowPtr:J
 Landroid/database/CursorWindow;->sCursorWindowSize:I
 Landroid/database/CursorWindow;->sWindowToPidMap:Landroid/util/LongSparseArray;
@@ -661,12 +686,14 @@
 Landroid/database/sqlite/SQLiteCustomFunction;->name:Ljava/lang/String;
 Landroid/database/sqlite/SQLiteCustomFunction;->numArgs:I
 Landroid/database/sqlite/SQLiteDatabaseConfiguration;->maxSqlCacheSize:I
+Landroid/database/sqlite/SQLiteDatabase;->CONFLICT_VALUES:[Ljava/lang/String;
 Landroid/database/sqlite/SQLiteDatabase;->mConfigurationLocked:Landroid/database/sqlite/SQLiteDatabaseConfiguration;
 Landroid/database/sqlite/SQLiteDatabase;->mConnectionPoolLocked:Landroid/database/sqlite/SQLiteConnectionPool;
 Landroid/database/sqlite/SQLiteDebug$PagerStats;->largestMemAlloc:I
 Landroid/database/sqlite/SQLiteDebug$PagerStats;->memoryUsed:I
 Landroid/database/sqlite/SQLiteDebug$PagerStats;->pageCacheOverflow:I
 Landroid/database/sqlite/SQLiteOpenHelper;->mName:Ljava/lang/String;
+Landroid/database/sqlite/SQLiteStatement;-><init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V
 Landroid/ddm/DdmHandleAppName;->getAppName()Ljava/lang/String;
 Landroid/graphics/AvoidXfermode$Mode;->AVOID:Landroid/graphics/AvoidXfermode$Mode;
 Landroid/graphics/AvoidXfermode$Mode;->TARGET:Landroid/graphics/AvoidXfermode$Mode;
@@ -690,10 +717,6 @@
 Landroid/graphics/Canvas;-><init>(J)V
 Landroid/graphics/Canvas;->release()V
 Landroid/graphics/Canvas;->save(I)I
-Landroid/graphics/Canvas;->saveLayerAlpha(FFFFII)I
-Landroid/graphics/Canvas;->saveLayerAlpha(Landroid/graphics/RectF;II)I
-Landroid/graphics/Canvas;->saveLayer(FFFFLandroid/graphics/Paint;I)I
-Landroid/graphics/Canvas;->saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;I)I
 Landroid/graphics/ColorMatrixColorFilter;->setColorMatrix(Landroid/graphics/ColorMatrix;)V
 Landroid/graphics/drawable/AnimatedImageDrawable;->onAnimationEnd()V
 Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState;->mStateIds:Landroid/util/SparseIntArray;
@@ -740,6 +763,7 @@
 Landroid/graphics/drawable/Icon;->hasTint()Z
 Landroid/graphics/drawable/Icon;->mType:I
 Landroid/graphics/drawable/InsetDrawable;->mState:Landroid/graphics/drawable/InsetDrawable$InsetState;
+Landroid/graphics/drawable/LayerDrawable;->mLayerState:Landroid/graphics/drawable/LayerDrawable$LayerState;
 Landroid/graphics/drawable/NinePatchDrawable;->mNinePatchState:Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;
 Landroid/graphics/drawable/NinePatchDrawable$NinePatchState;->mNinePatch:Landroid/graphics/NinePatch;
 Landroid/graphics/drawable/StateListDrawable;->extractStateSet(Landroid/util/AttributeSet;)[I
@@ -760,7 +784,6 @@
 Landroid/graphics/GraphicBuffer;->CREATOR:Landroid/os/Parcelable$Creator;
 Landroid/graphics/GraphicBuffer;-><init>(IIIIJ)V
 Landroid/graphics/GraphicBuffer;->mNativeObject:J
-Landroid/graphics/ImageDecoder;-><init>(JIIZ)V
 Landroid/graphics/ImageDecoder;->postProcessAndRelease(Landroid/graphics/Canvas;)I
 Landroid/graphics/LinearGradient;->mColors:[I
 Landroid/graphics/Matrix;->native_instance:J
@@ -772,6 +795,7 @@
 Landroid/graphics/PixelXorXfermode;-><init>(I)V
 Landroid/graphics/PorterDuffColorFilter;->setColor(I)V
 Landroid/graphics/PorterDuffColorFilter;->setMode(Landroid/graphics/PorterDuff$Mode;)V
+Landroid/graphics/Rect;->scale(F)V
 Landroid/graphics/Region;-><init>(JI)V
 Landroid/graphics/Region;->mNativeRegion:J
 Landroid/graphics/SurfaceTexture;->mFrameAvailableListener:J
@@ -1017,6 +1041,7 @@
 Landroid/media/AudioSystem;->errorCallbackFromNative(I)V
 Landroid/media/AudioSystem;->getPrimaryOutputFrameCount()I
 Landroid/media/AudioSystem;->getPrimaryOutputSamplingRate()I
+Landroid/media/AudioSystem;->isSourceActive(I)Z
 Landroid/media/AudioSystem;->isStreamActive(II)Z
 Landroid/media/AudioSystem;->recordingCallbackFromNative(IIII[I)V
 Landroid/media/AudioSystem;->setDeviceConnectionState(IILjava/lang/String;Ljava/lang/String;)I
@@ -1044,11 +1069,13 @@
 Landroid/media/MediaCodec;->getBuffers(Z)[Ljava/nio/ByteBuffer;
 Landroid/media/MediaCodec;->releaseOutputBuffer(IZZJ)V
 Landroid/media/MediaFile;->FIRST_AUDIO_FILE_TYPE:I
+Landroid/media/MediaFile;->getFileTypeForMimeType(Ljava/lang/String;)I
 Landroid/media/MediaFile;->getFileType(Ljava/lang/String;)Landroid/media/MediaFile$MediaFileType;
 Landroid/media/MediaFile;->getMimeTypeForFile(Ljava/lang/String;)Ljava/lang/String;
 Landroid/media/MediaFile;-><init>()V
 Landroid/media/MediaFile;->isAudioFileType(I)Z
 Landroid/media/MediaFile;->isImageFileType(I)Z
+Landroid/media/MediaFile;->isPlayListFileType(I)Z
 Landroid/media/MediaFile;->isVideoFileType(I)Z
 Landroid/media/MediaFile;->LAST_AUDIO_FILE_TYPE:I
 Landroid/media/MediaFile$MediaFileType;->fileType:I
@@ -1065,6 +1092,7 @@
 Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;Ljava/util/List;)V
 Landroid/media/MediaPlayer;->setDataSource(Ljava/lang/String;Ljava/util/Map;)V
 Landroid/media/MediaPlayer;->setRetransmitEndpoint(Ljava/net/InetSocketAddress;)V
+Landroid/media/MediaRecorder;->setParameter(Ljava/lang/String;)V
 Landroid/media/MediaRouter$RouteInfo;->getStatusCode()I
 Landroid/media/MediaRouter$RouteInfo;->STATUS_CONNECTING:I
 Landroid/media/MediaRouter;->selectRouteInt(ILandroid/media/MediaRouter$RouteInfo;Z)V
@@ -1135,8 +1163,10 @@
 Landroid/net/ConnectivityManager;->isNetworkSupported(I)Z
 Landroid/net/ConnectivityManager;->isNetworkTypeMobile(I)Z
 Landroid/net/ConnectivityManager;->mService:Landroid/net/IConnectivityManager;
+Landroid/net/ConnectivityManager;->registerNetworkFactory(Landroid/os/Messenger;Ljava/lang/String;)V
 Landroid/net/ConnectivityManager;->requestRouteToHostAddress(ILjava/net/InetAddress;)Z
 Landroid/net/ConnectivityManager;->requestRouteToHost(II)Z
+Landroid/net/ConnectivityManager;->setBackgroundDataSetting(Z)V
 Landroid/net/ConnectivityManager;->TYPE_MOBILE_CBS:I
 Landroid/net/ConnectivityManager;->TYPE_MOBILE_EMERGENCY:I
 Landroid/net/ConnectivityManager;->TYPE_MOBILE_FOTA:I
@@ -1206,6 +1236,9 @@
 Landroid/net/SSLCertificateSocketFactory;->TAG:Ljava/lang/String;
 Landroid/net/SSLCertificateSocketFactory;->verifyHostname(Ljava/net/Socket;Ljava/lang/String;)V
 Landroid/net/SSLSessionCache;->mSessionCache:Lcom/android/org/conscrypt/SSLClientSessionCache;
+Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress;
+Landroid/net/StaticIpConfiguration;-><init>()V
+Landroid/net/StaticIpConfiguration;->ipAddress:Landroid/net/LinkAddress;
 Landroid/net/TrafficStats;->getMobileIfaces()[Ljava/lang/String;
 Landroid/net/TrafficStats;->getRxBytes(Ljava/lang/String;)J
 Landroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService;
@@ -1215,8 +1248,10 @@
 Landroid/net/wifi/IWifiManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/net/wifi/p2p/WifiP2pGroup;->getNetworkId()I
 Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection;
+Landroid/net/wifi/p2p/WifiP2pGroup;->TEMPORARY_NET_ID:I
 Landroid/net/wifi/p2p/WifiP2pManager$Channel;->mAsyncChannel:Lcom/android/internal/util/AsyncChannel;
 Landroid/net/wifi/p2p/WifiP2pManager$Channel;->putListener(Ljava/lang/Object;)I
+Landroid/net/wifi/p2p/WifiP2pManager;->CREATE_GROUP:I
 Landroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
 Landroid/net/wifi/p2p/WifiP2pManager;->requestPersistentGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PersistentGroupInfoListener;)V
 Landroid/net/wifi/p2p/WifiP2pManager;->setDeviceName(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V
@@ -1252,6 +1287,8 @@
 Landroid/net/wifi/WifiConfiguration;->defaultGwMacAddress:Ljava/lang/String;
 Landroid/net/wifi/WifiConfiguration;->lastConnectUid:I
 Landroid/net/wifi/WifiConfiguration;->mIpConfiguration:Landroid/net/IpConfiguration;
+Landroid/net/wifi/WifiConfiguration;->setIpAssignment(Landroid/net/IpConfiguration$IpAssignment;)V
+Landroid/net/wifi/WifiConfiguration;->setStaticIpConfiguration(Landroid/net/StaticIpConfiguration;)V
 Landroid/net/wifi/WifiConfiguration;->validatedInternetAccess:Z
 Landroid/net/wifi/WifiEnterpriseConfig;->getCaCertificateAlias()Ljava/lang/String;
 Landroid/net/wifi/WifiEnterpriseConfig;->getClientCertificateAlias()Ljava/lang/String;
@@ -1271,6 +1308,7 @@
 Landroid/opengl/GLSurfaceView$EglHelper;->mEglContext:Ljavax/microedition/khronos/egl/EGLContext;
 Landroid/opengl/GLSurfaceView$GLThread;->mEglHelper:Landroid/opengl/GLSurfaceView$EglHelper;
 Landroid/opengl/GLSurfaceView;->mGLThread:Landroid/opengl/GLSurfaceView$GLThread;
+Landroid/opengl/GLSurfaceView;->mRenderer:Landroid/opengl/GLSurfaceView$Renderer;
 Landroid/os/AsyncTask;->mFuture:Ljava/util/concurrent/FutureTask;
 Landroid/os/AsyncTask;->mStatus:Landroid/os/AsyncTask$Status;
 Landroid/os/AsyncTask;->mTaskInvoked:Ljava/util/concurrent/atomic/AtomicBoolean;
@@ -1279,6 +1317,7 @@
 Landroid/os/AsyncTask;->setDefaultExecutor(Ljava/util/concurrent/Executor;)V
 Landroid/os/BatteryStats$Counter;->getCountLocked(I)I
 Landroid/os/BatteryStats;->getUidStats()Landroid/util/SparseArray;
+Landroid/os/BatteryStats$HistoryItem;->CMD_UPDATE:B
 Landroid/os/BatteryStats$HistoryItem;->states2:I
 Landroid/os/BatteryStats;->NUM_DATA_CONNECTION_TYPES:I
 Landroid/os/BatteryStats;->startIteratingHistoryLocked()Z
@@ -1498,7 +1537,6 @@
 Landroid/os/UserHandle;->MU_ENABLED:Z
 Landroid/os/UserHandle;->OWNER:Landroid/os/UserHandle;
 Landroid/os/UserHandle;->PER_USER_RANGE:I
-Landroid/os/UserHandle;->SYSTEM:Landroid/os/UserHandle;
 Landroid/os/UserHandle;->USER_ALL:I
 Landroid/os/UserHandle;->USER_CURRENT:I
 Landroid/os/UserHandle;->USER_CURRENT_OR_SELF:I
@@ -1587,6 +1625,7 @@
 Landroid/provider/Browser;->clearSearches(Landroid/content/ContentResolver;)V
 Landroid/provider/Browser;->deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V
 Landroid/provider/Browser;->getVisitedHistory(Landroid/content/ContentResolver;)[Ljava/lang/String;
+Landroid/provider/Browser;->HISTORY_PROJECTION:[Ljava/lang/String;
 Landroid/provider/Browser;->SEARCHES_URI:Landroid/net/Uri;
 Landroid/provider/Browser;->sendString(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
 Landroid/provider/Browser;->updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V
@@ -1819,43 +1858,6 @@
 Landroid/R$styleable;->Window_windowFrame:I
 Landroid/security/keystore/AndroidKeyStoreProvider;->getKeyStoreOperationHandle(Ljava/lang/Object;)J
 Landroid/security/KeyStore;->getInstance()Landroid/security/KeyStore;
-Landroid/security/keystore/KeychainProtectionParams;->clearSecret()V
-Landroid/security/keystore/KeychainProtectionParams;->getKeyDerivationParams()Landroid/security/keystore/KeyDerivationParams;
-Landroid/security/keystore/KeychainProtectionParams;->getLockScreenUiFormat()I
-Landroid/security/keystore/KeychainProtectionParams;->getSecret()[B
-Landroid/security/keystore/KeychainProtectionParams;->getUserSecretType()I
-Landroid/security/keystore/KeychainProtectionParams;-><init>(IILandroid/security/keystore/KeyDerivationParams;[B)V
-Landroid/security/keystore/KeychainProtectionParams;-><init>(Landroid/os/Parcel;)V
-Landroid/security/keystore/KeychainProtectionParams;-><init>()V
-Landroid/security/keystore/KeychainSnapshot;->getCounterId()J
-Landroid/security/keystore/KeychainSnapshot;->getEncryptedRecoveryKeyBlob()[B
-Landroid/security/keystore/KeychainSnapshot;->getKeychainProtectionParams()Ljava/util/List;
-Landroid/security/keystore/KeychainSnapshot;->getMaxAttempts()I
-Landroid/security/keystore/KeychainSnapshot;->getServerParams()[B
-Landroid/security/keystore/KeychainSnapshot;->getSnapshotVersion()I
-Landroid/security/keystore/KeychainSnapshot;->getTrustedHardwarePublicKey()[B
-Landroid/security/keystore/KeychainSnapshot;->getWrappedApplicationKeys()Ljava/util/List;
-Landroid/security/keystore/KeyDerivationParams;->ALGORITHM_ARGON2ID:I
-Landroid/security/keystore/KeyDerivationParams;->ALGORITHM_SHA256:I
-Landroid/security/keystore/KeyDerivationParams;->createSha256Params([B)Landroid/security/keystore/KeyDerivationParams;
-Landroid/security/keystore/KeyDerivationParams;->getAlgorithm()I
-Landroid/security/keystore/KeyDerivationParams;->getSalt()[B
-Landroid/security/keystore/KeyDerivationParams;-><init>(I[B)V
-Landroid/security/keystore/KeyDerivationParams;-><init>(Landroid/os/Parcel;)V
-Landroid/security/keystore/RecoveryClaim;->getClaimBytes()[B
-Landroid/security/keystore/RecoveryClaim;->getRecoverySession()Landroid/security/keystore/RecoverySession;
-Landroid/security/keystore/RecoveryController;->getInstance()Landroid/security/keystore/RecoveryController;
-Landroid/security/keystore/RecoveryController;->getRecoveryData([B)Landroid/security/keystore/KeychainSnapshot;
-Landroid/security/keystore/RecoveryController;->initRecoveryService(Ljava/lang/String;[B)V
-Landroid/security/keystore/RecoveryController;->recoverKeys(Landroid/security/keystore/RecoverySession;[BLjava/util/List;)Ljava/util/Map;
-Landroid/security/keystore/RecoveryController;->setRecoverySecretTypes([I)V
-Landroid/security/keystore/RecoveryController;->setRecoveryStatus(Ljava/lang/String;[Ljava/lang/String;I)V
-Landroid/security/keystore/RecoveryController;->setServerParams([B)V
-Landroid/security/keystore/RecoveryController;->setSnapshotCreatedPendingIntent(Landroid/app/PendingIntent;)V
-Landroid/security/keystore/RecoveryController;->startRecoverySession([B[B[BLjava/util/List;)Landroid/security/keystore/RecoveryClaim;
-Landroid/security/keystore/WrappedApplicationKey;->getAlias()Ljava/lang/String;
-Landroid/security/keystore/WrappedApplicationKey;->getEncryptedKeyMaterial()[B
-Landroid/security/keystore/WrappedApplicationKey;-><init>(Ljava/lang/String;[B)V
 Landroid/security/net/config/RootTrustManager;->checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;
 Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnectFailed()V
 Landroid/service/media/IMediaBrowserServiceCallbacks;->onConnect(Ljava/lang/String;Landroid/media/session/MediaSession$Token;Landroid/os/Bundle;)V
@@ -1927,6 +1929,7 @@
 Landroid/system/OsConstants;->XATTR_CREATE:I
 Landroid/system/OsConstants;->XATTR_REPLACE:I
 Landroid/system/StructTimeval;->fromMillis(J)Landroid/system/StructTimeval;
+Landroid/telecom/AudioState;->isMuted:Z
 Landroid/telecom/TelecomManager;->EXTRA_IS_HANDOVER:Ljava/lang/String;
 Landroid/telecom/TelecomManager;->getUserSelectedOutgoingPhoneAccount()Landroid/telecom/PhoneAccountHandle;
 Landroid/telecom/TelecomManager;->setUserSelectedOutgoingPhoneAccount(Landroid/telecom/PhoneAccountHandle;)V
@@ -1961,6 +1964,8 @@
 Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_MODERATE:I
 Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_NONE_OR_UNKNOWN:I
 Landroid/telephony/SignalStrength;->SIGNAL_STRENGTH_POOR:I
+Landroid/telephony/SmsManager;->sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;IZI)V
+Landroid/telephony/SmsManager;->sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;IZI)V
 Landroid/telephony/SmsMessage;->getSubId()I
 Landroid/telephony/SmsMessage;->mWrappedSmsMessage:Lcom/android/internal/telephony/SmsMessageBase;
 Landroid/telephony/SubscriptionManager;->getActiveSubscriptionIdList()[I
@@ -2006,6 +2011,7 @@
 Landroid/telephony/TelephonyManager;->isMultiSimEnabled()Z
 Landroid/telephony/TelephonyManager;->isNetworkRoaming(I)Z
 Landroid/telephony/TelephonyManager;->isVolteAvailable()Z
+Landroid/telephony/TelephonyManager;->isWifiCallingAvailable()Z
 Landroid/telephony/TelephonyManager;->mSubscriptionManager:Landroid/telephony/SubscriptionManager;
 Landroid/text/AndroidBidi;->bidi(I[C[B)I
 Landroid/text/DynamicLayout;-><init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZIIILandroid/text/TextUtils$TruncateAt;I)V
@@ -2054,6 +2060,7 @@
 Landroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V
 Landroid/text/SpannableStringInternal;->START:I
 Landroid/text/SpanSet;->spans:[Ljava/lang/Object;
+Landroid/text/StaticLayout;->getHeight(Z)I
 Landroid/text/StaticLayout;-><init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;Landroid/text/TextDirectionHeuristic;FFZLandroid/text/TextUtils$TruncateAt;II)V
 Landroid/text/StaticLayout$LineBreaks;->ascents:[F
 Landroid/text/StaticLayout$LineBreaks;->breaks:[I
@@ -2103,6 +2110,8 @@
 Landroid/util/SparseIntArray;->mKeys:[I
 Landroid/util/SparseIntArray;->mSize:I
 Landroid/util/SparseIntArray;->mValues:[I
+Landroid/view/accessibility/AccessibilityInteractionClient;->clearCache()V
+Landroid/view/accessibility/AccessibilityInteractionClient;->getInstance()Landroid/view/accessibility/AccessibilityInteractionClient;
 Landroid/view/accessibility/AccessibilityManager;->getInstance(Landroid/content/Context;)Landroid/view/accessibility/AccessibilityManager;
 Landroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z
 Landroid/view/accessibility/AccessibilityManager;->mAccessibilityStateChangeListeners:Landroid/util/ArrayMap;
@@ -2110,17 +2119,22 @@
 Landroid/view/accessibility/AccessibilityManager;->mIsHighTextContrastEnabled:Z
 Landroid/view/accessibility/AccessibilityManager;->sInstance:Landroid/view/accessibility/AccessibilityManager;
 Landroid/view/accessibility/AccessibilityManager;->sInstanceSync:Ljava/lang/Object;
+Landroid/view/accessibility/AccessibilityNodeInfo;->isSealed()Z
+Landroid/view/accessibility/AccessibilityNodeInfo;->mChildNodeIds:Landroid/util/LongArray;
 Landroid/view/accessibility/AccessibilityNodeInfo;->refresh(Landroid/os/Bundle;Z)Z
+Landroid/view/accessibility/AccessibilityNodeInfo;->setSealed(Z)V
 Landroid/view/accessibility/AccessibilityRecord;->getSourceNodeId()J
 Landroid/view/accessibility/IAccessibilityManager;->getEnabledAccessibilityServiceList(II)Ljava/util/List;
 Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/accessibility/IAccessibilityManager;
 Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/view/animation/Animation;->initializeInvalidateRegion(IIII)V
 Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener;
 Landroid/view/autofill/IAutoFillManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V
 Landroid/view/Choreographer;->doFrame(JI)V
 Landroid/view/Choreographer;->getFrameTime()J
 Landroid/view/Choreographer;->mCallbackQueues:[Landroid/view/Choreographer$CallbackQueue;
+Landroid/view/Choreographer;->mFrameIntervalNanos:J
 Landroid/view/Choreographer;->mLastFrameTimeNanos:J
 Landroid/view/Choreographer;->mLock:Ljava/lang/Object;
 Landroid/view/Choreographer;->scheduleVsyncLocked()V
@@ -2256,13 +2270,15 @@
 Landroid/view/Surface;->mLock:Ljava/lang/Object;
 Landroid/view/Surface;->mNativeObject:J
 Landroid/view/SurfaceSession;->mNativeClient:J
+Landroid/view/Surface;->transferFrom(Landroid/view/Surface;)V
+Landroid/view/SurfaceView;->isFixedSize()Z
 Landroid/view/SurfaceView;->mCallbacks:Ljava/util/ArrayList;
 Landroid/view/SurfaceView;->mFormat:I
 Landroid/view/SurfaceView;->mRequestedFormat:I
 Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder;
+Landroid/view/SurfaceView;->setFrame(IIII)Z
 Landroid/view/SurfaceView;->surfacePositionLost_uiRtSync(J)V
 Landroid/view/SurfaceView;->updateSurfacePosition_renderWorker(JIIII)V
-Landroid/view/textclassifier/Logger;->DISABLED:Landroid/view/textclassifier/Logger;
 Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V
 Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V
 Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
@@ -2294,6 +2310,7 @@
 Landroid/view/View;->computeOpaqueFlags()V
 Landroid/view/ViewConfiguration;->getDeviceGlobalActionKeyTimeout()J
 Landroid/view/ViewConfiguration;->getDoubleTapMinTime()I
+Landroid/view/ViewConfiguration;->getScaledScrollFactor()I
 Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z
 Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z
 Landroid/view/ViewConfiguration;->sHasPermanentMenuKey:Z
@@ -2304,6 +2321,7 @@
 Landroid/view/View;->dispatchDetachedFromWindow()V
 Landroid/view/View;->fitsSystemWindows()Z
 Landroid/view/View;->getAccessibilityDelegate()Landroid/view/View$AccessibilityDelegate;
+Landroid/view/View;->getAccessibilityViewId()I
 Landroid/view/View;->getBoundsOnScreen(Landroid/graphics/Rect;)V
 Landroid/view/View;->getHorizontalScrollFactor()F
 Landroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix;
@@ -2329,6 +2347,7 @@
 Landroid/view/ViewGroup;->mOnHierarchyChangeListener:Landroid/view/ViewGroup$OnHierarchyChangeListener;
 Landroid/view/ViewGroup;->mPersistentDrawingCache:I
 Landroid/view/ViewGroup;->offsetChildrenTopAndBottom(I)V
+Landroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V
 Landroid/view/ViewGroup;->resetResolvedDrawables()V
 Landroid/view/ViewGroup;->resetResolvedLayoutDirection()V
 Landroid/view/ViewGroup;->resetResolvedPadding()V
@@ -2339,6 +2358,7 @@
 Landroid/view/View;->initializeScrollbars(Landroid/content/res/TypedArray;)V
 Landroid/view/View;->internalSetPadding(IIII)V
 Landroid/view/View;->isPaddingResolved()Z
+Landroid/view/View;->isRootNamespace()Z
 Landroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z
 Landroid/view/View;->isVisibleToUser()Z
 Landroid/view/View$ListenerInfo;-><init>()V
@@ -2361,6 +2381,7 @@
 Landroid/view/View;->mPaddingRight:I
 Landroid/view/View;->mPaddingTop:I
 Landroid/view/View;->mParent:Landroid/view/ViewParent;
+Landroid/view/View;->mPrivateFlags2:I
 Landroid/view/View;->mPrivateFlags3:I
 Landroid/view/View;->mPrivateFlags:I
 Landroid/view/View;->mRecreateDisplayList:Z
@@ -2441,8 +2462,31 @@
 Landroid/view/Window;->mContext:Landroid/content/Context;
 Landroid/view/Window;->mHardwareAccelerated:Z
 Landroid/view/Window;->mWindowStyle:Landroid/content/res/TypedArray;
+Landroid/webkit/CacheManager;->cacheDisabled()Z
+Landroid/webkit/CacheManager$CacheResult;->getContentDisposition()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getContentLength()J
+Landroid/webkit/CacheManager$CacheResult;->getEncoding()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getETag()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getExpires()J
+Landroid/webkit/CacheManager$CacheResult;->getExpiresString()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getHttpStatusCode()I
+Landroid/webkit/CacheManager$CacheResult;->getInputStream()Ljava/io/InputStream;
+Landroid/webkit/CacheManager$CacheResult;->getLastModified()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getLocalPath()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getLocation()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getMimeType()Ljava/lang/String;
+Landroid/webkit/CacheManager$CacheResult;->getOutputStream()Ljava/io/OutputStream;
+Landroid/webkit/CacheManager$CacheResult;-><init>()V
+Landroid/webkit/CacheManager$CacheResult;->setEncoding(Ljava/lang/String;)V
+Landroid/webkit/CacheManager$CacheResult;->setInputStream(Ljava/io/InputStream;)V
+Landroid/webkit/CacheManager;->endCacheTransaction()Z
+Landroid/webkit/CacheManager;->getCacheFileBaseDir()Ljava/io/File;
+Landroid/webkit/CacheManager;->getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;
+Landroid/webkit/CacheManager;->saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V
+Landroid/webkit/CacheManager;->startCacheTransaction()Z
 Landroid/webkit/IWebViewUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
 Landroid/webkit/WebResourceResponse;->mImmutable:Z
+Landroid/webkit/WebSettings$TextSize;->value:I
 Landroid/webkit/WebSyncManager;->mHandler:Landroid/os/Handler;
 Landroid/webkit/WebViewClient;->onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V
 Landroid/webkit/WebView;->debugDump()V
@@ -2453,11 +2497,13 @@
 Landroid/webkit/WebViewFactory;->getWebViewContextAndSetProvider()Landroid/content/Context;
 Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo;
 Landroid/webkit/WebViewFactory;->sProviderInstance:Landroid/webkit/WebViewFactoryProvider;
+Landroid/webkit/WebView;->getContentWidth()I
 Landroid/webkit/WebView;->getTouchIconUrl()Ljava/lang/String;
 Landroid/webkit/WebView;->getVisibleTitleHeight()I
 Landroid/webkit/WebView;->isPaused()Z
 Landroid/webkit/WebView;->mProvider:Landroid/webkit/WebViewProvider;
 Landroid/webkit/WebView;->notifyFindDialogDismissed()V
+Landroid/webkit/WebView;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V
 Landroid/webkit/WebView;->restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z
 Landroid/webkit/WebView;->savePicture(Landroid/os/Bundle;Ljava/io/File;)Z
 Landroid/webkit/WebView;->sEnforceThreadChecking:Z
@@ -2472,6 +2518,7 @@
 Landroid/widget/AbsListView;->mFastScroll:Landroid/widget/FastScroller;
 Landroid/widget/AbsListView;->mFlingRunnable:Landroid/widget/AbsListView$FlingRunnable;
 Landroid/widget/AbsListView;->mIsChildViewEnabled:Z
+Landroid/widget/AbsListView;->mLayoutMode:I
 Landroid/widget/AbsListView;->mMaximumVelocity:I
 Landroid/widget/AbsListView;->mMotionPosition:I
 Landroid/widget/AbsListView;->mOnScrollListener:Landroid/widget/AbsListView$OnScrollListener;
@@ -2501,6 +2548,8 @@
 Landroid/widget/ActivityChooserView;->setExpandActivityOverflowButtonDrawable(Landroid/graphics/drawable/Drawable;)V
 Landroid/widget/AdapterView;->mDataChanged:Z
 Landroid/widget/AdapterView;->mFirstPosition:I
+Landroid/widget/AdapterView;->mNextSelectedPosition:I
+Landroid/widget/AdapterView;->mNextSelectedRowId:J
 Landroid/widget/AdapterView;->mOldSelectedPosition:I
 Landroid/widget/AdapterView;->setNextSelectedPositionInt(I)V
 Landroid/widget/AdapterView;->setSelectedPositionInt(I)V
@@ -2510,6 +2559,7 @@
 Landroid/widget/AutoCompleteTextView;->mPopup:Landroid/widget/ListPopupWindow;
 Landroid/widget/AutoCompleteTextView;->setDropDownAlwaysVisible(Z)V
 Landroid/widget/AutoCompleteTextView;->setForceIgnoreOutsideTouch(Z)V
+Landroid/widget/BaseAdapter;->mDataSetObservable:Landroid/database/DataSetObservable;
 Landroid/widget/CompoundButton;->mButtonDrawable:Landroid/graphics/drawable/Drawable;
 Landroid/widget/CompoundButton;->mOnCheckedChangeListener:Landroid/widget/CompoundButton$OnCheckedChangeListener;
 Landroid/widget/CursorAdapter;->mChangeObserver:Landroid/widget/CursorAdapter$ChangeObserver;
@@ -2551,6 +2601,7 @@
 Landroid/widget/HorizontalScrollView;->mEdgeGlowLeft:Landroid/widget/EdgeEffect;
 Landroid/widget/HorizontalScrollView;->mEdgeGlowRight:Landroid/widget/EdgeEffect;
 Landroid/widget/HorizontalScrollView;->mScroller:Landroid/widget/OverScroller;
+Landroid/widget/ImageView;->animateTransform(Landroid/graphics/Matrix;)V
 Landroid/widget/ImageView;->mAdjustViewBounds:Z
 Landroid/widget/ImageView;->mAlpha:I
 Landroid/widget/ImageView;->mDrawMatrix:Landroid/graphics/Matrix;
@@ -2758,6 +2809,10 @@
 Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setFeatureTag(Ljava/lang/String;)V
 Lcom/android/ims/internal/uce/presence/PresTupleInfo;->setTimestamp(Ljava/lang/String;)V
 Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;-><init>()V
+Lcom/android/internal/app/AlertController;->mCustomTitleView:Landroid/view/View;
+Lcom/android/internal/app/AlertController;->mForceInverseBackground:Z
+Lcom/android/internal/app/AlertController;->mTitle:Ljava/lang/CharSequence;
+Lcom/android/internal/app/AlertController;->mView:Landroid/view/View;
 Lcom/android/internal/app/AlertController$RecycleListView;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
 Lcom/android/internal/app/IAppOpsService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/app/IAppOpsService;
 Lcom/android/internal/app/IAppOpsService$Stub$Proxy;->checkOperation(IILjava/lang/String;)I
@@ -3029,6 +3084,8 @@
 Lcom/android/internal/telephony/ITelephony;->getCallState()I
 Lcom/android/internal/telephony/ITelephony;->getDataState()I
 Lcom/android/internal/telephony/ITelephony;->isIdle(Ljava/lang/String;)Z
+Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallState(ILjava/lang/String;)V
+Lcom/android/internal/telephony/ITelephonyRegistry$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephonyRegistry;
 Lcom/android/internal/telephony/ITelephony;->silenceRinger()V
 Lcom/android/internal/telephony/ITelephony$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/telephony/ITelephony;
 Lcom/android/internal/telephony/ITelephony$Stub$Proxy;->endCall()Z
@@ -3212,6 +3269,7 @@
 Ljava/lang/Double;->value:D
 Ljava/lang/Float;->value:F
 Ljava/lang/Integer;->value:I
+Ljava/lang/invoke/MethodHandles$Lookup;-><init>(Ljava/lang/Class;I)V
 Ljava/lang/Long;->value:J
 Ljava/lang/ref/FinalizerReference;->add(Ljava/lang/Object;)V
 Ljava/lang/ref/FinalizerReference;->head:Ljava/lang/ref/FinalizerReference;
@@ -3225,6 +3283,7 @@
 Ljava/lang/ref/Reference;->referent:Ljava/lang/Object;
 Ljava/lang/Runtime;->loadLibrary(Ljava/lang/String;Ljava/lang/ClassLoader;)V
 Ljava/lang/Runtime;->load(Ljava/lang/String;Ljava/lang/ClassLoader;)V
+Ljava/lang/Runtime;->mLibPaths:[Ljava/lang/String;
 Ljava/lang/Runtime;->nativeLoad(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/String;
 Ljava/lang/Short;->value:S
 Ljava/lang/String;-><init>(II[C)V
@@ -3246,7 +3305,9 @@
 Ljava/lang/Thread;->lock:Ljava/lang/Object;
 Ljava/lang/Thread;->name:Ljava/lang/String;
 Ljava/lang/Thread;->nativePeer:J
+Ljava/lang/Thread;->parkBlocker:Ljava/lang/Object;
 Ljava/lang/Thread;->priority:I
+Ljava/lang/Thread;->threadLocals:Ljava/lang/ThreadLocal$ThreadLocalMap;
 Ljava/lang/Throwable;->backtrace:Ljava/lang/Object;
 Ljava/lang/Throwable;->cause:Ljava/lang/Throwable;
 Ljava/lang/Throwable;->detailMessage:Ljava/lang/String;
@@ -3278,7 +3339,10 @@
 Ljava/net/Socket;->impl:Ljava/net/SocketImpl;
 Ljava/net/SocketImpl;->serverSocket:Ljava/net/ServerSocket;
 Ljava/net/SocketImpl;->socket:Ljava/net/Socket;
+Ljava/net/URI;->fragment:Ljava/lang/String;
 Ljava/net/URI;->host:Ljava/lang/String;
+Ljava/net/URI;->port:I
+Ljava/net/URI;->string:Ljava/lang/String;
 Ljava/net/URL;->handler:Ljava/net/URLStreamHandler;
 Ljava/net/URL;->handlers:Ljava/util/Hashtable;
 Ljava/nio/Buffer;->address:J
@@ -3299,6 +3363,9 @@
 Ljava/text/DateFormat;->is24Hour:Ljava/lang/Boolean;
 Ljava/time/Duration;->toSeconds()Ljava/math/BigDecimal;
 Ljava/time/OffsetDateTime;-><init>(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)V
+Ljava/util/ArrayDeque;->elements:[Ljava/lang/Object;
+Ljava/util/ArrayDeque;->head:I
+Ljava/util/ArrayDeque;->tail:I
 Ljava/util/ArrayList;->elementData:[Ljava/lang/Object;
 Ljava/util/ArrayList;->size:I
 Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList;
@@ -3311,22 +3378,37 @@
 Ljava/util/Collections$SynchronizedMap;->m:Ljava/util/Map;
 Ljava/util/Collections$UnmodifiableCollection;->c:Ljava/util/Collection;
 Ljava/util/Collections$UnmodifiableMap;->m:Ljava/util/Map;
+Ljava/util/concurrent/atomic/AtomicInteger;->value:I
 Ljava/util/concurrent/ConcurrentHashMap$BaseIterator;->hasMoreElements()Z
+Ljava/util/concurrent/CopyOnWriteArraySet;->al:Ljava/util/concurrent/CopyOnWriteArrayList;
 Ljava/util/concurrent/Executors$RunnableAdapter;->task:Ljava/lang/Runnable;
 Ljava/util/concurrent/FutureTask;->callable:Ljava/util/concurrent/Callable;
 Ljava/util/concurrent/FutureTask;->EXCEPTIONAL:I
 Ljava/util/concurrent/FutureTask;->outcome:Ljava/lang/Object;
 Ljava/util/concurrent/FutureTask;->state:I
+Ljava/util/concurrent/LinkedBlockingDeque;->first:Ljava/util/concurrent/LinkedBlockingDeque$Node;
+Ljava/util/concurrent/LinkedBlockingDeque;->lock:Ljava/util/concurrent/locks/ReentrantLock;
 Ljava/util/concurrent/LinkedBlockingQueue;->capacity:I
+Ljava/util/concurrent/LinkedBlockingQueue;->head:Ljava/util/concurrent/LinkedBlockingQueue$Node;
+Ljava/util/concurrent/LinkedBlockingQueue;->putLock:Ljava/util/concurrent/locks/ReentrantLock;
+Ljava/util/concurrent/LinkedBlockingQueue;->takeLock:Ljava/util/concurrent/locks/ReentrantLock;
+Ljava/util/concurrent/ThreadPoolExecutor;->allowCoreThreadTimeOut:Z
 Ljava/util/EnumMap;->keyType:Ljava/lang/Class;
 Ljava/util/EnumSet;->elementType:Ljava/lang/Class;
 Ljava/util/HashMap$HashIterator;->hasNext()Z
+Ljava/util/HashMap;->modCount:I
+Ljava/util/HashMap;->table:[Ljava/util/HashMap$Node;
+Ljava/util/HashSet;->map:Ljava/util/HashMap;
 Ljava/util/jar/JarFile;->manifest:Ljava/util/jar/Manifest;
 Ljava/util/LinkedHashMap;->eldest()Ljava/util/Map$Entry;
 Ljava/util/LinkedHashMap$LinkedHashIterator;->hasNext()Z
+Ljava/util/LinkedList;->size:I
 Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale;
+Ljava/util/PriorityQueue;->modCount:I
+Ljava/util/PriorityQueue;->size:I
 Ljava/util/Random;->seedUniquifier()J
 Ljava/util/regex/Matcher;->appendPos:I
+Ljava/util/Vector;->elementData(I)Ljava/lang/Object;
 Ljava/util/zip/Deflater;->buf:[B
 Ljava/util/zip/Deflater;->finished:Z
 Ljava/util/zip/Deflater;->finish:Z
diff --git a/config/hiddenapi-vendor-list.txt b/config/hiddenapi-vendor-list.txt
index 61ae6e7..b598296 100644
--- a/config/hiddenapi-vendor-list.txt
+++ b/config/hiddenapi-vendor-list.txt
@@ -20,7 +20,7 @@
 Landroid/app/AppOpsManager$PackageOps;->getPackageName()Ljava/lang/String;
 Landroid/app/AppOpsManager$PackageOps;->getUid()I
 Landroid/app/IActivityController$Stub;-><init>()V
-Landroid/app/IActivityManager;->cancelRecentsAnimation()V
+Landroid/app/IActivityManager;->cancelRecentsAnimation(Z)V
 Landroid/app/IActivityManager;->cancelTaskWindowTransition(I)V
 Landroid/app/IActivityManager;->closeSystemDialogs(Ljava/lang/String;)V
 Landroid/app/IActivityManager;->getCurrentUser()Landroid/content/pm/UserInfo;
@@ -312,9 +312,7 @@
 Landroid/net/SntpClient;->requestTime(Ljava/lang/String;I)Z
 Landroid/net/StaticIpConfiguration;->dnsServers:Ljava/util/ArrayList;
 Landroid/net/StaticIpConfiguration;->domains:Ljava/lang/String;
-Landroid/net/StaticIpConfiguration;->gateway:Ljava/net/InetAddress;
 Landroid/net/StaticIpConfiguration;->getRoutes(Ljava/lang/String;)Ljava/util/List;
-Landroid/net/StaticIpConfiguration;->ipAddress:Landroid/net/LinkAddress;
 Landroid/net/StringNetworkSpecifier;->specifier:Ljava/lang/String;
 Landroid/net/TrafficStats;->getMobileTcpRxPackets()J
 Landroid/net/TrafficStats;->getMobileTcpTxPackets()J
@@ -514,7 +512,6 @@
 Landroid/telephony/TelephonyManager;->getVoiceMessageCount()I
 Landroid/telephony/TelephonyManager;->getVoiceNetworkType(I)I
 Landroid/telephony/TelephonyManager;->isImsRegistered()Z
-Landroid/telephony/TelephonyManager;->isWifiCallingAvailable()Z
 Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDA:Landroid/telephony/TelephonyManager$MultiSimVariants;
 Landroid/telephony/TelephonyManager$MultiSimVariants;->DSDS:Landroid/telephony/TelephonyManager$MultiSimVariants;
 Landroid/telephony/TelephonyManager;->nvResetConfig(I)Z
@@ -718,6 +715,7 @@
 Lcom/android/ims/internal/uce/presence/IPresenceService$Stub;-><init>()V
 Lcom/android/ims/internal/uce/presence/PresCapInfo;->getCapInfo()Lcom/android/ims/internal/uce/common/CapInfo;
 Lcom/android/ims/internal/uce/presence/PresCapInfo;->getContactUri()Ljava/lang/String;
+Lcom/android/ims/internal/uce/presence/PresCapInfo;->mContactUri:Ljava/lang/String;
 Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getMediaType()I
 Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceDesc()Ljava/lang/String;
 Lcom/android/ims/internal/uce/presence/PresServiceInfo;->getServiceId()Ljava/lang/String;
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 0a4541b..829a9444 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -537,7 +537,7 @@
      * anything behind it, then only the modal window will be reported
      * (assuming it is the top one). For convenience the returned windows
      * are ordered in a descending layer order, which is the windows that
-     * are higher in the Z-order are reported first. Since the user can always
+     * are on top are reported first. Since the user can always
      * interact with the window that has input focus by typing, the focused
      * window is always returned (even if covered by a modal window).
      * <p>
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 09dcbf2..ecd99a7 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -1139,7 +1139,8 @@
      * {@link android.app.admin.DevicePolicyManager} can run in LockTask mode. Therefore, if
      * {@link android.app.admin.DevicePolicyManager#isLockTaskPermitted(String)} returns
      * {@code false} for the package of the target activity, a {@link SecurityException} will be
-     * thrown during {@link Context#startActivity(Intent, Bundle)}.
+     * thrown during {@link Context#startActivity(Intent, Bundle)}. This method doesn't affect
+     * activities that are already running — relaunch the activity to run in lock task mode.
      *
      * Defaults to {@code false} if not set.
      *
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1df724e..50a4398 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3736,54 +3736,64 @@
         //Slog.i(TAG, "Running services: " + mServices);
     }
 
-    ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
+    /**
+     * Resume the activity.
+     * @param token Target activity token.
+     * @param finalStateRequest Flag indicating if this is part of final state resolution for a
+     *                          transaction.
+     * @param reason Reason for performing the action.
+     *
+     * @return The {@link ActivityClientRecord} that was resumed, {@code null} otherwise.
+     */
+    @VisibleForTesting
+    public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
             String reason) {
-        ActivityClientRecord r = mActivities.get(token);
-        if (localLOGV) Slog.v(TAG, "Performing resume of " + r
-                + " finished=" + r.activity.mFinished);
-        if (r != null && !r.activity.mFinished) {
-            if (r.getLifecycleState() == ON_RESUME) {
-                if (!finalStateRequest) {
-                    final RuntimeException e = new IllegalStateException(
-                            "Trying to resume activity which is already resumed");
-                    Slog.e(TAG, e.getMessage(), e);
-                    Slog.e(TAG, r.getStateString());
-                    // TODO(lifecycler): A double resume request is possible when an activity
-                    // receives two consequent transactions with relaunch requests and "resumed"
-                    // final state requests and the second relaunch is omitted. We still try to
-                    // handle two resume requests for the final state. For cases other than this
-                    // one, we don't expect it to happen.
-                }
-                return null;
+        final ActivityClientRecord r = mActivities.get(token);
+        if (localLOGV) {
+            Slog.v(TAG, "Performing resume of " + r + " finished=" + r.activity.mFinished);
+        }
+        if (r == null || r.activity.mFinished) {
+            return null;
+        }
+        if (r.getLifecycleState() == ON_RESUME) {
+            if (!finalStateRequest) {
+                final RuntimeException e = new IllegalStateException(
+                        "Trying to resume activity which is already resumed");
+                Slog.e(TAG, e.getMessage(), e);
+                Slog.e(TAG, r.getStateString());
+                // TODO(lifecycler): A double resume request is possible when an activity
+                // receives two consequent transactions with relaunch requests and "resumed"
+                // final state requests and the second relaunch is omitted. We still try to
+                // handle two resume requests for the final state. For cases other than this
+                // one, we don't expect it to happen.
             }
-            if (finalStateRequest) {
-                r.hideForNow = false;
-                r.activity.mStartedActivity = false;
+            return null;
+        }
+        if (finalStateRequest) {
+            r.hideForNow = false;
+            r.activity.mStartedActivity = false;
+        }
+        try {
+            r.activity.onStateNotSaved();
+            r.activity.mFragments.noteStateNotSaved();
+            checkAndBlockForNetworkAccess();
+            if (r.pendingIntents != null) {
+                deliverNewIntents(r, r.pendingIntents);
+                r.pendingIntents = null;
             }
-            try {
-                r.activity.onStateNotSaved();
-                r.activity.mFragments.noteStateNotSaved();
-                checkAndBlockForNetworkAccess();
-                if (r.pendingIntents != null) {
-                    deliverNewIntents(r, r.pendingIntents);
-                    r.pendingIntents = null;
-                }
-                if (r.pendingResults != null) {
-                    deliverResults(r, r.pendingResults);
-                    r.pendingResults = null;
-                }
-                r.activity.performResume(r.startsNotResumed, reason);
+            if (r.pendingResults != null) {
+                deliverResults(r, r.pendingResults);
+                r.pendingResults = null;
+            }
+            r.activity.performResume(r.startsNotResumed, reason);
 
-                r.state = null;
-                r.persistentState = null;
-                r.setState(ON_RESUME);
-            } catch (Exception e) {
-                if (!mInstrumentation.onException(r.activity, e)) {
-                    throw new RuntimeException(
-                        "Unable to resume activity "
-                        + r.intent.getComponent().toShortString()
-                        + ": " + e.toString(), e);
-                }
+            r.state = null;
+            r.persistentState = null;
+            r.setState(ON_RESUME);
+        } catch (Exception e) {
+            if (!mInstrumentation.onException(r.activity, e)) {
+                throw new RuntimeException("Unable to resume activity "
+                        + r.intent.getComponent().toShortString() + ": " + e.toString(), e);
             }
         }
         return r;
@@ -3816,126 +3826,115 @@
 
         // TODO Push resumeArgs into the activity for consideration
         final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
+        if (r == null) {
+            // We didn't actually resume the activity, so skipping any follow-up actions.
+            return;
+        }
 
-        if (r != null) {
-            final Activity a = r.activity;
+        final Activity a = r.activity;
 
-            if (localLOGV) Slog.v(
-                TAG, "Resume " + r + " started activity: " +
-                a.mStartedActivity + ", hideForNow: " + r.hideForNow
-                + ", finished: " + a.mFinished);
+        if (localLOGV) {
+            Slog.v(TAG, "Resume " + r + " started activity: " + a.mStartedActivity
+                    + ", hideForNow: " + r.hideForNow + ", finished: " + a.mFinished);
+        }
 
-            final int forwardBit = isForward ?
-                    WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
+        final int forwardBit = isForward
+                ? WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
 
-            // If the window hasn't yet been added to the window manager,
-            // and this guy didn't finish itself or start another activity,
-            // then go ahead and add the window.
-            boolean willBeVisible = !a.mStartedActivity;
-            if (!willBeVisible) {
-                try {
-                    willBeVisible = ActivityManager.getService().willActivityBeVisible(
-                            a.getActivityToken());
-                } catch (RemoteException e) {
-                    throw e.rethrowFromSystemServer();
+        // If the window hasn't yet been added to the window manager,
+        // and this guy didn't finish itself or start another activity,
+        // then go ahead and add the window.
+        boolean willBeVisible = !a.mStartedActivity;
+        if (!willBeVisible) {
+            try {
+                willBeVisible = ActivityManager.getService().willActivityBeVisible(
+                        a.getActivityToken());
+            } catch (RemoteException e) {
+                throw e.rethrowFromSystemServer();
+            }
+        }
+        if (r.window == null && !a.mFinished && willBeVisible) {
+            r.window = r.activity.getWindow();
+            View decor = r.window.getDecorView();
+            decor.setVisibility(View.INVISIBLE);
+            ViewManager wm = a.getWindowManager();
+            WindowManager.LayoutParams l = r.window.getAttributes();
+            a.mDecor = decor;
+            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
+            l.softInputMode |= forwardBit;
+            if (r.mPreserveWindow) {
+                a.mWindowAdded = true;
+                r.mPreserveWindow = false;
+                // Normally the ViewRoot sets up callbacks with the Activity
+                // in addView->ViewRootImpl#setView. If we are instead reusing
+                // the decor view we have to notify the view root that the
+                // callbacks may have changed.
+                ViewRootImpl impl = decor.getViewRootImpl();
+                if (impl != null) {
+                    impl.notifyChildRebuilt();
                 }
             }
-            if (r.window == null && !a.mFinished && willBeVisible) {
-                r.window = r.activity.getWindow();
-                View decor = r.window.getDecorView();
-                decor.setVisibility(View.INVISIBLE);
-                ViewManager wm = a.getWindowManager();
-                WindowManager.LayoutParams l = r.window.getAttributes();
-                a.mDecor = decor;
-                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
-                l.softInputMode |= forwardBit;
-                if (r.mPreserveWindow) {
+            if (a.mVisibleFromClient) {
+                if (!a.mWindowAdded) {
                     a.mWindowAdded = true;
-                    r.mPreserveWindow = false;
-                    // Normally the ViewRoot sets up callbacks with the Activity
-                    // in addView->ViewRootImpl#setView. If we are instead reusing
-                    // the decor view we have to notify the view root that the
-                    // callbacks may have changed.
-                    ViewRootImpl impl = decor.getViewRootImpl();
-                    if (impl != null) {
-                        impl.notifyChildRebuilt();
-                    }
+                    wm.addView(decor, l);
+                } else {
+                    // The activity will get a callback for this {@link LayoutParams} change
+                    // earlier. However, at that time the decor will not be set (this is set
+                    // in this method), so no action will be taken. This call ensures the
+                    // callback occurs with the decor set.
+                    a.onWindowAttributesChanged(l);
                 }
-                if (a.mVisibleFromClient) {
-                    if (!a.mWindowAdded) {
-                        a.mWindowAdded = true;
-                        wm.addView(decor, l);
-                    } else {
-                        // The activity will get a callback for this {@link LayoutParams} change
-                        // earlier. However, at that time the decor will not be set (this is set
-                        // in this method), so no action will be taken. This call ensures the
-                        // callback occurs with the decor set.
-                        a.onWindowAttributesChanged(l);
-                    }
-                }
+            }
 
             // If the window has already been added, but during resume
             // we started another activity, then don't yet make the
             // window visible.
-            } else if (!willBeVisible) {
-                if (localLOGV) Slog.v(
-                    TAG, "Launch " + r + " mStartedActivity set");
-                r.hideForNow = true;
+        } else if (!willBeVisible) {
+            if (localLOGV) Slog.v(TAG, "Launch " + r + " mStartedActivity set");
+            r.hideForNow = true;
+        }
+
+        // Get rid of anything left hanging around.
+        cleanUpPendingRemoveWindows(r, false /* force */);
+
+        // The window is now visible if it has been added, we are not
+        // simply finishing, and we are not starting another activity.
+        if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
+            if (r.newConfig != null) {
+                performConfigurationChangedForActivity(r, r.newConfig);
+                if (DEBUG_CONFIGURATION) {
+                    Slog.v(TAG, "Resuming activity " + r.activityInfo.name + " with newConfig "
+                            + r.activity.mCurrentConfig);
+                }
+                r.newConfig = null;
             }
-
-            // Get rid of anything left hanging around.
-            cleanUpPendingRemoveWindows(r, false /* force */);
-
-            // The window is now visible if it has been added, we are not
-            // simply finishing, and we are not starting another activity.
-            if (!r.activity.mFinished && willBeVisible
-                    && r.activity.mDecor != null && !r.hideForNow) {
-                if (r.newConfig != null) {
-                    performConfigurationChangedForActivity(r, r.newConfig);
-                    if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
-                            + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
-                    r.newConfig = null;
-                }
-                if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward="
-                        + isForward);
-                WindowManager.LayoutParams l = r.window.getAttributes();
-                if ((l.softInputMode
-                        & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
-                        != forwardBit) {
-                    l.softInputMode = (l.softInputMode
-                            & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
-                            | forwardBit;
-                    if (r.activity.mVisibleFromClient) {
-                        ViewManager wm = a.getWindowManager();
-                        View decor = r.window.getDecorView();
-                        wm.updateViewLayout(decor, l);
-                    }
-                }
-
-                r.activity.mVisibleFromServer = true;
-                mNumVisibleActivities++;
+            if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward=" + isForward);
+            WindowManager.LayoutParams l = r.window.getAttributes();
+            if ((l.softInputMode
+                    & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
+                    != forwardBit) {
+                l.softInputMode = (l.softInputMode
+                        & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
+                        | forwardBit;
                 if (r.activity.mVisibleFromClient) {
-                    r.activity.makeVisible();
+                    ViewManager wm = a.getWindowManager();
+                    View decor = r.window.getDecorView();
+                    wm.updateViewLayout(decor, l);
                 }
             }
 
-            r.nextIdle = mNewActivities;
-            mNewActivities = r;
-            if (localLOGV) {
-                Slog.v(TAG, "Scheduling idle handler for " + r);
-            }
-            Looper.myQueue().addIdleHandler(new Idler());
-        } else {
-            // If an exception was thrown when trying to resume, then
-            // just end this activity.
-            try {
-                ActivityManager.getService()
-                    .finishActivity(token, Activity.RESULT_CANCELED, null,
-                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
-            } catch (RemoteException ex) {
-                throw ex.rethrowFromSystemServer();
+            r.activity.mVisibleFromServer = true;
+            mNumVisibleActivities++;
+            if (r.activity.mVisibleFromClient) {
+                r.activity.makeVisible();
             }
         }
+
+        r.nextIdle = mNewActivities;
+        mNewActivities = r;
+        if (localLOGV) Slog.v(TAG, "Scheduling idle handler for " + r);
+        Looper.myQueue().addIdleHandler(new Idler());
     }
 
     @Override
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index a68136b..2e93d88 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2155,19 +2155,10 @@
     public String[] setPackagesSuspended(String[] packageNames, boolean suspended,
             PersistableBundle appExtras, PersistableBundle launcherExtras,
             String dialogMessage) {
-        // TODO (b/75332201): Pass in the dialogMessage and use it in the interceptor dialog
         try {
             return mPM.setPackagesSuspendedAsUser(packageNames, suspended, appExtras,
-                    launcherExtras, mContext.getOpPackageName(), mContext.getUserId());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    @Override
-    public PersistableBundle getSuspendedPackageAppExtras(String packageName) {
-        try {
-            return mPM.getSuspendedPackageAppExtras(packageName, mContext.getUserId());
+                    launcherExtras, dialogMessage, mContext.getOpPackageName(),
+                    mContext.getUserId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -2175,17 +2166,14 @@
 
     @Override
     public Bundle getSuspendedPackageAppExtras() {
-        final PersistableBundle extras = getSuspendedPackageAppExtras(mContext.getOpPackageName());
-        return extras != null ? new Bundle(extras.deepCopy()) : null;
-    }
-
-    @Override
-    public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras) {
+        final PersistableBundle extras;
         try {
-            mPM.setSuspendedPackageAppExtras(packageName, appExtras, mContext.getUserId());
+            extras = mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(),
+                    mContext.getUserId());
         } catch (RemoteException e) {
-            e.rethrowFromSystemServer();
+            throw e.rethrowFromSystemServer();
         }
+        return extras != null ? new Bundle(extras.deepCopy()) : null;
     }
 
     @Override
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index b6cff38..69c3632 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -32,6 +32,7 @@
     private long mTemporaryAppWhitelistDuration;
     private int mMinManifestReceiverApiLevel = 0;
     private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT;
+    private boolean mDontSendToRestrictedApps = false;
 
     /**
      * How long to temporarily put an app on the power whitelist when executing this broadcast
@@ -52,6 +53,12 @@
     static final String KEY_MAX_MANIFEST_RECEIVER_API_LEVEL
             = "android:broadcast.maxManifestReceiverApiLevel";
 
+    /**
+     * Corresponds to {@link #setMaxManifestReceiverApiLevel}.
+     */
+    static final String KEY_DONT_SEND_TO_RESTRICTED_APPS =
+            "android:broadcast.dontSendToRestrictedApps";
+
     public static BroadcastOptions makeBasic() {
         BroadcastOptions opts = new BroadcastOptions();
         return opts;
@@ -66,6 +73,7 @@
         mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0);
         mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL,
                 Build.VERSION_CODES.CUR_DEVELOPMENT);
+        mDontSendToRestrictedApps = opts.getBoolean(KEY_DONT_SEND_TO_RESTRICTED_APPS, false);
     }
 
     /**
@@ -123,6 +131,23 @@
     }
 
     /**
+     * Sets whether pending intent can be sent for an application with background restrictions
+     * @param dontSendToRestrictedApps if true, pending intent will not be sent for an application
+     * with background restrictions. Default value is {@code false}
+     */
+    public void setDontSendToRestrictedApps(boolean dontSendToRestrictedApps) {
+        mDontSendToRestrictedApps = dontSendToRestrictedApps;
+    }
+
+    /**
+     * @hide
+     * @return #setDontSendToRestrictedApps
+     */
+    public boolean isDontSendToRestrictedApps() {
+        return mDontSendToRestrictedApps;
+    }
+
+    /**
      * Returns the created options as a Bundle, which can be passed to
      * {@link android.content.Context#sendBroadcast(android.content.Intent)
      * Context.sendBroadcast(Intent)} and related methods.
@@ -141,6 +166,9 @@
         if (mMaxManifestReceiverApiLevel != Build.VERSION_CODES.CUR_DEVELOPMENT) {
             b.putInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, mMaxManifestReceiverApiLevel);
         }
+        if (mDontSendToRestrictedApps) {
+            b.putBoolean(KEY_DONT_SEND_TO_RESTRICTED_APPS, true);
+        }
         return b.isEmpty() ? null : b;
     }
 }
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index 925080e..0639b00 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -24,6 +24,7 @@
 import android.os.IBinder;
 import android.util.MergedConfiguration;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.content.ReferrerIntent;
 
 import java.io.PrintWriter;
@@ -48,7 +49,8 @@
      * Execute transaction immediately without scheduling it. This is used for local requests, so
      * it will also recycle the transaction.
      */
-    void executeTransaction(ClientTransaction transaction) {
+    @VisibleForTesting
+    public void executeTransaction(ClientTransaction transaction) {
         transaction.preExecute(this);
         getTransactionExecutor().execute(transaction);
         transaction.recycle();
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 71b88fa..9a491bc 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -16,6 +16,7 @@
 
 package android.app;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.TestApi;
@@ -88,11 +89,12 @@
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteOrder;
 import java.util.ArrayList;
 import java.util.Objects;
 import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicInteger;
 
 class ReceiverRestrictedContext extends ContextWrapper {
     ReceiverRestrictedContext(Context base) {
@@ -212,13 +214,24 @@
     static final int STATE_UNINITIALIZED = 0;
     static final int STATE_INITIALIZING = 1;
     static final int STATE_READY = 2;
+    static final int STATE_NOT_FOUND = 3;
+
+    /** @hide */
+    @IntDef(prefix = { "STATE_" }, value = {
+            STATE_UNINITIALIZED,
+            STATE_INITIALIZING,
+            STATE_READY,
+            STATE_NOT_FOUND,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @interface ServiceInitializationState {}
 
     /**
      * Initialization state for each service. Any of {@link #STATE_UNINITIALIZED},
      * {@link #STATE_INITIALIZING} or {@link #STATE_READY},
      */
-    final AtomicInteger[] mServiceInitializationStateArray =
-            SystemServiceRegistry.createServiceInitializationStateArray();
+    @ServiceInitializationState
+    final int[] mServiceInitializationStateArray = new int[mServiceCache.length];
 
     static ContextImpl getImpl(Context context) {
         Context nextContext;
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 4a168fe..e4a0583 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -321,16 +321,20 @@
         }
 
         WindowManager.LayoutParams l = mWindow.getAttributes();
+        boolean restoreSoftInputMode = false;
         if ((l.softInputMode
                 & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
-            WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
-            nl.copyFrom(l);
-            nl.softInputMode |=
+            l.softInputMode |=
                     WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
-            l = nl;
+            restoreSoftInputMode = true;
         }
 
         mWindowManager.addView(mDecor, l);
+        if (restoreSoftInputMode) {
+            l.softInputMode &=
+                    ~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
+        }
+
         mShowing = true;
 
         sendShowMessage();
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index e1a02fa..919f714 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -450,7 +450,7 @@
             in Intent intent, in String resolvedType, in Bundle options, int userId);
     void startRecentsActivity(in Intent intent, in IAssistDataReceiver assistDataReceiver,
             in IRecentsAnimationRunner recentsAnimationRunner);
-    void cancelRecentsAnimation();
+    void cancelRecentsAnimation(boolean restoreHomeStackPosition);
     int startActivityFromRecents(int taskId, in Bundle options);
     Bundle getActivityOptions(in IBinder token);
     List<IBinder> getAppTasks(in String callingPackage);
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index ddd0656..5067e19 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -73,6 +73,7 @@
     ParceledListSlice getNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted);
     int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted);
     int getDeletedChannelCount(String pkg, int uid);
+    int getBlockedChannelCount(String pkg, int uid);
     void deleteNotificationChannelGroup(String pkg, String channelGroupId);
     NotificationChannelGroup getNotificationChannelGroup(String pkg, String channelGroupId);
     ParceledListSlice getNotificationChannelGroups(String pkg);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 4326ee3..4ab6724 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -3902,7 +3902,7 @@
          * @deprecated use {@link #addPerson(Person)}
          */
         public Builder addPerson(String uri) {
-            addPerson(new Person().setUri(uri));
+            addPerson(new Person.Builder().setUri(uri).build());
             return this;
         }
 
@@ -6384,7 +6384,7 @@
          * @deprecated use {@code MessagingStyle(Person)}
          */
         public MessagingStyle(@NonNull CharSequence userDisplayName) {
-            this(new Person().setName(userDisplayName));
+            this(new Person.Builder().setName(userDisplayName).build());
         }
 
         /**
@@ -6431,6 +6431,7 @@
         /**
          * @return the user to be displayed for any replies sent by the user
          */
+        @NonNull
         public Person getUser() {
             return mUser;
         }
@@ -6489,7 +6490,7 @@
          */
         public MessagingStyle addMessage(CharSequence text, long timestamp, CharSequence sender) {
             return addMessage(text, timestamp,
-                    sender == null ? null : new Person().setName(sender));
+                    sender == null ? null : new Person.Builder().setName(sender).build());
         }
 
         /**
@@ -6505,7 +6506,8 @@
          *
          * @return this object for method chaining
          */
-        public MessagingStyle addMessage(CharSequence text, long timestamp, Person sender) {
+        public MessagingStyle addMessage(@NonNull CharSequence text, long timestamp,
+                @Nullable Person sender) {
             return addMessage(new Message(text, timestamp, sender));
         }
 
@@ -6661,7 +6663,7 @@
             mUser = extras.getParcelable(EXTRA_MESSAGING_PERSON);
             if (mUser == null) {
                 CharSequence displayName = extras.getCharSequence(EXTRA_SELF_DISPLAY_NAME);
-                mUser = new Person().setName(displayName);
+                mUser = new Person.Builder().setName(displayName).build();
             }
             mConversationTitle = extras.getCharSequence(EXTRA_CONVERSATION_TITLE);
             Parcelable[] messages = extras.getParcelableArray(EXTRA_MESSAGES);
@@ -6678,7 +6680,8 @@
         public RemoteViews makeContentView(boolean increasedHeight) {
             mBuilder.mOriginalActions = mBuilder.mActions;
             mBuilder.mActions = new ArrayList<>();
-            RemoteViews remoteViews = makeMessagingView(true /* isCollapsed */);
+            RemoteViews remoteViews = makeMessagingView(true /* displayImagesAtEnd */,
+                    true /* showReplyIcon */);
             mBuilder.mActions = mBuilder.mOriginalActions;
             mBuilder.mOriginalActions = null;
             return remoteViews;
@@ -6765,11 +6768,19 @@
          */
         @Override
         public RemoteViews makeBigContentView() {
-            return makeMessagingView(false /* isCollapsed */);
+            return makeMessagingView(false /* displayImagesAtEnd */, false /* showReplyIcon */);
         }
 
+        /**
+         * Create a messaging layout.
+         *
+         * @param displayImagesAtEnd should images be displayed at the end of the content instead
+         *                           of inline.
+         * @param showReplyIcon Should the reply affordance be shown at the end of the notification
+         * @return the created remoteView.
+         */
         @NonNull
-        private RemoteViews makeMessagingView(boolean isCollapsed) {
+        private RemoteViews makeMessagingView(boolean displayImagesAtEnd, boolean showReplyIcon) {
             CharSequence conversationTitle = !TextUtils.isEmpty(super.mBigContentTitle)
                     ? super.mBigContentTitle
                     : mConversationTitle;
@@ -6780,24 +6791,24 @@
                 nameReplacement = conversationTitle;
                 conversationTitle = null;
             }
-            boolean hideLargeIcon = !isCollapsed || isOneToOne;
+            boolean hideLargeIcon = !showReplyIcon || isOneToOne;
             RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
                     mBuilder.getMessagingLayoutResource(),
                     mBuilder.mParams.reset().hasProgress(false).title(conversationTitle).text(null)
                             .hideLargeIcon(hideLargeIcon)
                             .headerTextSecondary(conversationTitle)
-                            .alwaysShowReply(isCollapsed));
+                            .alwaysShowReply(showReplyIcon));
             addExtras(mBuilder.mN.extras);
             // also update the end margin if there is an image
             int endMargin = R.dimen.notification_content_margin_end;
-            if (isCollapsed) {
+            if (showReplyIcon) {
                 endMargin = R.dimen.notification_content_plus_picture_margin_end;
             }
             contentView.setViewLayoutMarginEndDimen(R.id.notification_main_column, endMargin);
             contentView.setInt(R.id.status_bar_latest_event_content, "setLayoutColor",
                     mBuilder.resolveContrastColor());
-            contentView.setBoolean(R.id.status_bar_latest_event_content, "setIsCollapsed",
-                    isCollapsed);
+            contentView.setBoolean(R.id.status_bar_latest_event_content, "setDisplayImagesAtEnd",
+                    displayImagesAtEnd);
             contentView.setIcon(R.id.status_bar_latest_event_content, "setLargeIcon",
                     mBuilder.mN.mLargeIcon);
             contentView.setCharSequence(R.id.status_bar_latest_event_content, "setNameReplacement",
@@ -6864,7 +6875,8 @@
          */
         @Override
         public RemoteViews makeHeadsUpContentView(boolean increasedHeight) {
-            RemoteViews remoteViews = makeMessagingView(true /* isCollapsed */);
+            RemoteViews remoteViews = makeMessagingView(true /* displayImagesAtEnd */,
+                    false /* showReplyIcon */);
             remoteViews.setInt(R.id.notification_messaging, "setMaxDisplayedLines", 1);
             return remoteViews;
         }
@@ -6906,7 +6918,8 @@
              *  @deprecated use {@code Message(CharSequence, long, Person)}
              */
             public Message(CharSequence text, long timestamp, CharSequence sender){
-                this(text, timestamp, sender == null ? null : new Person().setName(sender));
+                this(text, timestamp, sender == null ? null
+                        : new Person.Builder().setName(sender).build());
             }
 
             /**
@@ -6917,13 +6930,14 @@
              * Should be <code>null</code> for messages by the current user, in which case
              * the platform will insert the user set in {@code MessagingStyle(Person)}.
              * <p>
-             * The person provided should contain an Icon, set with {@link Person#setIcon(Icon)}
-             * and also have a name provided with {@link Person#setName(CharSequence)}. If multiple
-             * users have the same name, consider providing a key with {@link Person#setKey(String)}
-             * in order to differentiate between the different users.
+             * The person provided should contain an Icon, set with
+             * {@link Person.Builder#setIcon(Icon)} and also have a name provided
+             * with {@link Person.Builder#setName(CharSequence)}. If multiple users have the same
+             * name, consider providing a key with {@link Person.Builder#setKey(String)} in order
+             * to differentiate between the different users.
              * </p>
              */
-            public Message(CharSequence text, long timestamp, @Nullable Person sender){
+            public Message(@NonNull CharSequence text, long timestamp, @Nullable Person sender) {
                 mText = text;
                 mTimestamp = timestamp;
                 mSender = sender;
@@ -7082,7 +7096,7 @@
                             // the native api instead
                             CharSequence senderName = bundle.getCharSequence(KEY_SENDER);
                             if (senderName != null) {
-                                senderPerson = new Person().setName(senderName);
+                                senderPerson = new Person.Builder().setName(senderName).build();
                             }
                         }
                         Message message = new Message(bundle.getCharSequence(KEY_TEXT),
@@ -7777,217 +7791,6 @@
         }
     }
 
-    /**
-     * A Person associated with this Notification.
-     */
-    public static final class Person implements Parcelable {
-        @Nullable private CharSequence mName;
-        @Nullable private Icon mIcon;
-        @Nullable private String mUri;
-        @Nullable private String mKey;
-        private boolean mBot;
-        private boolean mImportant;
-
-        protected Person(Parcel in) {
-            mName = in.readCharSequence();
-            if (in.readInt() != 0) {
-                mIcon = Icon.CREATOR.createFromParcel(in);
-            }
-            mUri = in.readString();
-            mKey = in.readString();
-            mImportant = in.readBoolean();
-            mBot = in.readBoolean();
-        }
-
-        /**
-         * Create a new person.
-         */
-        public Person() {
-        }
-
-        /**
-         * Give this person a name.
-         *
-         * @param name the name of this person
-         */
-        public Person setName(@Nullable CharSequence name) {
-            this.mName = name;
-            return this;
-        }
-
-        /**
-         * Add an icon for this person.
-         * <br />
-         * This is currently only used for {@link MessagingStyle} notifications and should not be
-         * provided otherwise, in order to save memory. The system will prefer this icon over any
-         * images that are resolved from the URI.
-         *
-         * @param icon the icon of the person
-         */
-        public Person setIcon(@Nullable Icon icon) {
-            this.mIcon = icon;
-            return this;
-        }
-
-        /**
-         * Set a URI associated with this person.
-         *
-         * <P>
-         * Depending on user preferences, adding a URI to a Person may allow the notification to
-         * pass through interruption filters, if this notification is of
-         * category {@link #CATEGORY_CALL} or {@link #CATEGORY_MESSAGE}.
-         * The addition of people may also cause this notification to appear more prominently in
-         * the user interface.
-         * </P>
-         *
-         * <P>
-         * The person should be specified by the {@code String} representation of a
-         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
-         * </P>
-         *
-         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
-         * URIs.  The path part of these URIs must exist in the contacts database, in the
-         * appropriate column, or the reference will be discarded as invalid. Telephone schema
-         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
-         * </P>
-         *
-         * @param uri a URI for the person
-         */
-        public Person setUri(@Nullable String uri) {
-            mUri = uri;
-            return this;
-        }
-
-        /**
-         * Add a key to this person in order to uniquely identify it.
-         * This is especially useful if the name doesn't uniquely identify this person or if the
-         * display name is a short handle of the actual name.
-         *
-         * <P>If no key is provided, the name serves as as the key for the purpose of
-         * identification.</P>
-         *
-         * @param key the key that uniquely identifies this person
-         */
-        public Person setKey(@Nullable String key) {
-            mKey = key;
-            return this;
-        }
-
-        /**
-         * Sets whether this is an important person. Use this method to denote users who frequently
-         * interact with the user of this device, when it is not possible to refer to the user
-         * by {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
-         *
-         * @param isImportant {@code true} if this is an important person, {@code false} otherwise.
-         */
-        public Person setImportant(boolean isImportant) {
-            mImportant = isImportant;
-            return this;
-        }
-
-        /**
-         * Sets whether this person is a machine rather than a human.
-         *
-         * @param isBot {@code true}  if this person is a machine, {@code false} otherwise.
-         */
-        public Person setBot(boolean isBot) {
-            mBot = isBot;
-            return this;
-        }
-
-        /**
-         * @return the uri provided for this person or {@code null} if no Uri was provided
-         */
-        @Nullable
-        public String getUri() {
-            return mUri;
-        }
-
-        /**
-         * @return the name provided for this person or {@code null} if no name was provided
-         */
-        @Nullable
-        public CharSequence getName() {
-            return mName;
-        }
-
-        /**
-         * @return the icon provided for this person or {@code null} if no icon was provided
-         */
-        @Nullable
-        public Icon getIcon() {
-            return mIcon;
-        }
-
-        /**
-         * @return the key provided for this person or {@code null} if no key was provided
-         */
-        @Nullable
-        public String getKey() {
-            return mKey;
-        }
-
-        /**
-         * @return whether this Person is a machine.
-         */
-        public boolean isBot() {
-            return mBot;
-        }
-
-        /**
-         * @return whether this Person is important.
-         */
-        public boolean isImportant() {
-            return mImportant;
-        }
-
-        /**
-         * @return the URI associated with this person, or "name:mName" otherwise
-         *  @hide
-         */
-        public String resolveToLegacyUri() {
-            if (mUri != null) {
-                return mUri;
-            }
-            if (mName != null) {
-                return "name:" + mName;
-            }
-            return "";
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, @WriteFlags int flags) {
-            dest.writeCharSequence(mName);
-            if (mIcon != null) {
-                dest.writeInt(1);
-                mIcon.writeToParcel(dest, 0);
-            } else {
-                dest.writeInt(0);
-            }
-            dest.writeString(mUri);
-            dest.writeString(mKey);
-            dest.writeBoolean(mImportant);
-            dest.writeBoolean(mBot);
-        }
-
-        public static final Creator<Person> CREATOR = new Creator<Person>() {
-            @Override
-            public Person createFromParcel(Parcel in) {
-                return new Person(in);
-            }
-
-            @Override
-            public Person[] newArray(int size) {
-                return new Person[size];
-            }
-        };
-    }
-
     // When adding a new Style subclass here, don't forget to update
     // Builder.getNotificationStyleClass.
 
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index 4a7cf62..9e47ced 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -328,7 +328,8 @@
      * Group information is only used for presentation, not for behavior.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}, unless the
+     * channel is not currently part of a group.
      *
      * @param groupId the id of a group created by
      * {@link NotificationManager#createNotificationChannelGroup(NotificationChannelGroup)}.
@@ -341,6 +342,9 @@
      * Sets whether notifications posted to this channel can appear as application icon badges
      * in a Launcher.
      *
+     * Only modifiable before the channel is submitted to
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
+     *
      * @param showBadge true if badges should be allowed to be shown.
      */
     public void setShowBadge(boolean showBadge) {
@@ -353,7 +357,7 @@
      * least {@link NotificationManager#IMPORTANCE_DEFAULT} should have a sound.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      */
     public void setSound(Uri sound, AudioAttributes audioAttributes) {
         this.mSound = sound;
@@ -365,7 +369,7 @@
      * on devices that support that feature.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      */
     public void enableLights(boolean lights) {
         this.mLights = lights;
@@ -376,7 +380,7 @@
      * {@link #enableLights(boolean) enabled} on this channel and the device supports that feature.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      */
     public void setLightColor(int argb) {
         this.mLightColor = argb;
@@ -387,7 +391,7 @@
      * be set with {@link #setVibrationPattern(long[])}.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      */
     public void enableVibration(boolean vibration) {
         this.mVibrationEnabled = vibration;
@@ -399,7 +403,7 @@
      * vibration} as well. Otherwise, vibration will be disabled.
      *
      * Only modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      */
     public void setVibrationPattern(long[] vibrationPattern) {
         this.mVibrationEnabled = vibrationPattern != null && vibrationPattern.length > 0;
@@ -407,9 +411,10 @@
     }
 
     /**
-     * Sets the level of interruption of this notification channel. Only
-     * modifiable before the channel is submitted to
-     * {@link NotificationManager#notify(String, int, Notification)}.
+     * Sets the level of interruption of this notification channel.
+     *
+     * Only modifiable before the channel is submitted to
+     * {@link NotificationManager#createNotificationChannel(NotificationChannel)}.
      *
      * @param importance the amount the user should be interrupted by
      *            notifications from this channel.
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java
index 46d1264..757fc64 100644
--- a/core/java/android/app/NotificationManager.java
+++ b/core/java/android/app/NotificationManager.java
@@ -1145,6 +1145,21 @@
                 SUPPRESSED_EFFECT_NOTIFICATION_LIST
         };
 
+        private static final int[] SCREEN_OFF_SUPPRESSED_EFFECTS = {
+                SUPPRESSED_EFFECT_SCREEN_OFF,
+                SUPPRESSED_EFFECT_FULL_SCREEN_INTENT,
+                SUPPRESSED_EFFECT_LIGHTS,
+                SUPPRESSED_EFFECT_AMBIENT,
+        };
+
+        private static final int[] SCREEN_ON_SUPPRESSED_EFFECTS = {
+                SUPPRESSED_EFFECT_SCREEN_ON,
+                SUPPRESSED_EFFECT_PEEK,
+                SUPPRESSED_EFFECT_STATUS_BAR,
+                SUPPRESSED_EFFECT_BADGE,
+                SUPPRESSED_EFFECT_NOTIFICATION_LIST
+        };
+
         /**
          * Visual effects to suppress for a notification that is filtered by Do Not Disturb mode.
          * Bitmask of SUPPRESSED_EFFECT_* constants.
@@ -1297,6 +1312,58 @@
             return true;
         }
 
+        /**
+         * @hide
+         */
+        public static boolean areAnyScreenOffEffectsSuppressed(int effects) {
+            for (int i = 0; i < SCREEN_OFF_SUPPRESSED_EFFECTS.length; i++) {
+                final int effect = SCREEN_OFF_SUPPRESSED_EFFECTS[i];
+                if ((effects & effect) != 0) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /**
+         * @hide
+         */
+        public static boolean areAnyScreenOnEffectsSuppressed(int effects) {
+            for (int i = 0; i < SCREEN_ON_SUPPRESSED_EFFECTS.length; i++) {
+                final int effect = SCREEN_ON_SUPPRESSED_EFFECTS[i];
+                if ((effects & effect) != 0) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /**
+         * @hide
+         */
+        public static int toggleScreenOffEffectsSuppressed(int currentEffects, boolean suppress) {
+            return toggleEffects(currentEffects, SCREEN_OFF_SUPPRESSED_EFFECTS, suppress);
+        }
+
+        /**
+         * @hide
+         */
+        public static int toggleScreenOnEffectsSuppressed(int currentEffects, boolean suppress) {
+            return toggleEffects(currentEffects, SCREEN_ON_SUPPRESSED_EFFECTS, suppress);
+        }
+
+        private static int toggleEffects(int currentEffects, int[] effects, boolean suppress) {
+            for (int i = 0; i < effects.length; i++) {
+                final int effect = effects[i];
+                if (suppress) {
+                    currentEffects |= effect;
+                } else {
+                    currentEffects &= ~effect;
+                }
+            }
+            return currentEffects;
+        }
+
         public static String suppressedEffectsToString(int effects) {
             if (effects <= 0) return "";
             final StringBuilder sb = new StringBuilder();
diff --git a/core/java/android/app/Person.java b/core/java/android/app/Person.java
new file mode 100644
index 0000000..3884a8d
--- /dev/null
+++ b/core/java/android/app/Person.java
@@ -0,0 +1,270 @@
+/*
+ * 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;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.drawable.Icon;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Provides an immutable reference to an entity that appears repeatedly on different surfaces of the
+ * platform. For example, this could represent the sender of a message.
+ */
+public final class Person implements Parcelable {
+
+    @Nullable private CharSequence mName;
+    @Nullable private Icon mIcon;
+    @Nullable private String mUri;
+    @Nullable private String mKey;
+    private boolean mIsBot;
+    private boolean mIsImportant;
+
+    private Person(Parcel in) {
+        mName = in.readCharSequence();
+        if (in.readInt() != 0) {
+            mIcon = Icon.CREATOR.createFromParcel(in);
+        }
+        mUri = in.readString();
+        mKey = in.readString();
+        mIsImportant = in.readBoolean();
+        mIsBot = in.readBoolean();
+    }
+
+    private Person(Builder builder) {
+        mName = builder.mName;
+        mIcon = builder.mIcon;
+        mUri = builder.mUri;
+        mKey = builder.mKey;
+        mIsBot = builder.mIsBot;
+        mIsImportant = builder.mIsImportant;
+    }
+
+    /** Creates and returns a new {@link Builder} initialized with this Person's data. */
+    public Builder toBuilder() {
+        return new Builder(this);
+    }
+
+    /**
+     * @return the uri provided for this person or {@code null} if no Uri was provided.
+     */
+    @Nullable
+    public String getUri() {
+        return mUri;
+    }
+
+    /**
+     * @return the name provided for this person or {@code null} if no name was provided.
+     */
+    @Nullable
+    public CharSequence getName() {
+        return mName;
+    }
+
+    /**
+     * @return the icon provided for this person or {@code null} if no icon was provided.
+     */
+    @Nullable
+    public Icon getIcon() {
+        return mIcon;
+    }
+
+    /**
+     * @return the key provided for this person or {@code null} if no key was provided.
+     */
+    @Nullable
+    public String getKey() {
+        return mKey;
+    }
+
+    /**
+     * @return whether this Person is a machine.
+     */
+    public boolean isBot() {
+        return mIsBot;
+    }
+
+    /**
+     * @return whether this Person is important.
+     */
+    public boolean isImportant() {
+        return mIsImportant;
+    }
+
+    /**
+     * @return the URI associated with this person, or "name:mName" otherwise
+     *  @hide
+     */
+    public String resolveToLegacyUri() {
+        if (mUri != null) {
+            return mUri;
+        }
+        if (mName != null) {
+            return "name:" + mName;
+        }
+        return "";
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, @WriteFlags int flags) {
+        dest.writeCharSequence(mName);
+        if (mIcon != null) {
+            dest.writeInt(1);
+            mIcon.writeToParcel(dest, 0);
+        } else {
+            dest.writeInt(0);
+        }
+        dest.writeString(mUri);
+        dest.writeString(mKey);
+        dest.writeBoolean(mIsImportant);
+        dest.writeBoolean(mIsBot);
+    }
+
+    /** Builder for the immutable {@link Person} class. */
+    public static class Builder {
+        @Nullable private CharSequence mName;
+        @Nullable private Icon mIcon;
+        @Nullable private String mUri;
+        @Nullable private String mKey;
+        private boolean mIsBot;
+        private boolean mIsImportant;
+
+        /** Creates a new, empty {@link Builder}. */
+        public Builder() {
+        }
+
+        private Builder(Person person) {
+            mName = person.mName;
+            mIcon = person.mIcon;
+            mUri = person.mUri;
+            mKey = person.mKey;
+            mIsBot = person.mIsBot;
+            mIsImportant = person.mIsImportant;
+        }
+
+        /**
+         * Give this person a name.
+         *
+         * @param name the name of this person.
+         */
+        @NonNull
+        public Person.Builder setName(@Nullable CharSequence name) {
+            this.mName = name;
+            return this;
+        }
+
+        /**
+         * Add an icon for this person.
+         * <br />
+         * The system will prefer this icon over any images that are resolved from the URI.
+         *
+         * @param icon the icon of the person.
+         */
+        @NonNull
+        public Person.Builder setIcon(@Nullable Icon icon) {
+            this.mIcon = icon;
+            return this;
+        }
+
+        /**
+         * Set a URI associated with this person.
+         *
+         * <P>
+         * The person should be specified by the {@code String} representation of a
+         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
+         * </P>
+         *
+         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
+         * URIs. The path part of these URIs must exist in the contacts database, in the
+         * appropriate column, or the reference will be discarded as invalid. Telephone schema
+         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
+         * </P>
+         *
+         * @param uri a URI for the person.
+         */
+        @NonNull
+        public Person.Builder setUri(@Nullable String uri) {
+            mUri = uri;
+            return this;
+        }
+
+        /**
+         * Add a key to this person in order to uniquely identify it.
+         * This is especially useful if the name doesn't uniquely identify this person or if the
+         * display name is a short handle of the actual name.
+         *
+         * <P>If no key is provided, the name serves as the key for the purpose of
+         * identification.</P>
+         *
+         * @param key the key that uniquely identifies this person.
+         */
+        @NonNull
+        public Person.Builder setKey(@Nullable String key) {
+            mKey = key;
+            return this;
+        }
+
+        /**
+         * Sets whether this is an important person. Use this method to denote users who frequently
+         * interact with the user of this device when {@link #setUri(String)} isn't provided with
+         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}, and instead with
+         * the {@code mailto:} or {@code tel:} schemas.
+         *
+         * @param isImportant {@code true} if this is an important person, {@code false} otherwise.
+         */
+        @NonNull
+        public Person.Builder setImportant(boolean isImportant) {
+            mIsImportant = isImportant;
+            return this;
+        }
+
+        /**
+         * Sets whether this person is a machine rather than a human.
+         *
+         * @param isBot {@code true} if this person is a machine, {@code false} otherwise.
+         */
+        @NonNull
+        public Person.Builder setBot(boolean isBot) {
+            mIsBot = isBot;
+            return this;
+        }
+
+        /** Creates and returns the {@link Person} this builder represents. */
+        @NonNull
+        public Person build() {
+            return new Person(this);
+        }
+    }
+
+    public static final Creator<Person> CREATOR = new Creator<Person>() {
+        @Override
+        public Person createFromParcel(Parcel in) {
+            return new Person(in);
+        }
+
+        @Override
+        public Person[] newArray(int size) {
+            return new Person[size];
+        }
+    };
+}
diff --git a/core/java/android/app/RemoteAction.java b/core/java/android/app/RemoteAction.java
index 47741c0..c174665 100644
--- a/core/java/android/app/RemoteAction.java
+++ b/core/java/android/app/RemoteAction.java
@@ -122,6 +122,7 @@
     public RemoteAction clone() {
         RemoteAction action = new RemoteAction(mIcon, mTitle, mContentDescription, mActionIntent);
         action.setEnabled(mEnabled);
+        action.setShouldShowIcon(mShouldShowIcon);
         return action;
     }
 
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 1776eac..246d4a3 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -18,6 +18,7 @@
 
 import android.accounts.AccountManager;
 import android.accounts.IAccountManager;
+import android.app.ContextImpl.ServiceInitializationState;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.IDevicePolicyManager;
 import android.app.job.IJobScheduler;
@@ -104,10 +105,12 @@
 import android.os.BatteryManager;
 import android.os.BatteryStats;
 import android.os.Build;
+import android.os.DeviceIdleManager;
 import android.os.DropBoxManager;
 import android.os.HardwarePropertiesManager;
 import android.os.IBatteryPropertiesRegistrar;
 import android.os.IBinder;
+import android.os.IDeviceIdleController;
 import android.os.IHardwarePropertiesManager;
 import android.os.IPowerManager;
 import android.os.IRecoverySystem;
@@ -160,7 +163,6 @@
 import com.android.internal.policy.PhoneLayoutInflater;
 
 import java.util.HashMap;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Manages all of the system services that can be returned by {@link Context#getSystemService}.
@@ -279,12 +281,12 @@
             }});
 
         registerService(Context.IPSEC_SERVICE, IpSecManager.class,
-                new StaticServiceFetcher<IpSecManager>() {
+                new CachedServiceFetcher<IpSecManager>() {
             @Override
-            public IpSecManager createService() {
+            public IpSecManager createService(ContextImpl ctx) throws ServiceNotFoundException {
                 IBinder b = ServiceManager.getService(Context.IPSEC_SERVICE);
                 IIpSecService service = IIpSecService.Stub.asInterface(b);
-                return new IpSecManager(service);
+                return new IpSecManager(ctx, service);
             }});
 
         registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
@@ -984,6 +986,17 @@
                                 ctx.mMainThread.getHandler());
                     }
             });
+
+        registerService(Context.DEVICE_IDLE_CONTROLLER, DeviceIdleManager.class,
+                new CachedServiceFetcher<DeviceIdleManager>() {
+                    @Override
+                    public DeviceIdleManager createService(ContextImpl ctx)
+                            throws ServiceNotFoundException {
+                        IDeviceIdleController service = IDeviceIdleController.Stub.asInterface(
+                                ServiceManager.getServiceOrThrow(
+                                        Context.DEVICE_IDLE_CONTROLLER));
+                        return new DeviceIdleManager(ctx.getOuterContext(), service);
+                    }});
     }
 
     /**
@@ -993,10 +1006,6 @@
         return new Object[sServiceCacheSize];
     }
 
-    public static AtomicInteger[] createServiceInitializationStateArray() {
-        return new AtomicInteger[sServiceCacheSize];
-    }
-
     /**
      * Gets a system service from a given context.
      */
@@ -1037,7 +1046,10 @@
     static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
         private final int mCacheIndex;
 
-        public CachedServiceFetcher() {
+        CachedServiceFetcher() {
+            // Note this class must be instantiated only by the static initializer of the
+            // outer class (SystemServiceRegistry), which already does the synchronization,
+            // so bare access to sServiceCacheSize is okay here.
             mCacheIndex = sServiceCacheSize++;
         }
 
@@ -1045,95 +1057,73 @@
         @SuppressWarnings("unchecked")
         public final T getService(ContextImpl ctx) {
             final Object[] cache = ctx.mServiceCache;
+            final int[] gates = ctx.mServiceInitializationStateArray;
 
-            // Fast path. If it's already cached, just return it.
-            Object service = cache[mCacheIndex];
-            if (service != null) {
-                return (T) service;
-            }
+            for (;;) {
+                boolean doInitialize = false;
+                synchronized (cache) {
+                    // Return it if we already have a cached instance.
+                    T service = (T) cache[mCacheIndex];
+                    if (service != null || gates[mCacheIndex] == ContextImpl.STATE_NOT_FOUND) {
+                        return service;
+                    }
 
-            // Slow path.
-            final AtomicInteger[] gates = ctx.mServiceInitializationStateArray;
-            final AtomicInteger gate;
+                    // If we get here, there's no cached instance.
 
-            synchronized (cache) {
-                // See if it's cached or not again, with the lock held this time.
-                service = cache[mCacheIndex];
-                if (service != null) {
-                    return (T) service;
+                    // Grr... if gate is STATE_READY, then this means we initialized the service
+                    // once but someone cleared it.
+                    // We start over from STATE_UNINITIALIZED.
+                    if (gates[mCacheIndex] == ContextImpl.STATE_READY) {
+                        gates[mCacheIndex] = ContextImpl.STATE_UNINITIALIZED;
+                    }
+
+                    // It's possible for multiple threads to get here at the same time, so
+                    // use the "gate" to make sure only the first thread will call createService().
+
+                    // At this point, the gate must be either UNINITIALIZED or INITIALIZING.
+                    if (gates[mCacheIndex] == ContextImpl.STATE_UNINITIALIZED) {
+                        doInitialize = true;
+                        gates[mCacheIndex] = ContextImpl.STATE_INITIALIZING;
+                    }
                 }
 
-                // Not initialized yet. Create an atomic boolean to control which thread should
-                // instantiate the service.
-                if (gates[mCacheIndex] != null) {
-                    gate = gates[mCacheIndex];
-                } else {
-                    gate = new AtomicInteger(ContextImpl.STATE_UNINITIALIZED);
-                    gates[mCacheIndex] = gate;
-                }
-            }
+                if (doInitialize) {
+                    // Only the first thread gets here.
 
-            // Not cached yet.
-            //
-            // Note multiple threads can reach here for the same service on the same context
-            // concurrently.
-            //
-            // Now we're going to instantiate the service, but do so without the cache held;
-            // otherwise it could deadlock. (b/71882178)
-            //
-            // However we still don't want to instantiate the same service multiple times, so
-            // use the atomic integer to ensure only one thread will call createService().
-
-            if (gate.compareAndSet(
-                    ContextImpl.STATE_UNINITIALIZED, ContextImpl.STATE_INITIALIZING)) {
-                try {
-                    // This thread is the first one to get here. Instantiate the service
-                    // *without* the cache lock held.
+                    T service = null;
+                    @ServiceInitializationState int newState = ContextImpl.STATE_NOT_FOUND;
                     try {
+                        // This thread is the first one to get here. Instantiate the service
+                        // *without* the cache lock held.
                         service = createService(ctx);
+                        newState = ContextImpl.STATE_READY;
 
-                        synchronized (cache) {
-                            cache[mCacheIndex] = service;
-                        }
                     } catch (ServiceNotFoundException e) {
                         onServiceNotFound(e);
-                    }
-                } finally {
-                    // Tell the all other threads that the cache is ready now.
-                    // (But it's still be null in case of ServiceNotFoundException.)
-                    synchronized (gate) {
-                        gate.set(ContextImpl.STATE_READY);
-                        gate.notifyAll();
-                    }
-                }
-                return (T) service;
-            }
-            // Other threads will wait on the gate lock.
-            synchronized (gate) {
-                boolean interrupted = false;
 
-                // Note: We check whether "state == STATE_READY", not
-                // "cache[mCacheIndex] != null", because "cache[mCacheIndex] == null"
-                // is still a valid outcome in the ServiceNotFoundException case.
-                while (gate.get() != ContextImpl.STATE_READY) {
-                    try {
-                        gate.wait();
-                    } catch (InterruptedException e) {
-                        Log.w(TAG,  "getService() interrupted");
-                        interrupted = true;
+                    } finally {
+                        synchronized (cache) {
+                            cache[mCacheIndex] = service;
+                            gates[mCacheIndex] = newState;
+                            cache.notifyAll();
+                        }
+                    }
+                    return service;
+                }
+                // The other threads will wait for the first thread to call notifyAll(),
+                // and go back to the top and retry.
+                synchronized (cache) {
+                    while (gates[mCacheIndex] < ContextImpl.STATE_READY) {
+                        try {
+                            cache.wait();
+                        } catch (InterruptedException e) {
+                            Log.w(TAG, "getService() interrupted");
+                            Thread.currentThread().interrupt();
+                            return null;
+                        }
                     }
                 }
-                if (interrupted) {
-                    Thread.currentThread().interrupt();
-                }
             }
-            // Now the first thread has initialized it.
-            // It may still be null if ServiceNotFoundException was thrown, but that shouldn't
-            // happen, so we'll just return null here in that case.
-            synchronized (cache) {
-                service = cache[mCacheIndex];
-            }
-            return (T) service;
         }
 
         public abstract T createService(ContextImpl ctx) throws ServiceNotFoundException;
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index bd4933a..c03340e 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -580,6 +580,8 @@
         // Execute the command *without* the lock being held.
         command.run();
 
+        List<AccessibilityEvent> receivedEvents = new ArrayList<>();
+
         // Acquire the lock and wait for the event.
         try {
             // Wait for the event.
@@ -600,14 +602,14 @@
                     if (filter.accept(event)) {
                         return event;
                     }
-                    event.recycle();
+                    receivedEvents.add(event);
                 }
                 // Check if timed out and if not wait.
                 final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis;
                 final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis;
                 if (remainingTimeMillis <= 0) {
                     throw new TimeoutException("Expected event not received within: "
-                            + timeoutMillis + " ms.");
+                            + timeoutMillis + " ms among: " + receivedEvents);
                 }
                 synchronized (mLock) {
                     if (mEventQueue.isEmpty()) {
@@ -620,6 +622,11 @@
                 }
             }
         } finally {
+            int size = receivedEvents.size();
+            for (int i = 0; i < size; i++) {
+                receivedEvents.get(i).recycle();
+            }
+
             synchronized (mLock) {
                 mWaitingForEventDelivery = false;
                 mEventQueue.clear();
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 465340f..17bc6ea 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -401,7 +401,8 @@
                 }
             }
             synchronized (this) {
-                if (mCachedWallpaper != null && mCachedWallpaperUserId == userId) {
+                if (mCachedWallpaper != null && mCachedWallpaperUserId == userId
+                        && !mCachedWallpaper.isRecycled()) {
                     return mCachedWallpaper;
                 }
                 mCachedWallpaper = null;
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index b64aae5..990147b 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -1173,6 +1173,13 @@
     public static final String POLICY_MANDATORY_BACKUPS = "policy_mandatory_backups";
 
     /**
+     * Constant to indicate the feature of suspending app. Use it as the value of
+     * {@link #EXTRA_RESTRICTION}.
+     * @hide
+     */
+    public static final String POLICY_SUSPEND_PACKAGES = "policy_suspend_packages";
+
+    /**
      * A String indicating a specific restricted feature. Can be a user restriction from the
      * {@link UserManager}, e.g. {@link UserManager#DISALLOW_ADJUST_VOLUME}, or one of the values
      * {@link #POLICY_DISABLE_CAMERA}, {@link #POLICY_DISABLE_SCREEN_CAPTURE} or
@@ -4211,6 +4218,15 @@
         return null;
     }
 
+    /**
+     * Returns {@code true} if the device supports attestation of device identifiers in addition
+     * to key attestation.
+     * @return {@code true} if Device ID attestation is supported.
+     */
+    public boolean isDeviceIdAttestationSupported() {
+        PackageManager pm = mContext.getPackageManager();
+        return pm.hasSystemFeature(PackageManager.FEATURE_DEVICE_ID_ATTESTATION);
+    }
 
     /**
      * Called by a device or profile owner, or delegated certificate installer, to associate
@@ -6182,6 +6198,7 @@
      * @hide
      */
      @SystemApi
+     @RequiresPermission(android.Manifest.permission.MANAGE_USERS)
      public @Nullable List<String> getPermittedAccessibilityServices(int userId) {
         throwIfParentInstance("getPermittedAccessibilityServices");
         if (mService != null) {
diff --git a/core/java/android/app/admin/FreezeInterval.java b/core/java/android/app/admin/FreezePeriod.java
similarity index 74%
rename from core/java/android/app/admin/FreezeInterval.java
rename to core/java/android/app/admin/FreezePeriod.java
index de5e21a..657f017 100644
--- a/core/java/android/app/admin/FreezeInterval.java
+++ b/core/java/android/app/admin/FreezePeriod.java
@@ -20,49 +20,88 @@
 import android.util.Pair;
 
 import java.time.LocalDate;
+import java.time.MonthDay;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * An interval representing one freeze period which repeats annually. We use the number of days
- * since the start of (non-leap) year to define the start and end dates of an interval, both
- * inclusive. If the end date is smaller than the start date, the interval is considered wrapped
- * around the year-end. As far as an interval is concerned, February 29th should be treated as
- * if it were February 28th: so an interval starting or ending on February 28th are not
- * distinguishable from an interval on February 29th. When calulating interval length or
- * distance between two dates, February 29th is also disregarded.
+ * A class that represents one freeze period which repeats <em>annually</em>. A freeze period has
+ * two {@link java.time#MonthDay} values that define the start and end dates of the period, both
+ * inclusive. If the end date is earlier than the start date, the period is considered wrapped
+ * around the year-end. As far as freeze period is concerned, leap year is disregarded and February
+ * 29th should be treated as if it were February 28th: so a freeze starting or ending on February
+ * 28th is identical to a freeze starting or ending on February 29th. When calulating the length of
+ * a freeze or the distance bewteen two freee periods, February 29th is also ignored.
  *
  * @see SystemUpdatePolicy#setFreezePeriods
- * @hide
  */
-public class FreezeInterval {
-    private static final String TAG = "FreezeInterval";
+public class FreezePeriod {
+    private static final String TAG = "FreezePeriod";
 
     private static final int DUMMY_YEAR = 2001;
     static final int DAYS_IN_YEAR = 365; // 365 since DUMMY_YEAR is not a leap year
 
-    final int mStartDay; // [1,365]
-    final int mEndDay; // [1,365]
+    private final MonthDay mStart;
+    private final MonthDay mEnd;
 
-    FreezeInterval(int startDay, int endDay) {
-        if (startDay < 1 || startDay > 365 || endDay < 1 || endDay > 365) {
-            throw new RuntimeException("Bad dates for Interval: " + startDay + "," + endDay);
-        }
-        mStartDay = startDay;
-        mEndDay = endDay;
+    /*
+     * Start and end dates represented by number of days since the beginning of the year.
+     * They are internal representations of mStart and mEnd with normalized Leap year days
+     * (Feb 29 == Feb 28 == 59th day of year). All internal calclations are based on
+     * these two values so that leap year days are disregarded.
+     */
+    private final int mStartDay; // [1, 365]
+    private final int mEndDay; // [1, 365]
+
+    /**
+     * Creates a freeze period by its start and end dates. If the end date is earlier than the start
+     * date, the freeze period is considered wrapping year-end.
+     */
+    public FreezePeriod(MonthDay start, MonthDay end) {
+        mStart = start;
+        mStartDay = mStart.atYear(DUMMY_YEAR).getDayOfYear();
+        mEnd = end;
+        mEndDay = mEnd.atYear(DUMMY_YEAR).getDayOfYear();
     }
 
+    /**
+     * Returns the start date (inclusive) of this freeze period.
+     */
+    public MonthDay getStart() {
+        return mStart;
+    }
+
+    /**
+     * Returns the end date (inclusive) of this freeze period.
+     */
+    public MonthDay getEnd() {
+        return mEnd;
+    }
+
+    /**
+     * @hide
+     */
+    private FreezePeriod(int startDay, int endDay) {
+        mStartDay = startDay;
+        mStart = dayOfYearToMonthDay(startDay);
+        mEndDay = endDay;
+        mEnd = dayOfYearToMonthDay(endDay);
+    }
+
+    /** @hide */
     int getLength() {
         return getEffectiveEndDay() - mStartDay + 1;
     }
 
+    /** @hide */
     boolean isWrapped() {
         return mEndDay < mStartDay;
     }
 
     /**
      * Returns the effective end day, taking wrapping around year-end into consideration
+     * @hide
      */
     int getEffectiveEndDay() {
         if (!isWrapped()) {
@@ -72,6 +111,7 @@
         }
     }
 
+    /** @hide */
     boolean contains(LocalDate localDate) {
         final int daysOfYear = dayOfYearDisregardLeapYear(localDate);
         if (!isWrapped()) {
@@ -84,6 +124,7 @@
         }
     }
 
+    /** @hide */
     boolean after(LocalDate localDate) {
         return mStartDay > dayOfYearDisregardLeapYear(localDate);
     }
@@ -95,6 +136,7 @@
      * include now, the returned dates represents the next future interval.
      * The result will always have the same month and dayOfMonth value as the non-instantiated
      * interval itself.
+     * @hide
      */
     Pair<LocalDate, LocalDate> toCurrentOrFutureRealDates(LocalDate now) {
         final int nowDays = dayOfYearDisregardLeapYear(now);
@@ -138,14 +180,24 @@
                 + LocalDate.ofYearDay(DUMMY_YEAR, mEndDay).format(formatter);
     }
 
-    // Treat the supplied date as in a non-leap year and return its day of year.
-    static int dayOfYearDisregardLeapYear(LocalDate date) {
+    /** @hide */
+    private static MonthDay dayOfYearToMonthDay(int dayOfYear) {
+        LocalDate date = LocalDate.ofYearDay(DUMMY_YEAR, dayOfYear);
+        return MonthDay.of(date.getMonth(), date.getDayOfMonth());
+    }
+
+    /**
+     * Treat the supplied date as in a non-leap year and return its day of year.
+     * @hide
+     */
+    private static int dayOfYearDisregardLeapYear(LocalDate date) {
         return date.withYear(DUMMY_YEAR).getDayOfYear();
     }
 
     /**
      * Compute the number of days between first (inclusive) and second (exclusive),
      * treating all years in between as non-leap.
+     * @hide
      */
     public static int distanceWithoutLeapYear(LocalDate first, LocalDate second) {
         return dayOfYearDisregardLeapYear(first) - dayOfYearDisregardLeapYear(second)
@@ -165,16 +217,16 @@
      *     3. At most one wrapped Interval remains, and it will be at the end of the list
      * @hide
      */
-    protected static List<FreezeInterval> canonicalizeIntervals(List<FreezeInterval> intervals) {
+    static List<FreezePeriod> canonicalizePeriods(List<FreezePeriod> intervals) {
         boolean[] taken = new boolean[DAYS_IN_YEAR];
         // First convert the intervals into flat array
-        for (FreezeInterval interval : intervals) {
+        for (FreezePeriod interval : intervals) {
             for (int i = interval.mStartDay; i <= interval.getEffectiveEndDay(); i++) {
                 taken[(i - 1) % DAYS_IN_YEAR] = true;
             }
         }
         // Then reconstruct intervals from the array
-        List<FreezeInterval> result = new ArrayList<>();
+        List<FreezePeriod> result = new ArrayList<>();
         int i = 0;
         while (i < DAYS_IN_YEAR) {
             if (!taken[i]) {
@@ -183,14 +235,14 @@
             }
             final int intervalStart = i + 1;
             while (i < DAYS_IN_YEAR && taken[i]) i++;
-            result.add(new FreezeInterval(intervalStart, i));
+            result.add(new FreezePeriod(intervalStart, i));
         }
         // Check if the last entry can be merged to the first entry to become one single
         // wrapped interval
         final int lastIndex = result.size() - 1;
         if (lastIndex > 0 && result.get(lastIndex).mEndDay == DAYS_IN_YEAR
                 && result.get(0).mStartDay == 1) {
-            FreezeInterval wrappedInterval = new FreezeInterval(result.get(lastIndex).mStartDay,
+            FreezePeriod wrappedInterval = new FreezePeriod(result.get(lastIndex).mStartDay,
                     result.get(0).mEndDay);
             result.set(lastIndex, wrappedInterval);
             result.remove(0);
@@ -207,18 +259,18 @@
      *
      * @hide
      */
-    protected static void validatePeriods(List<FreezeInterval> periods) {
-        List<FreezeInterval> allPeriods = FreezeInterval.canonicalizeIntervals(periods);
+    static void validatePeriods(List<FreezePeriod> periods) {
+        List<FreezePeriod> allPeriods = FreezePeriod.canonicalizePeriods(periods);
         if (allPeriods.size() != periods.size()) {
             throw SystemUpdatePolicy.ValidationFailedException.duplicateOrOverlapPeriods();
         }
         for (int i = 0; i < allPeriods.size(); i++) {
-            FreezeInterval current = allPeriods.get(i);
+            FreezePeriod current = allPeriods.get(i);
             if (current.getLength() > SystemUpdatePolicy.FREEZE_PERIOD_MAX_LENGTH) {
                 throw SystemUpdatePolicy.ValidationFailedException.freezePeriodTooLong("Freeze "
                         + "period " + current + " is too long: " + current.getLength() + " days");
             }
-            FreezeInterval previous = i > 0 ? allPeriods.get(i - 1)
+            FreezePeriod previous = i > 0 ? allPeriods.get(i - 1)
                     : allPeriods.get(allPeriods.size() - 1);
             if (previous != current) {
                 final int separation;
@@ -247,7 +299,7 @@
      *
      * @hide
      */
-    protected static void validateAgainstPreviousFreezePeriod(List<FreezeInterval> periods,
+    static void validateAgainstPreviousFreezePeriod(List<FreezePeriod> periods,
             LocalDate prevPeriodStart, LocalDate prevPeriodEnd, LocalDate now) {
         if (periods.size() == 0 || prevPeriodStart == null || prevPeriodEnd == null) {
             return;
@@ -258,14 +310,14 @@
             // Clock was adjusted backwards. We can continue execution though, the separation
             // and length validation below still works under this condition.
         }
-        List<FreezeInterval> allPeriods = FreezeInterval.canonicalizeIntervals(periods);
+        List<FreezePeriod> allPeriods = FreezePeriod.canonicalizePeriods(periods);
         // Given current time now, find the freeze period that's either current, or the one
         // that's immediately afterwards. For the later case, it might be after the year-end,
         // but this can only happen if there is only one freeze period.
-        FreezeInterval curOrNextFreezePeriod = allPeriods.get(0);
-        for (FreezeInterval interval : allPeriods) {
+        FreezePeriod curOrNextFreezePeriod = allPeriods.get(0);
+        for (FreezePeriod interval : allPeriods) {
             if (interval.contains(now)
-                    || interval.mStartDay > FreezeInterval.dayOfYearDisregardLeapYear(now)) {
+                    || interval.mStartDay > FreezePeriod.dayOfYearDisregardLeapYear(now)) {
                 curOrNextFreezePeriod = interval;
                 break;
             }
@@ -282,7 +334,7 @@
         // Now validate [prevPeriodStart, prevPeriodEnd] against curOrNextFreezeDates
         final String periodsDescription = "Prev: " + prevPeriodStart + "," + prevPeriodEnd
                 + "; cur: " + curOrNextFreezeDates.first + "," + curOrNextFreezeDates.second;
-        long separation = FreezeInterval.distanceWithoutLeapYear(curOrNextFreezeDates.first,
+        long separation = FreezePeriod.distanceWithoutLeapYear(curOrNextFreezeDates.first,
                 prevPeriodEnd) - 1;
         if (separation > 0) {
             // Two intervals do not overlap, check separation
@@ -292,7 +344,7 @@
             }
         } else {
             // Two intervals overlap, check combined length
-            long length = FreezeInterval.distanceWithoutLeapYear(curOrNextFreezeDates.second,
+            long length = FreezePeriod.distanceWithoutLeapYear(curOrNextFreezeDates.second,
                     prevPeriodStart) + 1;
             if (length > SystemUpdatePolicy.FREEZE_PERIOD_MAX_LENGTH) {
                 throw ValidationFailedException.combinedPeriodTooLong("Combined freeze period "
diff --git a/core/java/android/app/admin/SystemUpdatePolicy.java b/core/java/android/app/admin/SystemUpdatePolicy.java
index 47b3a81..20eef6c 100644
--- a/core/java/android/app/admin/SystemUpdatePolicy.java
+++ b/core/java/android/app/admin/SystemUpdatePolicy.java
@@ -38,9 +38,11 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.MonthDay;
 import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -51,7 +53,7 @@
  * @see DevicePolicyManager#setSystemUpdatePolicy
  * @see DevicePolicyManager#getSystemUpdatePolicy
  */
-public class SystemUpdatePolicy implements Parcelable {
+public final class SystemUpdatePolicy implements Parcelable {
     private static final String TAG = "SystemUpdatePolicy";
 
     /** @hide */
@@ -163,6 +165,7 @@
                 ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE,
                 ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG,
                 ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE,
+                ERROR_UNKNOWN,
         })
         @Retention(RetentionPolicy.SOURCE)
         @interface ValidationFailureType {}
@@ -171,33 +174,38 @@
         public static final int ERROR_NONE = 0;
 
         /**
+         * Validation failed with unknown error.
+         */
+        public static final int ERROR_UNKNOWN = 1;
+
+        /**
          * The freeze periods contains duplicates, periods that overlap with each
          * other or periods whose start and end joins.
          */
-        public static final int ERROR_DUPLICATE_OR_OVERLAP = 1;
+        public static final int ERROR_DUPLICATE_OR_OVERLAP = 2;
 
         /**
          * There exists at least one freeze period whose length exceeds 90 days.
          */
-        public static final int ERROR_NEW_FREEZE_PERIOD_TOO_LONG = 2;
+        public static final int ERROR_NEW_FREEZE_PERIOD_TOO_LONG = 3;
 
         /**
          * There exists some freeze period which starts within 60 days of the preceding period's
          * end time.
          */
-        public static final int ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE = 3;
+        public static final int ERROR_NEW_FREEZE_PERIOD_TOO_CLOSE = 4;
 
         /**
          * The device has been in a freeze period and when combining with the new freeze period
          * to be set, it will result in the total freeze period being longer than 90 days.
          */
-        public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG = 4;
+        public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_LONG = 5;
 
         /**
          * The device has been in a freeze period and some new freeze period to be set is less
          * than 60 days from the end of the last freeze period the device went through.
          */
-        public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE = 5;
+        public static final int ERROR_COMBINED_FREEZE_PERIOD_TOO_CLOSE = 6;
 
         @ValidationFailureType
         private final int mErrorCode;
@@ -272,7 +280,7 @@
     private int mMaintenanceWindowStart;
     private int mMaintenanceWindowEnd;
 
-    private final ArrayList<FreezeInterval> mFreezePeriods;
+    private final ArrayList<FreezePeriod> mFreezePeriods;
 
     private SystemUpdatePolicy() {
         mPolicyType = TYPE_UNKNOWN;
@@ -444,12 +452,10 @@
      *         requirement set above
      * @return this instance
      */
-    public SystemUpdatePolicy setFreezePeriods(List<Pair<Integer, Integer>> freezePeriods) {
-        List<FreezeInterval> newPeriods = freezePeriods.stream().map(
-                p -> new FreezeInterval(p.first, p.second)).collect(Collectors.toList());
-        FreezeInterval.validatePeriods(newPeriods);
+    public SystemUpdatePolicy setFreezePeriods(List<FreezePeriod> freezePeriods) {
+        FreezePeriod.validatePeriods(freezePeriods);
         mFreezePeriods.clear();
-        mFreezePeriods.addAll(newPeriods);
+        mFreezePeriods.addAll(freezePeriods);
         return this;
     }
 
@@ -458,12 +464,8 @@
      *
      * @return the list of freeze periods, or an empty list if none was set.
      */
-    public List<Pair<Integer, Integer>> getFreezePeriods() {
-        List<Pair<Integer, Integer>> result = new ArrayList<>(mFreezePeriods.size());
-        for (FreezeInterval interval : mFreezePeriods) {
-            result.add(new Pair<>(interval.mStartDay, interval.mEndDay));
-        }
-        return result;
+    public List<FreezePeriod> getFreezePeriods() {
+        return Collections.unmodifiableList(mFreezePeriods);
     }
 
     /**
@@ -472,7 +474,7 @@
      * @hide
      */
     public Pair<LocalDate, LocalDate> getCurrentFreezePeriod(LocalDate now) {
-        for (FreezeInterval interval : mFreezePeriods) {
+        for (FreezePeriod interval : mFreezePeriods) {
             if (interval.contains(now)) {
                 return interval.toCurrentOrFutureRealDates(now);
             }
@@ -485,10 +487,10 @@
      * is not within a freeze period.
      */
     private long timeUntilNextFreezePeriod(long now) {
-        List<FreezeInterval> sortedPeriods = FreezeInterval.canonicalizeIntervals(mFreezePeriods);
+        List<FreezePeriod> sortedPeriods = FreezePeriod.canonicalizePeriods(mFreezePeriods);
         LocalDate nowDate = millisToDate(now);
         LocalDate nextFreezeStart = null;
-        for (FreezeInterval interval : sortedPeriods) {
+        for (FreezePeriod interval : sortedPeriods) {
             if (interval.after(nowDate)) {
                 nextFreezeStart = interval.toCurrentOrFutureRealDates(nowDate).first;
                 break;
@@ -506,13 +508,13 @@
 
     /** @hide */
     public void validateFreezePeriods() {
-        FreezeInterval.validatePeriods(mFreezePeriods);
+        FreezePeriod.validatePeriods(mFreezePeriods);
     }
 
     /** @hide */
     public void validateAgainstPreviousFreezePeriod(LocalDate prevPeriodStart,
             LocalDate prevPeriodEnd, LocalDate now) {
-        FreezeInterval.validateAgainstPreviousFreezePeriod(mFreezePeriods, prevPeriodStart,
+        FreezePeriod.validateAgainstPreviousFreezePeriod(mFreezePeriods, prevPeriodStart,
                 prevPeriodEnd, now);
     }
 
@@ -521,10 +523,10 @@
      * updates and how long this action is valid for, given the current system update policy. Its
      * action could be one of the following
      * <ul>
-     * <li> {@code TYPE_INSTALL_AUTOMATIC} system updates should be installed immedately and without
-     * user intervention as soon as they become available.
-     * <li> {@code TYPE_POSTPONE} system updates should be postponed for a maximum of 30 days
-     * <li> {@code TYPE_PAUSE} system updates should be postponed indefinitely until further notice
+     * <li> {@link #TYPE_INSTALL_AUTOMATIC} system updates should be installed immedately and
+     * without user intervention as soon as they become available.
+     * <li> {@link #TYPE_POSTPONE} system updates should be postponed for a maximum of 30 days
+     * <li> {@link #TYPE_PAUSE} system updates should be postponed indefinitely until further notice
      * </ul>
      *
      * The effective time measures how long this installation option is valid for from the queried
@@ -535,18 +537,38 @@
      */
     @SystemApi
     public static class InstallationOption {
+        /** @hide */
+        @IntDef(prefix = { "TYPE_" }, value = {
+                TYPE_INSTALL_AUTOMATIC,
+                TYPE_PAUSE,
+                TYPE_POSTPONE
+        })
+        @Retention(RetentionPolicy.SOURCE)
+        @interface InstallationOptionType {}
+
+        @InstallationOptionType
         private final int mType;
         private long mEffectiveTime;
 
-        InstallationOption(int type, long effectiveTime) {
+        InstallationOption(@InstallationOptionType int type, long effectiveTime) {
             this.mType = type;
             this.mEffectiveTime = effectiveTime;
         }
 
-        public int getType() {
+        /**
+         * Returns the type of the current installation option, could be one of
+         * {@link #TYPE_INSTALL_AUTOMATIC}, {@link #TYPE_POSTPONE} and {@link #TYPE_PAUSE}.
+         * @return type of installation option.
+         */
+        public @InstallationOptionType int getType() {
             return mType;
         }
 
+        /**
+         * Returns how long the current installation option in effective for, starting from the time
+         * of query.
+         * @return the effective time in milliseconds.
+         */
         public long getEffectiveTime() {
             return mEffectiveTime;
         }
@@ -667,9 +689,11 @@
         int freezeCount = mFreezePeriods.size();
         dest.writeInt(freezeCount);
         for (int i = 0; i < freezeCount; i++) {
-            FreezeInterval interval = mFreezePeriods.get(i);
-            dest.writeInt(interval.mStartDay);
-            dest.writeInt(interval.mEndDay);
+            FreezePeriod interval = mFreezePeriods.get(i);
+            dest.writeInt(interval.getStart().getMonthValue());
+            dest.writeInt(interval.getStart().getDayOfMonth());
+            dest.writeInt(interval.getEnd().getMonthValue());
+            dest.writeInt(interval.getEnd().getDayOfMonth());
         }
     }
 
@@ -686,8 +710,9 @@
                     int freezeCount = source.readInt();
                     policy.mFreezePeriods.ensureCapacity(freezeCount);
                     for (int i = 0; i < freezeCount; i++) {
-                        policy.mFreezePeriods.add(
-                                new FreezeInterval(source.readInt(), source.readInt()));
+                        MonthDay start = MonthDay.of(source.readInt(), source.readInt());
+                        MonthDay end = MonthDay.of(source.readInt(), source.readInt());
+                        policy.mFreezePeriods.add(new FreezePeriod(start, end));
                     }
                     return policy;
                 }
@@ -730,9 +755,9 @@
                     if (!parser.getName().equals(KEY_FREEZE_TAG)) {
                         continue;
                     }
-                    policy.mFreezePeriods.add(new FreezeInterval(
-                            Integer.parseInt(parser.getAttributeValue(null, KEY_FREEZE_START)),
-                            Integer.parseInt(parser.getAttributeValue(null, KEY_FREEZE_END))));
+                    policy.mFreezePeriods.add(new FreezePeriod(
+                            MonthDay.parse(parser.getAttributeValue(null, KEY_FREEZE_START)),
+                            MonthDay.parse(parser.getAttributeValue(null, KEY_FREEZE_END))));
                 }
                 return policy;
             }
@@ -751,10 +776,10 @@
         out.attribute(null, KEY_INSTALL_WINDOW_START, Integer.toString(mMaintenanceWindowStart));
         out.attribute(null, KEY_INSTALL_WINDOW_END, Integer.toString(mMaintenanceWindowEnd));
         for (int i = 0; i < mFreezePeriods.size(); i++) {
-            FreezeInterval interval = mFreezePeriods.get(i);
+            FreezePeriod interval = mFreezePeriods.get(i);
             out.startTag(null, KEY_FREEZE_TAG);
-            out.attribute(null, KEY_FREEZE_START, Integer.toString(interval.mStartDay));
-            out.attribute(null, KEY_FREEZE_END, Integer.toString(interval.mEndDay));
+            out.attribute(null, KEY_FREEZE_START, interval.getStart().toString());
+            out.attribute(null, KEY_FREEZE_END, interval.getEnd().toString());
             out.endTag(null, KEY_FREEZE_TAG);
         }
     }
diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl
index a2aaf12..69852f3 100644
--- a/core/java/android/app/slice/ISliceManager.aidl
+++ b/core/java/android/app/slice/ISliceManager.aidl
@@ -25,11 +25,15 @@
     void unpinSlice(String pkg, in Uri uri, in IBinder token);
     boolean hasSliceAccess(String pkg);
     SliceSpec[] getPinnedSpecs(in Uri uri, String pkg);
-    int checkSlicePermission(in Uri uri, String pkg, int pid, int uid,
-            in String[] autoGrantPermissions);
-    void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices);
     Uri[] getPinnedSlices(String pkg);
 
     byte[] getBackupPayload(int user);
     void applyRestore(in byte[] payload, int user);
+
+    // Perms.
+    void grantSlicePermission(String callingPkg, String toPkg, in Uri uri);
+    void revokeSlicePermission(String callingPkg, String toPkg, in Uri uri);
+    int checkSlicePermission(in Uri uri, String pkg, int pid, int uid,
+            in String[] autoGrantPermissions);
+    void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices);
 }
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index 0285e9f..3b73174 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -16,6 +16,8 @@
 
 package android.app.slice;
 
+import static android.content.pm.PackageManager.PERMISSION_DENIED;
+
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SdkConstant;
@@ -101,22 +103,6 @@
     private final IBinder mToken = new Binder();
 
     /**
-     * Permission denied.
-     * @hide
-     */
-    public static final int PERMISSION_DENIED = -1;
-    /**
-     * Permission granted.
-     * @hide
-     */
-    public static final int PERMISSION_GRANTED = 0;
-    /**
-     * Permission just granted by the user, and should be granted uri permission as well.
-     * @hide
-     */
-    public static final int PERMISSION_USER_GRANTED = 1;
-
-    /**
      * @hide
      */
     public SliceManager(Context context, Handler handler) throws ServiceNotFoundException {
@@ -417,9 +403,11 @@
      * @see #grantSlicePermission(String, Uri)
      */
     public @PermissionResult int checkSlicePermission(@NonNull Uri uri, int pid, int uid) {
-        // TODO: Switch off Uri permissions.
-        return mContext.checkUriPermission(uri, pid, uid,
-                Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        try {
+            return mService.checkSlicePermission(uri, null, pid, uid, null);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
@@ -431,11 +419,11 @@
      * @see #revokeSlicePermission
      */
     public void grantSlicePermission(@NonNull String toPackage, @NonNull Uri uri) {
-        // TODO: Switch off Uri permissions.
-        mContext.grantUriPermission(toPackage, uri,
-                Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
-                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
-                        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+        try {
+            mService.grantSlicePermission(mContext.getPackageName(), toPackage, uri);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
@@ -453,11 +441,11 @@
      * @see #grantSlicePermission
      */
     public void revokeSlicePermission(@NonNull String toPackage, @NonNull Uri uri) {
-        // TODO: Switch off Uri permissions.
-        mContext.revokeUriPermission(toPackage, uri,
-                Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
-                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
-                        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
+        try {
+            mService.revokeSlicePermission(mContext.getPackageName(), toPackage, uri);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
@@ -478,16 +466,6 @@
                 throw new SecurityException("User " + uid + " does not have slice permission for "
                         + uri + ".");
             }
-            if (result == PERMISSION_USER_GRANTED) {
-                // We just had a user grant of this permission and need to grant this to the app
-                // permanently.
-                mContext.grantUriPermission(pkg, uri.buildUpon().path("").build(),
-                        Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
-                                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
-                                | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
-                // Notify a change has happened because we just granted a permission.
-                mContext.getContentResolver().notifyChange(uri, null);
-            }
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/app/usage/EventStats.java b/core/java/android/app/usage/EventStats.java
index b799de9..ea95a05 100644
--- a/core/java/android/app/usage/EventStats.java
+++ b/core/java/android/app/usage/EventStats.java
@@ -41,10 +41,9 @@
     public long mEndTimeStamp;
 
     /**
-     * Last time used by the user with an explicit action (notification, activity launch).
      * {@hide}
      */
-    public long mLastTimeUsed;
+    public long mLastEventTime;
 
     /**
      * {@hide}
@@ -66,7 +65,7 @@
         mEventType = stats.mEventType;
         mBeginTimeStamp = stats.mBeginTimeStamp;
         mEndTimeStamp = stats.mEndTimeStamp;
-        mLastTimeUsed = stats.mLastTimeUsed;
+        mLastEventTime = stats.mLastEventTime;
         mTotalTime = stats.mTotalTime;
         mCount = stats.mCount;
     }
@@ -100,12 +99,12 @@
     }
 
     /**
-     * Get the last time this event was used, measured in milliseconds since the epoch.
+     * Get the last time this event triggered, measured in milliseconds since the epoch.
      * <p/>
      * See {@link System#currentTimeMillis()}.
      */
-    public long getLastTimeUsed() {
-        return mLastTimeUsed;
+    public long getLastEventTime() {
+        return mLastEventTime;
     }
 
     /**
@@ -138,7 +137,7 @@
         // We use the mBeginTimeStamp due to a bug where UsageStats files can overlap with
         // regards to their mEndTimeStamp.
         if (right.mBeginTimeStamp > mBeginTimeStamp) {
-            mLastTimeUsed = Math.max(mLastTimeUsed, right.mLastTimeUsed);
+            mLastEventTime = Math.max(mLastEventTime, right.mLastEventTime);
         }
         mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
         mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp);
@@ -156,7 +155,7 @@
         dest.writeInt(mEventType);
         dest.writeLong(mBeginTimeStamp);
         dest.writeLong(mEndTimeStamp);
-        dest.writeLong(mLastTimeUsed);
+        dest.writeLong(mLastEventTime);
         dest.writeLong(mTotalTime);
         dest.writeInt(mCount);
     }
@@ -168,7 +167,7 @@
             stats.mEventType = in.readInt();
             stats.mBeginTimeStamp = in.readLong();
             stats.mEndTimeStamp = in.readLong();
-            stats.mLastTimeUsed = in.readLong();
+            stats.mLastEventTime = in.readLong();
             stats.mTotalTime = in.readLong();
             stats.mCount = in.readInt();
             return stats;
diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java
index e315e91..7252f02 100644
--- a/core/java/android/app/usage/NetworkStats.java
+++ b/core/java/android/app/usage/NetworkStats.java
@@ -68,6 +68,11 @@
     private int mTag = android.net.NetworkStats.TAG_NONE;
 
     /**
+     * State in case it was not specified in the query.
+     */
+    private int mState = Bucket.STATE_ALL;
+
+    /**
      * The session while the query requires it, null if all the stats have been collected or close()
      * has been called.
      */
@@ -267,6 +272,15 @@
         private long mTxBytes;
         private long mTxPackets;
 
+        private static int convertSet(@State int state) {
+            switch (state) {
+                case STATE_ALL: return android.net.NetworkStats.SET_ALL;
+                case STATE_DEFAULT: return android.net.NetworkStats.SET_DEFAULT;
+                case STATE_FOREGROUND: return android.net.NetworkStats.SET_FOREGROUND;
+            }
+            return 0;
+        }
+
         private static @State int convertState(int networkStatsSet) {
             switch (networkStatsSet) {
                 case android.net.NetworkStats.SET_ALL : return STATE_ALL;
@@ -527,20 +541,13 @@
     /**
      * Collects history results for uid and resets history enumeration index.
      */
-    void startHistoryEnumeration(int uid) {
-        startHistoryEnumeration(uid, android.net.NetworkStats.TAG_NONE);
-    }
-
-    /**
-     * Collects history results for uid and resets history enumeration index.
-     */
-    void startHistoryEnumeration(int uid, int tag) {
+    void startHistoryEnumeration(int uid, int tag, int state) {
         mHistory = null;
         try {
             mHistory = mSession.getHistoryIntervalForUid(mTemplate, uid,
-                    android.net.NetworkStats.SET_ALL, tag,
-                    NetworkStatsHistory.FIELD_ALL, mStartTimeStamp, mEndTimeStamp);
-            setSingleUidTag(uid, tag);
+                    Bucket.convertSet(state), tag, NetworkStatsHistory.FIELD_ALL,
+                    mStartTimeStamp, mEndTimeStamp);
+            setSingleUidTagState(uid, tag, state);
         } catch (RemoteException e) {
             Log.w(TAG, e);
             // Leaving mHistory null
@@ -636,6 +643,7 @@
         fillBucketFromSummaryEntry(bucket);
         return bucket;
     }
+
     /**
      * Getting the next item in a history enumeration.
      * @param bucketOut Next item will be set here.
@@ -648,7 +656,7 @@
                         mRecycledHistoryEntry);
                 bucketOut.mUid = Bucket.convertUid(getUid());
                 bucketOut.mTag = Bucket.convertTag(mTag);
-                bucketOut.mState = Bucket.STATE_ALL;
+                bucketOut.mState = mState;
                 bucketOut.mDefaultNetwork = Bucket.DEFAULT_NETWORK_ALL;
                 bucketOut.mMetered = Bucket.METERED_ALL;
                 bucketOut.mRoaming = Bucket.ROAMING_ALL;
@@ -691,9 +699,10 @@
         return mUidOrUidIndex;
     }
 
-    private void setSingleUidTag(int uid, int tag) {
+    private void setSingleUidTagState(int uid, int tag, int state) {
         mUidOrUidIndex = uid;
         mTag = tag;
+        mState = state;
     }
 
     private void stepUid() {
diff --git a/core/java/android/app/usage/NetworkStatsManager.java b/core/java/android/app/usage/NetworkStatsManager.java
index 2357637..85f4efc 100644
--- a/core/java/android/app/usage/NetworkStatsManager.java
+++ b/core/java/android/app/usage/NetworkStatsManager.java
@@ -263,20 +263,31 @@
     /**
      * Query network usage statistics details for a given uid.
      *
-     * #see queryDetailsForUidTag(int, String, long, long, int, int)
+     * #see queryDetailsForUidTagState(int, String, long, long, int, int, int)
      */
     public NetworkStats queryDetailsForUid(int networkType, String subscriberId,
-            long startTime, long endTime, int uid) throws SecurityException, RemoteException {
-        return queryDetailsForUidTag(networkType, subscriberId, startTime, endTime, uid,
-            NetworkStats.Bucket.TAG_NONE);
+            long startTime, long endTime, int uid) throws SecurityException {
+        return queryDetailsForUidTagState(networkType, subscriberId, startTime, endTime, uid,
+            NetworkStats.Bucket.TAG_NONE, NetworkStats.Bucket.STATE_ALL);
     }
 
     /**
-     * Query network usage statistics details for a given uid and tag. Only usable for uids
-     * belonging to calling user. Result is aggregated over state but not aggregated over time.
-     * This means buckets' start and end timestamps are going to be between 'startTime' and
-     * 'endTime' parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, uid the
-     * same as the 'uid' parameter and tag the same as 'tag' parameter.
+     * Query network usage statistics details for a given uid and tag.
+     *
+     * #see queryDetailsForUidTagState(int, String, long, long, int, int, int)
+     */
+    public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId,
+            long startTime, long endTime, int uid, int tag) throws SecurityException {
+        return queryDetailsForUidTagState(networkType, subscriberId, startTime, endTime, uid,
+            tag, NetworkStats.Bucket.STATE_ALL);
+    }
+
+    /**
+     * Query network usage statistics details for a given uid, tag, and state. Only usable for uids
+     * belonging to calling user. Result is not aggregated over time. This means buckets' start and
+     * end timestamps are going to be between 'startTime' and 'endTime' parameters. The uid is going
+     * to be the same as the 'uid' parameter, the tag the same as the 'tag' parameter, and the state
+     * the same as the 'state' parameter.
      * defaultNetwork is going to be {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
      * metered is going to be {@link NetworkStats.Bucket#METERED_ALL}, and
      * roaming is going to be {@link NetworkStats.Bucket#ROAMING_ALL}.
@@ -294,20 +305,23 @@
      *            {@link java.lang.System#currentTimeMillis}.
      * @param uid UID of app
      * @param tag TAG of interest. Use {@link NetworkStats.Bucket#TAG_NONE} for no tags.
+     * @param state state of interest. Use {@link NetworkStats.Bucket#STATE_ALL} to aggregate
+     *            traffic from all states.
      * @return Statistics object or null if an error happened during statistics collection.
      * @throws SecurityException if permissions are insufficient to read network statistics.
      */
-    public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId,
-            long startTime, long endTime, int uid, int tag) throws SecurityException {
+    public NetworkStats queryDetailsForUidTagState(int networkType, String subscriberId,
+            long startTime, long endTime, int uid, int tag, int state) throws SecurityException {
         NetworkTemplate template;
         template = createTemplate(networkType, subscriberId);
 
         NetworkStats result;
         try {
             result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
-            result.startHistoryEnumeration(uid, tag);
+            result.startHistoryEnumeration(uid, tag, state);
         } catch (RemoteException e) {
-            Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag, e);
+            Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag
+                    + " state=" + state, e);
             return null;
         }
 
diff --git a/core/java/android/app/usage/TimeSparseArray.java b/core/java/android/app/usage/TimeSparseArray.java
index 9ef88e4..4ec0e9e 100644
--- a/core/java/android/app/usage/TimeSparseArray.java
+++ b/core/java/android/app/usage/TimeSparseArray.java
@@ -88,7 +88,7 @@
                 key++;
                 keyIndex++;
             }
-            if (key >= origKey + 10) {
+            if (key >= origKey + 100) {
                 Slog.w(TAG, "Value " + value + " supposed to be inserted at " + origKey
                         + " displaced to " + key);
             }
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index a665652..84f57a3 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -152,6 +152,18 @@
          */
         public static final int SCREEN_NON_INTERACTIVE = 16;
 
+        /**
+         * An event type denoting that the screen's keyguard has been shown, whether or not
+         * the screen is off.
+         */
+        public static final int KEYGUARD_SHOWN = 17;
+
+        /**
+         * An event type denoting that the screen's keyguard has been hidden.  This typically
+         * happens when the user unlocks their phone after turning it on.
+         */
+        public static final int KEYGUARD_HIDDEN = 18;
+
         /** @hide */
         public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
 
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index eafe91a..7fb97d3 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -319,6 +319,8 @@
      * <ul>
      *     <li>{@link UsageEvents.Event#SCREEN_INTERACTIVE}</li>
      *     <li>{@link UsageEvents.Event#SCREEN_NON_INTERACTIVE}</li>
+     *     <li>{@link UsageEvents.Event#KEYGUARD_SHOWN}</li>
+     *     <li>{@link UsageEvents.Event#KEYGUARD_HIDDEN}</li>
      * </ul>
      *
      * <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java
index 37360ba..49cc498 100644
--- a/core/java/android/appwidget/AppWidgetHost.java
+++ b/core/java/android/appwidget/AppWidgetHost.java
@@ -37,6 +37,7 @@
 import android.widget.RemoteViews;
 import android.widget.RemoteViews.OnClickHandler;
 
+import com.android.internal.R;
 import com.android.internal.appwidget.IAppWidgetHost;
 import com.android.internal.appwidget.IAppWidgetService;
 
@@ -171,8 +172,9 @@
                 return;
             }
             sServiceInitialized = true;
-            if (!context.getPackageManager().hasSystemFeature(
-                    PackageManager.FEATURE_APP_WIDGETS)) {
+            PackageManager packageManager = context.getPackageManager();
+            if (!packageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
+                    && !context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {
                 return;
             }
             IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
diff --git a/core/java/android/bluetooth/BluetoothHearingAid.java b/core/java/android/bluetooth/BluetoothHearingAid.java
index 8f8083e..159e165 100644
--- a/core/java/android/bluetooth/BluetoothHearingAid.java
+++ b/core/java/android/bluetooth/BluetoothHearingAid.java
@@ -421,29 +421,29 @@
     }
 
     /**
-     * Check whether the device is active.
+     * Get the connected physical Hearing Aid devices that are active
      *
      * <p>Requires {@link android.Manifest.permission#BLUETOOTH}
      * permission.
      *
-     * @return the connected device that is active or null if no device
-     * is active
+     * @return the list of active devices. The first element is the left active
+     * device; the second element is the right active device. If either or both side
+     * is not active, it will be null on that position. Returns empty list on error.
      * @hide
      */
     @RequiresPermission(Manifest.permission.BLUETOOTH)
-    public boolean isActiveDevice(@Nullable BluetoothDevice device) {
-        if (VDBG) log("isActiveDevice()");
+    public List<BluetoothDevice> getActiveDevices() {
+        if (VDBG) log("getActiveDevices()");
         try {
             mServiceLock.readLock().lock();
-            if (mService != null && isEnabled()
-                    && ((device == null) || isValidDevice(device))) {
-                return mService.isActiveDevice(device);
+            if (mService != null && isEnabled()) {
+                return mService.getActiveDevices();
             }
             if (mService == null) Log.w(TAG, "Proxy not attached to service");
-            return false;
+            return new ArrayList<>();
         } catch (RemoteException e) {
             Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
-            return false;
+            return new ArrayList<>();
         } finally {
             mServiceLock.readLock().unlock();
         }
diff --git a/core/java/android/bluetooth/BluetoothHidDevice.java b/core/java/android/bluetooth/BluetoothHidDevice.java
index af99bf7..3bc8544 100644
--- a/core/java/android/bluetooth/BluetoothHidDevice.java
+++ b/core/java/android/bluetooth/BluetoothHidDevice.java
@@ -701,6 +701,28 @@
     }
 
     /**
+     * Gets the application name of the current HidDeviceService user.
+     *
+     * @return the current user name, or empty string if cannot get the name
+     * {@hide}
+     */
+    public String getUserAppName() {
+        final IBluetoothHidDevice service = mService;
+
+        if (service != null) {
+            try {
+                return service.getUserAppName();
+            } catch (RemoteException e) {
+                Log.e(TAG, e.toString());
+            }
+        } else {
+            Log.w(TAG, "Proxy not attached to service");
+        }
+
+        return "";
+    }
+
+    /**
      * Initiates connection to host which is currently paired with this device. If the application
      * is not registered, #connect(BluetoothDevice) will fail. The connection state should be
      * tracked by the application by handling callback from Callback#onConnectionStateChanged. The
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 9f3df37..f7908b6 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -51,7 +51,6 @@
 import android.util.EventLog;
 import android.util.Log;
 
-import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.MimeIconUtils;
 import com.android.internal.util.Preconditions;
 
@@ -602,6 +601,8 @@
             try {
                 return provider.getType(url);
             } catch (RemoteException e) {
+                // Arbitrary and not worth documenting, as Activity
+                // Manager will kill this process shortly anyway.
                 return null;
             } catch (java.lang.Exception e) {
                 Log.w(TAG, "Failed to get type for: " + url + " (" + e.getMessage() + ")");
@@ -620,9 +621,7 @@
                     ContentProvider.getUriWithoutUserId(url), resolveUserId(url));
             return type;
         } catch (RemoteException e) {
-            // Arbitrary and not worth documenting, as Activity
-            // Manager will kill this process shortly anyway.
-            return null;
+            throw e.rethrowFromSystemServer();
         } catch (java.lang.Exception e) {
             Log.w(TAG, "Failed to get type for: " + url + " (" + e.getMessage() + ")");
             return null;
@@ -1964,6 +1963,7 @@
             getContentService().registerContentObserver(uri, notifyForDescendents,
                     observer.getContentObserver(), userHandle, mTargetSdkVersion);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -1982,6 +1982,7 @@
                         contentObserver);
             }
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2089,6 +2090,7 @@
                     syncToNetwork ? NOTIFY_SYNC_TO_NETWORK : 0,
                     userHandle, mTargetSdkVersion);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2105,6 +2107,7 @@
                     observer != null && observer.deliverSelfNotifications(), flags,
                     userHandle, mTargetSdkVersion);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2126,6 +2129,7 @@
                     ContentProvider.getUriWithoutUserId(uri), modeFlags, /* toPackage= */ null,
                     resolveUserId(uri));
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2141,6 +2145,7 @@
                     ContentProvider.getUriWithoutUserId(uri), modeFlags, toPackage,
                     resolveUserId(uri));
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2160,6 +2165,7 @@
                     ContentProvider.getUriWithoutUserId(uri), modeFlags, /* toPackage= */ null,
                     resolveUserId(uri));
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2178,7 +2184,7 @@
             return ActivityManager.getService()
                     .getPersistedUriPermissions(mPackageName, true).getList();
         } catch (RemoteException e) {
-            throw new RuntimeException("Activity manager has died", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2194,7 +2200,7 @@
             return ActivityManager.getService()
                     .getPersistedUriPermissions(mPackageName, false).getList();
         } catch (RemoteException e) {
-            throw new RuntimeException("Activity manager has died", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2273,7 +2279,7 @@
         try {
             getContentService().syncAsUser(request, userId);
         } catch(RemoteException e) {
-            // Shouldn't happen.
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2285,7 +2291,7 @@
         try {
             getContentService().sync(request);
         } catch(RemoteException e) {
-            // Shouldn't happen.
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2349,6 +2355,7 @@
         try {
             getContentService().cancelSync(account, authority, null);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2360,6 +2367,7 @@
         try {
             getContentService().cancelSyncAsUser(account, authority, null, userId);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2371,7 +2379,7 @@
         try {
             return getContentService().getSyncAdapterTypes();
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2383,7 +2391,7 @@
         try {
             return getContentService().getSyncAdapterTypesAsUser(userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2397,8 +2405,8 @@
         try {
             return getContentService().getSyncAdapterPackagesForAuthorityAsUser(authority, userId);
         } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
-        return ArrayUtils.emptyArray(String.class);
     }
 
     /**
@@ -2414,7 +2422,7 @@
         try {
             return getContentService().getSyncAutomatically(account, authority);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2427,7 +2435,7 @@
         try {
             return getContentService().getSyncAutomaticallyAsUser(account, authority, userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2453,8 +2461,7 @@
         try {
             getContentService().setSyncAutomaticallyAsUser(account, authority, sync, userId);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2500,8 +2507,7 @@
         try {
              getContentService().addPeriodicSync(account, authority, extras, pollFrequency);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2540,7 +2546,7 @@
         try {
             getContentService().removePeriodicSync(account, authority, extras);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2564,8 +2570,7 @@
         try {
             getContentService().cancelRequest(request);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2582,7 +2587,7 @@
         try {
             return getContentService().getPeriodicSyncs(account, authority, null);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2596,7 +2601,7 @@
         try {
             return getContentService().getIsSyncable(account, authority);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2609,7 +2614,7 @@
         try {
             return getContentService().getIsSyncableAsUser(account, authority, userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2623,8 +2628,7 @@
         try {
             getContentService().setIsSyncable(account, authority, syncable);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2640,7 +2644,7 @@
         try {
             return getContentService().getMasterSyncAutomatically();
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2652,7 +2656,7 @@
         try {
             return getContentService().getMasterSyncAutomaticallyAsUser(userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2676,8 +2680,7 @@
         try {
             getContentService().setMasterSyncAutomaticallyAsUser(sync, userId);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2701,7 +2704,7 @@
         try {
             return getContentService().isSyncActive(account, authority, null);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2727,7 +2730,7 @@
             }
             return syncs.get(0);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2744,7 +2747,7 @@
         try {
             return getContentService().getCurrentSyncs();
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2756,7 +2759,7 @@
         try {
             return getContentService().getCurrentSyncsAsUser(userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2771,7 +2774,7 @@
         try {
             return getContentService().getSyncStatus(account, authority, null);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2784,7 +2787,7 @@
         try {
             return getContentService().getSyncStatusAsUser(account, authority, null, userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2809,7 +2812,7 @@
         try {
             return getContentService().isSyncPendingAsUser(account, authority, null, userId);
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2841,7 +2844,7 @@
             getContentService().addStatusChangeListener(mask, observer);
             return observer;
         } catch (RemoteException e) {
-            throw new RuntimeException("the ContentService should always be reachable", e);
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -2856,8 +2859,7 @@
         try {
             getContentService().removeStatusChangeListener((ISyncStatusObserver.Stub) handle);
         } catch (RemoteException e) {
-            // exception ignored; if this is thrown then it means the runtime is in the midst of
-            // being restarted
+            throw e.rethrowFromSystemServer();
         }
     }
 
@@ -3027,9 +3029,7 @@
             return sContentService;
         }
         IBinder b = ServiceManager.getService(CONTENT_SERVICE_NAME);
-        if (false) Log.v("ContentService", "default service binder = " + b);
         sContentService = IContentService.Stub.asInterface(b);
-        if (false) Log.v("ContentService", "default service = " + sContentService);
         return sContentService;
     }
 
@@ -3038,7 +3038,7 @@
         return mPackageName;
     }
 
-    private static IContentService sContentService;
+    private static volatile IContentService sContentService;
     private final Context mContext;
 
     final String mPackageName;
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 920056a..ede7ee4 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3780,7 +3780,7 @@
     public static final String DROPBOX_SERVICE = "dropbox";
 
     /**
-     * System service name for the DeviceIdleController.  There is no Java API for this.
+     * System service name for the DeviceIdleManager.
      * @see #getSystemService(String)
      * @hide
      */
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 000912c..01ee671 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -2282,6 +2282,28 @@
     public static final String ACTION_MY_PACKAGE_SUSPENDED = "android.intent.action.MY_PACKAGE_SUSPENDED";
 
     /**
+     * Activity Action: Started to show more details about why an application was suspended.
+     *
+     * <p>Apps holding {@link android.Manifest.permission#SUSPEND_APPS} must declare an activity
+     * handling this intent and protect it with
+     * {@link android.Manifest.permission#SEND_SHOW_SUSPENDED_APP_DETAILS}.
+     *
+     * <p>Includes an extra {@link #EXTRA_PACKAGE_NAME} which is the name of the suspended package.
+     *
+     * <p class="note">This is a protected intent that can only be sent
+     * by the system.
+     *
+     * @see PackageManager#isPackageSuspended()
+     * @see #ACTION_PACKAGES_SUSPENDED
+     *
+     * @hide
+     */
+    @SystemApi
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_SHOW_SUSPENDED_APP_DETAILS =
+            "android.intent.action.SHOW_SUSPENDED_APP_DETAILS";
+
+    /**
      * Broadcast Action: Sent to a package that has been unsuspended.
      *
      * <p class="note">This is a protected intent that can only be sent
@@ -6788,6 +6810,9 @@
                 case "--activity-task-on-home":
                     intent.addFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME);
                     break;
+                case "--activity-match-external":
+                    intent.addFlags(Intent.FLAG_ACTIVITY_MATCH_EXTERNAL);
+                    break;
                 case "--receiver-registered-only":
                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
                     break;
@@ -6924,7 +6949,7 @@
                 "    [--activity-no-user-action] [--activity-previous-is-top]",
                 "    [--activity-reorder-to-front] [--activity-reset-task-if-needed]",
                 "    [--activity-single-top] [--activity-clear-task]",
-                "    [--activity-task-on-home]",
+                "    [--activity-task-on-home] [--activity-match-external]",
                 "    [--receiver-registered-only] [--receiver-replace-pending]",
                 "    [--receiver-foreground] [--receiver-no-abort]",
                 "    [--receiver-include-background]",
diff --git a/core/java/android/content/QuickViewConstants.java b/core/java/android/content/QuickViewConstants.java
index a25513d..132d43f 100644
--- a/core/java/android/content/QuickViewConstants.java
+++ b/core/java/android/content/QuickViewConstants.java
@@ -45,8 +45,8 @@
      * Feature to delete an individual document. Quick viewer implementations must use
      * Storage Access Framework to both verify delete permission and to delete content.
      *
-     * @see DocumentsContract#Document#FLAG_SUPPORTS_DELETE
-     * @see DocumentsContract#deleteDocument(ContentResolver resolver, Uri documentUri)
+     * @see DocumentsContract.Document#FLAG_SUPPORTS_DELETE
+     * @see DocumentsContract#deleteDocument(ContentResolver, Uri)
      */
     public static final String FEATURE_DELETE = "android:delete";
 
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index e85058d..c5a39f4 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -26,6 +26,7 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.os.Environment;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -590,26 +591,33 @@
     public static final int PRIVATE_FLAG_VIRTUAL_PRELOAD = 1 << 16;
 
     /**
-     * Value for {@linl #privateFlags}: whether this app is pre-installed on the
+     * Value for {@link #privateFlags}: whether this app is pre-installed on the
      * OEM partition of the system image.
      * @hide
      */
     public static final int PRIVATE_FLAG_OEM = 1 << 17;
 
     /**
-     * Value for {@linl #privateFlags}: whether this app is pre-installed on the
+     * Value for {@link #privateFlags}: whether this app is pre-installed on the
      * vendor partition of the system image.
      * @hide
      */
     public static final int PRIVATE_FLAG_VENDOR = 1 << 18;
 
     /**
-     * Value for {@linl #privateFlags}: whether this app is pre-installed on the
+     * Value for {@link #privateFlags}: whether this app is pre-installed on the
      * product partition of the system image.
      * @hide
      */
     public static final int PRIVATE_FLAG_PRODUCT = 1 << 19;
 
+    /**
+     * Value for {@link #privateFlags}: whether this app is signed with the
+     * platform key.
+     * @hide
+     */
+    public static final int PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY = 1 << 20;
+
     /** @hide */
     @IntDef(flag = true, prefix = { "PRIVATE_FLAG_" }, value = {
             PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE,
@@ -629,6 +637,7 @@
             PRIVATE_FLAG_PRIVILEGED,
             PRIVATE_FLAG_PRODUCT,
             PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER,
+            PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY,
             PRIVATE_FLAG_STATIC_SHARED_LIBRARY,
             PRIVATE_FLAG_VENDOR,
             PRIVATE_FLAG_VIRTUAL_PRELOAD,
@@ -904,7 +913,17 @@
      * The app's declared version code.
      * @hide
      */
-    public long versionCode;
+    public long longVersionCode;
+
+    /**
+     * An integer representation of the app's declared version code. This is being left in place as
+     * some apps were using reflection to access it before the move to long in
+     * {@link android.os.Build.VERSION_CODES#P}
+     * @deprecated Use {@link #longVersionCode} instead.
+     * @hide
+     */
+    @Deprecated
+    public int versionCode;
 
     /**
      * The user-visible SDK version (ex. 26) of the framework against which the application claims
@@ -1114,11 +1133,12 @@
      */
     public static final int HIDDEN_API_ENFORCEMENT_NONE = 0;
     /**
-     * Light grey list enforcement, the strictest option. Enforces the light grey, dark grey and
-     * black lists.
+     * No API enforcement, but enable the detection logic and warnings. Observed behaviour is the
+     * same as {@link #HIDDEN_API_ENFORCEMENT_NONE} but you may see warnings in the log when APIs
+     * are accessed.
      * @hide
      * */
-    public static final int HIDDEN_API_ENFORCEMENT_ALL_LISTS = 1;
+    public static final int HIDDEN_API_ENFORCEMENT_JUST_WARN = 1;
     /**
      * Dark grey list enforcement. Enforces the dark grey and black lists
      * @hide
@@ -1140,14 +1160,15 @@
     @IntDef(prefix = { "HIDDEN_API_ENFORCEMENT_" }, value = {
             HIDDEN_API_ENFORCEMENT_DEFAULT,
             HIDDEN_API_ENFORCEMENT_NONE,
-            HIDDEN_API_ENFORCEMENT_ALL_LISTS,
+            HIDDEN_API_ENFORCEMENT_JUST_WARN,
             HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK,
             HIDDEN_API_ENFORCEMENT_BLACK,
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface HiddenApiEnforcementPolicy {}
 
-    private boolean isValidHiddenApiEnforcementPolicy(int policy) {
+    /** @hide */
+    public static boolean isValidHiddenApiEnforcementPolicy(int policy) {
         return policy >= HIDDEN_API_ENFORCEMENT_DEFAULT && policy <= HIDDEN_API_ENFORCEMENT_MAX;
     }
 
@@ -1214,7 +1235,7 @@
         pw.println(prefix + "enabled=" + enabled
                 + " minSdkVersion=" + minSdkVersion
                 + " targetSdkVersion=" + targetSdkVersion
-                + " versionCode=" + versionCode
+                + " versionCode=" + longVersionCode
                 + " targetSandboxVersion=" + targetSandboxVersion);
         if ((dumpFlags & DUMP_FLAG_DETAILS) != 0) {
             if (manageSpaceActivityName != null) {
@@ -1287,7 +1308,7 @@
         proto.write(ApplicationInfoProto.Version.ENABLED, enabled);
         proto.write(ApplicationInfoProto.Version.MIN_SDK_VERSION, minSdkVersion);
         proto.write(ApplicationInfoProto.Version.TARGET_SDK_VERSION, targetSdkVersion);
-        proto.write(ApplicationInfoProto.Version.VERSION_CODE, versionCode);
+        proto.write(ApplicationInfoProto.Version.VERSION_CODE, longVersionCode);
         proto.write(ApplicationInfoProto.Version.TARGET_SANDBOX_VERSION, targetSandboxVersion);
         proto.end(versionToken);
 
@@ -1421,7 +1442,7 @@
         uid = orig.uid;
         minSdkVersion = orig.minSdkVersion;
         targetSdkVersion = orig.targetSdkVersion;
-        versionCode = orig.versionCode;
+        setVersionCode(orig.longVersionCode);
         enabled = orig.enabled;
         enabledSetting = orig.enabledSetting;
         installLocation = orig.installLocation;
@@ -1495,7 +1516,7 @@
         dest.writeInt(uid);
         dest.writeInt(minSdkVersion);
         dest.writeInt(targetSdkVersion);
-        dest.writeLong(versionCode);
+        dest.writeLong(longVersionCode);
         dest.writeInt(enabled ? 1 : 0);
         dest.writeInt(enabledSetting);
         dest.writeInt(installLocation);
@@ -1566,7 +1587,7 @@
         uid = source.readInt();
         minSdkVersion = source.readInt();
         targetSdkVersion = source.readInt();
-        versionCode = source.readLong();
+        setVersionCode(source.readLong());
         enabled = source.readInt() != 0;
         enabledSetting = source.readInt();
         installLocation = source.readInt();
@@ -1658,17 +1679,26 @@
         return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
     }
 
+    private boolean isAllowedToUseHiddenApis() {
+        return isSignedWithPlatformKey()
+            || (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp()));
+    }
+
     /**
      * @hide
      */
     public @HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
+        if (isAllowedToUseHiddenApis()) {
+            return HIDDEN_API_ENFORCEMENT_NONE;
+        }
         if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
             return mHiddenApiPolicy;
         }
-        if (isPackageWhitelistedForHiddenApis() && (isSystemApp() || isUpdatedSystemApp())) {
-            return HIDDEN_API_ENFORCEMENT_NONE;
+        if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+            return HIDDEN_API_ENFORCEMENT_BLACK;
+        } else {
+            return HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
         }
-        return HIDDEN_API_ENFORCEMENT_BLACK;
     }
 
     /**
@@ -1682,6 +1712,39 @@
     }
 
     /**
+     * Updates the hidden API enforcement policy for this app from the given values, if appropriate.
+     *
+     * This will have no effect if this app is not subject to hidden API enforcement, i.e. if it
+     * is on the package whitelist.
+     *
+     * @param policyPreP configured policy for pre-P apps, or {@link
+     *        #HIDDEN_API_ENFORCEMENT_DEFAULT} if nothing configured.
+     * @param policyP configured policy for apps targeting P or later, or {@link
+     *        #HIDDEN_API_ENFORCEMENT_DEFAULT} if nothing configured.
+     * @hide
+     */
+    public void maybeUpdateHiddenApiEnforcementPolicy(
+            @HiddenApiEnforcementPolicy int policyPreP, @HiddenApiEnforcementPolicy int policyP) {
+        if (isPackageWhitelistedForHiddenApis()) {
+            return;
+        }
+        if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+            setHiddenApiEnforcementPolicy(policyPreP);
+        } else if (targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+            setHiddenApiEnforcementPolicy(policyP);
+        }
+
+    }
+
+    /**
+     * @hide
+     */
+    public void setVersionCode(long newVersionCode) {
+        longVersionCode = newVersionCode;
+        versionCode = (int) newVersionCode;
+    }
+
+    /**
      * @hide
      */
     @Override
@@ -1758,6 +1821,11 @@
     }
 
     /** @hide */
+    public boolean isSignedWithPlatformKey() {
+        return (privateFlags & ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY) != 0;
+    }
+
+    /** @hide */
     @TestApi
     public boolean isPrivilegedApp() {
         return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 277738b..2be33e9 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -273,16 +273,13 @@
     void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage);
 
     String[] setPackagesSuspendedAsUser(in String[] packageNames, boolean suspended,
-            in PersistableBundle launcherExtras, in PersistableBundle appExtras,
-            String callingPackage, int userId);
+            in PersistableBundle appExtras, in PersistableBundle launcherExtras,
+            String dialogMessage, String callingPackage, int userId);
 
     boolean isPackageSuspendedForUser(String packageName, int userId);
 
     PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId);
 
-    void setSuspendedPackageAppExtras(String packageName, in PersistableBundle appExtras,
-            int userId);
-
     /**
      * Backup/restore support - only the system uid may use these.
      */
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 491f0af..90fc8f8 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2629,6 +2629,17 @@
             "android.hardware.strongbox_keystore";
 
     /**
+     * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
+     * The device has a Keymaster implementation that supports Device ID attestation.
+     *
+     * @see DevicePolicyManager#isDeviceIdAttestationSupported
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.FEATURE)
+    public static final String FEATURE_DEVICE_ID_ATTESTATION =
+            "android.software.device_id_attestation";
+
+    /**
      * Action to external storage service to clean out removed apps.
      * @hide
      */
@@ -3941,6 +3952,7 @@
      *
      * @hide
      */
+    @TestApi
     public abstract @NonNull String getServicesSystemSharedLibraryPackageName();
 
     /**
@@ -3950,6 +3962,7 @@
      *
      * @hide
      */
+    @TestApi
     public abstract @NonNull String getSharedSystemSharedLibraryPackageName();
 
     /**
@@ -5603,46 +5616,6 @@
     }
 
     /**
-     * Retrieve the {@link PersistableBundle} that was passed as {@code appExtras} when the given
-     * package was suspended.
-     *
-     * <p> The caller must hold permission {@link Manifest.permission#SUSPEND_APPS} to use this
-     * api.</p>
-     *
-     * @param packageName The package to retrieve extras for.
-     * @return The {@code appExtras} for the suspended package.
-     *
-     * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(Manifest.permission.SUSPEND_APPS)
-    public @Nullable PersistableBundle getSuspendedPackageAppExtras(String packageName) {
-        throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented");
-    }
-
-    /**
-     * Set the app extras for a suspended package. This method can be used to update the appExtras
-     * for a package that was earlier suspended using
-     * {@link #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle,
-     * String)}
-     * Does nothing if the given package is not already in a suspended state.
-     *
-     * @param packageName The package for which the appExtras need to be updated
-     * @param appExtras The new appExtras for the given package
-     *
-     * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String)
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(Manifest.permission.SUSPEND_APPS)
-    public void setSuspendedPackageAppExtras(String packageName,
-            @Nullable PersistableBundle appExtras) {
-        throw new UnsupportedOperationException("setSuspendedPackageAppExtras not implemented");
-    }
-
-    /**
      * Returns any extra information supplied as {@code appExtras} to the system when the calling
      * app was suspended.
      *
@@ -6118,7 +6091,9 @@
      * signed.  This should be used instead of {@code getPackageInfo} with {@code GET_SIGNATURES}
      * since it takes into account the possibility of signing certificate rotation, except in the
      * case of packages that are signed by multiple certificates, for which signing certificate
-     * rotation is not supported.
+     * rotation is not supported.  This method is analogous to using {@code getPackageInfo} with
+     * {@code GET_SIGNING_CERTIFICATES} and then searching through the resulting {@code
+     * signingCertificateHistory} field to see if the desired certificate is present.
      *
      * @param packageName package whose signing certificates to check
      * @param certificate signing certificate for which to search
@@ -6132,13 +6107,19 @@
     }
 
     /**
-     * Searches the set of signing certificates by which the given uid has proven to have been
-     * signed.  This should be used instead of {@code getPackageInfo} with {@code GET_SIGNATURES}
+     * Searches the set of signing certificates by which the package(s) for the given uid has proven
+     * to have been signed.  For multiple packages sharing the same uid, this will return the
+     * signing certificates found in the signing history of the "newest" package, where "newest"
+     * indicates the package with the newest signing certificate in the shared uid group.  This
+     * method should be used instead of {@code getPackageInfo} with {@code GET_SIGNATURES}
      * since it takes into account the possibility of signing certificate rotation, except in the
      * case of packages that are signed by multiple certificates, for which signing certificate
-     * rotation is not supported.
+     * rotation is not supported. This method is analogous to using {@code getPackagesForUid}
+     * followed by {@code getPackageInfo} with {@code GET_SIGNING_CERTIFICATES}, selecting the
+     * {@code PackageInfo} of the newest-signed bpackage , and finally searching through the
+     * resulting {@code signingCertificateHistory} field to see if the desired certificate is there.
      *
-     * @param uid package whose signing certificates to check
+     * @param uid uid whose signing certificates to check
      * @param certificate signing certificate for which to search
      * @param type representation of the {@code certificate}
      * @return true if this package was or is signed by exactly the certificate {@code certificate}
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index c9b78c0..699e81b 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -191,10 +191,10 @@
     /**
      * Retrieve launcher extras for a suspended package provided to the system in
      * {@link PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
-     * PersistableBundle, String)}
+     * PersistableBundle, String)}.
      *
      * @param packageName The package for which to return launcher extras.
-     * @param userId The user for which to check,
+     * @param userId The user for which to check.
      * @return The launcher extras.
      *
      * @see PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
@@ -205,6 +205,38 @@
             int userId);
 
     /**
+     * Internal api to query the suspended state of a package.
+     * @param packageName The package to check.
+     * @param userId The user id to check for.
+     * @return {@code true} if the package is suspended, {@code false} otherwise.
+     * @see PackageManager#isPackageSuspended(String)
+     */
+    public abstract boolean isPackageSuspended(String packageName, int userId);
+
+    /**
+     * Get the name of the package that suspended the given package. Packages can be suspended by
+     * device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or
+     * {@link android.Manifest.permission#SUSPEND_APPS}.
+     *
+     * @param suspendedPackage The package that has been suspended.
+     * @param userId The user for which to check.
+     * @return Name of the package that suspended the given package. Returns {@code null} if the
+     * given package is not currently suspended and the platform package name - i.e.
+     * {@code "android"} - if the package was suspended by a device admin.
+     */
+    public abstract String getSuspendingPackage(String suspendedPackage, int userId);
+
+    /**
+     * Get the dialog message to be shown to the user when they try to launch a suspended
+     * application.
+     *
+     * @param suspendedPackage The package that has been suspended.
+     * @param userId The user for which to check.
+     * @return The dialog message to be shown to the user.
+     */
+    public abstract String getSuspendedDialogMessage(String suspendedPackage, int userId);
+
+    /**
      * Do a straight uid lookup for the given package/application in the given user.
      * @see PackageManager#getPackageUidAsUser(String, int, int)
      * @return The app's uid, or < 0 if the package was not found in that user
@@ -429,7 +461,7 @@
      * Resolves an activity intent, allowing instant apps to be resolved.
      */
     public abstract ResolveInfo resolveIntent(Intent intent, String resolvedType,
-            int flags, int userId, boolean resolveForStart);
+            int flags, int userId, boolean resolveForStart, int filterCallingUid);
 
     /**
     * Resolves a service intent, allowing instant apps to be resolved.
@@ -489,6 +521,11 @@
     public abstract @Nullable PackageParser.Package getPackage(@NonNull String packageName);
 
     /**
+     * Returns a {@link com.android.server.pm.PackageSetting} for a given package name.
+     */
+    public abstract @Nullable Object getPackageSetting(String packageName);
+
+    /**
      * Returns a list without a change observer.
      *
      * {@see #getPackageList(PackageListObserver)}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index bc7540f..3e0db60 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1918,7 +1918,7 @@
                 com.android.internal.R.styleable.AndroidManifest_versionCode, 0);
         pkg.mVersionCodeMajor = sa.getInteger(
                 com.android.internal.R.styleable.AndroidManifest_versionCodeMajor, 0);
-        pkg.applicationInfo.versionCode = pkg.getLongVersionCode();
+        pkg.applicationInfo.setVersionCode(pkg.getLongVersionCode());
         pkg.baseRevisionCode = sa.getInteger(
                 com.android.internal.R.styleable.AndroidManifest_revisionCode, 0);
         pkg.mVersionName = sa.getNonConfigurationString(
@@ -5701,7 +5701,8 @@
                 flag = true,
                 value = {CertCapabilities.INSTALLED_DATA,
                         CertCapabilities.SHARED_USER_ID,
-                        CertCapabilities.PERMISSION })
+                        CertCapabilities.PERMISSION,
+                        CertCapabilities.ROLLBACK})
         public @interface CertCapabilities {
 
             /** accept data from already installed pkg with this cert */
@@ -5712,6 +5713,9 @@
 
             /** grant SIGNATURE permissions to pkgs with this cert */
             int PERMISSION = 4;
+
+            /** allow pkg to update to one signed by this certificate */
+            int ROLLBACK = 8;
         }
 
         /**
diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java
index f7b6e09..f471a1d 100644
--- a/core/java/android/content/pm/PackageUserState.java
+++ b/core/java/android/content/pm/PackageUserState.java
@@ -34,6 +34,7 @@
 import com.android.internal.util.ArrayUtils;
 
 import java.util.Arrays;
+import java.util.Objects;
 
 /**
  * Per-user state information about a package.
@@ -47,6 +48,7 @@
     public boolean hidden; // Is the app restricted by owner / admin
     public boolean suspended;
     public String suspendingPackage;
+    public String dialogMessage; // Message to show when a suspended package launch attempt is made
     public PersistableBundle suspendedAppExtras;
     public PersistableBundle suspendedLauncherExtras;
     public boolean instantApp;
@@ -82,6 +84,7 @@
         hidden = o.hidden;
         suspended = o.suspended;
         suspendingPackage = o.suspendingPackage;
+        dialogMessage = o.dialogMessage;
         suspendedAppExtras = o.suspendedAppExtras;
         suspendedLauncherExtras = o.suspendedLauncherExtras;
         instantApp = o.instantApp;
@@ -208,6 +211,9 @@
                     || !suspendingPackage.equals(oldState.suspendingPackage)) {
                 return false;
             }
+            if (!Objects.equals(dialogMessage, oldState.dialogMessage)) {
+                return false;
+            }
             if (!BaseBundle.kindofEquals(suspendedAppExtras,
                     oldState.suspendedAppExtras)) {
                 return false;
diff --git a/core/java/android/hardware/biometrics/BiometricDialog.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
similarity index 93%
rename from core/java/android/hardware/biometrics/BiometricDialog.java
rename to core/java/android/hardware/biometrics/BiometricPrompt.java
index dd848a3..1c9de45 100644
--- a/core/java/android/hardware/biometrics/BiometricDialog.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -38,7 +38,7 @@
 /**
  * A class that manages a system-provided biometric dialog.
  */
-public class BiometricDialog implements BiometricAuthenticator, BiometricConstants {
+public class BiometricPrompt implements BiometricAuthenticator, BiometricConstants {
 
     /**
      * @hide
@@ -190,11 +190,11 @@
         }
 
         /**
-         * Creates a {@link BiometricDialog}.
-         * @return a {@link BiometricDialog}
+         * Creates a {@link BiometricPrompt}.
+         * @return a {@link BiometricPrompt}
          * @throws IllegalArgumentException if any of the required fields are not set.
          */
-        public BiometricDialog build() {
+        public BiometricPrompt build() {
             final CharSequence title = mBundle.getCharSequence(KEY_TITLE);
             final CharSequence negative = mBundle.getCharSequence(KEY_NEGATIVE_TEXT);
 
@@ -203,7 +203,7 @@
             } else if (TextUtils.isEmpty(negative)) {
                 throw new IllegalArgumentException("Negative text must be set and non-empty");
             }
-            return new BiometricDialog(mContext, mBundle, mPositiveButtonInfo, mNegativeButtonInfo);
+            return new BiometricPrompt(mContext, mBundle, mPositiveButtonInfo, mNegativeButtonInfo);
         }
     }
 
@@ -213,7 +213,7 @@
     private ButtonInfo mPositiveButtonInfo;
     private ButtonInfo mNegativeButtonInfo;
 
-    IBiometricDialogReceiver mDialogReceiver = new IBiometricDialogReceiver.Stub() {
+    IBiometricPromptReceiver mDialogReceiver = new IBiometricPromptReceiver.Stub() {
         @Override
         public void onDialogDismissed(int reason) {
             // Check the reason and invoke OnClickListener(s) if necessary
@@ -229,7 +229,7 @@
         }
     };
 
-    private BiometricDialog(Context context, Bundle bundle,
+    private BiometricPrompt(Context context, Bundle bundle,
             ButtonInfo positiveButtonInfo, ButtonInfo negativeButtonInfo) {
         mBundle = bundle;
         mPositiveButtonInfo = positiveButtonInfo;
@@ -239,7 +239,7 @@
     }
 
     /**
-     * A wrapper class for the crypto objects supported by BiometricDialog. Currently the framework
+     * A wrapper class for the crypto objects supported by BiometricPrompt. Currently the framework
      * supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
      */
     public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
@@ -308,8 +308,8 @@
     }
 
     /**
-     * Callback structure provided to {@link BiometricDialog#authenticate(CancellationSignal,
-     * Executor, AuthenticationCallback)} or {@link BiometricDialog#authenticate(CryptoObject,
+     * Callback structure provided to {@link BiometricPrompt#authenticate(CancellationSignal,
+     * Executor, AuthenticationCallback)} or {@link BiometricPrompt#authenticate(CryptoObject,
      * CancellationSignal, Executor, AuthenticationCallback)}. Users must provide an implementation
      * of this for listening to authentication events.
      */
@@ -378,7 +378,7 @@
             @NonNull CancellationSignal cancel,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
-        if (!(callback instanceof BiometricDialog.AuthenticationCallback)) {
+        if (!(callback instanceof BiometricPrompt.AuthenticationCallback)) {
             throw new IllegalArgumentException("Callback cannot be casted");
         }
         authenticate(crypto, cancel, executor, (AuthenticationCallback) callback);
@@ -395,7 +395,7 @@
     public void authenticate(@NonNull CancellationSignal cancel,
             @NonNull @CallbackExecutor Executor executor,
             @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
-        if (!(callback instanceof BiometricDialog.AuthenticationCallback)) {
+        if (!(callback instanceof BiometricPrompt.AuthenticationCallback)) {
             throw new IllegalArgumentException("Callback cannot be casted");
         }
         authenticate(cancel, executor, (AuthenticationCallback) callback);
@@ -410,8 +410,8 @@
      * operation can be canceled by using the provided cancel object. The application will receive
      * authentication errors through {@link AuthenticationCallback}, and button events through the
      * corresponding callback set in {@link Builder#setNegativeButton(CharSequence, Executor,
-     * DialogInterface.OnClickListener)}. It is safe to reuse the {@link BiometricDialog} object,
-     * and calling {@link BiometricDialog#authenticate( CancellationSignal, Executor,
+     * DialogInterface.OnClickListener)}. It is safe to reuse the {@link BiometricPrompt} object,
+     * and calling {@link BiometricPrompt#authenticate( CancellationSignal, Executor,
      * AuthenticationCallback)} while an existing authentication attempt is occurring will stop the
      * previous client and start a new authentication. The interrupted client will receive a
      * cancelled notification through {@link AuthenticationCallback#onAuthenticationError(int,
@@ -445,8 +445,8 @@
      * provided cancel object. The application will receive authentication errors through {@link
      * AuthenticationCallback}, and button events through the corresponding callback set in {@link
      * Builder#setNegativeButton(CharSequence, Executor, DialogInterface.OnClickListener)}.  It is
-     * safe to reuse the {@link BiometricDialog} object, and calling {@link
-     * BiometricDialog#authenticate(CancellationSignal, Executor, AuthenticationCallback)} while
+     * safe to reuse the {@link BiometricPrompt} object, and calling {@link
+     * BiometricPrompt#authenticate(CancellationSignal, Executor, AuthenticationCallback)} while
      * an existing authentication attempt is occurring will stop the previous client and start a new
      * authentication. The interrupted client will receive a cancelled notification through {@link
      * AuthenticationCallback#onAuthenticationError(int, CharSequence)}.
@@ -470,15 +470,15 @@
     private boolean handlePreAuthenticationErrors(AuthenticationCallback callback,
             Executor executor) {
         if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
-            sendError(BiometricDialog.BIOMETRIC_ERROR_HW_NOT_PRESENT, callback,
+            sendError(BiometricPrompt.BIOMETRIC_ERROR_HW_NOT_PRESENT, callback,
                       executor);
             return true;
         } else if (!mFingerprintManager.isHardwareDetected()) {
-            sendError(BiometricDialog.BIOMETRIC_ERROR_HW_UNAVAILABLE, callback,
+            sendError(BiometricPrompt.BIOMETRIC_ERROR_HW_UNAVAILABLE, callback,
                       executor);
             return true;
         } else if (!mFingerprintManager.hasEnrolledFingerprints()) {
-            sendError(BiometricDialog.BIOMETRIC_ERROR_NO_BIOMETRICS, callback,
+            sendError(BiometricPrompt.BIOMETRIC_ERROR_NO_BIOMETRICS, callback,
                       executor);
             return true;
         }
diff --git a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
similarity index 87%
rename from core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
rename to core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
index e528aa7..67c9346 100644
--- a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
+++ b/core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl
@@ -19,9 +19,9 @@
 import android.os.UserHandle;
 
 /**
- * Communication channel from the BiometricDialog (SysUI) back to AuthenticationClient.
+ * Communication channel from the BiometricPrompt (SysUI) back to AuthenticationClient.
  * @hide
  */
-oneway interface IBiometricDialogReceiver {
+oneway interface IBiometricPromptReceiver {
     void onDialogDismissed(int reason);
 }
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 4124536..7ebe0f9 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -43,6 +43,9 @@
 import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.RejectedExecutionException;
@@ -924,6 +927,37 @@
                     idCount++;
                 }
             }
+
+            // The sort logic must match the logic in
+            // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds
+            Arrays.sort(cameraIds, new Comparator<String>() {
+                    @Override
+                    public int compare(String s1, String s2) {
+                        int s1Int = 0, s2Int = 0;
+                        try {
+                            s1Int = Integer.parseInt(s1);
+                        } catch (NumberFormatException e) {
+                            s1Int = -1;
+                        }
+
+                        try {
+                            s2Int = Integer.parseInt(s2);
+                        } catch (NumberFormatException e) {
+                            s2Int = -1;
+                        }
+
+                        // Uint device IDs first
+                        if (s1Int >= 0 && s2Int >= 0) {
+                            return s1Int - s2Int;
+                        } else if (s1Int >= 0) {
+                            return -1;
+                        } else if (s2Int >= 0) {
+                            return 1;
+                        } else {
+                            // Simple string compare if both id are not uint
+                            return s1.compareTo(s2);
+                        }
+                    }});
             return cameraIds;
         }
 
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 2252571..411a97e 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -2105,8 +2105,8 @@
      * the thumbnail data will also be rotated.</p>
      * <p>Note that this orientation is relative to the orientation of the camera sensor, given
      * by {@link CameraCharacteristics#SENSOR_ORIENTATION android.sensor.orientation}.</p>
-     * <p>To translate from the device orientation given by the Android sensor APIs, the following
-     * sample code may be used:</p>
+     * <p>To translate from the device orientation given by the Android sensor APIs for camera
+     * sensors which are not EXTERNAL, the following sample code may be used:</p>
      * <pre><code>private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
      *     if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
      *     int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
@@ -2125,6 +2125,8 @@
      *     return jpegOrientation;
      * }
      * </code></pre>
+     * <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
+     * also be set to EXTERNAL. The above code is not relevant in such case.</p>
      * <p><b>Units</b>: Degrees in multiples of 90</p>
      * <p><b>Range of valid values:</b><br>
      * 0, 90, 180, 270</p>
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 8df5447..c156616 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2422,8 +2422,8 @@
      * the thumbnail data will also be rotated.</p>
      * <p>Note that this orientation is relative to the orientation of the camera sensor, given
      * by {@link CameraCharacteristics#SENSOR_ORIENTATION android.sensor.orientation}.</p>
-     * <p>To translate from the device orientation given by the Android sensor APIs, the following
-     * sample code may be used:</p>
+     * <p>To translate from the device orientation given by the Android sensor APIs for camera
+     * sensors which are not EXTERNAL, the following sample code may be used:</p>
      * <pre><code>private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
      *     if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
      *     int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);
@@ -2442,6 +2442,8 @@
      *     return jpegOrientation;
      * }
      * </code></pre>
+     * <p>For EXTERNAL cameras the sensor orientation will always be set to 0 and the facing will
+     * also be set to EXTERNAL. The above code is not relevant in such case.</p>
      * <p><b>Units</b>: Degrees in multiples of 90</p>
      * <p><b>Range of valid values:</b><br>
      * 0, 90, 180, 270</p>
diff --git a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
index 93d6001..55130c8 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyExceptionUtils.java
@@ -62,14 +62,14 @@
      * exceptions.</p>
      *
      * @param errorFlag error to throw as an exception.
-     * @throws {@link BufferQueueAbandonedException} for -ENODEV.
+     * @throws {@link BufferQueueAbandonedException} for BAD_VALUE.
      * @throws {@link UnsupportedOperationException} for an unknown negative error code.
      * @return {@code errorFlag} if the value was non-negative, throws otherwise.
      */
     public static int throwOnError(int errorFlag) throws BufferQueueAbandonedException {
         if (errorFlag == NO_ERROR) {
             return NO_ERROR;
-        } else if (errorFlag == -ENODEV) {
+        } else if (errorFlag == BAD_VALUE) {
             throw new BufferQueueAbandonedException();
         }
 
diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java
index 67e97bf..6d9ba77 100644
--- a/core/java/android/hardware/display/BrightnessConfiguration.java
+++ b/core/java/android/hardware/display/BrightnessConfiguration.java
@@ -86,7 +86,9 @@
             sb.append("(").append(mLux[i]).append(", ").append(mNits[i]).append(")");
         }
         sb.append("], '");
-        sb.append(mDescription);
+        if (mDescription != null) {
+            sb.append(mDescription);
+        }
         sb.append("'}");
         return sb.toString();
     }
@@ -96,7 +98,9 @@
         int result = 1;
         result = result * 31 + Arrays.hashCode(mLux);
         result = result * 31 + Arrays.hashCode(mNits);
-        result = result * 31 + mDescription.hashCode();
+        if (mDescription != null) {
+            result = result * 31 + mDescription.hashCode();
+        }
         return result;
     }
 
diff --git a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl b/core/java/android/hardware/display/Curve.aidl
similarity index 68%
copy from core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
copy to core/java/android/hardware/display/Curve.aidl
index e528aa7..796493e 100644
--- a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
+++ b/core/java/android/hardware/display/Curve.aidl
@@ -13,15 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.hardware.biometrics;
 
-import android.os.Bundle;
-import android.os.UserHandle;
+package android.hardware.display;
 
-/**
- * Communication channel from the BiometricDialog (SysUI) back to AuthenticationClient.
- * @hide
- */
-oneway interface IBiometricDialogReceiver {
-    void onDialogDismissed(int reason);
-}
+parcelable Curve;
diff --git a/core/java/android/hardware/display/Curve.java b/core/java/android/hardware/display/Curve.java
new file mode 100644
index 0000000..ac28fdd
--- /dev/null
+++ b/core/java/android/hardware/display/Curve.java
@@ -0,0 +1,62 @@
+/*
+ * 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.hardware.display;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/** @hide */
+public final class Curve implements Parcelable {
+    private final float[] mX;
+    private final float[] mY;
+
+    public Curve(float[] x, float[] y) {
+        mX = x;
+        mY = y;
+    }
+
+    public float[] getX() {
+        return mX;
+    }
+
+    public float[] getY() {
+        return mY;
+    }
+
+    public static final Creator<Curve> CREATOR = new Creator<Curve>() {
+        public Curve createFromParcel(Parcel in) {
+            float[] x = in.createFloatArray();
+            float[] y = in.createFloatArray();
+            return new Curve(x, y);
+        }
+
+        public Curve[] newArray(int size) {
+            return new Curve[size];
+        }
+    };
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeFloatArray(mX);
+        out.writeFloatArray(mY);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+}
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index efb9517..b182fa2 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -28,6 +28,7 @@
 import android.graphics.Point;
 import android.media.projection.MediaProjection;
 import android.os.Handler;
+import android.util.Pair;
 import android.util.SparseArray;
 import android.view.Display;
 import android.view.Surface;
@@ -748,6 +749,22 @@
     }
 
     /**
+     * Returns the minimum brightness curve, which guarantess that any brightness curve that dips
+     * below it is rejected by the system.
+     * This prevent auto-brightness from setting the screen so dark as to prevent the user from
+     * resetting or disabling it, and maps lux to the absolute minimum nits that are still readable
+     * in that ambient brightness.
+     *
+     * @return The minimum brightness curve (as lux values and their corresponding nits values).
+     *
+     * @hide
+     */
+    @SystemApi
+    public Pair<float[], float[]> getMinimumBrightnessCurve() {
+        return mGlobal.getMinimumBrightnessCurve();
+    }
+
+    /**
      * Listens for changes in available display devices.
      */
     public interface DisplayListener {
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 2d0ef2f..d968a3e 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -31,6 +31,7 @@
 import android.os.ServiceManager;
 import android.text.TextUtils;
 import android.util.Log;
+import android.util.Pair;
 import android.util.SparseArray;
 import android.view.Display;
 import android.view.DisplayAdjustments;
@@ -563,6 +564,24 @@
     }
 
     /**
+     * Returns the minimum brightness curve, which guarantess that any brightness curve that dips
+     * below it is rejected by the system.
+     * This prevent auto-brightness from setting the screen so dark as to prevent the user from
+     * resetting or disabling it, and maps lux to the absolute minimum nits that are still readable
+     * in that ambient brightness.
+     *
+     * @return The minimum brightness curve (as lux values and their corresponding nits values).
+     */
+    public Pair<float[], float[]> getMinimumBrightnessCurve() {
+        try {
+            Curve curve = mDm.getMinimumBrightnessCurve();
+            return Pair.create(curve.getX(), curve.getY());
+        } catch (RemoteException ex) {
+            throw ex.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * Retrieves ambient brightness stats.
      */
     public List<AmbientBrightnessDayStats> getAmbientBrightnessStats() {
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index b77de748..b575997 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -19,6 +19,7 @@
 import android.content.pm.ParceledListSlice;
 import android.graphics.Point;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.Curve;
 import android.hardware.display.IDisplayManagerCallback;
 import android.hardware.display.IVirtualDisplayCallback;
 import android.hardware.display.WifiDisplay;
@@ -112,4 +113,7 @@
 
     // Temporarily sets the auto brightness adjustment factor.
     void setTemporaryAutoBrightnessAdjustment(float adjustment);
+
+    // Get the minimum brightness curve.
+    Curve getMinimumBrightnessCurve();
 }
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index a6c8c67..40d31bf 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -31,9 +31,9 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.hardware.biometrics.BiometricAuthenticator;
-import android.hardware.biometrics.BiometricDialog;
 import android.hardware.biometrics.BiometricFingerprintConstants;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.BiometricPrompt;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.CancellationSignal;
@@ -57,7 +57,7 @@
 
 /**
  * A class that coordinates access to the fingerprint hardware.
- * @deprecated See {@link BiometricDialog} which shows a system-provided dialog upon starting
+ * @deprecated See {@link BiometricPrompt} which shows a system-provided dialog upon starting
  * authentication. In a world where devices may have different types of biometric authentication,
  * it's much more realistic to have a system-provided authentication dialog since the method may
  * vary by vendor/device.
@@ -111,7 +111,7 @@
     /**
      * A wrapper class for the crypto objects supported by FingerprintManager. Currently the
      * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
-     * @deprecated See {@link android.hardware.biometrics.BiometricDialog.CryptoObject}
+     * @deprecated See {@link android.hardware.biometrics.BiometricPrompt.CryptoObject}
      */
     @Deprecated
     public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
@@ -155,7 +155,7 @@
     /**
      * Container for callback data from {@link FingerprintManager#authenticate(CryptoObject,
      *     CancellationSignal, int, AuthenticationCallback, Handler)}.
-     * @deprecated See {@link android.hardware.biometrics.BiometricDialog.AuthenticationResult}
+     * @deprecated See {@link android.hardware.biometrics.BiometricPrompt.AuthenticationResult}
      */
     @Deprecated
     public static class AuthenticationResult {
@@ -204,7 +204,7 @@
      * FingerprintManager#authenticate(CryptoObject, CancellationSignal,
      * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to
      * fingerprint events.
-     * @deprecated See {@link android.hardware.biometrics.BiometricDialog.AuthenticationCallback}
+     * @deprecated See {@link android.hardware.biometrics.BiometricPrompt.AuthenticationCallback}
      */
     @Deprecated
     public static abstract class AuthenticationCallback
@@ -378,10 +378,10 @@
      *         by <a href="{@docRoot}training/articles/keystore.html">Android Keystore
      *         facility</a>.
      * @throws IllegalStateException if the crypto primitive is not initialized.
-     * @deprecated See {@link BiometricDialog#authenticate(CancellationSignal, Executor,
-     * BiometricDialog.AuthenticationCallback)} and {@link BiometricDialog#authenticate(
-     * BiometricDialog.CryptoObject, CancellationSignal, Executor,
-     * BiometricDialog.AuthenticationCallback)}
+     * @deprecated See {@link BiometricPrompt#authenticate(CancellationSignal, Executor,
+     * BiometricPrompt.AuthenticationCallback)} and {@link BiometricPrompt#authenticate(
+     * BiometricPrompt.CryptoObject, CancellationSignal, Executor,
+     * BiometricPrompt.AuthenticationCallback)}
      */
     @Deprecated
     @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT})
@@ -444,7 +444,7 @@
 
     /**
      * Per-user version, see {@link FingerprintManager#authenticate(CryptoObject,
-     * CancellationSignal, Bundle, Executor, IBiometricDialogReceiver, AuthenticationCallback)}
+     * CancellationSignal, Bundle, Executor, IBiometricPromptReceiver, AuthenticationCallback)}
      * @param userId the user ID that the fingerprint hardware will authenticate for.
      */
     private void authenticate(int userId,
@@ -452,7 +452,7 @@
             @NonNull CancellationSignal cancel,
             @NonNull Bundle bundle,
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull IBiometricDialogReceiver receiver,
+            @NonNull IBiometricPromptReceiver receiver,
             @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
         mCryptoObject = crypto;
         if (cancel.isCanceled()) {
@@ -480,8 +480,8 @@
     }
 
     /**
-     * Private method, see {@link BiometricDialog#authenticate(CancellationSignal, Executor,
-     * BiometricDialog.AuthenticationCallback)}
+     * Private method, see {@link BiometricPrompt#authenticate(CancellationSignal, Executor,
+     * BiometricPrompt.AuthenticationCallback)}
      * @param cancel
      * @param executor
      * @param callback
@@ -491,7 +491,7 @@
             @NonNull CancellationSignal cancel,
             @NonNull Bundle bundle,
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull IBiometricDialogReceiver receiver,
+            @NonNull IBiometricPromptReceiver receiver,
             @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
         if (cancel == null) {
             throw new IllegalArgumentException("Must supply a cancellation signal");
@@ -512,8 +512,8 @@
     }
 
     /**
-     * Private method, see {@link BiometricDialog#authenticate(BiometricDialog.CryptoObject,
-     * CancellationSignal, Executor, BiometricDialog.AuthenticationCallback)}
+     * Private method, see {@link BiometricPrompt#authenticate(BiometricPrompt.CryptoObject,
+     * CancellationSignal, Executor, BiometricPrompt.AuthenticationCallback)}
      * @param crypto
      * @param cancel
      * @param executor
@@ -524,7 +524,7 @@
             @NonNull CancellationSignal cancel,
             @NonNull Bundle bundle,
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull IBiometricDialogReceiver receiver,
+            @NonNull IBiometricPromptReceiver receiver,
             @NonNull BiometricAuthenticator.AuthenticationCallback callback) {
         if (crypto == null) {
             throw new IllegalArgumentException("Must supply a crypto object");
@@ -743,7 +743,7 @@
      * Determine if there is at least one fingerprint enrolled.
      *
      * @return true if at least one fingerprint is enrolled, false otherwise
-     * @deprecated See {@link BiometricDialog} and
+     * @deprecated See {@link BiometricPrompt} and
      * {@link FingerprintManager#FINGERPRINT_ERROR_NO_FINGERPRINTS}
      */
     @Deprecated
@@ -777,7 +777,7 @@
      * Determine if fingerprint hardware is present and functional.
      *
      * @return true if hardware is present and functional, false otherwise.
-     * @deprecated See {@link BiometricDialog} and
+     * @deprecated See {@link BiometricPrompt} and
      * {@link FingerprintManager#FINGERPRINT_ERROR_HW_UNAVAILABLE}
      */
     @Deprecated
@@ -1158,7 +1158,7 @@
         @Override // binder call
         public void onError(long deviceId, int error, int vendorCode) {
             if (mExecutor != null) {
-                // BiometricDialog case
+                // BiometricPrompt case
                 if (error == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED) {
                     // User tapped somewhere to cancel, the biometric dialog is already dismissed.
                     mExecutor.execute(() -> {
@@ -1172,7 +1172,7 @@
                         mExecutor.execute(() -> {
                             sendErrorResult(deviceId, error, vendorCode);
                         });
-                    }, BiometricDialog.HIDE_DIALOG_DELAY);
+                    }, BiometricPrompt.HIDE_DIALOG_DELAY);
                 }
             } else {
                 mHandler.obtainMessage(MSG_ERROR, error, vendorCode, deviceId).sendToTarget();
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 78d01e5..8aa2183 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -16,7 +16,7 @@
 package android.hardware.fingerprint;
 
 import android.os.Bundle;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.hardware.fingerprint.IFingerprintClientActiveCallback;
 import android.hardware.fingerprint.IFingerprintServiceReceiver;
 import android.hardware.fingerprint.IFingerprintServiceLockoutResetCallback;
@@ -31,7 +31,7 @@
     // Authenticate the given sessionId with a fingerprint
     void authenticate(IBinder token, long sessionId, int userId,
             IFingerprintServiceReceiver receiver, int flags, String opPackageName,
-            in Bundle bundle, IBiometricDialogReceiver dialogReceiver);
+            in Bundle bundle, IBiometricPromptReceiver dialogReceiver);
 
     // Cancel authentication for the given sessionId
     void cancelAuthentication(IBinder token, String opPackageName);
diff --git a/core/java/android/net/IIpSecService.aidl b/core/java/android/net/IIpSecService.aidl
index 3a3ddcc..d6774d4 100644
--- a/core/java/android/net/IIpSecService.aidl
+++ b/core/java/android/net/IIpSecService.aidl
@@ -45,25 +45,31 @@
             in String localAddr,
             in String remoteAddr,
             in Network underlyingNetwork,
-            in IBinder binder);
+            in IBinder binder,
+            in String callingPackage);
 
     void addAddressToTunnelInterface(
             int tunnelResourceId,
-            in LinkAddress localAddr);
+            in LinkAddress localAddr,
+            in String callingPackage);
 
     void removeAddressFromTunnelInterface(
             int tunnelResourceId,
-            in LinkAddress localAddr);
+            in LinkAddress localAddr,
+            in String callingPackage);
 
-    void deleteTunnelInterface(int resourceId);
+    void deleteTunnelInterface(int resourceId, in String callingPackage);
 
-    IpSecTransformResponse createTransform(in IpSecConfig c, in IBinder binder);
+    IpSecTransformResponse createTransform(
+            in IpSecConfig c, in IBinder binder, in String callingPackage);
 
     void deleteTransform(int transformId);
 
-    void applyTransportModeTransform(in ParcelFileDescriptor socket, int direction, int transformId);
+    void applyTransportModeTransform(
+            in ParcelFileDescriptor socket, int direction, int transformId);
 
-    void applyTunnelModeTransform(int tunnelResourceId, int direction, int transformResourceId);
+    void applyTunnelModeTransform(
+            int tunnelResourceId, int direction, int transformResourceId, in String callingPackage);
 
     void removeTransportModeTransforms(in ParcelFileDescriptor socket);
 }
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 476e2f4..e92302a 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -37,8 +37,6 @@
     int getUidPolicy(int uid);
     int[] getUidsWithPolicy(int policy);
 
-    boolean isUidForeground(int uid);
-
     void registerListener(INetworkPolicyListener listener);
     void unregisterListener(INetworkPolicyListener listener);
 
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index 1525508..8732375 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -140,6 +140,7 @@
         }
     }
 
+    private final Context mContext;
     private final IIpSecService mService;
 
     /**
@@ -336,6 +337,9 @@
      */
     public void applyTransportModeTransform(@NonNull Socket socket,
             @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
+        // Ensure creation of FD. See b/77548890 for more details.
+        socket.getSoLinger();
+
         applyTransportModeTransform(socket.getFileDescriptor$(), direction, transform);
     }
 
@@ -440,6 +444,9 @@
      * @throws IOException indicating that the transform could not be removed from the socket
      */
     public void removeTransportModeTransforms(@NonNull Socket socket) throws IOException {
+        // Ensure creation of FD. See b/77548890 for more details.
+        socket.getSoLinger();
+
         removeTransportModeTransforms(socket.getFileDescriptor$());
     }
 
@@ -661,6 +668,7 @@
      */
     @SystemApi
     public static final class IpSecTunnelInterface implements AutoCloseable {
+        private final String mOpPackageName;
         private final IIpSecService mService;
         private final InetAddress mRemoteAddress;
         private final InetAddress mLocalAddress;
@@ -682,13 +690,15 @@
          * tunneled traffic.
          *
          * @param address the local address for traffic inside the tunnel
+         * @param prefixLen length of the InetAddress prefix
          * @hide
          */
         @SystemApi
         @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
-        public void addAddress(@NonNull LinkAddress address) throws IOException {
+        public void addAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
             try {
-                mService.addAddressToTunnelInterface(mResourceId, address);
+                mService.addAddressToTunnelInterface(
+                        mResourceId, new LinkAddress(address, prefixLen), mOpPackageName);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
@@ -700,22 +710,25 @@
          * <p>Remove an address which was previously added to the IpSecTunnelInterface
          *
          * @param address to be removed
+         * @param prefixLen length of the InetAddress prefix
          * @hide
          */
         @SystemApi
         @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
-        public void removeAddress(@NonNull LinkAddress address) throws IOException {
+        public void removeAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
             try {
-                mService.removeAddressFromTunnelInterface(mResourceId, address);
+                mService.removeAddressFromTunnelInterface(
+                        mResourceId, new LinkAddress(address, prefixLen), mOpPackageName);
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             }
         }
 
-        private IpSecTunnelInterface(@NonNull IIpSecService service,
+        private IpSecTunnelInterface(@NonNull Context ctx, @NonNull IIpSecService service,
                 @NonNull InetAddress localAddress, @NonNull InetAddress remoteAddress,
                 @NonNull Network underlyingNetwork)
                 throws ResourceUnavailableException, IOException {
+            mOpPackageName = ctx.getOpPackageName();
             mService = service;
             mLocalAddress = localAddress;
             mRemoteAddress = remoteAddress;
@@ -727,7 +740,8 @@
                                 localAddress.getHostAddress(),
                                 remoteAddress.getHostAddress(),
                                 underlyingNetwork,
-                                new Binder());
+                                new Binder(),
+                                mOpPackageName);
                 switch (result.status) {
                     case Status.OK:
                         break;
@@ -756,7 +770,7 @@
         @Override
         public void close() {
             try {
-                mService.deleteTunnelInterface(mResourceId);
+                mService.deleteTunnelInterface(mResourceId, mOpPackageName);
                 mResourceId = INVALID_RESOURCE_ID;
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
@@ -801,7 +815,8 @@
     public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
             @NonNull InetAddress remoteAddress, @NonNull Network underlyingNetwork)
             throws ResourceUnavailableException, IOException {
-        return new IpSecTunnelInterface(mService, localAddress, remoteAddress, underlyingNetwork);
+        return new IpSecTunnelInterface(
+                mContext, mService, localAddress, remoteAddress, underlyingNetwork);
     }
 
     /**
@@ -827,7 +842,8 @@
             @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
         try {
             mService.applyTunnelModeTransform(
-                    tunnel.getResourceId(), direction, transform.getResourceId());
+                    tunnel.getResourceId(), direction,
+                    transform.getResourceId(), mContext.getOpPackageName());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -839,7 +855,8 @@
      * @param context the application context for this manager
      * @hide
      */
-    public IpSecManager(IIpSecService service) {
+    public IpSecManager(Context ctx, IIpSecService service) {
+        mContext = ctx;
         mService = checkNotNull(service, "missing service");
     }
 }
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index 099fe02..fb5f46c 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -130,7 +130,8 @@
         synchronized (this) {
             try {
                 IIpSecService svc = getIpSecService();
-                IpSecTransformResponse result = svc.createTransform(mConfig, new Binder());
+                IpSecTransformResponse result = svc.createTransform(
+                        mConfig, new Binder(), mContext.getOpPackageName());
                 int status = result.status;
                 checkResultStatus(status);
                 mResourceId = result.resourceId;
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index 374b3ab..c314a35 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -318,7 +318,7 @@
 
     /**
      * Capabilities that suggest that a network is restricted.
-     * {@see #maybeMarkCapabilitiesRestricted}.
+     * {@see #maybeMarkCapabilitiesRestricted}, {@see #FORCE_RESTRICTED_CAPABILITIES}
      */
     @VisibleForTesting
     /* package */ static final long RESTRICTED_CAPABILITIES =
@@ -329,7 +329,13 @@
             (1 << NET_CAPABILITY_IA) |
             (1 << NET_CAPABILITY_IMS) |
             (1 << NET_CAPABILITY_RCS) |
-            (1 << NET_CAPABILITY_XCAP) |
+            (1 << NET_CAPABILITY_XCAP);
+
+    /**
+     * Capabilities that force network to be restricted.
+     * {@see #maybeMarkCapabilitiesRestricted}.
+     */
+    private static final long FORCE_RESTRICTED_CAPABILITIES =
             (1 << NET_CAPABILITY_OEM_PAID);
 
     /**
@@ -533,16 +539,21 @@
      * @hide
      */
     public void maybeMarkCapabilitiesRestricted() {
+        // Check if we have any capability that forces the network to be restricted.
+        final boolean forceRestrictedCapability =
+                (mNetworkCapabilities & FORCE_RESTRICTED_CAPABILITIES) != 0;
+
         // Verify there aren't any unrestricted capabilities.  If there are we say
-        // the whole thing is unrestricted.
+        // the whole thing is unrestricted unless it is forced to be restricted.
         final boolean hasUnrestrictedCapabilities =
-                ((mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0);
+                (mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0;
 
         // Must have at least some restricted capabilities.
         final boolean hasRestrictedCapabilities =
-                ((mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0);
+                (mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0;
 
-        if (hasRestrictedCapabilities && !hasUnrestrictedCapabilities) {
+        if (forceRestrictedCapability
+                || (hasRestrictedCapabilities && !hasUnrestrictedCapabilities)) {
             removeCapability(NET_CAPABILITY_NOT_RESTRICTED);
         }
     }
diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java
index 1a28732..e84c85e 100644
--- a/core/java/android/net/NetworkPolicy.java
+++ b/core/java/android/net/NetworkPolicy.java
@@ -19,7 +19,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.BackupUtils;
-import android.util.Pair;
+import android.util.Range;
 import android.util.RecurrenceRule;
 
 import com.android.internal.util.Preconditions;
@@ -136,7 +136,7 @@
         return 0;
     }
 
-    public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+    public Iterator<Range<ZonedDateTime>> cycleIterator() {
         return cycleRule.cycleIterator();
     }
 
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index 2c5a021..6546c39 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -31,6 +31,7 @@
 import android.os.UserHandle;
 import android.util.DebugUtils;
 import android.util.Pair;
+import android.util.Range;
 
 import com.google.android.collect.Sets;
 
@@ -107,6 +108,9 @@
 
     private static final boolean ALLOW_PLATFORM_APP_POLICY = true;
 
+    public static final int FOREGROUND_THRESHOLD_STATE =
+            ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+
     /**
      * {@link Intent} extra that indicates which {@link NetworkTemplate} rule it
      * applies to.
@@ -255,8 +259,21 @@
     }
 
     /** {@hide} */
+    @Deprecated
     public static Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator(NetworkPolicy policy) {
-        return policy.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = policy.cycleIterator();
+        return new Iterator<Pair<ZonedDateTime, ZonedDateTime>>() {
+            @Override
+            public boolean hasNext() {
+                return it.hasNext();
+            }
+
+            @Override
+            public Pair<ZonedDateTime, ZonedDateTime> next() {
+                final Range<ZonedDateTime> r = it.next();
+                return Pair.create(r.getLower(), r.getUpper());
+            }
+        };
     }
 
     /**
@@ -331,7 +348,7 @@
      * to access network when the device is idle or in battery saver mode. Otherwise, false.
      */
     public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
-        return procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+        return procState <= FOREGROUND_THRESHOLD_STATE;
     }
 
     /**
@@ -339,7 +356,7 @@
      * to access network when the device is in data saver mode. Otherwise, false.
      */
     public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
-        return procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
+        return procState <= FOREGROUND_THRESHOLD_STATE;
     }
 
     public static String resolveNetworkId(WifiConfiguration config) {
diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java
index caefd89..6f812ac 100644
--- a/core/java/android/net/NetworkRequest.java
+++ b/core/java/android/net/NetworkRequest.java
@@ -172,6 +172,8 @@
          * If the given capability was previously added to the list of unwanted capabilities
          * then the capability will also be removed from the list of unwanted capabilities.
          *
+         * @see #addUnwantedCapability(int)
+         *
          * @param capability The capability to add.
          * @return The builder to facilitate chaining
          *         {@code builder.addCapability(...).addCapability();}.
@@ -231,7 +233,8 @@
          *
          * @param capability The capability to add to unwanted capability list.
          * @return The builder to facilitate chaining.
-         * @hide
+         *
+         * @removed
          */
         public Builder addUnwantedCapability(@NetworkCapabilities.NetCapability int capability) {
             mNetworkCapabilities.addUnwantedCapability(capability);
@@ -437,6 +440,15 @@
     }
 
     /**
+     * @see Builder#addUnwantedCapability(int)
+     *
+     * @removed
+     */
+    public boolean hasUnwantedCapability(@NetCapability int capability) {
+        return networkCapabilities.hasUnwantedCapability(capability);
+    }
+
+    /**
      * @see Builder#addTransportType(int)
      */
     public boolean hasTransport(@Transport int transportType) {
diff --git a/core/java/android/net/NetworkState.java b/core/java/android/net/NetworkState.java
index b00cb48..321f971 100644
--- a/core/java/android/net/NetworkState.java
+++ b/core/java/android/net/NetworkState.java
@@ -26,6 +26,8 @@
  * @hide
  */
 public class NetworkState implements Parcelable {
+    private static final boolean SANITY_CHECK_ROAMING = false;
+
     public static final NetworkState EMPTY = new NetworkState(null, null, null, null, null, null);
 
     public final NetworkInfo networkInfo;
@@ -47,7 +49,7 @@
 
         // This object is an atomic view of a network, so the various components
         // should always agree on roaming state.
-        if (networkInfo != null && networkCapabilities != null) {
+        if (SANITY_CHECK_ROAMING && networkInfo != null && networkCapabilities != null) {
             if (networkInfo.isRoaming() == networkCapabilities
                     .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)) {
                 Slog.wtf("NetworkState", "Roaming state disagreement between " + networkInfo
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 292bf8e..f0dd262 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -31,6 +31,7 @@
 import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -97,6 +98,11 @@
     /** Denotes a request for stats at the interface and UID level. */
     public static final int STATS_PER_UID = 1;
 
+    private static final String CLATD_INTERFACE_PREFIX = "v4-";
+    // Delta between IPv4 header (20b) and IPv6 header (40b).
+    // Used for correct stats accounting on clatd interfaces.
+    private static final int IPV4V6_HEADER_DELTA = 20;
+
     // TODO: move fields to "mVariable" notation
 
     /**
@@ -759,6 +765,75 @@
     }
 
     /**
+     * Calculate and apply adjustments to captured statistics for 464xlat traffic counted twice.
+     *
+     * <p>This mutates both base and stacked traffic stats, to account respectively for
+     * double-counted traffic and IPv4/IPv6 header size difference.
+     *
+     * <p>For 464xlat traffic, xt_qtaguid sees every IPv4 packet twice, once as a native IPv4
+     * packet on the stacked interface, and once as translated to an IPv6 packet on the
+     * base interface. For correct stats accounting on the base interface, every 464xlat
+     * packet needs to be subtracted from the root UID on the base interface both for tx
+     * and rx traffic (http://b/12249687, http:/b/33681750).
+     *
+     * <p>This method will behave fine if {@code stackedIfaces} is an non-synchronized but add-only
+     * {@code ConcurrentHashMap}
+     * @param baseTraffic Traffic on the base interfaces. Will be mutated.
+     * @param stackedTraffic Stats with traffic stacked on top of our ifaces. Will also be mutated.
+     * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
+     */
+    public static void apply464xlatAdjustments(NetworkStats baseTraffic,
+            NetworkStats stackedTraffic, Map<String, String> stackedIfaces) {
+        // Total 464xlat traffic to subtract from uid 0 on all base interfaces.
+        // stackedIfaces may grow afterwards, but NetworkStats will just be resized automatically.
+        final NetworkStats adjustments = new NetworkStats(0, stackedIfaces.size());
+
+        // For recycling
+        Entry entry = null;
+        Entry adjust = new NetworkStats.Entry(IFACE_ALL, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L, 0L);
+
+        for (int i = 0; i < stackedTraffic.size; i++) {
+            entry = stackedTraffic.getValues(i, entry);
+            if (entry.iface == null || !entry.iface.startsWith(CLATD_INTERFACE_PREFIX)) {
+                continue;
+            }
+            final String baseIface = stackedIfaces.get(entry.iface);
+            if (baseIface == null) {
+                continue;
+            }
+            // Subtract any 464lat traffic seen for the root UID on the current base interface.
+            adjust.iface = baseIface;
+            adjust.rxBytes = -(entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
+            adjust.txBytes = -(entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
+            adjust.rxPackets = -entry.rxPackets;
+            adjust.txPackets = -entry.txPackets;
+            adjustments.combineValues(adjust);
+
+            // For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent
+            // on the stacked interface with prefix "v4-" and drops the IPv6 header size after
+            // unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
+            // difference for all packets (http://b/12249687, http:/b/33681750).
+            entry.rxBytes += entry.rxPackets * IPV4V6_HEADER_DELTA;
+            entry.txBytes += entry.txPackets * IPV4V6_HEADER_DELTA;
+            stackedTraffic.setValues(i, entry);
+        }
+
+        baseTraffic.combineAllValues(adjustments);
+    }
+
+    /**
+     * Calculate and apply adjustments to captured statistics for 464xlat traffic counted twice.
+     *
+     * <p>This mutates the object this method is called on. Equivalent to calling
+     * {@link #apply464xlatAdjustments(NetworkStats, NetworkStats, Map)} with {@code this} as
+     * base and stacked traffic.
+     * @param stackedIfaces Mapping ipv6if -> ipv4if interface where traffic is counted on both.
+     */
+    public void apply464xlatAdjustments(Map<String, String> stackedIfaces) {
+        apply464xlatAdjustments(this, this, stackedIfaces);
+    }
+
+    /**
      * Return total statistics grouped by {@link #iface}; doesn't mutate the
      * original structure.
      */
diff --git a/core/java/android/net/http/X509TrustManagerExtensions.java b/core/java/android/net/http/X509TrustManagerExtensions.java
index e0fa63a..f9b6dfc 100644
--- a/core/java/android/net/http/X509TrustManagerExtensions.java
+++ b/core/java/android/net/http/X509TrustManagerExtensions.java
@@ -21,7 +21,6 @@
 
 import com.android.org.conscrypt.TrustManagerImpl;
 
-import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.cert.CertificateException;
@@ -133,8 +132,6 @@
     /**
      * Returns {@code true} if the TrustManager uses the same trust configuration for the provided
      * hostnames.
-     *
-     * @hide
      */
     @SystemApi
     public boolean isSameTrustConfiguration(String hostname1, String hostname2) {
diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java
index 3b0dc7e..76a781d 100644
--- a/core/java/android/net/metrics/ApfStats.java
+++ b/core/java/android/net/metrics/ApfStats.java
@@ -20,7 +20,7 @@
 import android.os.Parcelable;
 
 /**
- * An event logged for an interface with APF capabilities when its IpManager state machine exits.
+ * An event logged for an interface with APF capabilities when its IpClient state machine exits.
  * {@hide}
  */
 public final class ApfStats implements Parcelable {
diff --git a/core/java/android/os/DeviceIdleManager.java b/core/java/android/os/DeviceIdleManager.java
new file mode 100644
index 0000000..9039f92
--- /dev/null
+++ b/core/java/android/os/DeviceIdleManager.java
@@ -0,0 +1,69 @@
+/*
+ * 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;
+
+import android.annotation.NonNull;
+import android.annotation.SystemService;
+import android.annotation.TestApi;
+import android.content.Context;
+
+/**
+ * Access to the service that keeps track of device idleness and drives low power mode based on
+ * that.
+ *
+ * @hide
+ */
+@TestApi
+@SystemService(Context.DEVICE_IDLE_CONTROLLER)
+public class DeviceIdleManager {
+    private final Context mContext;
+    private final IDeviceIdleController mService;
+
+    /**
+     * @hide
+     */
+    public DeviceIdleManager(@NonNull Context context, @NonNull IDeviceIdleController service) {
+        mContext = context;
+        mService = service;
+    }
+
+    /**
+     * @return package names the system has white-listed to opt out of power save restrictions,
+     * except for device idle mode.
+     */
+    public @NonNull String[] getSystemPowerWhitelistExceptIdle() {
+        try {
+            return mService.getSystemPowerWhitelistExceptIdle();
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+            return new String[0];
+        }
+    }
+
+    /**
+     * @return package names the system has white-listed to opt out of power save restrictions for
+     * all modes.
+     */
+    public @NonNull String[] getSystemPowerWhitelist() {
+        try {
+            return mService.getSystemPowerWhitelist();
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+            return new String[0];
+        }
+    }
+}
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 03203d0..213260f 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -16,6 +16,7 @@
 
 package android.os;
 
+import android.annotation.TestApi;
 import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.os.storage.StorageManager;
@@ -1033,6 +1034,7 @@
      *
      * @hide
      */
+    @TestApi
     public static File buildPath(File base, String... segments) {
         File cur = base;
         for (String segment : segments) {
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index e3c4870..5142928 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -1857,26 +1857,7 @@
         int code = readExceptionCode();
         if (code != 0) {
             String msg = readString();
-            String remoteStackTrace = null;
-            final int remoteStackPayloadSize = readInt();
-            if (remoteStackPayloadSize > 0) {
-                remoteStackTrace = readString();
-            }
-            Exception e = createException(code, msg);
-            // Attach remote stack trace if availalble
-            if (remoteStackTrace != null) {
-                RemoteException cause = new RemoteException(
-                        "Remote stack trace:\n" + remoteStackTrace, null, false, false);
-                try {
-                    Throwable rootCause = ExceptionUtils.getRootCause(e);
-                    if (rootCause != null) {
-                        rootCause.initCause(cause);
-                    }
-                } catch (RuntimeException ex) {
-                    Log.e(TAG, "Cannot set cause " + cause + " for " + e, ex);
-                }
-            }
-            SneakyThrow.sneakyThrow(e);
+            readException(code, msg);
         }
     }
 
@@ -1921,7 +1902,26 @@
      * @param msg The exception message.
      */
     public final void readException(int code, String msg) {
-        SneakyThrow.sneakyThrow(createException(code, msg));
+        String remoteStackTrace = null;
+        final int remoteStackPayloadSize = readInt();
+        if (remoteStackPayloadSize > 0) {
+            remoteStackTrace = readString();
+        }
+        Exception e = createException(code, msg);
+        // Attach remote stack trace if availalble
+        if (remoteStackTrace != null) {
+            RemoteException cause = new RemoteException(
+                    "Remote stack trace:\n" + remoteStackTrace, null, false, false);
+            try {
+                Throwable rootCause = ExceptionUtils.getRootCause(e);
+                if (rootCause != null) {
+                    rootCause.initCause(cause);
+                }
+            } catch (RuntimeException ex) {
+                Log.e(TAG, "Cannot set cause " + cause + " for " + e, ex);
+            }
+        }
+        SneakyThrow.sneakyThrow(e);
     }
 
     /**
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index a93e25a..59380fd 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -39,6 +39,7 @@
 import android.os.strictmode.IntentReceiverLeakedViolation;
 import android.os.strictmode.LeakedClosableViolation;
 import android.os.strictmode.NetworkViolation;
+import android.os.strictmode.NonSdkApiUsedViolation;
 import android.os.strictmode.ResourceMismatchViolation;
 import android.os.strictmode.ServiceConnectionLeakedViolation;
 import android.os.strictmode.SqliteObjectLeakedViolation;
@@ -76,6 +77,7 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
 
 /**
  * StrictMode is a developer tool which detects things you might be doing by accident and brings
@@ -262,6 +264,9 @@
     /** @hide */
     @TestApi public static final int DETECT_VM_UNTAGGED_SOCKET = 0x80 << 24; // for VmPolicy
 
+    /** @hide */
+    @TestApi public static final int DETECT_VM_NON_SDK_API_USAGE = 0x40 << 24; // for VmPolicy
+
     private static final int ALL_VM_DETECT_BITS =
             DETECT_VM_CURSOR_LEAKS
                     | DETECT_VM_CLOSABLE_LEAKS
@@ -271,7 +276,9 @@
                     | DETECT_VM_FILE_URI_EXPOSURE
                     | DETECT_VM_CLEARTEXT_NETWORK
                     | DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION
-                    | DETECT_VM_UNTAGGED_SOCKET;
+                    | DETECT_VM_UNTAGGED_SOCKET
+                    | DETECT_VM_NON_SDK_API_USAGE;
+
 
     // Byte 3: Penalty
 
@@ -413,6 +420,13 @@
      */
     private static final AtomicInteger sDropboxCallsInFlight = new AtomicInteger(0);
 
+    /**
+     * Callback supplied to dalvik / libcore to get informed of usages of java API that are not
+     * a part of the public SDK.
+     */
+    private static final Consumer<String> sNonSdkApiUsageConsumer =
+            message -> onVmPolicyViolation(new NonSdkApiUsedViolation(message));
+
     private StrictMode() {}
 
     /**
@@ -796,6 +810,23 @@
             }
 
             /**
+             * Detect reflective usage of APIs that are not part of the public Android SDK.
+             */
+            public Builder detectNonSdkApiUsage() {
+                return enable(DETECT_VM_NON_SDK_API_USAGE);
+            }
+
+            /**
+             * Permit reflective usage of APIs that are not part of the public Android SDK. Note
+             * that this <b>only</b> affects {@code StrictMode}, the underlying runtime may
+             * continue to restrict or warn on access to methods that are not part of the
+             * public SDK.
+             */
+            public Builder permitNonSdkApiUsage() {
+                return disable(DETECT_VM_NON_SDK_API_USAGE);
+            }
+
+            /**
              * Detect everything that's potentially suspect.
              *
              * <p>In the Honeycomb release this includes leaks of SQLite cursors, Activities, and
@@ -826,6 +857,8 @@
                     detectContentUriWithoutPermission();
                     detectUntaggedSockets();
                 }
+
+                // TODO: Decide whether to detect non SDK API usage beyond a certain API level.
                 return this;
             }
 
@@ -1848,6 +1881,13 @@
             } else if (networkPolicy != NETWORK_POLICY_ACCEPT) {
                 Log.w(TAG, "Dropping requested network policy due to missing service!");
             }
+
+
+            if ((sVmPolicy.mask & DETECT_VM_NON_SDK_API_USAGE) != 0) {
+                VMRuntime.setNonSdkApiUsageConsumer(sNonSdkApiUsageConsumer);
+            } else {
+                VMRuntime.setNonSdkApiUsageConsumer(null);
+            }
         }
     }
 
@@ -2576,6 +2616,8 @@
                 return DETECT_VM_CONTENT_URI_WITHOUT_PERMISSION;
             } else if (mViolation instanceof UntaggedSocketViolation) {
                 return DETECT_VM_UNTAGGED_SOCKET;
+            } else if (mViolation instanceof NonSdkApiUsedViolation) {
+                return DETECT_VM_NON_SDK_API_USAGE;
             }
             throw new IllegalStateException("missing violation bit");
         }
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
index 8eb39c0..7d3ba6a 100644
--- a/core/java/android/os/SystemProperties.java
+++ b/core/java/android/os/SystemProperties.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.util.Log;
 import android.util.MutableInt;
 
@@ -35,6 +36,7 @@
  * {@hide}
  */
 @SystemApi
+@TestApi
 public class SystemProperties {
     private static final String TAG = "SystemProperties";
     private static final boolean TRACK_KEY_ACCESS = false;
@@ -110,6 +112,7 @@
      */
     @NonNull
     @SystemApi
+    @TestApi
     public static String get(@NonNull String key, @Nullable String def) {
         if (TRACK_KEY_ACCESS) onKeyAccess(key);
         return native_get(key, def);
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 094f004..4d4f31d 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -82,6 +82,7 @@
     public static final int USER_SERIAL_SYSTEM = 0;
 
     /** @hide A user handle to indicate the "system" user of the device */
+    @TestApi
     public static final UserHandle SYSTEM = new UserHandle(USER_SYSTEM);
 
     /**
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index a9eb360..9b20ed2 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1149,6 +1149,7 @@
      * primary user are two separate users. Previously system user and primary user are combined as
      * a single owner user.  see @link {android.os.UserHandle#USER_OWNER}
      */
+    @TestApi
     public static boolean isSplitSystemUser() {
         return RoSystemProperties.FW_SYSTEM_USER_SPLIT;
     }
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index b9dd376..d1d5d8e 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -467,7 +467,8 @@
      * <p>The list of exemptions will take affect for all new processes forked from the zygote after
      * this call.
      *
-     * @param exemptions List of hidden API exemption prefixes.
+     * @param exemptions List of hidden API exemption prefixes. Any matching members are treated as
+     *        whitelisted/public APIs (i.e. allowed, no logging of usage).
      */
     public void setApiBlacklistExemptions(List<String> exemptions) {
         synchronized (mLock) {
diff --git a/core/java/android/os/storage/DiskInfo.java b/core/java/android/os/storage/DiskInfo.java
index 9114107..d493cce 100644
--- a/core/java/android/os/storage/DiskInfo.java
+++ b/core/java/android/os/storage/DiskInfo.java
@@ -17,6 +17,7 @@
 package android.os.storage;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.res.Resources;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -93,7 +94,7 @@
         return true;
     }
 
-    public String getDescription() {
+    public @Nullable String getDescription() {
         final Resources res = Resources.getSystem();
         if ((flags & FLAG_SD) != 0) {
             if (isInteresting(label)) {
@@ -112,6 +113,17 @@
         }
     }
 
+    public @Nullable String getShortDescription() {
+        final Resources res = Resources.getSystem();
+        if (isSd()) {
+            return res.getString(com.android.internal.R.string.storage_sd_card);
+        } else if (isUsb()) {
+            return res.getString(com.android.internal.R.string.storage_usb_drive);
+        } else {
+            return null;
+        }
+    }
+
     public boolean isAdoptable() {
         return (flags & FLAG_ADOPTABLE) != 0;
     }
diff --git a/core/java/android/security/keystore/SessionExpiredException.java b/core/java/android/os/strictmode/NonSdkApiUsedViolation.java
similarity index 69%
rename from core/java/android/security/keystore/SessionExpiredException.java
rename to core/java/android/os/strictmode/NonSdkApiUsedViolation.java
index 7c8d5e4..2f0cb50 100644
--- a/core/java/android/security/keystore/SessionExpiredException.java
+++ b/core/java/android/os/strictmode/NonSdkApiUsedViolation.java
@@ -14,14 +14,15 @@
  * limitations under the License.
  */
 
-package android.security.keystore;
+package android.os.strictmode;
 
 /**
- * @deprecated Use {@link android.security.keystore.recovery.SessionExpiredException}.
- * @hide
+ * Subclass of {@code Violation} that is used when a process accesses
+ * a non SDK API.
  */
-public class SessionExpiredException extends RecoveryControllerException {
-    public SessionExpiredException(String msg) {
-        super(msg);
+public final class NonSdkApiUsedViolation extends Violation {
+    /** @hide */
+    public NonSdkApiUsedViolation(String message) {
+        super(message);
     }
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index b0367dc..c7c2c15 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1179,6 +1179,23 @@
     public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
 
     /**
+     * Activity Action: Show Zen Mode visual effects configuration settings.
+     *
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ZEN_MODE_BLOCKED_EFFECTS_SETTINGS =
+            "android.settings.ZEN_MODE_BLOCKED_EFFECTS_SETTINGS";
+
+    /**
+     * Activity Action: Show Zen Mode onboarding activity.
+     *
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ZEN_MODE_ONBOARDING = "android.settings.ZEN_MODE_ONBOARDING";
+
+    /**
      * Activity Action: Show Zen Mode (aka Do Not Disturb) priority configuration settings.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@@ -3113,6 +3130,9 @@
          */
         public static final String DISPLAY_COLOR_MODE = "display_color_mode";
 
+        private static final Validator DISPLAY_COLOR_MODE_VALIDATOR =
+                new SettingsValidators.InclusiveIntegerRangeValidator(0, 2);
+
         /**
          * The amount of time in milliseconds before the device goes to sleep or begins
          * to dream after a period of inactivity.  This value is also known as the
@@ -3133,9 +3153,6 @@
          */
         public static final String SCREEN_BRIGHTNESS = "screen_brightness";
 
-        private static final Validator SCREEN_BRIGHTNESS_VALIDATOR =
-                new SettingsValidators.InclusiveIntegerRangeValidator(0, 255);
-
         /**
          * The screen backlight brightness between 0 and 255.
          * @hide
@@ -3753,17 +3770,6 @@
                 new SettingsValidators.InclusiveIntegerRangeValidator(0, 3);
 
         /**
-         * User-selected RTT mode. When on, outgoing and incoming calls will be answered as RTT
-         * calls when supported by the device and carrier. Boolean value.
-         * 0 = OFF
-         * 1 = ON
-         */
-        public static final String RTT_CALLING_MODE = "rtt_calling_mode";
-
-        /** @hide */
-        public static final Validator RTT_CALLING_MODE_VALIDATOR = BOOLEAN_VALIDATOR;
-
-        /**
          * Whether the sounds effects (key clicks, lid open ...) are enabled. The value is
          * boolean (1 or 0).
          */
@@ -4071,7 +4077,6 @@
             FONT_SCALE,
             DIM_SCREEN,
             SCREEN_OFF_TIMEOUT,
-            SCREEN_BRIGHTNESS,
             SCREEN_BRIGHTNESS_MODE,
             SCREEN_AUTO_BRIGHTNESS_ADJ,
             SCREEN_BRIGHTNESS_FOR_VR,
@@ -4088,7 +4093,6 @@
             DTMF_TONE_WHEN_DIALING,
             DTMF_TONE_TYPE_WHEN_DIALING,
             HEARING_AID,
-            RTT_CALLING_MODE,
             TTY_MODE,
             MASTER_MONO,
             SOUND_EFFECTS_ENABLED,
@@ -4108,6 +4112,7 @@
             SHOW_BATTERY_PERCENT,
             NOTIFICATION_VIBRATION_INTENSITY,
             HAPTIC_FEEDBACK_INTENSITY,
+            DISPLAY_COLOR_MODE
         };
 
         /**
@@ -4220,6 +4225,7 @@
             PRIVATE_SETTINGS.add(LOCK_TO_APP_ENABLED);
             PRIVATE_SETTINGS.add(EGG_MODE);
             PRIVATE_SETTINGS.add(SHOW_BATTERY_PERCENT);
+            PRIVATE_SETTINGS.add(DISPLAY_COLOR_MODE);
         }
 
         /**
@@ -4241,8 +4247,8 @@
             VALIDATORS.put(NEXT_ALARM_FORMATTED, NEXT_ALARM_FORMATTED_VALIDATOR);
             VALIDATORS.put(FONT_SCALE, FONT_SCALE_VALIDATOR);
             VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR);
+            VALIDATORS.put(DISPLAY_COLOR_MODE, DISPLAY_COLOR_MODE_VALIDATOR);
             VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR);
-            VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR);
             VALIDATORS.put(SCREEN_BRIGHTNESS_FOR_VR, SCREEN_BRIGHTNESS_FOR_VR_VALIDATOR);
             VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR);
             VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR);
@@ -4287,7 +4293,6 @@
             VALIDATORS.put(DTMF_TONE_TYPE_WHEN_DIALING, DTMF_TONE_TYPE_WHEN_DIALING_VALIDATOR);
             VALIDATORS.put(HEARING_AID, HEARING_AID_VALIDATOR);
             VALIDATORS.put(TTY_MODE, TTY_MODE_VALIDATOR);
-            VALIDATORS.put(RTT_CALLING_MODE, RTT_CALLING_MODE_VALIDATOR);
             VALIDATORS.put(NOTIFICATION_LIGHT_PULSE, NOTIFICATION_LIGHT_PULSE_VALIDATOR);
             VALIDATORS.put(POINTER_LOCATION, POINTER_LOCATION_VALIDATOR);
             VALIDATORS.put(SHOW_TOUCHES, SHOW_TOUCHES_VALIDATOR);
@@ -6660,6 +6665,17 @@
         private static final Validator TTY_MODE_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR;
 
         /**
+         * User-selected RTT mode. When on, outgoing and incoming calls will be answered as RTT
+         * calls when supported by the device and carrier. Boolean value.
+         * 0 = OFF
+         * 1 = ON
+         */
+        public static final String RTT_CALLING_MODE = "rtt_calling_mode";
+
+        private static final Validator RTT_CALLING_MODE_VALIDATOR = BOOLEAN_VALIDATOR;
+
+        /**
+        /**
          * Controls whether settings backup is enabled.
          * Type: int ( 0 = disabled, 1 = enabled )
          * @hide
@@ -7383,6 +7399,17 @@
                 BOOLEAN_VALIDATOR;
 
         /**
+         * Whether the swipe up gesture to switch apps should be enabled.
+         *
+         * @hide
+         */
+        public static final String SWIPE_UP_TO_SWITCH_APPS_ENABLED =
+                "swipe_up_to_switch_apps_enabled";
+
+        private static final Validator SWIPE_UP_TO_SWITCH_APPS_ENABLED_VALIDATOR =
+                BOOLEAN_VALIDATOR;
+
+        /**
          * Whether or not the smart camera lift trigger that launches the camera when the user moves
          * the phone into a position for taking photos should be enabled.
          *
@@ -7885,6 +7912,7 @@
             PREFERRED_TTY_MODE,
             ENHANCED_VOICE_PRIVACY_ENABLED,
             TTY_MODE_ENABLED,
+            RTT_CALLING_MODE,
             INCALL_POWER_BUTTON_BEHAVIOR,
             NIGHT_DISPLAY_CUSTOM_START_TIME,
             NIGHT_DISPLAY_CUSTOM_END_TIME,
@@ -7892,6 +7920,7 @@
             NIGHT_DISPLAY_AUTO_MODE,
             SYNC_PARENT_SOUNDS,
             CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
+            SWIPE_UP_TO_SWITCH_APPS_ENABLED,
             CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
             SYSTEM_NAVIGATION_KEYS_ENABLED,
             QS_TILES,
@@ -8014,6 +8043,7 @@
             VALIDATORS.put(ENHANCED_VOICE_PRIVACY_ENABLED,
                     ENHANCED_VOICE_PRIVACY_ENABLED_VALIDATOR);
             VALIDATORS.put(TTY_MODE_ENABLED, TTY_MODE_ENABLED_VALIDATOR);
+            VALIDATORS.put(RTT_CALLING_MODE, RTT_CALLING_MODE_VALIDATOR);
             VALIDATORS.put(INCALL_POWER_BUTTON_BEHAVIOR, INCALL_POWER_BUTTON_BEHAVIOR_VALIDATOR);
             VALIDATORS.put(NIGHT_DISPLAY_CUSTOM_START_TIME,
                     NIGHT_DISPLAY_CUSTOM_START_TIME_VALIDATOR);
@@ -8024,6 +8054,8 @@
             VALIDATORS.put(SYNC_PARENT_SOUNDS, SYNC_PARENT_SOUNDS_VALIDATOR);
             VALIDATORS.put(CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED,
                     CAMERA_DOUBLE_TWIST_TO_FLIP_ENABLED_VALIDATOR);
+            VALIDATORS.put(SWIPE_UP_TO_SWITCH_APPS_ENABLED,
+                    SWIPE_UP_TO_SWITCH_APPS_ENABLED_VALIDATOR);
             VALIDATORS.put(CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED,
                     CAMERA_DOUBLE_TAP_POWER_GESTURE_DISABLED_VALIDATOR);
             VALIDATORS.put(SYSTEM_NAVIGATION_KEYS_ENABLED,
@@ -8935,6 +8967,20 @@
        /** {@hide} */
        public static final String NETSTATS_UID_TAG_DELETE_AGE = "netstats_uid_tag_delete_age";
 
+       /** {@hide} */
+       public static final String NETPOLICY_QUOTA_ENABLED = "netpolicy_quota_enabled";
+       /** {@hide} */
+       public static final String NETPOLICY_QUOTA_UNLIMITED = "netpolicy_quota_unlimited";
+       /** {@hide} */
+       public static final String NETPOLICY_QUOTA_LIMITED = "netpolicy_quota_limited";
+       /** {@hide} */
+       public static final String NETPOLICY_QUOTA_FRAC_JOBS = "netpolicy_quota_frac_jobs";
+       /** {@hide} */
+       public static final String NETPOLICY_QUOTA_FRAC_MULTIPATH = "netpolicy_quota_frac_multipath";
+
+       /** {@hide} */
+       public static final String NETPOLICY_OVERRIDE_ENABLED = "netpolicy_override_enabled";
+
        /**
         * User preference for which network(s) should be used. Only the
         * connectivity service should touch this.
@@ -9220,8 +9266,8 @@
         public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
 
         /**
-         * Map of package name to application names.  Package names must be lower cased as they are
-         * used as a key in the map.  The application names cannot and will not be localized.
+         * Map of package name to application names. The application names cannot and will not be
+         * localized. App names may not contain colons or semicolons.
          *
          * The value is "packageName1:appName1;packageName2:appName2;..."
          * @hide
@@ -9309,6 +9355,15 @@
                "network_metered_multipath_preference";
 
         /**
+         * Default daily multipath budget used by ConnectivityManager.getMultipathPreference()
+         * on metered networks. This default quota is only used if quota could not be determined
+         * from data plan or data limit/warning set by the user.
+         * @hide
+         */
+        public static final String NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES =
+                "network_default_daily_multipath_quota_bytes";
+
+        /**
          * Network watchlist last report time.
          * @hide
          */
@@ -10797,6 +10852,15 @@
                 = "time_only_mode_constants";
 
         /**
+         * Whether of not to send keycode sleep for ungaze when Home is the foreground activity on
+         * watch type devices.
+         * Type: int (0 for false, 1 for true)
+         * Default: 0
+         * @hide
+         */
+        public static final String UNGAZE_SLEEP_ENABLED = "ungaze_sleep_enabled";
+
+        /**
          * Whether or not Network Watchlist feature is enabled.
          * Type: int (0 for false, 1 for true)
          * Default: 0
@@ -11076,6 +11140,14 @@
         public static final String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
 
         /**
+         * If nonzero, all system error dialogs will be hidden.  For example, the
+         * crash and ANR dialogs will not be shown, and the system will just proceed
+         * as if they had been accepted by the user.
+         * @hide
+         */
+        public static final String HIDE_ERROR_DIALOGS = "hide_error_dialogs";
+
+        /**
          * Use Dock audio output for media:
          *      0 = disabled
          *      1 = enabled
@@ -11694,6 +11766,29 @@
                 "hidden_api_blacklist_exemptions";
 
         /**
+         * Hidden API enforcement policy for apps targeting SDK versions prior to the latest
+         * version.
+         *
+         * Values correspond to @{@link
+         * android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy}
+         *
+         * @hide
+         */
+        public static final String HIDDEN_API_POLICY_PRE_P_APPS =
+                "hidden_api_policy_pre_p_apps";
+
+        /**
+         * Hidden API enforcement policy for apps targeting the current SDK version.
+         *
+         * Values correspond to @{@link
+         * android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy}
+         *
+         * @hide
+         */
+        public static final String HIDDEN_API_POLICY_P_APPS =
+                "hidden_api_policy_p_apps";
+
+        /**
          * Timeout for a single {@link android.media.soundtrigger.SoundTriggerDetectionService}
          * operation (in ms).
          *
@@ -12532,6 +12627,19 @@
          */
          public static final String SWAP_ENABLED = "swap_enabled";
 
+        /**
+         * Blacklist of GNSS satellites.
+         *
+         * This is a list of integers separated by commas to represent pairs of (constellation,
+         * svid). Thus, the number of integers should be even.
+         *
+         * E.g.: "3,0,5,24" denotes (constellation=3, svid=0) and (constellation=5, svid=24) are
+         * blacklisted. Note that svid=0 denotes all svids in the
+         * constellation are blacklisted.
+         *
+         * @hide
+         */
+        public static final String GNSS_SATELLITE_BLACKLIST = "gnss_satellite_blacklist";
     }
 
     /**
diff --git a/core/java/android/se/omapi/Channel.java b/core/java/android/se/omapi/Channel.java
index c8efede..5db3c1a 100644
--- a/core/java/android/se/omapi/Channel.java
+++ b/core/java/android/se/omapi/Channel.java
@@ -39,7 +39,7 @@
  *
  * @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
  */
-public class Channel {
+public final class Channel implements java.nio.channels.Channel {
 
     private static final String TAG = "OMAPI.Channel";
     private Session mSession;
@@ -64,7 +64,7 @@
      * before closing the channel.
      */
     public void close() {
-        if (!isClosed()) {
+        if (isOpen()) {
             synchronized (mLock) {
                 try {
                     mChannel.close();
@@ -76,21 +76,21 @@
     }
 
     /**
-     * Tells if this channel is closed.
+     * Tells if this channel is open.
      *
-     * @return <code>true</code> if the channel is closed or in case of an error.
-     *         <code>false</code> otherwise.
+     * @return <code>false</code> if the channel is closed or in case of an error.
+     *         <code>true</code> otherwise.
      */
-    public boolean isClosed() {
+    public boolean isOpen() {
         if (!mService.isConnected()) {
             Log.e(TAG, "service not connected to system");
-            return true;
+            return false;
         }
         try {
-            return mChannel.isClosed();
+            return !mChannel.isClosed();
         } catch (RemoteException e) {
             Log.e(TAG, "Exception in isClosed()");
-            return true;
+            return false;
         }
     }
 
diff --git a/core/java/android/se/omapi/Reader.java b/core/java/android/se/omapi/Reader.java
index 9be3da6..80262f7 100644
--- a/core/java/android/se/omapi/Reader.java
+++ b/core/java/android/se/omapi/Reader.java
@@ -37,7 +37,7 @@
  *
  * @see <a href="http://globalplatform.org">GlobalPlatform Open Mobile API</a>
  */
-public class Reader {
+public final class Reader {
 
     private static final String TAG = "OMAPI.Reader";
     private final String mName;
diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java
index 311dc4c..14727f0 100644
--- a/core/java/android/se/omapi/SEService.java
+++ b/core/java/android/se/omapi/SEService.java
@@ -32,6 +32,7 @@
 import android.util.Log;
 
 import java.util.HashMap;
+import java.util.concurrent.Executor;
 
 /**
  * The SEService realises the communication to available Secure Elements on the
@@ -40,7 +41,7 @@
  *
  * @see <a href="http://simalliance.org">SIMalliance Open Mobile API  v3.0</a>
  */
-public class SEService {
+public final class SEService {
 
     /**
      * Error code used with ServiceSpecificException.
@@ -62,11 +63,11 @@
     /**
      * Interface to send call-backs to the application when the service is connected.
      */
-    public interface SecureElementListener {
+    public interface OnConnectedListener {
         /**
          * Called by the framework when the service is connected.
          */
-        void onServiceConnected();
+        void onConnected();
     }
 
     /**
@@ -74,16 +75,22 @@
      * SEService could be bound to the backend.
      */
     private class SEListener extends ISecureElementListener.Stub {
-        public SecureElementListener mListener = null;
+        public OnConnectedListener mListener = null;
+        public Executor mExecutor = null;
 
         @Override
         public IBinder asBinder() {
             return this;
         }
 
-        public void onServiceConnected() {
-            if (mListener != null) {
-                mListener.onServiceConnected();
+        public void onConnected() {
+            if (mListener != null && mExecutor != null) {
+                mExecutor.execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        mListener.onConnected();
+                    }
+                });
             }
         }
     }
@@ -116,22 +123,26 @@
      * the specified listener is called or if isConnected() returns
      * <code>true</code>. <br>
      * The call-back object passed as a parameter will have its
-     * onServiceConnected() method called when the connection actually happen.
+     * onConnected() method called when the connection actually happen.
      *
      * @param context
      *            the context of the calling application. Cannot be
      *            <code>null</code>.
      * @param listener
-     *            a SecureElementListener object.
+     *            a OnConnectedListener object.
+     * @param executor
+     *            an Executor which will be used when invoking the callback.
      */
-    public SEService(@NonNull Context context, @NonNull SecureElementListener listener) {
+    public SEService(@NonNull Context context, @NonNull Executor executor,
+            @NonNull OnConnectedListener listener) {
 
-        if (context == null) {
-            throw new NullPointerException("context must not be null");
+        if (context == null || listener == null || executor == null) {
+            throw new NullPointerException("Arguments must not be null");
         }
 
         mContext = context;
         mSEListener.mListener = listener;
+        mSEListener.mExecutor = executor;
 
         mConnection = new ServiceConnection() {
 
@@ -140,7 +151,7 @@
 
                 mSecureElementService = ISecureElementService.Stub.asInterface(service);
                 if (mSEListener != null) {
-                    mSEListener.onServiceConnected();
+                    mSEListener.onConnected();
                 }
                 Log.i(TAG, "Service onServiceConnected");
             }
@@ -171,12 +182,12 @@
     }
 
     /**
-     * Returns the list of available Secure Element readers.
+     * Returns an array of available Secure Element readers.
      * There must be no duplicated objects in the returned list.
      * All available readers shall be listed even if no card is inserted.
      *
-     * @return The readers list, as an array of Readers. If there are no
-     * readers the returned array is of length 0.
+     * @return An array of Readers. If there are no readers the returned array
+     * is of length 0.
      */
     public @NonNull Reader[] getReaders() {
         if (mSecureElementService == null) {
@@ -212,7 +223,8 @@
      * (including any binding to an underlying service).
      * As a result isConnected() will return false after shutdown() was called.
      * After this method call, the SEService object is not connected.
-     * It is recommended to call this method in the termination method of the calling application
+     * This method should be called when connection to the Secure Element is not needed
+     * or in the termination method of the calling application
      * (or part of this application) which is bound to this SEService.
      */
     public void shutdown() {
diff --git a/core/java/android/se/omapi/Session.java b/core/java/android/se/omapi/Session.java
index adfeddd..d5f8c82 100644
--- a/core/java/android/se/omapi/Session.java
+++ b/core/java/android/se/omapi/Session.java
@@ -39,7 +39,7 @@
  *
  * @see <a href="http://simalliance.org">SIMalliance Open Mobile API  v3.0</a>
  */
-public class Session {
+public final class Session {
 
     private final Object mLock = new Object();
     private final SEService mService;
@@ -225,6 +225,32 @@
     }
 
     /**
+     * This method is provided to ease the development of mobile application and for compliancy
+     * with existing applications.
+     * This method is equivalent to openBasicChannel(aid, P2=0x00)
+     *
+     * @param aid the AID of the Applet to be selected on this channel, as a
+     *            byte array, or null if no Applet is to be selected.
+     * @throws IOException if there is a communication problem to the reader or
+     *             the Secure Element.
+     * @throws IllegalStateException if the Secure Element session is used after
+     *             being closed.
+     * @throws IllegalArgumentException if the aid's length is not within 5 to
+     *             16 (inclusive).
+     * @throws SecurityException if the calling application cannot be granted
+     *             access to this AID or the default Applet on this
+     *             session.
+     * @throws NoSuchElementException if the AID on the Secure Element is not available or cannot be
+     *             selected.
+     * @throws UnsupportedOperationException if the given P2 parameter is not
+     *             supported by the device
+     * @return an instance of Channel if available or null.
+     */
+    public @Nullable Channel openBasicChannel(@Nullable byte[] aid) throws IOException {
+        return openBasicChannel(aid, (byte) 0x00);
+    }
+
+    /**
      * Open a logical channel with the Secure Element, selecting the Applet represented by
      * the given AID. If the AID is null, which means no Applet is to be selected on this
      * channel, the default Applet is used. It's up to the Secure Element to choose which
@@ -304,4 +330,32 @@
             }
         }
     }
+
+    /**
+     * This method is provided to ease the development of mobile application and for compliancy
+     * with existing applications.
+     * This method is equivalent to openLogicalChannel(aid, P2=0x00)
+     *
+     * @param aid the AID of the Applet to be selected on this channel, as a
+     *            byte array.
+     * @throws IOException if there is a communication problem to the reader or
+     *             the Secure Element.
+     * @throws IllegalStateException if the Secure Element is used after being
+     *             closed.
+     * @throws IllegalArgumentException if the aid's length is not within 5 to
+     *             16 (inclusive).
+     * @throws SecurityException if the calling application cannot be granted
+     *             access to this AID or the default Applet on this
+     *             session.
+     * @throws NoSuchElementException if the AID on the Secure Element is not
+     *             available or cannot be selected or a logical channel is already
+     *             open to a non-multiselectable Applet.
+     * @throws UnsupportedOperationException if the given P2 parameter is not
+     *             supported by the device.
+     * @return an instance of Channel. Null if the Secure Element is unable to
+     *         provide a new logical channel.
+     */
+    public @Nullable Channel openLogicalChannel(@Nullable byte[] aid) throws IOException {
+        return openLogicalChannel(aid, (byte) 0x00);
+    }
 }
diff --git a/core/java/android/security/ConfirmationCallback.java b/core/java/android/security/ConfirmationCallback.java
index 4670bce..fd027f0 100644
--- a/core/java/android/security/ConfirmationCallback.java
+++ b/core/java/android/security/ConfirmationCallback.java
@@ -33,22 +33,22 @@
      *
      * @param dataThatWasConfirmed the data that was confirmed, see above for the format.
      */
-    public void onConfirmedByUser(@NonNull byte[] dataThatWasConfirmed) {}
+    public void onConfirmed(@NonNull byte[] dataThatWasConfirmed) {}
 
     /**
      * Called when the requested prompt was dismissed (not accepted) by the user.
      */
-    public void onDismissedByUser() {}
+    public void onDismissed() {}
 
     /**
      * Called when the requested prompt was dismissed by the application.
      */
-    public void onDismissedByApplication() {}
+    public void onCanceled() {}
 
     /**
      * Called when the requested prompt was dismissed because of a low-level error.
      *
-     * @param e an exception representing the error.
+     * @param e a throwable representing the error.
      */
-    public void onError(Exception e) {}
+    public void onError(Throwable e) {}
 }
diff --git a/core/java/android/security/ConfirmationDialog.java b/core/java/android/security/ConfirmationPrompt.java
similarity index 88%
rename from core/java/android/security/ConfirmationDialog.java
rename to core/java/android/security/ConfirmationPrompt.java
index 1697106..5330cff 100644
--- a/core/java/android/security/ConfirmationDialog.java
+++ b/core/java/android/security/ConfirmationPrompt.java
@@ -68,7 +68,7 @@
  * {@link #presentPrompt presentPrompt()} method. The <i>Relying Party</i> stores the nonce locally
  * since it'll use it in a later step.
  * <li> If the user approves the prompt a <i>Confirmation Response</i> is returned in the
- * {@link ConfirmationCallback#onConfirmedByUser onConfirmedByUser(byte[])} callback as the
+ * {@link ConfirmationCallback#onConfirmed onConfirmed(byte[])} callback as the
  * <code>dataThatWasConfirmed</code> parameter. This blob contains the text that was shown to the
  * user, the <code>extraData</code> parameter, and possibly other data.
  * <li> The application signs the <i>Confirmation Response</i> with the previously created key and
@@ -82,8 +82,8 @@
  * last bullet, is to have the <i>Relying Party</i> generate <code>promptText</code> and store it
  * along the nonce in the <code>extraData</code> blob.
  */
-public class ConfirmationDialog {
-    private static final String TAG = "ConfirmationDialog";
+public class ConfirmationPrompt {
+    private static final String TAG = "ConfirmationPrompt";
 
     private CharSequence mPromptText;
     private byte[] mExtraData;
@@ -97,15 +97,15 @@
             ConfirmationCallback callback) {
         switch (responseCode) {
             case KeyStore.CONFIRMATIONUI_OK:
-                callback.onConfirmedByUser(dataThatWasConfirmed);
+                callback.onConfirmed(dataThatWasConfirmed);
                 break;
 
             case KeyStore.CONFIRMATIONUI_CANCELED:
-                callback.onDismissedByUser();
+                callback.onDismissed();
                 break;
 
             case KeyStore.CONFIRMATIONUI_ABORTED:
-                callback.onDismissedByApplication();
+                callback.onCanceled();
                 break;
 
             case KeyStore.CONFIRMATIONUI_SYSTEM_ERROR:
@@ -145,21 +145,25 @@
             };
 
     /**
-     * A builder that collects arguments, to be shown on the system-provided confirmation dialog.
+     * A builder that collects arguments, to be shown on the system-provided confirmation prompt.
      */
-    public static class Builder {
+    public static final class Builder {
 
+        private Context mContext;
         private CharSequence mPromptText;
         private byte[] mExtraData;
 
         /**
-         * Creates a builder for the confirmation dialog.
+         * Creates a builder for the confirmation prompt.
+         *
+         * @param context the application context
          */
-        public Builder() {
+        public Builder(Context context) {
+            mContext = context;
         }
 
         /**
-         * Sets the prompt text for the dialog.
+         * Sets the prompt text for the prompt.
          *
          * @param promptText the text to present in the prompt.
          * @return the builder.
@@ -170,7 +174,7 @@
         }
 
         /**
-         * Sets the extra data for the dialog.
+         * Sets the extra data for the prompt.
          *
          * @param extraData data to include in the response data.
          * @return the builder.
@@ -181,24 +185,23 @@
         }
 
         /**
-         * Creates a {@link ConfirmationDialog} with the arguments supplied to this builder.
+         * Creates a {@link ConfirmationPrompt} with the arguments supplied to this builder.
          *
-         * @param context the application context
-         * @return a {@link ConfirmationDialog}
+         * @return a {@link ConfirmationPrompt}
          * @throws IllegalArgumentException if any of the required fields are not set.
          */
-        public ConfirmationDialog build(Context context) {
+        public ConfirmationPrompt build() {
             if (TextUtils.isEmpty(mPromptText)) {
                 throw new IllegalArgumentException("prompt text must be set and non-empty");
             }
             if (mExtraData == null) {
                 throw new IllegalArgumentException("extraData must be set");
             }
-            return new ConfirmationDialog(context, mPromptText, mExtraData);
+            return new ConfirmationPrompt(mContext, mPromptText, mExtraData);
         }
     }
 
-    private ConfirmationDialog(Context context, CharSequence promptText, byte[] extraData) {
+    private ConfirmationPrompt(Context context, CharSequence promptText, byte[] extraData) {
         mContext = context;
         mPromptText = promptText;
         mExtraData = extraData;
@@ -227,10 +230,10 @@
         return uiOptionsAsFlags;
     }
 
-    private boolean isAccessibilityServiceRunning() {
+    private static boolean isAccessibilityServiceRunning(Context context) {
         boolean serviceRunning = false;
         try {
-            ContentResolver contentResolver = mContext.getContentResolver();
+            ContentResolver contentResolver = context.getContentResolver();
             int a11yEnabled = Settings.Secure.getInt(contentResolver,
                     Settings.Secure.ACCESSIBILITY_ENABLED);
             if (a11yEnabled == 1) {
@@ -249,12 +252,12 @@
      * When the prompt is no longer being presented, one of the methods in
      * {@link ConfirmationCallback} is called on the supplied callback object.
      *
-     * Confirmation dialogs may not be available when accessibility services are running so this
+     * Confirmation prompts may not be available when accessibility services are running so this
      * may fail with a {@link ConfirmationNotAvailableException} exception even if
      * {@link #isSupported} returns {@code true}.
      *
      * @param executor the executor identifying the thread that will receive the callback.
-     * @param callback the callback to use when the dialog is done showing.
+     * @param callback the callback to use when the prompt is done showing.
      * @throws IllegalArgumentException if the prompt text is too long or malfomed.
      * @throws ConfirmationAlreadyPresentingException if another prompt is being presented.
      * @throws ConfirmationNotAvailableException if confirmation prompts are not supported.
@@ -265,7 +268,7 @@
         if (mCallback != null) {
             throw new ConfirmationAlreadyPresentingException();
         }
-        if (isAccessibilityServiceRunning()) {
+        if (isAccessibilityServiceRunning(mContext)) {
             throw new ConfirmationNotAvailableException();
         }
         mCallback = callback;
@@ -301,7 +304,7 @@
      * Cancels a prompt currently being displayed.
      *
      * On success, the
-     * {@link ConfirmationCallback#onDismissedByApplication onDismissedByApplication()} method on
+     * {@link ConfirmationCallback#onCanceled onCanceled()} method on
      * the supplied callback object will be called asynchronously.
      *
      * @throws IllegalStateException if no prompt is currently being presented.
@@ -324,9 +327,13 @@
     /**
      * Checks if the device supports confirmation prompts.
      *
+     * @param context the application context.
      * @return true if confirmation prompts are supported by the device.
      */
-    public static boolean isSupported() {
+    public static boolean isSupported(Context context) {
+        if (isAccessibilityServiceRunning(context)) {
+            return false;
+        }
         return KeyStore.getInstance().isConfirmationPromptSupported();
     }
 }
diff --git a/core/java/android/security/Scrypt.java b/core/java/android/security/Scrypt.java
new file mode 100644
index 0000000..edf8d31
--- /dev/null
+++ b/core/java/android/security/Scrypt.java
@@ -0,0 +1,32 @@
+/*
+ * 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.security;
+
+/**
+ * A Java wrapper for the JNI function to perform the password hashing algorithm SCRYPT.
+ *
+ * @hide
+ */
+public class Scrypt {
+
+    native byte[] nativeScrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen);
+
+    /** Computes the password hashing algorithm SCRYPT. */
+    public byte[] scrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen) {
+        return nativeScrypt(password, salt, n, r, p, outLen);
+    }
+}
diff --git a/core/java/android/security/keystore/BackwardsCompat.java b/core/java/android/security/keystore/BackwardsCompat.java
deleted file mode 100644
index cf5fe1f..0000000
--- a/core/java/android/security/keystore/BackwardsCompat.java
+++ /dev/null
@@ -1,127 +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.security.keystore;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-
-/**
- * Helpers for converting classes between old and new API, so we can preserve backwards
- * compatibility while teamfooding. This will be removed soon.
- *
- * @hide
- */
-class BackwardsCompat {
-
-
-    static KeychainProtectionParams toLegacyKeychainProtectionParams(
-            android.security.keystore.recovery.KeyChainProtectionParams keychainProtectionParams
-    ) {
-        return new KeychainProtectionParams.Builder()
-                .setUserSecretType(keychainProtectionParams.getUserSecretType())
-                .setSecret(keychainProtectionParams.getSecret())
-                .setLockScreenUiFormat(keychainProtectionParams.getLockScreenUiFormat())
-                .setKeyDerivationParams(
-                        toLegacyKeyDerivationParams(
-                                keychainProtectionParams.getKeyDerivationParams()))
-                .build();
-    }
-
-    static KeyDerivationParams toLegacyKeyDerivationParams(
-            android.security.keystore.recovery.KeyDerivationParams keyDerivationParams
-    ) {
-        return new KeyDerivationParams(
-                keyDerivationParams.getAlgorithm(), keyDerivationParams.getSalt());
-    }
-
-    static WrappedApplicationKey toLegacyWrappedApplicationKey(
-            android.security.keystore.recovery.WrappedApplicationKey wrappedApplicationKey
-    ) {
-        return new WrappedApplicationKey.Builder()
-                .setAlias(wrappedApplicationKey.getAlias())
-                .setEncryptedKeyMaterial(wrappedApplicationKey.getEncryptedKeyMaterial())
-                .build();
-    }
-
-    static android.security.keystore.recovery.KeyDerivationParams fromLegacyKeyDerivationParams(
-            KeyDerivationParams keyDerivationParams
-    ) {
-        return android.security.keystore.recovery.KeyDerivationParams.createSha256Params(
-                keyDerivationParams.getSalt());
-    }
-
-    static android.security.keystore.recovery.WrappedApplicationKey fromLegacyWrappedApplicationKey(
-            WrappedApplicationKey wrappedApplicationKey
-    ) {
-        return new android.security.keystore.recovery.WrappedApplicationKey.Builder()
-                .setAlias(wrappedApplicationKey.getAlias())
-                .setEncryptedKeyMaterial(wrappedApplicationKey.getEncryptedKeyMaterial())
-                .build();
-    }
-
-    static List<android.security.keystore.recovery.WrappedApplicationKey>
-            fromLegacyWrappedApplicationKeys(List<WrappedApplicationKey> wrappedApplicationKeys
-    ) {
-        return map(wrappedApplicationKeys, BackwardsCompat::fromLegacyWrappedApplicationKey);
-    }
-
-    static List<android.security.keystore.recovery.KeyChainProtectionParams>
-            fromLegacyKeychainProtectionParams(
-                    List<KeychainProtectionParams> keychainProtectionParams) {
-        return map(keychainProtectionParams, BackwardsCompat::fromLegacyKeychainProtectionParam);
-    }
-
-    static android.security.keystore.recovery.KeyChainProtectionParams
-            fromLegacyKeychainProtectionParam(KeychainProtectionParams keychainProtectionParams) {
-        return new android.security.keystore.recovery.KeyChainProtectionParams.Builder()
-                .setUserSecretType(keychainProtectionParams.getUserSecretType())
-                .setSecret(keychainProtectionParams.getSecret())
-                .setLockScreenUiFormat(keychainProtectionParams.getLockScreenUiFormat())
-                .setKeyDerivationParams(
-                        fromLegacyKeyDerivationParams(
-                                keychainProtectionParams.getKeyDerivationParams()))
-                .build();
-    }
-
-    static KeychainSnapshot toLegacyKeychainSnapshot(
-            android.security.keystore.recovery.KeyChainSnapshot keychainSnapshot
-    ) {
-        return new KeychainSnapshot.Builder()
-                .setCounterId(keychainSnapshot.getCounterId())
-                .setEncryptedRecoveryKeyBlob(keychainSnapshot.getEncryptedRecoveryKeyBlob())
-                .setTrustedHardwarePublicKey(keychainSnapshot.getTrustedHardwarePublicKey())
-                .setSnapshotVersion(keychainSnapshot.getSnapshotVersion())
-                .setMaxAttempts(keychainSnapshot.getMaxAttempts())
-                .setServerParams(keychainSnapshot.getServerParams())
-                .setKeychainProtectionParams(
-                        map(keychainSnapshot.getKeyChainProtectionParams(),
-                                BackwardsCompat::toLegacyKeychainProtectionParams))
-                .setWrappedApplicationKeys(
-                        map(keychainSnapshot.getWrappedApplicationKeys(),
-                                BackwardsCompat::toLegacyWrappedApplicationKey))
-                .build();
-    }
-
-    static <A, B> List<B> map(List<A> as, Function<A, B> f) {
-        ArrayList<B> bs = new ArrayList<>(as.size());
-        for (A a : as) {
-            bs.add(f.apply(a));
-        }
-        return bs;
-    }
-}
diff --git a/core/java/android/security/keystore/BadCertificateFormatException.java b/core/java/android/security/keystore/BadCertificateFormatException.java
deleted file mode 100644
index c51b773..0000000
--- a/core/java/android/security/keystore/BadCertificateFormatException.java
+++ /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.
- */
-
-package android.security.keystore;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.BadCertificateFormatException}.
- * @hide
- */
-public class BadCertificateFormatException extends RecoveryControllerException {
-    public BadCertificateFormatException(String msg) {
-        super(msg);
-    }
-}
diff --git a/core/java/android/security/keystore/DecryptionFailedException.java b/core/java/android/security/keystore/DecryptionFailedException.java
deleted file mode 100644
index c0b52f7..0000000
--- a/core/java/android/security/keystore/DecryptionFailedException.java
+++ /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.
- */
-
-package android.security.keystore;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.DecryptionFailedException}.
- * @hide
- */
-public class DecryptionFailedException extends RecoveryControllerException {
-
-    public DecryptionFailedException(String msg) {
-        super(msg);
-    }
-}
diff --git a/core/java/android/security/keystore/InternalRecoveryServiceException.java b/core/java/android/security/keystore/InternalRecoveryServiceException.java
deleted file mode 100644
index 40076f7..0000000
--- a/core/java/android/security/keystore/InternalRecoveryServiceException.java
+++ /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.
- */
-
-package android.security.keystore;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.InternalRecoveryServiceException}.
- * @hide
- */
-public class InternalRecoveryServiceException extends RecoveryControllerException {
-    public InternalRecoveryServiceException(String msg) {
-        super(msg);
-    }
-
-    public InternalRecoveryServiceException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/core/java/android/security/keystore/KeyDerivationParams.java b/core/java/android/security/keystore/KeyDerivationParams.java
deleted file mode 100644
index e475dc3..0000000
--- a/core/java/android/security/keystore/KeyDerivationParams.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.util.Preconditions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.KeyDerivationParams}.
- * @hide
- */
-public final class KeyDerivationParams implements Parcelable {
-    private final int mAlgorithm;
-    private byte[] mSalt;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"ALGORITHM_"}, value = {ALGORITHM_SHA256, ALGORITHM_ARGON2ID})
-    public @interface KeyDerivationAlgorithm {
-    }
-
-    /**
-     * Salted SHA256
-     */
-    public static final int ALGORITHM_SHA256 = 1;
-
-    /**
-     * Argon2ID
-     * @hide
-     */
-    // TODO: add Argon2ID support.
-    public static final int ALGORITHM_ARGON2ID = 2;
-
-    /**
-     * Creates instance of the class to to derive key using salted SHA256 hash.
-     */
-    public static KeyDerivationParams createSha256Params(@NonNull byte[] salt) {
-        return new KeyDerivationParams(ALGORITHM_SHA256, salt);
-    }
-
-    KeyDerivationParams(@KeyDerivationAlgorithm int algorithm, @NonNull byte[] salt) {
-        mAlgorithm = algorithm;
-        mSalt = Preconditions.checkNotNull(salt);
-    }
-
-    /**
-     * Gets algorithm.
-     */
-    public @KeyDerivationAlgorithm int getAlgorithm() {
-        return mAlgorithm;
-    }
-
-    /**
-     * Gets salt.
-     */
-    public @NonNull byte[] getSalt() {
-        return mSalt;
-    }
-
-    public static final Parcelable.Creator<KeyDerivationParams> CREATOR =
-            new Parcelable.Creator<KeyDerivationParams>() {
-        public KeyDerivationParams createFromParcel(Parcel in) {
-                return new KeyDerivationParams(in);
-        }
-
-        public KeyDerivationParams[] newArray(int length) {
-            return new KeyDerivationParams[length];
-        }
-    };
-
-    /**
-     * @hide
-     */
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mAlgorithm);
-        out.writeByteArray(mSalt);
-    }
-
-    /**
-     * @hide
-     */
-    protected KeyDerivationParams(Parcel in) {
-        mAlgorithm = in.readInt();
-        mSalt = in.createByteArray();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-}
diff --git a/core/java/android/security/keystore/KeychainProtectionParams.java b/core/java/android/security/keystore/KeychainProtectionParams.java
deleted file mode 100644
index 19a087d..0000000
--- a/core/java/android/security/keystore/KeychainProtectionParams.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.util.Preconditions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.KeyChainProtectionParams}.
- * @hide
- */
-public final class KeychainProtectionParams implements Parcelable {
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({TYPE_LOCKSCREEN, TYPE_CUSTOM_PASSWORD})
-    public @interface UserSecretType {
-    }
-
-    /**
-     * Lockscreen secret is required to recover KeyStore.
-     */
-    public static final int TYPE_LOCKSCREEN = 100;
-
-    /**
-     * Custom passphrase, unrelated to lock screen, is required to recover KeyStore.
-     */
-    public static final int TYPE_CUSTOM_PASSWORD = 101;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({TYPE_PIN, TYPE_PASSWORD, TYPE_PATTERN})
-    public @interface LockScreenUiFormat {
-    }
-
-    /**
-     * Pin with digits only.
-     */
-    public static final int TYPE_PIN = 1;
-
-    /**
-     * Password. String with latin-1 characters only.
-     */
-    public static final int TYPE_PASSWORD = 2;
-
-    /**
-     * Pattern with 3 by 3 grid.
-     */
-    public static final int TYPE_PATTERN = 3;
-
-    @UserSecretType
-    private Integer mUserSecretType;
-
-    @LockScreenUiFormat
-    private Integer mLockScreenUiFormat;
-
-    /**
-     * Parameters of the key derivation function, including algorithm, difficulty, salt.
-     */
-    private KeyDerivationParams mKeyDerivationParams;
-    private byte[] mSecret; // Derived from user secret. The field must have limited visibility.
-
-    /**
-     * @param secret Constructor creates a reference to the secret. Caller must use
-     * @link {#clearSecret} to overwrite its value in memory.
-     * @hide
-     */
-    public KeychainProtectionParams(@UserSecretType int userSecretType,
-            @LockScreenUiFormat int lockScreenUiFormat,
-            @NonNull KeyDerivationParams keyDerivationParams,
-            @NonNull byte[] secret) {
-        mUserSecretType = userSecretType;
-        mLockScreenUiFormat = lockScreenUiFormat;
-        mKeyDerivationParams = Preconditions.checkNotNull(keyDerivationParams);
-        mSecret = Preconditions.checkNotNull(secret);
-    }
-
-    private KeychainProtectionParams() {
-
-    }
-
-    /**
-     * @see TYPE_LOCKSCREEN
-     * @see TYPE_CUSTOM_PASSWORD
-     */
-    public @UserSecretType int getUserSecretType() {
-        return mUserSecretType;
-    }
-
-    /**
-     * Specifies UX shown to user during recovery.
-     * Default value is {@code TYPE_LOCKSCREEN}
-     *
-     * @see TYPE_PIN
-     * @see TYPE_PASSWORD
-     * @see TYPE_PATTERN
-     */
-    public @LockScreenUiFormat int getLockScreenUiFormat() {
-        return mLockScreenUiFormat;
-    }
-
-    /**
-     * Specifies function used to derive symmetric key from user input
-     * Format is defined in separate util class.
-     */
-    public @NonNull KeyDerivationParams getKeyDerivationParams() {
-        return mKeyDerivationParams;
-    }
-
-    /**
-     * Secret derived from user input.
-     * Default value is empty array
-     *
-     * @return secret or empty array
-     */
-    public @NonNull byte[] getSecret() {
-        return mSecret;
-    }
-
-    /**
-     * Builder for creating {@link KeychainProtectionParams}.
-     */
-    public static class Builder {
-        private KeychainProtectionParams mInstance = new KeychainProtectionParams();
-
-        /**
-         * Sets user secret type.
-         *
-         * @see TYPE_LOCKSCREEN
-         * @see TYPE_CUSTOM_PASSWORD
-         * @param userSecretType The secret type
-         * @return This builder.
-         */
-        public Builder setUserSecretType(@UserSecretType int userSecretType) {
-            mInstance.mUserSecretType = userSecretType;
-            return this;
-        }
-
-        /**
-         * Sets UI format.
-         *
-         * @see TYPE_PIN
-         * @see TYPE_PASSWORD
-         * @see TYPE_PATTERN
-         * @param lockScreenUiFormat The UI format
-         * @return This builder.
-         */
-        public Builder setLockScreenUiFormat(@LockScreenUiFormat int lockScreenUiFormat) {
-            mInstance.mLockScreenUiFormat = lockScreenUiFormat;
-            return this;
-        }
-
-        /**
-         * Sets parameters of the key derivation function.
-         *
-         * @param keyDerivationParams Key derivation Params
-         * @return This builder.
-         */
-        public Builder setKeyDerivationParams(@NonNull KeyDerivationParams
-                keyDerivationParams) {
-            mInstance.mKeyDerivationParams = keyDerivationParams;
-            return this;
-        }
-
-        /**
-         * Secret derived from user input, or empty array.
-         *
-         * @param secret The secret.
-         * @return This builder.
-         */
-        public Builder setSecret(@NonNull byte[] secret) {
-            mInstance.mSecret = secret;
-            return this;
-        }
-
-
-        /**
-         * Creates a new {@link KeychainProtectionParams} instance.
-         * The instance will include default values, if {@link setSecret}
-         * or {@link setUserSecretType} were not called.
-         *
-         * @return new instance
-         * @throws NullPointerException if some required fields were not set.
-         */
-        @NonNull public KeychainProtectionParams build() {
-            if (mInstance.mUserSecretType == null) {
-                mInstance.mUserSecretType = TYPE_LOCKSCREEN;
-            }
-            Preconditions.checkNotNull(mInstance.mLockScreenUiFormat);
-            Preconditions.checkNotNull(mInstance.mKeyDerivationParams);
-            if (mInstance.mSecret == null) {
-                mInstance.mSecret = new byte[]{};
-            }
-            return mInstance;
-        }
-    }
-
-    /**
-     * Removes secret from memory than object is no longer used.
-     * Since finalizer call is not reliable, please use @link {#clearSecret} directly.
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        clearSecret();
-        super.finalize();
-    }
-
-    /**
-     * Fills mSecret with zeroes.
-     */
-    public void clearSecret() {
-        Arrays.fill(mSecret, (byte) 0);
-    }
-
-    public static final Parcelable.Creator<KeychainProtectionParams> CREATOR =
-            new Parcelable.Creator<KeychainProtectionParams>() {
-        public KeychainProtectionParams createFromParcel(Parcel in) {
-            return new KeychainProtectionParams(in);
-        }
-
-        public KeychainProtectionParams[] newArray(int length) {
-            return new KeychainProtectionParams[length];
-        }
-    };
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mUserSecretType);
-        out.writeInt(mLockScreenUiFormat);
-        out.writeTypedObject(mKeyDerivationParams, flags);
-        out.writeByteArray(mSecret);
-    }
-
-    /**
-     * @hide
-     */
-    protected KeychainProtectionParams(Parcel in) {
-        mUserSecretType = in.readInt();
-        mLockScreenUiFormat = in.readInt();
-        mKeyDerivationParams = in.readTypedObject(KeyDerivationParams.CREATOR);
-        mSecret = in.createByteArray();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-}
diff --git a/core/java/android/security/keystore/KeychainSnapshot.java b/core/java/android/security/keystore/KeychainSnapshot.java
deleted file mode 100644
index cf18fd1..0000000
--- a/core/java/android/security/keystore/KeychainSnapshot.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.util.Preconditions;
-
-import java.util.List;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.KeyChainSnapshot}.
- * @hide
- */
-public final class KeychainSnapshot implements Parcelable {
-    private static final int DEFAULT_MAX_ATTEMPTS = 10;
-    private static final long DEFAULT_COUNTER_ID = 1L;
-
-    private int mSnapshotVersion;
-    private int mMaxAttempts = DEFAULT_MAX_ATTEMPTS;
-    private long mCounterId = DEFAULT_COUNTER_ID;
-    private byte[] mServerParams;
-    private byte[] mPublicKey;
-    private List<KeychainProtectionParams> mKeychainProtectionParams;
-    private List<WrappedApplicationKey> mEntryRecoveryData;
-    private byte[] mEncryptedRecoveryKeyBlob;
-
-    /**
-     * @hide
-     * Deprecated, consider using builder.
-     */
-    public KeychainSnapshot(
-            int snapshotVersion,
-            @NonNull List<KeychainProtectionParams> keychainProtectionParams,
-            @NonNull List<WrappedApplicationKey> wrappedApplicationKeys,
-            @NonNull byte[] encryptedRecoveryKeyBlob) {
-        mSnapshotVersion = snapshotVersion;
-        mKeychainProtectionParams =
-                Preconditions.checkCollectionElementsNotNull(keychainProtectionParams,
-                        "keychainProtectionParams");
-        mEntryRecoveryData = Preconditions.checkCollectionElementsNotNull(wrappedApplicationKeys,
-                "wrappedApplicationKeys");
-        mEncryptedRecoveryKeyBlob = Preconditions.checkNotNull(encryptedRecoveryKeyBlob);
-    }
-
-    private KeychainSnapshot() {
-
-    }
-
-    /**
-     * Snapshot version for given account. It is incremented when user secret or list of application
-     * keys changes.
-     */
-    public int getSnapshotVersion() {
-        return mSnapshotVersion;
-    }
-
-    /**
-     * Number of user secret guesses allowed during Keychain recovery.
-     */
-    public int getMaxAttempts() {
-        return mMaxAttempts;
-    }
-
-    /**
-     * CounterId which is rotated together with user secret.
-     */
-    public long getCounterId() {
-        return mCounterId;
-    }
-
-    /**
-     * Server parameters.
-     */
-    public @NonNull byte[] getServerParams() {
-        return mServerParams;
-    }
-
-    /**
-     * Public key used to encrypt {@code encryptedRecoveryKeyBlob}.
-     *
-     * See implementation for binary key format
-     */
-    // TODO: document key format.
-    public @NonNull byte[] getTrustedHardwarePublicKey() {
-        return mPublicKey;
-    }
-
-    /**
-     * UI and key derivation parameters. Note that combination of secrets may be used.
-     */
-    public @NonNull List<KeychainProtectionParams> getKeychainProtectionParams() {
-        return mKeychainProtectionParams;
-    }
-
-    /**
-     * List of application keys, with key material encrypted by
-     * the recovery key ({@link #getEncryptedRecoveryKeyBlob}).
-     */
-    public @NonNull List<WrappedApplicationKey> getWrappedApplicationKeys() {
-        return mEntryRecoveryData;
-    }
-
-    /**
-     * Recovery key blob, encrypted by user secret and recovery service public key.
-     */
-    public @NonNull byte[] getEncryptedRecoveryKeyBlob() {
-        return mEncryptedRecoveryKeyBlob;
-    }
-
-    public static final Parcelable.Creator<KeychainSnapshot> CREATOR =
-            new Parcelable.Creator<KeychainSnapshot>() {
-        public KeychainSnapshot createFromParcel(Parcel in) {
-            return new KeychainSnapshot(in);
-        }
-
-        public KeychainSnapshot[] newArray(int length) {
-            return new KeychainSnapshot[length];
-        }
-    };
-
-    /**
-     * Builder for creating {@link KeychainSnapshot}.
-     *
-     * @hide
-     */
-    public static class Builder {
-        private KeychainSnapshot mInstance = new KeychainSnapshot();
-
-        /**
-         * Snapshot version for given account.
-         *
-         * @param snapshotVersion The snapshot version
-         * @return This builder.
-         */
-        public Builder setSnapshotVersion(int snapshotVersion) {
-            mInstance.mSnapshotVersion = snapshotVersion;
-            return this;
-        }
-
-        /**
-         * Sets the number of user secret guesses allowed during Keychain recovery.
-         *
-         * @param maxAttempts The maximum number of guesses.
-         * @return This builder.
-         */
-        public Builder setMaxAttempts(int maxAttempts) {
-            mInstance.mMaxAttempts = maxAttempts;
-            return this;
-        }
-
-        /**
-         * Sets counter id.
-         *
-         * @param counterId The counter id.
-         * @return This builder.
-         */
-        public Builder setCounterId(long counterId) {
-            mInstance.mCounterId = counterId;
-            return this;
-        }
-
-        /**
-         * Sets server parameters.
-         *
-         * @param serverParams The server parameters
-         * @return This builder.
-         */
-        public Builder setServerParams(byte[] serverParams) {
-            mInstance.mServerParams = serverParams;
-            return this;
-        }
-
-        /**
-         * Sets public key used to encrypt recovery blob.
-         *
-         * @param publicKey The public key
-         * @return This builder.
-         */
-        public Builder setTrustedHardwarePublicKey(byte[] publicKey) {
-            mInstance.mPublicKey = publicKey;
-            return this;
-        }
-
-        /**
-         * Sets UI and key derivation parameters
-         *
-         * @param recoveryMetadata The UI and key derivation parameters
-         * @return This builder.
-         */
-        public Builder setKeychainProtectionParams(
-                @NonNull List<KeychainProtectionParams> recoveryMetadata) {
-            mInstance.mKeychainProtectionParams = recoveryMetadata;
-            return this;
-        }
-
-        /**
-         * List of application keys.
-         *
-         * @param entryRecoveryData List of application keys
-         * @return This builder.
-         */
-        public Builder setWrappedApplicationKeys(List<WrappedApplicationKey> entryRecoveryData) {
-            mInstance.mEntryRecoveryData = entryRecoveryData;
-            return this;
-        }
-
-        /**
-         * Sets recovery key blob
-         *
-         * @param encryptedRecoveryKeyBlob The recovery key blob.
-         * @return This builder.
-         */
-        public Builder setEncryptedRecoveryKeyBlob(@NonNull byte[] encryptedRecoveryKeyBlob) {
-            mInstance.mEncryptedRecoveryKeyBlob = encryptedRecoveryKeyBlob;
-            return this;
-        }
-
-
-        /**
-         * Creates a new {@link KeychainSnapshot} instance.
-         *
-         * @return new instance
-         * @throws NullPointerException if some required fields were not set.
-         */
-        @NonNull public KeychainSnapshot build() {
-            Preconditions.checkCollectionElementsNotNull(mInstance.mKeychainProtectionParams,
-                    "recoveryMetadata");
-            Preconditions.checkCollectionElementsNotNull(mInstance.mEntryRecoveryData,
-                    "entryRecoveryData");
-            Preconditions.checkNotNull(mInstance.mEncryptedRecoveryKeyBlob);
-            Preconditions.checkNotNull(mInstance.mServerParams);
-            Preconditions.checkNotNull(mInstance.mPublicKey);
-            return mInstance;
-        }
-    }
-
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mSnapshotVersion);
-        out.writeTypedList(mKeychainProtectionParams);
-        out.writeByteArray(mEncryptedRecoveryKeyBlob);
-        out.writeTypedList(mEntryRecoveryData);
-    }
-
-    /**
-     * @hide
-     */
-    protected KeychainSnapshot(Parcel in) {
-        mSnapshotVersion = in.readInt();
-        mKeychainProtectionParams = in.createTypedArrayList(KeychainProtectionParams.CREATOR);
-        mEncryptedRecoveryKeyBlob = in.createByteArray();
-        mEntryRecoveryData = in.createTypedArrayList(WrappedApplicationKey.CREATOR);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-}
diff --git a/core/java/android/security/keystore/LockScreenRequiredException.java b/core/java/android/security/keystore/LockScreenRequiredException.java
deleted file mode 100644
index 0970284..0000000
--- a/core/java/android/security/keystore/LockScreenRequiredException.java
+++ /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.
- */
-
-package android.security.keystore;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.LockScreenRequiredException}.
- * @hide
- */
-public class LockScreenRequiredException extends RecoveryControllerException {
-    public LockScreenRequiredException(String msg) {
-        super(msg);
-    }
-}
diff --git a/core/java/android/security/keystore/RecoveryClaim.java b/core/java/android/security/keystore/RecoveryClaim.java
deleted file mode 100644
index 12be607..0000000
--- a/core/java/android/security/keystore/RecoveryClaim.java
+++ /dev/null
@@ -1,53 +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.security.keystore;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.RecoverySession}.
- * @hide
- */
-public class RecoveryClaim {
-
-    private final RecoverySession mRecoverySession;
-    private final byte[] mClaimBytes;
-
-    RecoveryClaim(RecoverySession recoverySession, byte[] claimBytes) {
-        mRecoverySession = recoverySession;
-        mClaimBytes = claimBytes;
-    }
-
-    /**
-     * Returns the session associated with the recovery attempt. This is used to match the symmetric
-     * key, which remains internal to the framework, for decrypting the claim response.
-     *
-     * @return The session data.
-     */
-    public RecoverySession getRecoverySession() {
-        return mRecoverySession;
-    }
-
-    /**
-     * Returns the encrypted claim's bytes.
-     *
-     * <p>This should be sent by the recovery agent to the remote secure hardware, which will use
-     * it to decrypt the keychain, before sending it re-encrypted with the session's symmetric key
-     * to the device.
-     */
-    public byte[] getClaimBytes() {
-        return mClaimBytes;
-    }
-}
diff --git a/core/java/android/security/keystore/RecoveryController.java b/core/java/android/security/keystore/RecoveryController.java
deleted file mode 100644
index ca67e35b..0000000
--- a/core/java/android/security/keystore/RecoveryController.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.app.PendingIntent;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.RemoteException;
-import android.os.ServiceSpecificException;
-import android.util.Log;
-
-import com.android.internal.widget.ILockSettings;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.RecoveryController}.
- * @hide
- */
-public class RecoveryController {
-    private static final String TAG = "RecoveryController";
-
-    /** Key has been successfully synced. */
-    public static final int RECOVERY_STATUS_SYNCED = 0;
-    /** Waiting for recovery agent to sync the key. */
-    public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1;
-    /** Recovery account is not available. */
-    public static final int RECOVERY_STATUS_MISSING_ACCOUNT = 2;
-    /** Key cannot be synced. */
-    public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3;
-
-    /**
-     * Failed because no snapshot is yet pending to be synced for the user.
-     *
-     * @hide
-     */
-    public static final int ERROR_NO_SNAPSHOT_PENDING = 21;
-
-    /**
-     * Failed due to an error internal to the recovery service. This is unexpected and indicates
-     * either a problem with the logic in the service, or a problem with a dependency of the
-     * service (such as AndroidKeyStore).
-     *
-     * @hide
-     */
-    public static final int ERROR_SERVICE_INTERNAL_ERROR = 22;
-
-    /**
-     * Failed because the user does not have a lock screen set.
-     *
-     * @hide
-     */
-    public static final int ERROR_INSECURE_USER = 23;
-
-    /**
-     * Error thrown when attempting to use a recovery session that has since been closed.
-     *
-     * @hide
-     */
-    public static final int ERROR_SESSION_EXPIRED = 24;
-
-    /**
-     * Failed because the provided certificate was not a valid X509 certificate.
-     *
-     * @hide
-     */
-    public static final int ERROR_BAD_CERTIFICATE_FORMAT = 25;
-
-    /**
-     * Error thrown if decryption failed. This might be because the tag is wrong, the key is wrong,
-     * the data has become corrupted, the data has been tampered with, etc.
-     *
-     * @hide
-     */
-    public static final int ERROR_DECRYPTION_FAILED = 26;
-
-
-    private final ILockSettings mBinder;
-
-    private RecoveryController(ILockSettings binder) {
-        mBinder = binder;
-    }
-
-    /**
-     * Deprecated.
-     * Gets a new instance of the class.
-     */
-    public static RecoveryController getInstance() {
-        throw new UnsupportedOperationException("using Deprecated RecoveryController version");
-    }
-
-    /**
-     * Initializes key recovery service for the calling application. RecoveryController
-     * randomly chooses one of the keys from the list and keeps it to use for future key export
-     * operations. Collection of all keys in the list must be signed by the provided {@code
-     * rootCertificateAlias}, which must also be present in the list of root certificates
-     * preinstalled on the device. The random selection allows RecoveryController to select
-     * which of a set of remote recovery service devices will be used.
-     *
-     * <p>In addition, RecoveryController enforces a delay of three months between
-     * consecutive initialization attempts, to limit the ability of an attacker to often switch
-     * remote recovery devices and significantly increase number of recovery attempts.
-     *
-     * @param rootCertificateAlias alias of a root certificate preinstalled on the device
-     * @param signedPublicKeyList binary blob a list of X509 certificates and signature
-     * @throws BadCertificateFormatException if the {@code signedPublicKeyList} is in a bad format.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void initRecoveryService(
-            @NonNull String rootCertificateAlias, @NonNull byte[] signedPublicKeyList)
-            throws BadCertificateFormatException, InternalRecoveryServiceException {
-        throw new UnsupportedOperationException("Deprecated initRecoveryService method called");
-
-    }
-
-    /**
-     * Returns data necessary to store all recoverable keys for given account. Key material is
-     * encrypted with user secret and recovery public key.
-     *
-     * @param account specific to Recovery agent.
-     * @return Data necessary to recover keystore.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public @NonNull KeychainSnapshot getRecoveryData(@NonNull byte[] account)
-            throws InternalRecoveryServiceException {
-        try {
-            return BackwardsCompat.toLegacyKeychainSnapshot(mBinder.getKeyChainSnapshot());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            if (e.errorCode == ERROR_NO_SNAPSHOT_PENDING) {
-                return null;
-            }
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Sets a listener which notifies recovery agent that new recovery snapshot is available. {@link
-     * #getRecoveryData} can be used to get the snapshot. Note that every recovery agent can have at
-     * most one registered listener at any time.
-     *
-     * @param intent triggered when new snapshot is available. Unregisters listener if the value is
-     *     {@code null}.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void setSnapshotCreatedPendingIntent(@Nullable PendingIntent intent)
-            throws InternalRecoveryServiceException {
-        try {
-            mBinder.setSnapshotCreatedPendingIntent(intent);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Returns a map from recovery agent accounts to corresponding KeyStore recovery snapshot
-     * version. Version zero is used, if no snapshots were created for the account.
-     *
-     * @return Map from recovery agent accounts to snapshot versions.
-     * @see KeychainSnapshot#getSnapshotVersion
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public @NonNull Map<byte[], Integer> getRecoverySnapshotVersions()
-            throws InternalRecoveryServiceException {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Server parameters used to generate new recovery key blobs. This value will be included in
-     * {@code KeychainSnapshot.getEncryptedRecoveryKeyBlob()}. The same value must be included
-     * in vaultParams {@link #startRecoverySession}
-     *
-     * @param serverParams included in recovery key blob.
-     * @see #getRecoveryData
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void setServerParams(byte[] serverParams) throws InternalRecoveryServiceException {
-        try {
-            mBinder.setServerParams(serverParams);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Updates recovery status for given keys. It is used to notify keystore that key was
-     * successfully stored on the server or there were an error. Application can check this value
-     * using {@code getRecoveyStatus}.
-     *
-     * @param packageName Application whose recoverable keys' statuses are to be updated.
-     * @param aliases List of application-specific key aliases. If the array is empty, updates the
-     *     status for all existing recoverable keys.
-     * @param status Status specific to recovery agent.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void setRecoveryStatus(
-            @NonNull String packageName, @Nullable String[] aliases, int status)
-            throws NameNotFoundException, InternalRecoveryServiceException {
-        try {
-            for (String alias : aliases) {
-                mBinder.setRecoveryStatus(alias, status);
-            }
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Returns a {@code Map} from Application's KeyStore key aliases to their recovery status.
-     * Negative status values are reserved for recovery agent specific codes. List of common codes:
-     *
-     * <ul>
-     *   <li>{@link #RECOVERY_STATUS_SYNCED}
-     *   <li>{@link #RECOVERY_STATUS_SYNC_IN_PROGRESS}
-     *   <li>{@link #RECOVERY_STATUS_MISSING_ACCOUNT}
-     *   <li>{@link #RECOVERY_STATUS_PERMANENT_FAILURE}
-     * </ul>
-     *
-     * @return {@code Map} from KeyStore alias to recovery status.
-     * @see #setRecoveryStatus
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public Map<String, Integer> getRecoveryStatus() throws InternalRecoveryServiceException {
-        try {
-            // IPC doesn't support generic Maps.
-            @SuppressWarnings("unchecked")
-            Map<String, Integer> result =
-                    (Map<String, Integer>) mBinder.getRecoveryStatus();
-            return result;
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Specifies a set of secret types used for end-to-end keystore encryption. Knowing all of them
-     * is necessary to recover data.
-     *
-     * @param secretTypes {@link KeychainProtectionParams#TYPE_LOCKSCREEN} or {@link
-     *     KeychainProtectionParams#TYPE_CUSTOM_PASSWORD}
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void setRecoverySecretTypes(
-            @NonNull @KeychainProtectionParams.UserSecretType int[] secretTypes)
-            throws InternalRecoveryServiceException {
-        try {
-            mBinder.setRecoverySecretTypes(secretTypes);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Defines a set of secret types used for end-to-end keystore encryption. Knowing all of them is
-     * necessary to generate KeychainSnapshot.
-     *
-     * @return list of recovery secret types
-     * @see KeychainSnapshot
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public @NonNull @KeychainProtectionParams.UserSecretType int[] getRecoverySecretTypes()
-            throws InternalRecoveryServiceException {
-        try {
-            return mBinder.getRecoverySecretTypes();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Returns a list of recovery secret types, necessary to create a pending recovery snapshot.
-     * When user enters a secret of a pending type {@link #recoverySecretAvailable} should be
-     * called.
-     *
-     * @return list of recovery secret types
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    @NonNull
-    public @KeychainProtectionParams.UserSecretType int[] getPendingRecoverySecretTypes()
-            throws InternalRecoveryServiceException {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Initializes recovery session and returns a blob with proof of recovery secrets possession.
-     * The method generates symmetric key for a session, which trusted remote device can use to
-     * return recovery key.
-     *
-     * @param verifierPublicKey Encoded {@code java.security.cert.X509Certificate} with Public key
-     * used to create the recovery blob on the source device.
-     * Keystore will verify the certificate using root of trust.
-     * @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
-     *     Used to limit number of guesses.
-     * @param vaultChallenge Data passed from server for this recovery session and used to prevent
-     *     replay attacks
-     * @param secrets Secrets provided by user, the method only uses type and secret fields.
-     * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is
-     *     encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric
-     *     key and parameters necessary to identify the counter with the number of failed recovery
-     *     attempts.
-     * @throws BadCertificateFormatException if the {@code verifierPublicKey} is in an incorrect
-     *     format.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    @NonNull public RecoveryClaim startRecoverySession(
-            @NonNull byte[] verifierPublicKey,
-            @NonNull byte[] vaultParams,
-            @NonNull byte[] vaultChallenge,
-            @NonNull List<KeychainProtectionParams> secrets)
-            throws BadCertificateFormatException, InternalRecoveryServiceException {
-        try {
-            RecoverySession recoverySession = RecoverySession.newInstance(this);
-            byte[] recoveryClaim =
-                    mBinder.startRecoverySession(
-                            recoverySession.getSessionId(),
-                            verifierPublicKey,
-                            vaultParams,
-                            vaultChallenge,
-                            BackwardsCompat.fromLegacyKeychainProtectionParams(secrets));
-            return new RecoveryClaim(recoverySession, recoveryClaim);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            if (e.errorCode == ERROR_BAD_CERTIFICATE_FORMAT) {
-                throw new BadCertificateFormatException(e.getMessage());
-            }
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Imports keys.
-     *
-     * @param session Related recovery session, as originally created by invoking
-     *        {@link #startRecoverySession(byte[], byte[], byte[], List)}.
-     * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
-     * @param applicationKeys Application keys. Key material can be decrypted using recoveryKeyBlob
-     *     and session. KeyStore only uses package names from the application info in {@link
-     *     WrappedApplicationKey}. Caller is responsibility to perform certificates check.
-     * @return Map from alias to raw key material.
-     * @throws SessionExpiredException if {@code session} has since been closed.
-     * @throws DecryptionFailedException if unable to decrypt the snapshot.
-     * @throws InternalRecoveryServiceException if an error occurs internal to the recovery service.
-     */
-    public Map<String, byte[]> recoverKeys(
-            @NonNull RecoverySession session,
-            @NonNull byte[] recoveryKeyBlob,
-            @NonNull List<WrappedApplicationKey> applicationKeys)
-            throws SessionExpiredException, DecryptionFailedException,
-            InternalRecoveryServiceException {
-        try {
-            return (Map<String, byte[]>) mBinder.recoverKeys(
-                    session.getSessionId(),
-                    recoveryKeyBlob,
-                    BackwardsCompat.fromLegacyWrappedApplicationKeys(applicationKeys));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            if (e.errorCode == ERROR_DECRYPTION_FAILED) {
-                throw new DecryptionFailedException(e.getMessage());
-            }
-            if (e.errorCode == ERROR_SESSION_EXPIRED) {
-                throw new SessionExpiredException(e.getMessage());
-            }
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    /**
-     * Deletes all data associated with {@code session}. Should not be invoked directly but via
-     * {@link RecoverySession#close()}.
-     *
-     * @hide
-     */
-    void closeSession(RecoverySession session) {
-        try {
-            mBinder.closeSession(session.getSessionId());
-        } catch (RemoteException | ServiceSpecificException e) {
-            Log.e(TAG, "Unexpected error trying to close session", e);
-        }
-    }
-
-    /**
-     * Generates a key called {@code alias} and loads it into the recoverable key store. Returns the
-     * raw material of the key.
-     *
-     * @param alias The key alias.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     * @throws LockScreenRequiredException if the user has not set a lock screen. This is required
-     *     to generate recoverable keys, as the snapshots are encrypted using a key derived from the
-     *     lock screen.
-     */
-    public byte[] generateAndStoreKey(@NonNull String alias)
-            throws InternalRecoveryServiceException, LockScreenRequiredException {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Removes a key called {@code alias} from the recoverable key store.
-     *
-     * @param alias The key alias.
-     * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
-     *     service.
-     */
-    public void removeKey(@NonNull String alias) throws InternalRecoveryServiceException {
-        try {
-            mBinder.removeKey(alias);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } catch (ServiceSpecificException e) {
-            throw wrapUnexpectedServiceSpecificException(e);
-        }
-    }
-
-    private InternalRecoveryServiceException wrapUnexpectedServiceSpecificException(
-            ServiceSpecificException e) {
-        if (e.errorCode == ERROR_SERVICE_INTERNAL_ERROR) {
-            return new InternalRecoveryServiceException(e.getMessage());
-        }
-
-        // Should never happen. If it does, it's a bug, and we need to update how the method that
-        // called this throws its exceptions.
-        return new InternalRecoveryServiceException("Unexpected error code for method: "
-                + e.errorCode, e);
-    }
-}
diff --git a/core/java/android/security/keystore/RecoveryControllerException.java b/core/java/android/security/keystore/RecoveryControllerException.java
deleted file mode 100644
index f990c23..0000000
--- a/core/java/android/security/keystore/RecoveryControllerException.java
+++ /dev/null
@@ -1,35 +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.security.keystore;
-
-import java.security.GeneralSecurityException;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.RecoveryController}.
- * @hide
- */
-public abstract class RecoveryControllerException extends GeneralSecurityException {
-    RecoveryControllerException() { }
-
-    RecoveryControllerException(String msg) {
-        super(msg);
-    }
-
-    public RecoveryControllerException(String message, Throwable cause) {
-        super(message, cause);
-    }
-}
diff --git a/core/java/android/security/keystore/RecoverySession.java b/core/java/android/security/keystore/RecoverySession.java
deleted file mode 100644
index 8a3e06b..0000000
--- a/core/java/android/security/keystore/RecoverySession.java
+++ /dev/null
@@ -1,69 +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.security.keystore;
-
-import java.security.SecureRandom;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.RecoverySession}.
- * @hide
- */
-public class RecoverySession implements AutoCloseable {
-
-    private static final int SESSION_ID_LENGTH_BYTES = 16;
-
-    private final String mSessionId;
-    private final RecoveryController mRecoveryController;
-
-    private RecoverySession(RecoveryController recoveryController, String sessionId) {
-        mRecoveryController = recoveryController;
-        mSessionId = sessionId;
-    }
-
-    /**
-     * A new session, started by {@code recoveryManager}.
-     */
-    static RecoverySession newInstance(RecoveryController recoveryController) {
-        return new RecoverySession(recoveryController, newSessionId());
-    }
-
-    /**
-     * Returns a new random session ID.
-     */
-    private static String newSessionId() {
-        SecureRandom secureRandom = new SecureRandom();
-        byte[] sessionId = new byte[SESSION_ID_LENGTH_BYTES];
-        secureRandom.nextBytes(sessionId);
-        StringBuilder sb = new StringBuilder();
-        for (byte b : sessionId) {
-            sb.append(Byte.toHexString(b, /*upperCase=*/ false));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * An internal session ID, used by the framework to match recovery claims to snapshot responses.
-     */
-    String getSessionId() {
-        return mSessionId;
-    }
-
-    @Override
-    public void close() {
-        mRecoveryController.closeSession(this);
-    }
-}
diff --git a/core/java/android/security/keystore/WrappedApplicationKey.java b/core/java/android/security/keystore/WrappedApplicationKey.java
deleted file mode 100644
index 2ce8c7d..0000000
--- a/core/java/android/security/keystore/WrappedApplicationKey.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.security.keystore;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.util.Preconditions;
-
-/**
- * @deprecated Use {@link android.security.keystore.recovery.WrappedApplicationKey}.
- * @hide
- */
-public final class WrappedApplicationKey implements Parcelable {
-    private String mAlias;
-    // The only supported format is AES-256 symmetric key.
-    private byte[] mEncryptedKeyMaterial;
-
-    /**
-     * Builder for creating {@link WrappedApplicationKey}.
-     */
-    public static class Builder {
-        private WrappedApplicationKey mInstance = new WrappedApplicationKey();
-
-        /**
-         * Sets Application-specific alias of the key.
-         *
-         * @param alias The alias.
-         * @return This builder.
-         */
-        public Builder setAlias(@NonNull String alias) {
-            mInstance.mAlias = alias;
-            return this;
-        }
-
-        /**
-         * Sets key material encrypted by recovery key.
-         *
-         * @param encryptedKeyMaterial The key material
-         * @return This builder
-         */
-
-        public Builder setEncryptedKeyMaterial(@NonNull byte[] encryptedKeyMaterial) {
-            mInstance.mEncryptedKeyMaterial = encryptedKeyMaterial;
-            return this;
-        }
-
-        /**
-         * Creates a new {@link WrappedApplicationKey} instance.
-         *
-         * @return new instance
-         * @throws NullPointerException if some required fields were not set.
-         */
-        @NonNull public WrappedApplicationKey build() {
-            Preconditions.checkNotNull(mInstance.mAlias);
-            Preconditions.checkNotNull(mInstance.mEncryptedKeyMaterial);
-            return mInstance;
-        }
-    }
-
-    private WrappedApplicationKey() {
-
-    }
-
-    /**
-     * Deprecated - consider using Builder.
-     * @hide
-     */
-    public WrappedApplicationKey(@NonNull String alias, @NonNull byte[] encryptedKeyMaterial) {
-        mAlias = Preconditions.checkNotNull(alias);
-        mEncryptedKeyMaterial = Preconditions.checkNotNull(encryptedKeyMaterial);
-    }
-
-    /**
-     * Application-specific alias of the key.
-     *
-     * @see java.security.KeyStore.aliases
-     */
-    public @NonNull String getAlias() {
-        return mAlias;
-    }
-
-    /** Key material encrypted by recovery key. */
-    public @NonNull byte[] getEncryptedKeyMaterial() {
-        return mEncryptedKeyMaterial;
-    }
-
-    public static final Parcelable.Creator<WrappedApplicationKey> CREATOR =
-            new Parcelable.Creator<WrappedApplicationKey>() {
-                public WrappedApplicationKey createFromParcel(Parcel in) {
-                    return new WrappedApplicationKey(in);
-                }
-
-                public WrappedApplicationKey[] newArray(int length) {
-                    return new WrappedApplicationKey[length];
-                }
-            };
-
-    /**
-     * @hide
-     */
-    @Override
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeString(mAlias);
-        out.writeByteArray(mEncryptedKeyMaterial);
-    }
-
-    /**
-     * @hide
-     */
-    protected WrappedApplicationKey(Parcel in) {
-        mAlias = in.readString();
-        mEncryptedKeyMaterial = in.createByteArray();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-}
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index ab3ed91..f351c5a 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -250,6 +250,16 @@
      */
     public static final int ERROR_INVALID_CERTIFICATE = 28;
 
+
+    /**
+     * Failed because the provided certificate contained serial version which is lower that the
+     * version device is already initialized with. It is not possible to downgrade serial version of
+     * the provided certificate.
+     *
+     * @hide
+     */
+    public static final int ERROR_DOWNGRADE_CERTIFICATE = 29;
+
     private final ILockSettings mBinder;
     private final KeyStore mKeyStore;
 
@@ -285,7 +295,17 @@
     public void initRecoveryService(
             @NonNull String rootCertificateAlias, @NonNull byte[] signedPublicKeyList)
             throws CertificateException, InternalRecoveryServiceException {
-        throw new CertificateException("Deprecated initRecoveryService method called");
+        try {
+            mBinder.initRecoveryService(rootCertificateAlias, signedPublicKeyList);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        } catch (ServiceSpecificException e) {
+            if (e.errorCode == ERROR_BAD_CERTIFICATE_FORMAT
+                    || e.errorCode == ERROR_INVALID_CERTIFICATE) {
+                throw new CertificateException("Invalid certificate for recovery service", e);
+            }
+            throw wrapUnexpectedServiceSpecificException(e);
+        }
     }
 
     /**
@@ -330,6 +350,10 @@
                     || e.errorCode == ERROR_INVALID_CERTIFICATE) {
                 throw new CertificateException("Invalid certificate for recovery service", e);
             }
+            if (e.errorCode == ERROR_DOWNGRADE_CERTIFICATE) {
+                throw new CertificateException(
+                        "Downgrading certificate serial version isn't supported.", e);
+            }
             throw wrapUnexpectedServiceSpecificException(e);
         }
     }
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 3726e66..32737c5 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -28,6 +28,7 @@
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
 import android.app.NotificationManager;
+import android.app.Person;
 import android.app.Service;
 import android.companion.CompanionDeviceManager;
 import android.content.ComponentName;
@@ -1195,13 +1196,13 @@
      */
     private void maybePopulatePeople(Notification notification) {
         if (getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P) {
-            ArrayList<Notification.Person> people = notification.extras.getParcelableArrayList(
+            ArrayList<Person> people = notification.extras.getParcelableArrayList(
                     Notification.EXTRA_PEOPLE_LIST);
             if (people != null && people.isEmpty()) {
                 int size = people.size();
                 String[] peopleArray = new String[size];
                 for (int i = 0; i < size; i++) {
-                    Notification.Person person = people.get(i);
+                    Person person = people.get(i);
                     peopleArray[i] = person.resolveToLegacyUri();
                 }
                 notification.extras.putStringArray(Notification.EXTRA_PEOPLE, peopleArray);
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 3830b7a..daecea7 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -1487,14 +1487,18 @@
     /**
      * Returns a description of the current do not disturb settings from config.
      * - If turned on manually and end time is known, returns end time.
+     * - If turned on manually and end time is on forever until turned off, return null if
+     * describeForeverCondition is false, else return String describing indefinite behavior
      * - If turned on by an automatic rule, returns the automatic rule name.
      * - If on due to an app, returns the app name.
      * - If there's a combination of rules/apps that trigger, then shows the one that will
      *  last the longest if applicable.
-     * @return null if do not disturb is off.
+     * @return null if DND is off or describeForeverCondition is false and
+     * DND is on forever (until turned off)
      */
-    public static String getDescription(Context context, boolean zenOn, ZenModeConfig config) {
-        if (!zenOn) {
+    public static String getDescription(Context context, boolean zenOn, ZenModeConfig config,
+            boolean describeForeverCondition) {
+        if (!zenOn || config == null) {
             return null;
         }
 
@@ -1513,8 +1517,11 @@
             } else {
                 if (id == null) {
                     // Do not disturb manually triggered to remain on forever until turned off
-                    // No subtext
-                    return null;
+                    if (describeForeverCondition) {
+                        return context.getString(R.string.zen_mode_forever);
+                    } else {
+                        return null;
+                    }
                 } else {
                     latestEndTime = tryParseCountdownConditionId(id);
                     if (latestEndTime > 0) {
diff --git a/core/java/android/service/textclassifier/ITextClassifierService.aidl b/core/java/android/service/textclassifier/ITextClassifierService.aidl
index 25e9d45..7ac72c7 100644
--- a/core/java/android/service/textclassifier/ITextClassifierService.aidl
+++ b/core/java/android/service/textclassifier/ITextClassifierService.aidl
@@ -21,30 +21,41 @@
 import android.service.textclassifier.ITextSelectionCallback;
 import android.view.textclassifier.SelectionEvent;
 import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationContext;
+import android.view.textclassifier.TextClassificationSessionId;
 import android.view.textclassifier.TextLinks;
 import android.view.textclassifier.TextSelection;
 
 /**
  * TextClassifierService binder interface.
- * See TextClassifier (and TextClassifier.Logger) for interface documentation.
+ * See TextClassifier for interface documentation.
  * {@hide}
  */
 oneway interface ITextClassifierService {
 
     void onSuggestSelection(
-            in CharSequence text, int selectionStartIndex, int selectionEndIndex,
-            in TextSelection.Options options,
-            in ITextSelectionCallback c);
+            in TextClassificationSessionId sessionId,
+            in TextSelection.Request request,
+            in ITextSelectionCallback callback);
 
     void onClassifyText(
-            in CharSequence text, int startIndex, int endIndex,
-            in TextClassification.Options options,
-            in ITextClassificationCallback c);
+            in TextClassificationSessionId sessionId,
+            in TextClassification.Request request,
+            in ITextClassificationCallback callback);
 
     void onGenerateLinks(
-            in CharSequence text,
-            in TextLinks.Options options,
-            in ITextLinksCallback c);
+            in TextClassificationSessionId sessionId,
+            in TextLinks.Request request,
+            in ITextLinksCallback callback);
 
-    void onSelectionEvent(in SelectionEvent event);
+    void onSelectionEvent(
+            in TextClassificationSessionId sessionId,
+            in SelectionEvent event);
+
+    void onCreateTextClassificationSession(
+            in TextClassificationContext context,
+            in TextClassificationSessionId sessionId);
+
+    void onDestroyTextClassificationSession(
+            in TextClassificationSessionId sessionId);
 }
diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java
index 88e29b0..b461c0d 100644
--- a/core/java/android/service/textclassifier/TextClassifierService.java
+++ b/core/java/android/service/textclassifier/TextClassifierService.java
@@ -35,11 +35,15 @@
 import android.util.Slog;
 import android.view.textclassifier.SelectionEvent;
 import android.view.textclassifier.TextClassification;
+import android.view.textclassifier.TextClassificationContext;
 import android.view.textclassifier.TextClassificationManager;
+import android.view.textclassifier.TextClassificationSessionId;
 import android.view.textclassifier.TextClassifier;
 import android.view.textclassifier.TextLinks;
 import android.view.textclassifier.TextSelection;
 
+import com.android.internal.util.Preconditions;
+
 /**
  * Abstract base class for the TextClassifier service.
  *
@@ -88,11 +92,14 @@
         /** {@inheritDoc} */
         @Override
         public void onSuggestSelection(
-                CharSequence text, int selectionStartIndex, int selectionEndIndex,
-                TextSelection.Options options, ITextSelectionCallback callback)
+                TextClassificationSessionId sessionId,
+                TextSelection.Request request, ITextSelectionCallback callback)
                 throws RemoteException {
+            Preconditions.checkNotNull(request);
+            Preconditions.checkNotNull(callback);
             TextClassifierService.this.onSuggestSelection(
-                    text, selectionStartIndex, selectionEndIndex, options, mCancellationSignal,
+                    request.getText(), request.getStartIndex(), request.getEndIndex(),
+                    TextSelection.Options.from(sessionId, request), mCancellationSignal,
                     new Callback<TextSelection>() {
                         @Override
                         public void onSuccess(TextSelection result) {
@@ -119,11 +126,14 @@
         /** {@inheritDoc} */
         @Override
         public void onClassifyText(
-                CharSequence text, int startIndex, int endIndex,
-                TextClassification.Options options, ITextClassificationCallback callback)
+                TextClassificationSessionId sessionId,
+                TextClassification.Request request, ITextClassificationCallback callback)
                 throws RemoteException {
+            Preconditions.checkNotNull(request);
+            Preconditions.checkNotNull(callback);
             TextClassifierService.this.onClassifyText(
-                    text, startIndex, endIndex, options, mCancellationSignal,
+                    request.getText(), request.getStartIndex(), request.getEndIndex(),
+                    TextClassification.Options.from(sessionId, request), mCancellationSignal,
                     new Callback<TextClassification>() {
                         @Override
                         public void onSuccess(TextClassification result) {
@@ -148,10 +158,14 @@
         /** {@inheritDoc} */
         @Override
         public void onGenerateLinks(
-                CharSequence text, TextLinks.Options options, ITextLinksCallback callback)
+                TextClassificationSessionId sessionId,
+                TextLinks.Request request, ITextLinksCallback callback)
                 throws RemoteException {
+            Preconditions.checkNotNull(request);
+            Preconditions.checkNotNull(callback);
             TextClassifierService.this.onGenerateLinks(
-                    text, options, mCancellationSignal,
+                    request.getText(), TextLinks.Options.from(sessionId, request),
+                    mCancellationSignal,
                     new Callback<TextLinks>() {
                         @Override
                         public void onSuccess(TextLinks result) {
@@ -175,8 +189,28 @@
 
         /** {@inheritDoc} */
         @Override
-        public void onSelectionEvent(SelectionEvent event) throws RemoteException {
-            TextClassifierService.this.onSelectionEvent(event);
+        public void onSelectionEvent(
+                TextClassificationSessionId sessionId,
+                SelectionEvent event) throws RemoteException {
+            Preconditions.checkNotNull(event);
+            TextClassifierService.this.onSelectionEvent(sessionId, event);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public void onCreateTextClassificationSession(
+                TextClassificationContext context, TextClassificationSessionId sessionId)
+                throws RemoteException {
+            Preconditions.checkNotNull(context);
+            Preconditions.checkNotNull(sessionId);
+            TextClassifierService.this.onCreateTextClassificationSession(context, sessionId);
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public void onDestroyTextClassificationSession(TextClassificationSessionId sessionId)
+                throws RemoteException {
+            TextClassifierService.this.onDestroyTextClassificationSession(sessionId);
         }
     };
 
@@ -193,56 +227,102 @@
      * Returns suggested text selection start and end indices, recognized entity types, and their
      * associated confidence scores. The entity types are ordered from highest to lowest scoring.
      *
-     * @param text text providing context for the selected text (which is specified
-     *      by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
-     * @param selectionStartIndex start index of the selected part of text
-     * @param selectionEndIndex end index of the selected part of text
-     * @param options optional input parameters
+     * @param sessionId the session id
+     * @param request the text selection request
      * @param cancellationSignal object to watch for canceling the current operation
      * @param callback the callback to return the result to
      */
     public abstract void onSuggestSelection(
+            @Nullable TextClassificationSessionId sessionId,
+            @NonNull TextSelection.Request request,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull Callback<TextSelection> callback);
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
+    public void onSuggestSelection(
             @NonNull CharSequence text,
             @IntRange(from = 0) int selectionStartIndex,
             @IntRange(from = 0) int selectionEndIndex,
             @Nullable TextSelection.Options options,
             @NonNull CancellationSignal cancellationSignal,
-            @NonNull Callback<TextSelection> callback);
+            @NonNull Callback<TextSelection> callback) {
+        final TextClassificationSessionId sessionId = options.getSessionId();
+        final TextSelection.Request request = options.getRequest() != null
+                ? options.getRequest()
+                : new TextSelection.Request.Builder(
+                        text, selectionStartIndex, selectionEndIndex)
+                        .setDefaultLocales(options.getDefaultLocales())
+                        .build();
+        onSuggestSelection(sessionId, request, cancellationSignal, callback);
+    }
 
     /**
      * Classifies the specified text and returns a {@link TextClassification} object that can be
      * used to generate a widget for handling the classified text.
      *
-     * @param text text providing context for the text to classify (which is specified
-     *      by the sub sequence starting at startIndex and ending at endIndex)
-     * @param startIndex start index of the text to classify
-     * @param endIndex end index of the text to classify
-     * @param options optional input parameters
+     * @param sessionId the session id
+     * @param request the text classification request
      * @param cancellationSignal object to watch for canceling the current operation
      * @param callback the callback to return the result to
      */
     public abstract void onClassifyText(
+            @Nullable TextClassificationSessionId sessionId,
+            @NonNull TextClassification.Request request,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull Callback<TextClassification> callback);
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
+    public void onClassifyText(
             @NonNull CharSequence text,
             @IntRange(from = 0) int startIndex,
             @IntRange(from = 0) int endIndex,
             @Nullable TextClassification.Options options,
             @NonNull CancellationSignal cancellationSignal,
-            @NonNull Callback<TextClassification> callback);
+            @NonNull Callback<TextClassification> callback) {
+        final TextClassificationSessionId sessionId = options.getSessionId();
+        final TextClassification.Request request = options.getRequest() != null
+                ? options.getRequest()
+                : new TextClassification.Request.Builder(
+                        text, startIndex, endIndex)
+                        .setDefaultLocales(options.getDefaultLocales())
+                        .setReferenceTime(options.getReferenceTime())
+                        .build();
+        onClassifyText(sessionId, request, cancellationSignal, callback);
+    }
 
     /**
      * Generates and returns a {@link TextLinks} that may be applied to the text to annotate it with
      * links information.
      *
-     * @param text the text to generate annotations for
-     * @param options configuration for link generation
+     * @param sessionId the session id
+     * @param request the text classification request
      * @param cancellationSignal object to watch for canceling the current operation
      * @param callback the callback to return the result to
      */
     public abstract void onGenerateLinks(
+            @Nullable TextClassificationSessionId sessionId,
+            @NonNull TextLinks.Request request,
+            @NonNull CancellationSignal cancellationSignal,
+            @NonNull Callback<TextLinks> callback);
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
+    public void onGenerateLinks(
             @NonNull CharSequence text,
             @Nullable TextLinks.Options options,
             @NonNull CancellationSignal cancellationSignal,
-            @NonNull Callback<TextLinks> callback);
+            @NonNull Callback<TextLinks> callback) {
+        final TextClassificationSessionId sessionId = options.getSessionId();
+        final TextLinks.Request request = options.getRequest() != null
+                ? options.getRequest()
+                : new TextLinks.Request.Builder(text)
+                        .setDefaultLocales(options.getDefaultLocales())
+                        .setEntityConfig(options.getEntityConfig())
+                        .build();
+        onGenerateLinks(sessionId, request, cancellationSignal, callback);
+    }
 
     /**
      * Writes the selection event.
@@ -250,8 +330,30 @@
      * happened.
      *
      * <p>The default implementation ignores the event.
+     *
+     * @param sessionId the session id
+     * @param event the selection event
      */
-    public void onSelectionEvent(@NonNull SelectionEvent event) {}
+    public void onSelectionEvent(
+            @Nullable TextClassificationSessionId sessionId, @NonNull SelectionEvent event) {}
+
+    /**
+     * Creates a new text classification session for the specified context.
+     *
+     * @param context the text classification context
+     * @param sessionId the session's Id
+     */
+    public void onCreateTextClassificationSession(
+            @NonNull TextClassificationContext context,
+            @NonNull TextClassificationSessionId sessionId) {}
+
+    /**
+     * Destroys the text classification session identified by the specified sessionId.
+     *
+     * @param sessionId the id of the session to destroy
+     */
+    public void onDestroyTextClassificationSession(
+            @NonNull TextClassificationSessionId sessionId) {}
 
     /**
      * Returns a TextClassifier that runs in this service's process.
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index 96edfa3..c2c3182 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -303,10 +303,9 @@
      *
      * This is available only if the MeasuredParagraph is computed with buildForStaticLayout.
      */
-    public void getBounds(@NonNull Paint paint, @IntRange(from = 0) int start,
-            @IntRange(from = 0) int end, @NonNull Rect bounds) {
-        nGetBounds(mNativePtr, mCopiedBuffer, paint.getNativeInstance(), start, end,
-                paint.getBidiFlags(), bounds);
+    public void getBounds(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+            @NonNull Rect bounds) {
+        nGetBounds(mNativePtr, mCopiedBuffer, start, end, bounds);
     }
 
     /**
@@ -743,6 +742,6 @@
     @CriticalNative
     private static native int nGetMemoryUsage(/* Non Zero */ long nativePtr);
 
-    private static native void nGetBounds(long nativePtr, char[] buf, long paintPtr, int start,
-            int end, int bidiFlag, Rect rect);
+    private static native void nGetBounds(long nativePtr, char[] buf, int start, int end,
+            Rect rect);
 }
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index 413df05..369f357 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -16,6 +16,7 @@
 
 package android.text;
 
+import android.annotation.FloatRange;
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
@@ -44,13 +45,17 @@
  * <pre>
  * An example usage is:
  * <code>
- *  void asyncSetText(final TextView textView, final String longString, Handler bgThreadHandler) {
+ *  static void asyncSetText(TextView textView, final String longString, Executor bgExecutor) {
  *      // construct precompute related parameters using the TextView that we will set the text on.
- *      final PrecomputedText.Params params = textView.getTextParams();
- *      bgThreadHandler.post(() -> {
- *          final PrecomputedText precomputedText =
- *                  PrecomputedText.create(expensiveLongString, params);
+ *      final PrecomputedText.Params params = textView.getTextMetricsParams();
+ *      final Reference textViewRef = new WeakReference<>(textView);
+ *      bgExecutor.submit(() -> {
+ *          TextView textView = textViewRef.get();
+ *          if (textView == null) return;
+ *          final PrecomputedText precomputedText = PrecomputedText.create(longString, params);
  *          textView.post(() -> {
+ *              TextView textView = textViewRef.get();
+ *              if (textView == null) return;
  *              textView.setText(precomputedText);
  *          });
  *      });
@@ -363,6 +368,7 @@
 
     /**
      * Return the underlying text.
+     * @hide
      */
     public @NonNull CharSequence getText() {
         return mText;
@@ -451,32 +457,65 @@
             + ", gave " + pos);
     }
 
-    /** @hide */
-    public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) {
+    /**
+     * Returns text width for the given range.
+     * Both {@code start} and {@code end} offset need to be in the same paragraph, otherwise
+     * IllegalArgumentException will be thrown.
+     *
+     * @param start the inclusive start offset in the text
+     * @param end the exclusive end offset in the text
+     * @return the text width
+     * @throws IllegalArgumentException if start and end offset are in the different paragraph.
+     */
+    public @FloatRange(from = 0) float getWidth(@IntRange(from = 0) int start,
+            @IntRange(from = 0) int end) {
+        Preconditions.checkArgument(0 <= start && start <= mText.length(), "invalid start offset");
+        Preconditions.checkArgument(0 <= end && end <= mText.length(), "invalid end offset");
+        Preconditions.checkArgument(start <= end, "start offset can not be larger than end offset");
+
+        if (start == end) {
+            return 0;
+        }
         final int paraIndex = findParaIndex(start);
         final int paraStart = getParagraphStart(paraIndex);
         final int paraEnd = getParagraphEnd(paraIndex);
         if (start < paraStart || paraEnd < end) {
-            throw new RuntimeException("Cannot measured across the paragraph:"
+            throw new IllegalArgumentException("Cannot measured across the paragraph:"
                 + "para: (" + paraStart + ", " + paraEnd + "), "
                 + "request: (" + start + ", " + end + ")");
         }
         return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart);
     }
 
-    /** @hide */
+    /**
+     * Retrieves the text bounding box for the given range.
+     * Both {@code start} and {@code end} offset need to be in the same paragraph, otherwise
+     * IllegalArgumentException will be thrown.
+     *
+     * @param start the inclusive start offset in the text
+     * @param end the exclusive end offset in the text
+     * @param bounds the output rectangle
+     * @throws IllegalArgumentException if start and end offset are in the different paragraph.
+     */
     public void getBounds(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
             @NonNull Rect bounds) {
+        Preconditions.checkArgument(0 <= start && start <= mText.length(), "invalid start offset");
+        Preconditions.checkArgument(0 <= end && end <= mText.length(), "invalid end offset");
+        Preconditions.checkArgument(start <= end, "start offset can not be larger than end offset");
+        Preconditions.checkNotNull(bounds);
+        if (start == end) {
+            bounds.set(0, 0, 0, 0);
+            return;
+        }
         final int paraIndex = findParaIndex(start);
         final int paraStart = getParagraphStart(paraIndex);
         final int paraEnd = getParagraphEnd(paraIndex);
         if (start < paraStart || paraEnd < end) {
-            throw new RuntimeException("Cannot measured across the paragraph:"
+            throw new IllegalArgumentException("Cannot measured across the paragraph:"
                 + "para: (" + paraStart + ", " + paraEnd + "), "
                 + "request: (" + start + ", " + end + ")");
         }
-        getMeasuredParagraph(paraIndex).getBounds(mParams.mPaint,
-                start - paraStart, end - paraStart, bounds);
+        getMeasuredParagraph(paraIndex).getBounds(start - paraStart, end - paraStart, bounds);
     }
 
     /**
diff --git a/core/java/android/text/Selection.java b/core/java/android/text/Selection.java
index 3445658..5256e47 100644
--- a/core/java/android/text/Selection.java
+++ b/core/java/android/text/Selection.java
@@ -180,7 +180,7 @@
      * Remove the selection or cursor, if any, from the text.
      */
     public static final void removeSelection(Spannable text) {
-        text.removeSpan(SELECTION_START);
+        text.removeSpan(SELECTION_START, Spanned.SPAN_INTERMEDIATE);
         text.removeSpan(SELECTION_END);
         removeMemory(text);
     }
diff --git a/core/java/android/text/Spannable.java b/core/java/android/text/Spannable.java
index 39b78eb..8315b2a 100644
--- a/core/java/android/text/Spannable.java
+++ b/core/java/android/text/Spannable.java
@@ -46,6 +46,19 @@
     public void removeSpan(Object what);
 
     /**
+     * Remove the specified object from the range of text to which it
+     * was attached, if any.  It is OK to remove an object that was never
+     * attached in the first place.
+     *
+     * See {@link Spanned} for an explanation of what the flags mean.
+     *
+     * @hide
+     */
+    default void removeSpan(Object what, int flags) {
+        removeSpan(what);
+    }
+
+    /**
      * Factory used by TextView to create new {@link Spannable Spannables}. You can subclass
      * it to provide something other than {@link SpannableString}.
      *
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index d41dfdc..41a9c45 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -312,7 +312,7 @@
                     // The following condition indicates that the span would become empty
                     (textIsRemoved || mSpanStarts[i] > start || mSpanEnds[i] < mGapStart)) {
                 mIndexOfSpan.remove(mSpans[i]);
-                removeSpan(i);
+                removeSpan(i, 0 /* flags */);
                 return true;
             }
             return resolveGap(mSpanStarts[i]) <= end && (i & 1) != 0 &&
@@ -472,7 +472,7 @@
     }
 
     // Note: caller is responsible for removing the mIndexOfSpan entry.
-    private void removeSpan(int i) {
+    private void removeSpan(int i, int flags) {
         Object object = mSpans[i];
 
         int start = mSpanStarts[i];
@@ -496,7 +496,9 @@
         // Invariants must be restored before sending span removed notifications.
         restoreInvariants();
 
-        sendSpanRemoved(object, start, end);
+        if ((flags & Spanned.SPAN_INTERMEDIATE) == 0) {
+            sendSpanRemoved(object, start, end);
+        }
     }
 
     // Documentation from interface
@@ -782,10 +784,19 @@
      * Remove the specified markup object from the buffer.
      */
     public void removeSpan(Object what) {
+        removeSpan(what, 0 /* flags */);
+    }
+
+    /**
+     * Remove the specified markup object from the buffer.
+     *
+     * @hide
+     */
+    public void removeSpan(Object what, int flags) {
         if (mIndexOfSpan == null) return;
         Integer i = mIndexOfSpan.remove(what);
         if (i != null) {
-            removeSpan(i.intValue());
+            removeSpan(i.intValue(), flags);
         }
     }
 
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index 5dd1a52..bcc2fda 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -249,6 +249,13 @@
     }
 
     /* package */ void removeSpan(Object what) {
+        removeSpan(what, 0 /* flags */);
+    }
+
+    /**
+     * @hide
+     */
+    public void removeSpan(Object what, int flags) {
         int count = mSpanCount;
         Object[] spans = mSpans;
         int[] data = mSpanData;
@@ -262,11 +269,13 @@
 
                 System.arraycopy(spans, i + 1, spans, i, c);
                 System.arraycopy(data, (i + 1) * COLUMNS,
-                                 data, i * COLUMNS, c * COLUMNS);
+                        data, i * COLUMNS, c * COLUMNS);
 
                 mSpanCount--;
 
-                sendSpanRemoved(what, ostart, oend);
+                if ((flags & Spanned.SPAN_INTERMEDIATE) == 0) {
+                    sendSpanRemoved(what, ostart, oend);
+                }
                 return;
             }
         }
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index ad3b4b6..de86a66 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -40,6 +40,10 @@
     public static final int FLAG_SHORTER = 1 << 0;
     /** {@hide} */
     public static final int FLAG_CALCULATE_ROUNDED = 1 << 1;
+    /** {@hide} */
+    public static final int FLAG_SI_UNITS = 1 << 2;
+    /** {@hide} */
+    public static final int FLAG_IEC_UNITS = 1 << 3;
 
     /** {@hide} */
     public static class BytesResult {
@@ -90,7 +94,7 @@
         if (context == null) {
             return "";
         }
-        final BytesResult res = formatBytes(context.getResources(), sizeBytes, 0);
+        final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SI_UNITS);
         return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
                 res.value, res.units));
     }
@@ -103,41 +107,43 @@
         if (context == null) {
             return "";
         }
-        final BytesResult res = formatBytes(context.getResources(), sizeBytes, FLAG_SHORTER);
+        final BytesResult res = formatBytes(context.getResources(), sizeBytes,
+                FLAG_SI_UNITS | FLAG_SHORTER);
         return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,
                 res.value, res.units));
     }
 
     /** {@hide} */
     public static BytesResult formatBytes(Resources res, long sizeBytes, int flags) {
+        final int unit = ((flags & FLAG_IEC_UNITS) != 0) ? 1024 : 1000;
         final boolean isNegative = (sizeBytes < 0);
         float result = isNegative ? -sizeBytes : sizeBytes;
         int suffix = com.android.internal.R.string.byteShort;
         long mult = 1;
         if (result > 900) {
             suffix = com.android.internal.R.string.kilobyteShort;
-            mult = 1000;
-            result = result / 1000;
+            mult = unit;
+            result = result / unit;
         }
         if (result > 900) {
             suffix = com.android.internal.R.string.megabyteShort;
-            mult *= 1000;
-            result = result / 1000;
+            mult *= unit;
+            result = result / unit;
         }
         if (result > 900) {
             suffix = com.android.internal.R.string.gigabyteShort;
-            mult *= 1000;
-            result = result / 1000;
+            mult *= unit;
+            result = result / unit;
         }
         if (result > 900) {
             suffix = com.android.internal.R.string.terabyteShort;
-            mult *= 1000;
-            result = result / 1000;
+            mult *= unit;
+            result = result / unit;
         }
         if (result > 900) {
             suffix = com.android.internal.R.string.petabyteShort;
-            mult *= 1000;
-            result = result / 1000;
+            mult *= unit;
+            result = result / unit;
         }
         // Note we calculate the rounded long by ourselves, but still let String.format()
         // compute the rounded value. String.format("%f", 0.1) might not return "0.1" due to
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index 435e324..c905f49 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -33,6 +33,7 @@
 import android.view.textclassifier.TextClassifier;
 import android.view.textclassifier.TextLinks;
 import android.view.textclassifier.TextLinks.TextLinkSpan;
+import android.view.textclassifier.TextLinksParams;
 import android.webkit.WebView;
 import android.widget.TextView;
 
@@ -55,7 +56,6 @@
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.function.Consumer;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -100,13 +100,20 @@
      *  take an options mask. Note that this uses the
      *  {@link android.webkit.WebView#findAddress(String) findAddress()} method in
      *  {@link android.webkit.WebView} for finding addresses, which has various
-     *  limitations.
+     *  limitations and has been deprecated.
+     *  @deprecated use {@link android.view.textclassifier.TextClassifier#generateLinks(
+     *  TextLinks.Request)} instead and avoid it even when targeting API levels where no alternative
+     *  is available.
      */
+    @Deprecated
     public static final int MAP_ADDRESSES = 0x08;
 
     /**
      *  Bit mask indicating that all available patterns should be matched in
      *  methods that take an options mask
+     *  <p><strong>Note:</strong></p> {@link #MAP_ADDRESSES} is deprecated.
+     *  Use {@link android.view.textclassifier.TextClassifier#generateLinks(TextLinks.Request)}
+     *  instead and avoid it even when targeting API levels where no alternative is available.
      */
     public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES;
 
@@ -502,15 +509,16 @@
      * calling thread.
      *
      * @param textView TextView whose text is to be marked-up with links
-     * @param options optional parameters to specify how to generate the links
+     * @param params optional parameters to specify how to generate the links
      *
      * @return a future that may be used to interrupt or query the background task
+     * @hide
      */
     @UiThread
     public static Future<Void> addLinksAsync(
             @NonNull TextView textView,
-            @Nullable TextLinks.Options options) {
-        return addLinksAsync(textView, options, null /* executor */, null /* callback */);
+            @Nullable TextLinksParams params) {
+        return addLinksAsync(textView, params, null /* executor */, null /* callback */);
     }
 
     /**
@@ -525,16 +533,42 @@
      * calling thread.
      *
      * @param textView TextView whose text is to be marked-up with links
-     * @param options optional parameters to specify how to generate the links
-     * @param executor Executor that runs the background task
-     * @param callback Callback that receives the final status of the background task execution
+     * @param mask mask to define which kinds of links will be generated
      *
      * @return a future that may be used to interrupt or query the background task
+     * @hide
      */
     @UiThread
     public static Future<Void> addLinksAsync(
             @NonNull TextView textView,
-            @Nullable TextLinks.Options options,
+            @LinkifyMask int mask) {
+        return addLinksAsync(textView, TextLinksParams.fromLinkMask(mask),
+                null /* executor */, null /* callback */);
+    }
+
+    /**
+     * Scans the text of the provided TextView and turns all occurrences of the entity types
+     * specified by {@code options} into clickable links. If links are found, this method
+     * removes any pre-existing {@link TextLinkSpan} attached to the text (to avoid
+     * problems if you call it repeatedly on the same text) and sets the movement method for the
+     * TextView to LinkMovementMethod.
+     *
+     * <p><strong>Note:</strong> This method returns immediately but generates the links with
+     * the specified classifier on a background thread. The generated links are applied on the
+     * calling thread.
+     *
+     * @param textView TextView whose text is to be marked-up with links
+     * @param params optional parameters to specify how to generate the links
+     * @param executor Executor that runs the background task
+     * @param callback Callback that receives the final status of the background task execution
+     *
+     * @return a future that may be used to interrupt or query the background task
+     * @hide
+     */
+    @UiThread
+    public static Future<Void> addLinksAsync(
+            @NonNull TextView textView,
+            @Nullable TextLinksParams params,
             @Nullable Executor executor,
             @Nullable Consumer<Integer> callback) {
         Preconditions.checkNotNull(textView);
@@ -548,7 +582,7 @@
             }
         };
         return addLinksAsync(spannable, textView.getTextClassifier(),
-                options, executor, callback, modifyTextView);
+                params, executor, callback, modifyTextView);
     }
 
     /**
@@ -566,15 +600,16 @@
      *
      * @param text Spannable whose text is to be marked-up with links
      * @param classifier the TextClassifier to use to generate the links
-     * @param options optional parameters to specify how to generate the links
+     * @param params optional parameters to specify how to generate the links
      *
      * @return a future that may be used to interrupt or query the background task
+     * @hide
      */
     public static Future<Void> addLinksAsync(
             @NonNull Spannable text,
             @NonNull TextClassifier classifier,
-            @Nullable TextLinks.Options options) {
-        return addLinksAsync(text, classifier, options, null /* executor */, null /* callback */);
+            @Nullable TextLinksParams params) {
+        return addLinksAsync(text, classifier, params, null /* executor */, null /* callback */);
     }
 
     /**
@@ -595,12 +630,13 @@
      * @param mask mask to define which kinds of links will be generated
      *
      * @return a future that may be used to interrupt or query the background task
+     * @hide
      */
     public static Future<Void> addLinksAsync(
             @NonNull Spannable text,
             @NonNull TextClassifier classifier,
             @LinkifyMask int mask) {
-        return addLinksAsync(text, classifier, TextLinks.Options.fromLinkMask(mask),
+        return addLinksAsync(text, classifier, TextLinksParams.fromLinkMask(mask),
                 null /* executor */, null /* callback */);
     }
 
@@ -619,39 +655,46 @@
      *
      * @param text Spannable whose text is to be marked-up with links
      * @param classifier the TextClassifier to use to generate the links
-     * @param options optional parameters to specify how to generate the links
+     * @param params optional parameters to specify how to generate the links
      * @param executor Executor that runs the background task
      * @param callback Callback that receives the final status of the background task execution
      *
      * @return a future that may be used to interrupt or query the background task
+     * @hide
      */
     public static Future<Void> addLinksAsync(
             @NonNull Spannable text,
             @NonNull TextClassifier classifier,
-            @Nullable TextLinks.Options options,
+            @Nullable TextLinksParams params,
             @Nullable Executor executor,
             @Nullable Consumer<Integer> callback) {
-        return addLinksAsync(text, classifier, options, executor, callback,
+        return addLinksAsync(text, classifier, params, executor, callback,
                 null /* modifyTextView */);
     }
 
     private static Future<Void> addLinksAsync(
             @NonNull Spannable text,
             @NonNull TextClassifier classifier,
-            @Nullable TextLinks.Options options,
+            @Nullable TextLinksParams params,
             @Nullable Executor executor,
             @Nullable Consumer<Integer> callback,
             @Nullable Runnable modifyTextView) {
         Preconditions.checkNotNull(text);
         Preconditions.checkNotNull(classifier);
 
+        // TODO: This is a bug. We shouldnot call getMaxGenerateLinksTextLength() on the UI thread.
         // The input text may exceed the maximum length the text classifier can handle. In such
         // cases, we process the text up to the maximum length.
         final CharSequence truncatedText = text.subSequence(
                 0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
 
-        final Supplier<TextLinks> supplier = () ->
-                classifier.generateLinks(truncatedText, options.setLegacyFallback(true));
+        final TextClassifier.EntityConfig entityConfig = (params == null)
+                ? null : params.getEntityConfig();
+        final TextLinks.Request request = new TextLinks.Request.Builder(truncatedText)
+                .setLegacyFallback(true)
+                .setEntityConfig(entityConfig)
+                .build();
+        final Supplier<TextLinks> supplier = () -> classifier.generateLinks(request);
         final Consumer<TextLinks> consumer = links -> {
             if (links.getLinks().isEmpty()) {
                 if (callback != null) {
@@ -661,17 +704,13 @@
             }
 
             // Remove spans only for the part of the text we generated links for.
-            final TextLinkSpan[] old = text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
+            final TextLinkSpan[] old =
+                    text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
             for (int i = old.length - 1; i >= 0; i--) {
                 text.removeSpan(old[i]);
             }
 
-            final Function<TextLinks.TextLink, TextLinkSpan> spanFactory = (options == null)
-                    ? null : options.getSpanFactory();
-            final @TextLinks.ApplyStrategy int applyStrategy = (options == null)
-                    ? TextLinks.APPLY_STRATEGY_IGNORE : options.getApplyStrategy();
-            final @TextLinks.Status int result = links.apply(text, applyStrategy, spanFactory,
-                    true /*allowPrefix*/);
+            final @TextLinks.Status int result = params.apply(text, links);
             if (result == TextLinks.STATUS_LINKS_APPLIED) {
                 if (modifyTextView != null) {
                     modifyTextView.run();
diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java
index 9f115eb..975ad48 100644
--- a/core/java/android/util/RecurrenceRule.java
+++ b/core/java/android/util/RecurrenceRule.java
@@ -158,7 +158,7 @@
                 && period.getDays() == 0;
     }
 
-    public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+    public Iterator<Range<ZonedDateTime>> cycleIterator() {
         if (period != null) {
             return new RecurringIterator();
         } else {
@@ -166,7 +166,7 @@
         }
     }
 
-    private class NonrecurringIterator implements Iterator<Pair<ZonedDateTime, ZonedDateTime>> {
+    private class NonrecurringIterator implements Iterator<Range<ZonedDateTime>> {
         boolean hasNext;
 
         public NonrecurringIterator() {
@@ -179,13 +179,13 @@
         }
 
         @Override
-        public Pair<ZonedDateTime, ZonedDateTime> next() {
+        public Range<ZonedDateTime> next() {
             hasNext = false;
-            return new Pair<>(start, end);
+            return new Range<>(start, end);
         }
     }
 
-    private class RecurringIterator implements Iterator<Pair<ZonedDateTime, ZonedDateTime>> {
+    private class RecurringIterator implements Iterator<Range<ZonedDateTime>> {
         int i;
         ZonedDateTime cycleStart;
         ZonedDateTime cycleEnd;
@@ -231,12 +231,12 @@
         }
 
         @Override
-        public Pair<ZonedDateTime, ZonedDateTime> next() {
+        public Range<ZonedDateTime> next() {
             if (LOGD) Log.d(TAG, "Cycle " + i + " from " + cycleStart + " to " + cycleEnd);
-            Pair<ZonedDateTime, ZonedDateTime> p = new Pair<>(cycleStart, cycleEnd);
+            Range<ZonedDateTime> r = new Range<>(cycleStart, cycleEnd);
             i--;
             updateCycle();
-            return p;
+            return r;
         }
     }
 
diff --git a/core/java/android/view/HapticFeedbackConstants.java b/core/java/android/view/HapticFeedbackConstants.java
index b147928..db01cea 100644
--- a/core/java/android/view/HapticFeedbackConstants.java
+++ b/core/java/android/view/HapticFeedbackConstants.java
@@ -77,6 +77,55 @@
     public static final int TEXT_HANDLE_MOVE = 9;
 
     /**
+     * The user unlocked the device
+     * @hide
+     */
+    public static final int ENTRY_BUMP = 10;
+
+    /**
+     * The user has moved the dragged object within a droppable area.
+     * @hide
+     */
+    public static final int DRAG_CROSSING = 11;
+
+    /**
+     * The user has started a gesture (e.g. on the soft keyboard).
+     * @hide
+     */
+    public static final int GESTURE_START = 12;
+
+    /**
+     * The user has finished a gesture (e.g. on the soft keyboard).
+     * @hide
+     */
+    public static final int GESTURE_END = 13;
+
+    /**
+     * The user's squeeze crossed the gesture's initiation threshold.
+     * @hide
+     */
+    public static final int EDGE_SQUEEZE = 14;
+
+    /**
+     * The user's squeeze crossed the gesture's release threshold.
+     * @hide
+     */
+    public static final int EDGE_RELEASE = 15;
+
+    /**
+     * A haptic effect to signal the confirmation or successful completion of a user
+     * interaction.
+     * @hide
+     */
+    public static final int CONFIRM = 16;
+
+    /**
+     * A haptic effect to signal the rejection or failure of a user interaction.
+     * @hide
+     */
+    public static final int REJECT = 17;
+
+    /**
      * The phone has booted with safe mode enabled.
      * This is a private constant.  Feel free to renumber as desired.
      * @hide
diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl
index 89684ca..c0b40c8 100644
--- a/core/java/android/view/IRecentsAnimationController.aidl
+++ b/core/java/android/view/IRecentsAnimationController.aidl
@@ -59,4 +59,9 @@
     * taken.
     */
     void setAnimationTargetsBehindSystemBars(boolean behindSystemBars);
+
+    /**
+     * Informs the system that the primary split-screen stack should be minimized.
+     */
+    void setSplitScreenMinimized(boolean minimized);
 }
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index d4610a5..5deee11 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -87,6 +87,7 @@
     private static native void nativeMergeTransaction(long transactionObj,
             long otherTransactionObj);
     private static native void nativeSetAnimationTransaction(long transactionObj);
+    private static native void nativeSetEarlyWakeup(long transactionObj);
 
     private static native void nativeSetLayer(long transactionObj, long nativeObject, int zorder);
     private static native void nativeSetRelativeLayer(long transactionObj, long nativeObject,
@@ -1642,6 +1643,19 @@
         }
 
         /**
+         * Indicate that SurfaceFlinger should wake up earlier than usual as a result of this
+         * transaction. This should be used when the caller thinks that the scene is complex enough
+         * that it's likely to hit GL composition, and thus, SurfaceFlinger needs to more time in
+         * order not to miss frame deadlines.
+         * <p>
+         * Corresponds to setting ISurfaceComposer::eEarlyWakeup
+         */
+        public Transaction setEarlyWakeup() {
+            nativeSetEarlyWakeup(mNativeObject);
+            return this;
+        }
+
+        /**
          * Merge the other transaction into this transaction, clearing the
          * other transaction as if it had been applied.
          */
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 5eb7e9c..e03f5fa 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -190,6 +190,10 @@
      */
     public static final String DEBUG_FPS_DIVISOR = "debug.hwui.fps_divisor";
 
+    public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101;
+    public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102;
+    public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
+
     static {
         // Try to check OpenGL support early if possible.
         isAvailable();
@@ -1140,6 +1144,16 @@
         nHackySetRTAnimationsEnabled(divisor <= 1);
     }
 
+    /**
+     * Changes the OpenGL context priority if IMG_context_priority extension is available. Must be
+     * called before any OpenGL context is created.
+     *
+     * @param priority The priority to use. Must be one of EGL_CONTEXT_PRIORITY_* values.
+     */
+    public static void setContextPriority(int priority) {
+        nSetContextPriority(priority);
+    }
+
     /** Not actually public - internal use only. This doc to make lint happy */
     public static native void disableVsync();
 
@@ -1213,4 +1227,5 @@
     private static native void nHackySetRTAnimationsEnabled(boolean enabled);
     private static native void nSetDebuggingEnabled(boolean enabled);
     private static native void nSetIsolatedProcess(boolean enabled);
+    private static native void nSetContextPriority(int priority);
 }
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 7e6ee76..b367dc7 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -10398,7 +10398,21 @@
      *
      * @param willNotCacheDrawing true if this view does not cache its
      *        drawing, false otherwise
+     *
+     * @deprecated The view drawing cache was largely made obsolete with the introduction of
+     * hardware-accelerated rendering in API 11. With hardware-acceleration, intermediate cache
+     * layers are largely unnecessary and can easily result in a net loss in performance due to the
+     * cost of creating and updating the layer. In the rare cases where caching layers are useful,
+     * such as for alpha animations, {@link #setLayerType(int, Paint)} handles this with hardware
+     * rendering. For software-rendered snapshots of a small part of the View hierarchy or
+     * individual Views it is recommended to create a {@link Canvas} from either a {@link Bitmap} or
+     * {@link android.graphics.Picture} and call {@link #draw(Canvas)} on the View. However these
+     * software-rendered usages are discouraged and have compatibility issues with hardware-only
+     * rendering features such as {@link android.graphics.Bitmap.Config#HARDWARE Config.HARDWARE}
+     * bitmaps, real-time shadows, and outline clipping. For screenshots of the UI for feedback
+     * reports or unit testing the {@link PixelCopy} API is recommended.
      */
+    @Deprecated
     public void setWillNotCacheDrawing(boolean willNotCacheDrawing) {
         setFlags(willNotCacheDrawing ? WILL_NOT_CACHE_DRAWING : 0, WILL_NOT_CACHE_DRAWING);
     }
@@ -10407,8 +10421,22 @@
      * Returns whether or not this View can cache its drawing or not.
      *
      * @return true if this view does not cache its drawing, false otherwise
+     *
+     * @deprecated The view drawing cache was largely made obsolete with the introduction of
+     * hardware-accelerated rendering in API 11. With hardware-acceleration, intermediate cache
+     * layers are largely unnecessary and can easily result in a net loss in performance due to the
+     * cost of creating and updating the layer. In the rare cases where caching layers are useful,
+     * such as for alpha animations, {@link #setLayerType(int, Paint)} handles this with hardware
+     * rendering. For software-rendered snapshots of a small part of the View hierarchy or
+     * individual Views it is recommended to create a {@link Canvas} from either a {@link Bitmap} or
+     * {@link android.graphics.Picture} and call {@link #draw(Canvas)} on the View. However these
+     * software-rendered usages are discouraged and have compatibility issues with hardware-only
+     * rendering features such as {@link android.graphics.Bitmap.Config#HARDWARE Config.HARDWARE}
+     * bitmaps, real-time shadows, and outline clipping. For screenshots of the UI for feedback
+     * reports or unit testing the {@link PixelCopy} API is recommended.
      */
     @ViewDebug.ExportedProperty(category = "drawing")
+    @Deprecated
     public boolean willNotCacheDrawing() {
         return (mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING;
     }
@@ -11763,6 +11791,14 @@
         return null;
     }
 
+    /** @hide */
+    View getSelfOrParentImportantForA11y() {
+        if (isImportantForAccessibility()) return this;
+        ViewParent parent = getParentForAccessibility();
+        if (parent instanceof View) return (View) parent;
+        return null;
+    }
+
     /**
      * Adds the children of this View relevant for accessibility to the given list
      * as output. Since some Views are not important for accessibility the added
@@ -14978,10 +15014,7 @@
     public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
         ensureTransformationInfo();
         if (mTransformationInfo.mAlpha != alpha) {
-            // Report visibility changes, which can affect children, to accessibility
-            if ((alpha == 0) ^ (mTransformationInfo.mAlpha == 0)) {
-                notifySubtreeAccessibilityStateChangedIfNeeded();
-            }
+            float oldAlpha = mTransformationInfo.mAlpha;
             mTransformationInfo.mAlpha = alpha;
             if (onSetAlpha((int) (alpha * 255))) {
                 mPrivateFlags |= PFLAG_ALPHA_SET;
@@ -14993,6 +15026,10 @@
                 invalidateViewProperty(true, false);
                 mRenderNode.setAlpha(getFinalAlpha());
             }
+            // Report visibility changes, which can affect children, to accessibility
+            if ((alpha == 0) ^ (oldAlpha == 0)) {
+                notifySubtreeAccessibilityStateChangedIfNeeded();
+            }
         }
     }
 
@@ -20224,22 +20261,20 @@
 
         int solidColor = getSolidColor();
         if (solidColor == 0) {
-            final int flags = Canvas.HAS_ALPHA_LAYER_SAVE_FLAG;
-
             if (drawTop) {
-                canvas.saveLayer(left, top, right, top + length, null, flags);
+                canvas.saveUnclippedLayer(left, top, right, top + length);
             }
 
             if (drawBottom) {
-                canvas.saveLayer(left, bottom - length, right, bottom, null, flags);
+                canvas.saveUnclippedLayer(left, bottom - length, right, bottom);
             }
 
             if (drawLeft) {
-                canvas.saveLayer(left, top, left + length, bottom, null, flags);
+                canvas.saveUnclippedLayer(left, top, left + length, bottom);
             }
 
             if (drawRight) {
-                canvas.saveLayer(right - length, top, right, bottom, null, flags);
+                canvas.saveUnclippedLayer(right - length, top, right, bottom);
             }
         } else {
             scrollabilityCache.setFadeColor(solidColor);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 433c90b..f6d9a16 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3719,7 +3719,7 @@
         checkThread();
         if (mView != null) {
             if (!mView.hasFocus()) {
-                if (sAlwaysAssignFocus || !isInTouchMode()) {
+                if (sAlwaysAssignFocus || !mAttachInfo.mInTouchMode) {
                     v.requestFocus();
                 }
             } else {
@@ -8305,6 +8305,12 @@
 
         public View mSource;
         public long mLastEventTimeMillis;
+        /**
+         * Override for {@link AccessibilityEvent#originStackTrace} to provide the stack trace
+         * of the original {@link #runOrPost} call instead of one for sending the delayed event
+         * from a looper.
+         */
+        public StackTraceElement[] mOrigin;
 
         @Override
         public void run() {
@@ -8322,6 +8328,7 @@
                 AccessibilityEvent event = AccessibilityEvent.obtain();
                 event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
                 event.setContentChangeTypes(mChangeTypes);
+                if (AccessibilityEvent.DEBUG_ORIGIN) event.originStackTrace = mOrigin;
                 source.sendAccessibilityEventUnchecked(event);
             } else {
                 mLastEventTimeMillis = 0;
@@ -8329,6 +8336,7 @@
             // In any case reset to initial state.
             source.resetSubtreeAccessibilityStateChanged();
             mChangeTypes = 0;
+            if (AccessibilityEvent.DEBUG_ORIGIN) mOrigin = null;
         }
 
         public void runOrPost(View source, int changeType) {
@@ -8352,12 +8360,18 @@
                 // If there is no common predecessor, then mSource points to
                 // a removed view, hence in this case always prefer the source.
                 View predecessor = getCommonPredecessor(mSource, source);
+                if (predecessor != null) {
+                    predecessor = predecessor.getSelfOrParentImportantForA11y();
+                }
                 mSource = (predecessor != null) ? predecessor : source;
                 mChangeTypes |= changeType;
                 return;
             }
             mSource = source;
             mChangeTypes = changeType;
+            if (AccessibilityEvent.DEBUG_ORIGIN) {
+                mOrigin = Thread.currentThread().getStackTrace();
+            }
             final long timeSinceLastMillis = SystemClock.uptimeMillis() - mLastEventTimeMillis;
             final long minEventIntevalMillis =
                     ViewConfiguration.getSendRecurringAccessibilityEventsInterval();
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index cca66d6..08c2d0b 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -610,6 +610,10 @@
                     ViewRootImpl root = mRoots.get(i);
                     // Client might remove the view by "stopped" event.
                     root.setWindowStopped(stopped);
+                    // Recursively forward stopped state to View's attached
+                    // to this Window rather than the root application token,
+                    // e.g. PopupWindow's.
+                    setStoppedState(root.mAttachInfo.mWindowToken, stopped);
                 }
             }
         }
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index e0f74a7..95a83da 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -388,6 +388,8 @@
  */
 public final class AccessibilityEvent extends AccessibilityRecord implements Parcelable {
     private static final boolean DEBUG = false;
+    /** @hide */
+    public static final boolean DEBUG_ORIGIN = false;
 
     /**
      * Invalid selection/focus position.
@@ -748,7 +750,7 @@
 
     private static final int MAX_POOL_SIZE = 10;
     private static final SynchronizedPool<AccessibilityEvent> sPool =
-            new SynchronizedPool<AccessibilityEvent>(MAX_POOL_SIZE);
+            new SynchronizedPool<>(MAX_POOL_SIZE);
 
     private @EventType int mEventType;
     private CharSequence mPackageName;
@@ -758,6 +760,17 @@
     int mContentChangeTypes;
     int mWindowChangeTypes;
 
+    /**
+     * The stack trace describing where this event originated from on the app side.
+     * Only populated if {@link #DEBUG_ORIGIN} is enabled
+     * Can be inspected(e.g. printed) from an
+     * {@link android.accessibilityservice.AccessibilityService} to trace where particular events
+     * are being dispatched from.
+     *
+     * @hide
+     */
+    public StackTraceElement[] originStackTrace = null;
+
     private ArrayList<AccessibilityRecord> mRecords;
 
     /*
@@ -780,6 +793,7 @@
         mWindowChangeTypes = event.mWindowChangeTypes;
         mEventTime = event.mEventTime;
         mPackageName = event.mPackageName;
+        if (DEBUG_ORIGIN) originStackTrace = event.originStackTrace;
     }
 
     /**
@@ -1104,7 +1118,9 @@
      */
     public static AccessibilityEvent obtain() {
         AccessibilityEvent event = sPool.acquire();
-        return (event != null) ? event : new AccessibilityEvent();
+        if (event == null) event = new AccessibilityEvent();
+        if (DEBUG_ORIGIN) event.originStackTrace = Thread.currentThread().getStackTrace();
+        return event;
     }
 
     /**
@@ -1142,6 +1158,7 @@
                 record.recycle();
             }
         }
+        if (DEBUG_ORIGIN) originStackTrace = null;
     }
 
     /**
@@ -1164,7 +1181,7 @@
         // Read the records.
         final int recordCount = parcel.readInt();
         if (recordCount > 0) {
-            mRecords = new ArrayList<AccessibilityRecord>(recordCount);
+            mRecords = new ArrayList<>(recordCount);
             for (int i = 0; i < recordCount; i++) {
                 AccessibilityRecord record = AccessibilityRecord.obtain();
                 readAccessibilityRecordFromParcel(record, parcel);
@@ -1172,6 +1189,17 @@
                 mRecords.add(record);
             }
         }
+
+        if (DEBUG_ORIGIN) {
+            originStackTrace = new StackTraceElement[parcel.readInt()];
+            for (int i = 0; i < originStackTrace.length; i++) {
+                originStackTrace[i] = new StackTraceElement(
+                        parcel.readString(),
+                        parcel.readString(),
+                        parcel.readString(),
+                        parcel.readInt());
+            }
+        }
     }
 
     /**
@@ -1227,6 +1255,17 @@
             AccessibilityRecord record = mRecords.get(i);
             writeAccessibilityRecordToParcel(record, parcel, flags);
         }
+
+        if (DEBUG_ORIGIN) {
+            if (originStackTrace == null) originStackTrace = Thread.currentThread().getStackTrace();
+            parcel.writeInt(originStackTrace.length);
+            for (StackTraceElement element : originStackTrace) {
+                parcel.writeString(element.getClassName());
+                parcel.writeString(element.getMethodName());
+                parcel.writeString(element.getFileName());
+                parcel.writeInt(element.getLineNumber());
+            }
+        }
     }
 
     /**
diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
index 72af203..d60c481 100644
--- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java
+++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java
@@ -326,12 +326,14 @@
                             accessibilityWindowId, accessibilityNodeId);
                     if (cachedInfo != null) {
                         if (DEBUG) {
-                            Log.i(LOG_TAG, "Node cache hit");
+                            Log.i(LOG_TAG, "Node cache hit for "
+                                    + idToString(accessibilityWindowId, accessibilityNodeId));
                         }
                         return cachedInfo;
                     }
                     if (DEBUG) {
-                        Log.i(LOG_TAG, "Node cache miss");
+                        Log.i(LOG_TAG, "Node cache miss for "
+                                + idToString(accessibilityWindowId, accessibilityNodeId));
                     }
                 }
                 final int interactionId = mInteractionIdCounter.getAndIncrement();
@@ -368,6 +370,11 @@
         return null;
     }
 
+    private static String idToString(int accessibilityWindowId, long accessibilityNodeId) {
+        return accessibilityWindowId + "/"
+                + AccessibilityNodeInfo.idToString(accessibilityNodeId);
+    }
+
     /**
      * Finds an {@link AccessibilityNodeInfo} by View id. The search is performed in
      * the window whose id is specified and starts from the node whose accessibility
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index dee267d..cbb23f1 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -16,6 +16,8 @@
 
 package android.view.accessibility;
 
+import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME;
+
 import android.Manifest;
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType;
@@ -44,6 +46,7 @@
 import android.view.IWindow;
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent.EventType;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IntPair;
 
@@ -51,8 +54,6 @@
 import java.util.Collections;
 import java.util.List;
 
-import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME;
-
 /**
  * System level service that serves as an event dispatch for {@link AccessibilityEvent}s,
  * and provides facilities for querying the accessibility state of the system.
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 4c437dd..03f1c12 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -3874,6 +3874,24 @@
                         | FLAG_PREFETCH_DESCENDANTS | FLAG_PREFETCH_SIBLINGS, null);
     }
 
+    /** @hide */
+    public static String idToString(long accessibilityId) {
+        int accessibilityViewId = getAccessibilityViewId(accessibilityId);
+        int virtualDescendantId = getVirtualDescendantId(accessibilityId);
+        return virtualDescendantId == AccessibilityNodeProvider.HOST_VIEW_ID
+                ? idItemToString(accessibilityViewId)
+                : idItemToString(accessibilityViewId) + ":" + idItemToString(virtualDescendantId);
+    }
+
+    private static String idItemToString(int item) {
+        switch (item) {
+            case ROOT_ITEM_ID: return "ROOT";
+            case UNDEFINED_ITEM_ID: return "UNDEFINED";
+            case AccessibilityNodeProvider.HOST_VIEW_ID: return "HOST";
+            default: return "" + item;
+        }
+    }
+
     /**
      * A class defining an action that can be performed on an {@link AccessibilityNodeInfo}.
      * Each action has a unique id that is mandatory and optional data.
diff --git a/core/java/android/view/autofill/AutofillPopupWindow.java b/core/java/android/view/autofill/AutofillPopupWindow.java
index 1da998d..a6495d1 100644
--- a/core/java/android/view/autofill/AutofillPopupWindow.java
+++ b/core/java/android/view/autofill/AutofillPopupWindow.java
@@ -79,6 +79,11 @@
     public AutofillPopupWindow(@NonNull IAutofillWindowPresenter presenter) {
         mWindowPresenter = new WindowPresenter(presenter);
 
+        // We want to show the window as system controlled one so it covers app windows, but it has
+        // to be an application type (so it's contained inside the application area).
+        // Hence, we set it to the application type with the highest z-order, which currently
+        // is TYPE_APPLICATION_ABOVE_SUB_PANEL.
+        setWindowLayoutType(WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL);
         setTouchModal(false);
         setOutsideTouchable(true);
         setInputMethodMode(INPUT_METHOD_NOT_NEEDED);
diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java
index 5f7a0f7..090e19f 100644
--- a/core/java/android/view/inputmethod/BaseInputConnection.java
+++ b/core/java/android/view/inputmethod/BaseInputConnection.java
@@ -522,7 +522,7 @@
             b = tmp;
         }
 
-        if (a == b) return null;
+        if (a == b || a < 0) return null;
 
         if ((flags&GET_TEXT_WITH_STYLES) != 0) {
             return content.subSequence(a, b);
diff --git a/core/java/android/view/textclassifier/GenerateLinksLogger.java b/core/java/android/view/textclassifier/GenerateLinksLogger.java
index 73cf43b..067513f 100644
--- a/core/java/android/view/textclassifier/GenerateLinksLogger.java
+++ b/core/java/android/view/textclassifier/GenerateLinksLogger.java
@@ -19,13 +19,13 @@
 import android.annotation.Nullable;
 import android.metrics.LogMaker;
 import android.util.ArrayMap;
-import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.util.Preconditions;
 
+import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Random;
@@ -39,6 +39,7 @@
 public final class GenerateLinksLogger {
 
     private static final String LOG_TAG = "GenerateLinksLogger";
+    private static final boolean DEBUG_LOG_ENABLED = false;
     private static final String ZERO = "0";
 
     private final MetricsLogger mMetricsLogger;
@@ -127,7 +128,7 @@
     }
 
     private static void debugLog(LogMaker log) {
-        if (!Logger.DEBUG_LOG_ENABLED) return;
+        if (!DEBUG_LOG_ENABLED) return;
 
         final String callId = Objects.toString(
                 log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID), "");
@@ -142,8 +143,9 @@
         final int latencyMs = Integer.parseInt(
                 Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY), ZERO));
 
-        Log.d(LOG_TAG, String.format("%s:%s %d links (%d/%d chars) %dms %s", callId, entityType,
-                numLinks, linkLength, textLength, latencyMs, log.getPackageName()));
+        Log.d(LOG_TAG,
+                String.format(Locale.US, "%s:%s %d links (%d/%d chars) %dms %s", callId, entityType,
+                        numLinks, linkLength, textLength, latencyMs, log.getPackageName()));
     }
 
     /** Helper class for storing per-entity type statistics. */
diff --git a/core/java/android/view/textclassifier/LinksInfo.java b/core/java/android/view/textclassifier/LinksInfo.java
deleted file mode 100644
index 754c9e9..0000000
--- a/core/java/android/view/textclassifier/LinksInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.textclassifier;
-
-import android.annotation.NonNull;
-
-/**
- * Link information that can be applied to text. See: {@link #apply(CharSequence)}.
- * Typical implementations of this interface will annotate spannable text with e.g
- * {@link android.text.style.ClickableSpan}s or other annotations.
- * @hide
- */
-public interface LinksInfo {
-
-    /**
-     * @hide
-     */
-    LinksInfo NO_OP = text -> false;
-
-    /**
-     * Applies link annotations to the specified text.
-     * These annotations are not guaranteed to be applied. For example, the annotations may not be
-     * applied if the text has changed from what it was when the link spec was generated for it.
-     *
-     * @return Whether or not the link annotations were successfully applied.
-     */
-    boolean apply(@NonNull CharSequence text);
-}
diff --git a/core/java/android/view/textclassifier/Log.java b/core/java/android/view/textclassifier/Log.java
index 83ca15d..ef19ee5 100644
--- a/core/java/android/view/textclassifier/Log.java
+++ b/core/java/android/view/textclassifier/Log.java
@@ -35,6 +35,10 @@
         Slog.d(tag, msg);
     }
 
+    public static void w(String tag, String msg) {
+        Slog.w(tag, msg);
+    }
+
     public static void e(String tag, String msg, Throwable tr) {
         if (ENABLE_FULL_LOGGING) {
             Slog.e(tag, msg, tr);
diff --git a/core/java/android/view/textclassifier/Logger.java b/core/java/android/view/textclassifier/Logger.java
deleted file mode 100644
index c29d3e6..0000000
--- a/core/java/android/view/textclassifier/Logger.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view.textclassifier;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.Context;
-
-import com.android.internal.util.Preconditions;
-
-import java.text.BreakIterator;
-import java.util.Locale;
-import java.util.Objects;
-
-/**
- * A helper for logging TextClassifier related events.
- * @hide
- */
-public abstract class Logger {
-
-    private static final String LOG_TAG = "Logger";
-    /* package */ static final boolean DEBUG_LOG_ENABLED = true;
-
-    private static final String NO_SIGNATURE = "";
-
-    private @SelectionEvent.InvocationMethod int mInvocationMethod;
-    private SelectionEvent mPrevEvent;
-    private SelectionEvent mSmartEvent;
-    private SelectionEvent mStartEvent;
-
-    /**
-     * Logger that does not log anything.
-     * @hide
-     */
-    public static final Logger DISABLED = new Logger() {
-        @Override
-        public void writeEvent(SelectionEvent event) {}
-    };
-
-    @Nullable
-    private final Config mConfig;
-
-    public Logger(Config config) {
-        mConfig = Preconditions.checkNotNull(config);
-    }
-
-    private Logger() {
-        mConfig = null;
-    }
-
-    /**
-     * Writes the selection event to a log.
-     */
-    public abstract void writeEvent(@NonNull SelectionEvent event);
-
-    /**
-     * Returns true if the signature matches that of a smart selection event (i.e.
-     * {@link SelectionEvent#EVENT_SMART_SELECTION_SINGLE} or
-     * {@link SelectionEvent#EVENT_SMART_SELECTION_MULTI}).
-     * Returns false otherwise.
-     */
-    public boolean isSmartSelection(@NonNull String signature) {
-        return false;
-    }
-
-    /**
-     * Returns a token iterator for tokenizing text for logging purposes.
-     */
-    public BreakIterator getTokenIterator(@NonNull Locale locale) {
-        return BreakIterator.getWordInstance(Preconditions.checkNotNull(locale));
-    }
-
-    /**
-     * Logs a "selection started" event.
-     *
-     * @param invocationMethod  the way the selection was triggered
-     * @param start  the token index of the selected token
-     */
-    public final void logSelectionStartedEvent(
-            @SelectionEvent.InvocationMethod int invocationMethod, int start) {
-        if (mConfig == null) {
-            return;
-        }
-
-        mInvocationMethod = invocationMethod;
-        logEvent(new SelectionEvent(
-                start, start + 1, SelectionEvent.EVENT_SELECTION_STARTED,
-                TextClassifier.TYPE_UNKNOWN, mInvocationMethod, NO_SIGNATURE, mConfig));
-    }
-
-    /**
-     * Logs a "selection modified" event.
-     * Use when the user modifies the selection.
-     *
-     * @param start  the start token (inclusive) index of the selection
-     * @param end  the end token (exclusive) index of the selection
-     */
-    public final void logSelectionModifiedEvent(int start, int end) {
-        Preconditions.checkArgument(end >= start, "end cannot be less than start");
-
-        if (mConfig == null) {
-            return;
-        }
-
-        logEvent(new SelectionEvent(
-                start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
-                TextClassifier.TYPE_UNKNOWN, mInvocationMethod, NO_SIGNATURE, mConfig));
-    }
-
-    /**
-     * Logs a "selection modified" event.
-     * Use when the user modifies the selection and the selection's entity type is known.
-     *
-     * @param start  the start token (inclusive) index of the selection
-     * @param end  the end token (exclusive) index of the selection
-     * @param classification  the TextClassification object returned by the TextClassifier that
-     *      classified the selected text
-     */
-    public final void logSelectionModifiedEvent(
-            int start, int end, @NonNull TextClassification classification) {
-        Preconditions.checkArgument(end >= start, "end cannot be less than start");
-        Preconditions.checkNotNull(classification);
-
-        if (mConfig == null) {
-            return;
-        }
-
-        final String entityType = classification.getEntityCount() > 0
-                ? classification.getEntity(0)
-                : TextClassifier.TYPE_UNKNOWN;
-        final String signature = classification.getSignature();
-        logEvent(new SelectionEvent(
-                start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
-                entityType, mInvocationMethod, signature, mConfig));
-    }
-
-    /**
-     * Logs a "selection modified" event.
-     * Use when a TextClassifier modifies the selection.
-     *
-     * @param start  the start token (inclusive) index of the selection
-     * @param end  the end token (exclusive) index of the selection
-     * @param selection  the TextSelection object returned by the TextClassifier for the
-     *      specified selection
-     */
-    public final void logSelectionModifiedEvent(
-            int start, int end, @NonNull TextSelection selection) {
-        Preconditions.checkArgument(end >= start, "end cannot be less than start");
-        Preconditions.checkNotNull(selection);
-
-        if (mConfig == null) {
-            return;
-        }
-
-        final int eventType;
-        if (isSmartSelection(selection.getSignature())) {
-            eventType = end - start > 1
-                    ? SelectionEvent.EVENT_SMART_SELECTION_MULTI
-                    : SelectionEvent.EVENT_SMART_SELECTION_SINGLE;
-
-        } else {
-            eventType = SelectionEvent.EVENT_AUTO_SELECTION;
-        }
-        final String entityType = selection.getEntityCount() > 0
-                ? selection.getEntity(0)
-                : TextClassifier.TYPE_UNKNOWN;
-        final String signature = selection.getSignature();
-        logEvent(new SelectionEvent(start, end, eventType, entityType, mInvocationMethod, signature,
-                mConfig));
-    }
-
-    /**
-     * Logs an event specifying an action taken on a selection.
-     * Use when the user clicks on an action to act on the selected text.
-     *
-     * @param start  the start token (inclusive) index of the selection
-     * @param end  the end token (exclusive) index of the selection
-     * @param actionType  the action that was performed on the selection
-     */
-    public final void logSelectionActionEvent(
-            int start, int end, @SelectionEvent.ActionType int actionType) {
-        Preconditions.checkArgument(end >= start, "end cannot be less than start");
-        checkActionType(actionType);
-
-        if (mConfig == null) {
-            return;
-        }
-
-        logEvent(new SelectionEvent(
-                start, end, actionType, TextClassifier.TYPE_UNKNOWN, mInvocationMethod,
-                NO_SIGNATURE, mConfig));
-    }
-
-    /**
-     * Logs an event specifying an action taken on a selection.
-     * Use when the user clicks on an action to act on the selected text and the selection's
-     * entity type is known.
-     *
-     * @param start  the start token (inclusive) index of the selection
-     * @param end  the end token (exclusive) index of the selection
-     * @param actionType  the action that was performed on the selection
-     * @param classification  the TextClassification object returned by the TextClassifier that
-     *      classified the selected text
-     *
-     * @throws IllegalArgumentException If actionType is not a valid SelectionEvent actionType
-     */
-    public final void logSelectionActionEvent(
-            int start, int end, @SelectionEvent.ActionType int actionType,
-            @NonNull TextClassification classification) {
-        Preconditions.checkArgument(end >= start, "end cannot be less than start");
-        Preconditions.checkNotNull(classification);
-        checkActionType(actionType);
-
-        if (mConfig == null) {
-            return;
-        }
-
-        final String entityType = classification.getEntityCount() > 0
-                ? classification.getEntity(0)
-                : TextClassifier.TYPE_UNKNOWN;
-        final String signature = classification.getSignature();
-        logEvent(new SelectionEvent(start, end, actionType, entityType, mInvocationMethod,
-                signature, mConfig));
-    }
-
-    private void logEvent(@NonNull SelectionEvent event) {
-        Preconditions.checkNotNull(event);
-
-        if (event.getEventType() != SelectionEvent.EVENT_SELECTION_STARTED
-                && mStartEvent == null) {
-            if (DEBUG_LOG_ENABLED) {
-                Log.d(LOG_TAG, "Selection session not yet started. Ignoring event");
-            }
-            return;
-        }
-
-        final long now = System.currentTimeMillis();
-        switch (event.getEventType()) {
-            case SelectionEvent.EVENT_SELECTION_STARTED:
-                Preconditions.checkArgument(event.getAbsoluteEnd() == event.getAbsoluteStart() + 1);
-                event.setSessionId(startNewSession());
-                mStartEvent = event;
-                break;
-            case SelectionEvent.EVENT_SMART_SELECTION_SINGLE:  // fall through
-            case SelectionEvent.EVENT_SMART_SELECTION_MULTI:
-                mSmartEvent = event;
-                break;
-            case SelectionEvent.EVENT_SELECTION_MODIFIED:  // fall through
-            case SelectionEvent.EVENT_AUTO_SELECTION:
-                if (mPrevEvent != null
-                        && mPrevEvent.getAbsoluteStart() == event.getAbsoluteStart()
-                        && mPrevEvent.getAbsoluteEnd() == event.getAbsoluteEnd()) {
-                    // Selection did not change. Ignore event.
-                    return;
-                }
-                break;
-            default:
-                // do nothing.
-        }
-
-        event.setEventTime(now);
-        if (mStartEvent != null) {
-            event.setSessionId(mStartEvent.getSessionId())
-                    .setDurationSinceSessionStart(now - mStartEvent.getEventTime())
-                    .setStart(event.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
-                    .setEnd(event.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
-        }
-        if (mSmartEvent != null) {
-            event.setSignature(mSmartEvent.getSignature())
-                    .setSmartStart(mSmartEvent.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
-                    .setSmartEnd(mSmartEvent.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
-        }
-        if (mPrevEvent != null) {
-            event.setDurationSincePreviousEvent(now - mPrevEvent.getEventTime())
-                    .setEventIndex(mPrevEvent.getEventIndex() + 1);
-        }
-        writeEvent(event);
-        mPrevEvent = event;
-
-        if (event.isTerminal()) {
-            endSession();
-        }
-    }
-
-    private TextClassificationSessionId startNewSession() {
-        endSession();
-        return new TextClassificationSessionId();
-    }
-
-    private void endSession() {
-        mPrevEvent = null;
-        mSmartEvent = null;
-        mStartEvent = null;
-    }
-
-    /**
-     * @throws IllegalArgumentException If eventType is not an {@link SelectionEvent.ActionType}
-     */
-    private static void checkActionType(@SelectionEvent.EventType int eventType)
-            throws IllegalArgumentException {
-        switch (eventType) {
-            case SelectionEvent.ACTION_OVERTYPE:  // fall through
-            case SelectionEvent.ACTION_COPY:  // fall through
-            case SelectionEvent.ACTION_PASTE:  // fall through
-            case SelectionEvent.ACTION_CUT:  // fall through
-            case SelectionEvent.ACTION_SHARE:  // fall through
-            case SelectionEvent.ACTION_SMART_SHARE:  // fall through
-            case SelectionEvent.ACTION_DRAG:  // fall through
-            case SelectionEvent.ACTION_ABANDON:  // fall through
-            case SelectionEvent.ACTION_SELECT_ALL:  // fall through
-            case SelectionEvent.ACTION_RESET:  // fall through
-                return;
-            default:
-                throw new IllegalArgumentException(
-                        String.format(Locale.US, "%d is not an eventType", eventType));
-        }
-    }
-
-
-    /**
-     * A Logger config.
-     */
-    public static final class Config {
-
-        private final String mPackageName;
-        private final String mWidgetType;
-        @Nullable private final String mWidgetVersion;
-
-        /**
-         * @param context Context of the widget the logger logs for
-         * @param widgetType a name for the widget being logged for. e.g.
-         *      {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}
-         * @param widgetVersion a string version info for the widget the logger logs for
-         */
-        public Config(
-                @NonNull Context context,
-                @TextClassifier.WidgetType String widgetType,
-                @Nullable String widgetVersion) {
-            mPackageName = Preconditions.checkNotNull(context).getPackageName();
-            mWidgetType = widgetType;
-            mWidgetVersion = widgetVersion;
-        }
-
-        /**
-         * Returns the package name of the application the logger logs for.
-         */
-        public String getPackageName() {
-            return mPackageName;
-        }
-
-        /**
-         * Returns the name for the widget being logged for. e.g.
-         * {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}.
-         */
-        public String getWidgetType() {
-            return mWidgetType;
-        }
-
-        /**
-         * Returns string version info for the logger. This is specific to the text classifier.
-         */
-        @Nullable
-        public String getWidgetVersion() {
-            return mWidgetVersion;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mPackageName, mWidgetType, mWidgetVersion);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == this) {
-                return true;
-            }
-
-            if (!(obj instanceof Config)) {
-                return false;
-            }
-
-            final Config other = (Config) obj;
-            return Objects.equals(mPackageName, other.mPackageName)
-                    && Objects.equals(mWidgetType, other.mWidgetType)
-                    && Objects.equals(mWidgetVersion, other.mWidgetType);
-        }
-    }
-}
diff --git a/core/java/android/view/textclassifier/SelectionEvent.java b/core/java/android/view/textclassifier/SelectionEvent.java
index 5a4d2cf..b073596 100644
--- a/core/java/android/view/textclassifier/SelectionEvent.java
+++ b/core/java/android/view/textclassifier/SelectionEvent.java
@@ -126,7 +126,7 @@
     private String mWidgetType = TextClassifier.WIDGET_TYPE_UNKNOWN;
     private @InvocationMethod int mInvocationMethod;
     @Nullable private String mWidgetVersion;
-    private String mSignature;  // TODO: Rename to resultId.
+    @Nullable private String mResultId;
     private long mEventTime;
     private long mDurationSinceSessionStart;
     private long mDurationSincePreviousEvent;
@@ -140,29 +140,16 @@
     SelectionEvent(
             int start, int end,
             @EventType int eventType, @EntityType String entityType,
-            @InvocationMethod int invocationMethod, String signature) {
+            @InvocationMethod int invocationMethod, @Nullable String resultId) {
         Preconditions.checkArgument(end >= start, "end cannot be less than start");
         mAbsoluteStart = start;
         mAbsoluteEnd = end;
         mEventType = eventType;
         mEntityType = Preconditions.checkNotNull(entityType);
-        mSignature = Preconditions.checkNotNull(signature);
+        mResultId = resultId;
         mInvocationMethod = invocationMethod;
     }
 
-    SelectionEvent(
-            int start, int end,
-            @EventType int eventType, @EntityType String entityType,
-            @InvocationMethod int invocationMethod, String signature, Logger.Config config) {
-        this(start, end, eventType, entityType, invocationMethod, signature);
-        Preconditions.checkNotNull(config);
-        setTextClassificationSessionContext(
-                new TextClassificationContext.Builder(
-                        config.getPackageName(), config.getWidgetType())
-                        .setWidgetVersion(config.getWidgetVersion())
-                        .build());
-    }
-
     private SelectionEvent(Parcel in) {
         mAbsoluteStart = in.readInt();
         mAbsoluteEnd = in.readInt();
@@ -172,7 +159,7 @@
         mPackageName = in.readString();
         mWidgetType = in.readString();
         mInvocationMethod = in.readInt();
-        mSignature = in.readString();
+        mResultId = in.readString();
         mEventTime = in.readLong();
         mDurationSinceSessionStart = in.readLong();
         mDurationSincePreviousEvent = in.readLong();
@@ -198,7 +185,7 @@
         dest.writeString(mPackageName);
         dest.writeString(mWidgetType);
         dest.writeInt(mInvocationMethod);
-        dest.writeString(mSignature);
+        dest.writeString(mResultId);
         dest.writeLong(mEventTime);
         dest.writeLong(mDurationSinceSessionStart);
         dest.writeLong(mDurationSincePreviousEvent);
@@ -270,7 +257,7 @@
                 : TextClassifier.TYPE_UNKNOWN;
         return new SelectionEvent(
                 start, end, SelectionEvent.EVENT_SELECTION_MODIFIED,
-                entityType, INVOCATION_UNKNOWN, classification.getSignature());
+                entityType, INVOCATION_UNKNOWN, classification.getId());
     }
 
     /**
@@ -294,7 +281,7 @@
                 : TextClassifier.TYPE_UNKNOWN;
         return new SelectionEvent(
                 start, end, SelectionEvent.EVENT_AUTO_SELECTION,
-                entityType, INVOCATION_UNKNOWN, selection.getSignature());
+                entityType, INVOCATION_UNKNOWN, selection.getId());
     }
 
     /**
@@ -342,7 +329,7 @@
                 ? classification.getEntity(0)
                 : TextClassifier.TYPE_UNKNOWN;
         return new SelectionEvent(start, end, actionType, entityType, INVOCATION_UNKNOWN,
-                classification.getSignature());
+                classification.getId());
     }
 
     /**
@@ -361,6 +348,7 @@
             case SelectionEvent.ACTION_ABANDON:  // fall through
             case SelectionEvent.ACTION_SELECT_ALL:  // fall through
             case SelectionEvent.ACTION_RESET:  // fall through
+            case SelectionEvent.ACTION_OTHER:  // fall through
                 return;
             default:
                 throw new IllegalArgumentException(
@@ -450,14 +438,15 @@
     }
 
     /**
-     * Returns the signature of the text classifier result associated with this event.
+     * Returns the id of the text classifier result associated with this event.
      */
-    public String getSignature() {
-        return mSignature;
+    @Nullable
+    public String getResultId() {
+        return mResultId;
     }
 
-    SelectionEvent setSignature(String signature) {
-        mSignature = Preconditions.checkNotNull(signature);
+    SelectionEvent setResultId(@Nullable String resultId) {
+        mResultId = resultId;
         return this;
     }
 
@@ -604,7 +593,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(mAbsoluteStart, mAbsoluteEnd, mEventType, mEntityType,
-                mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mSignature,
+                mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mResultId,
                 mEventTime, mDurationSinceSessionStart, mDurationSincePreviousEvent,
                 mEventIndex, mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
     }
@@ -627,7 +616,7 @@
                 && Objects.equals(mPackageName, other.mPackageName)
                 && Objects.equals(mWidgetType, other.mWidgetType)
                 && mInvocationMethod == other.mInvocationMethod
-                && Objects.equals(mSignature, other.mSignature)
+                && Objects.equals(mResultId, other.mResultId)
                 && mEventTime == other.mEventTime
                 && mDurationSinceSessionStart == other.mDurationSinceSessionStart
                 && mDurationSincePreviousEvent == other.mDurationSincePreviousEvent
@@ -642,15 +631,16 @@
     @Override
     public String toString() {
         return String.format(Locale.US,
-        "SelectionEvent {absoluteStart=%d, absoluteEnd=%d, eventType=%d, entityType=%s, "
-                + "widgetVersion=%s, packageName=%s, widgetType=%s, invocationMethod=%s, "
-                + "signature=%s, eventTime=%d, durationSinceSessionStart=%d, "
-                + "durationSincePreviousEvent=%d, eventIndex=%d, sessionId=%s, start=%d, end=%d, "
-                + "smartStart=%d, smartEnd=%d}",
+                "SelectionEvent {absoluteStart=%d, absoluteEnd=%d, eventType=%d, entityType=%s, "
+                        + "widgetVersion=%s, packageName=%s, widgetType=%s, invocationMethod=%s, "
+                        + "resultId=%s, eventTime=%d, durationSinceSessionStart=%d, "
+                        + "durationSincePreviousEvent=%d, eventIndex=%d,"
+                        + "sessionId=%s, start=%d, end=%d, smartStart=%d, smartEnd=%d}",
                 mAbsoluteStart, mAbsoluteEnd, mEventType, mEntityType,
-                mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod, mSignature,
-                mEventTime, mDurationSinceSessionStart, mDurationSincePreviousEvent,
-                mEventIndex, mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
+                mWidgetVersion, mPackageName, mWidgetType, mInvocationMethod,
+                mResultId, mEventTime, mDurationSinceSessionStart,
+                mDurationSincePreviousEvent, mEventIndex,
+                mSessionId, mStart, mEnd, mSmartStart, mSmartEnd);
     }
 
     public static final Creator<SelectionEvent> CREATOR = new Creator<SelectionEvent>() {
diff --git a/core/java/android/view/textclassifier/DefaultLogger.java b/core/java/android/view/textclassifier/SelectionSessionLogger.java
similarity index 87%
rename from core/java/android/view/textclassifier/DefaultLogger.java
rename to core/java/android/view/textclassifier/SelectionSessionLogger.java
index 46ff442..f2fb63e 100644
--- a/core/java/android/view/textclassifier/DefaultLogger.java
+++ b/core/java/android/view/textclassifier/SelectionSessionLogger.java
@@ -17,28 +17,29 @@
 package android.view.textclassifier;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.content.Context;
 import android.metrics.LogMaker;
-import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.util.Preconditions;
 
+import java.text.BreakIterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
 import java.util.StringJoiner;
 
 /**
- * Default Logger.
- * Used internally by TextClassifierImpl.
+ * A helper for logging selection session events.
  * @hide
  */
-public final class DefaultLogger extends Logger {
+public final class SelectionSessionLogger {
 
-    private static final String LOG_TAG = "DefaultLogger";
+    private static final String LOG_TAG = "SelectionSessionLogger";
+    private static final boolean DEBUG_LOG_ENABLED = false;
     static final String CLASSIFIER_ID = "androidtc";
 
     private static final int START_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_START;
@@ -59,23 +60,16 @@
 
     private final MetricsLogger mMetricsLogger;
 
-    public DefaultLogger(@NonNull Config config) {
-        super(config);
+    public SelectionSessionLogger() {
         mMetricsLogger = new MetricsLogger();
     }
 
     @VisibleForTesting
-    public DefaultLogger(@NonNull Config config, @NonNull MetricsLogger metricsLogger) {
-        super(config);
+    public SelectionSessionLogger(@NonNull MetricsLogger metricsLogger) {
         mMetricsLogger = Preconditions.checkNotNull(metricsLogger);
     }
 
-    @Override
-    public boolean isSmartSelection(@NonNull String signature) {
-        return CLASSIFIER_ID.equals(SignatureParser.getClassifierId(signature));
-    }
-
-    @Override
+    /** Emits a selection event to the logs. */
     public void writeEvent(@NonNull SelectionEvent event) {
         Preconditions.checkNotNull(event);
         final LogMaker log = new LogMaker(MetricsEvent.TEXT_SELECTION_SESSION)
@@ -87,13 +81,13 @@
                 .addTaggedData(INDEX, event.getEventIndex())
                 .addTaggedData(WIDGET_TYPE, event.getWidgetType())
                 .addTaggedData(WIDGET_VERSION, event.getWidgetVersion())
-                .addTaggedData(MODEL_NAME, SignatureParser.getModelName(event.getSignature()))
+                .addTaggedData(MODEL_NAME, SignatureParser.getModelName(event.getResultId()))
                 .addTaggedData(ENTITY_TYPE, event.getEntityType())
                 .addTaggedData(SMART_START, event.getSmartStart())
                 .addTaggedData(SMART_END, event.getSmartEnd())
                 .addTaggedData(EVENT_START, event.getStart())
                 .addTaggedData(EVENT_END, event.getEnd())
-                .addTaggedData(SESSION_ID, event.getSessionId());
+                .addTaggedData(SESSION_ID, event.getSessionId().flattenToString());
         mMetricsLogger.write(log);
         debugLog(log);
     }
@@ -225,15 +219,23 @@
         final int eventEnd = Integer.parseInt(
                 Objects.toString(log.getTaggedData(EVENT_END), ZERO));
 
-        Log.d(LOG_TAG, String.format("%2d: %s/%s/%s, range=%d,%d - smart_range=%d,%d (%s/%s)",
-                index, type, subType, entity, eventStart, eventEnd, smartStart, smartEnd, widget,
-                model));
+        Log.d(LOG_TAG,
+                String.format(Locale.US, "%2d: %s/%s/%s, range=%d,%d - smart_range=%d,%d (%s/%s)",
+                        index, type, subType, entity, eventStart, eventEnd, smartStart, smartEnd,
+                        widget, model));
     }
 
     /**
-     * Creates a signature string that may be used to tag TextClassifier results.
+     * Returns a token iterator for tokenizing text for logging purposes.
      */
-    public static String createSignature(
+    public static BreakIterator getTokenIterator(@NonNull Locale locale) {
+        return BreakIterator.getWordInstance(Preconditions.checkNotNull(locale));
+    }
+
+    /**
+     * Creates a string id that may be used to identify a TextClassifier result.
+     */
+    public static String createId(
             String text, int start, int end, Context context, int modelVersion,
             List<Locale> locales) {
         Preconditions.checkNotNull(text);
@@ -250,7 +252,7 @@
     }
 
     /**
-     * Helper for creating and parsing signature strings for
+     * Helper for creating and parsing string ids for
      * {@link android.view.textclassifier.TextClassifierImpl}.
      */
     @VisibleForTesting
@@ -260,8 +262,10 @@
             return String.format(Locale.US, "%s|%s|%d", classifierId, modelName, hash);
         }
 
-        static String getClassifierId(String signature) {
-            Preconditions.checkNotNull(signature);
+        static String getClassifierId(@Nullable String signature) {
+            if (signature == null) {
+                return "";
+            }
             final int end = signature.indexOf("|");
             if (end >= 0) {
                 return signature.substring(0, end);
@@ -269,8 +273,10 @@
             return "";
         }
 
-        static String getModelName(String signature) {
-            Preconditions.checkNotNull(signature);
+        static String getModelName(@Nullable String signature) {
+            if (signature == null) {
+                return "";
+            }
             final int start = signature.indexOf("|") + 1;
             final int end = signature.indexOf("|", start);
             if (start >= 1 && end >= start) {
@@ -279,8 +285,10 @@
             return "";
         }
 
-        static int getHash(String signature) {
-            Preconditions.checkNotNull(signature);
+        static int getHash(@Nullable String signature) {
+            if (signature == null) {
+                return 0;
+            }
             final int index1 = signature.indexOf("|");
             final int index2 = signature.indexOf("|", index1);
             if (index2 > 0) {
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index 2a24dd7..490c389 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -16,7 +16,6 @@
 
 package android.view.textclassifier;
 
-import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.WorkerThread;
@@ -29,7 +28,6 @@
 import android.service.textclassifier.ITextLinksCallback;
 import android.service.textclassifier.ITextSelectionCallback;
 
-import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.annotations.VisibleForTesting.Visibility;
 import com.android.internal.util.Preconditions;
@@ -50,12 +48,7 @@
     private final TextClassificationConstants mSettings;
     private final TextClassifier mFallback;
     private final String mPackageName;
-
-    private final Object mLoggerLock = new Object();
-    @GuardedBy("mLoggerLock")
-    private Logger.Config mLoggerConfig;
-    @GuardedBy("mLoggerLock")
-    private Logger mLogger;
+    private TextClassificationSessionId mSessionId;
 
     public SystemTextClassifier(Context context, TextClassificationConstants settings)
                 throws ServiceManager.ServiceNotFoundException {
@@ -71,26 +64,20 @@
      */
     @Override
     @WorkerThread
-    public TextSelection suggestSelection(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int selectionStartIndex,
-            @IntRange(from = 0) int selectionEndIndex,
-            @Nullable TextSelection.Options options) {
-        Utils.validate(text, selectionStartIndex, selectionEndIndex, false /* allowInMainThread */);
+    public TextSelection suggestSelection(TextSelection.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
         try {
             final TextSelectionCallback callback = new TextSelectionCallback();
-            mManagerService.onSuggestSelection(
-                    text, selectionStartIndex, selectionEndIndex, options, callback);
+            mManagerService.onSuggestSelection(mSessionId, request, callback);
             final TextSelection selection = callback.mReceiver.get();
             if (selection != null) {
                 return selection;
             }
-        } catch (RemoteException e) {
-            e.rethrowAsRuntimeException();
-        } catch (InterruptedException e) {
-            Log.d(LOG_TAG, e.getMessage());
+        } catch (RemoteException | InterruptedException e) {
+            Log.e(LOG_TAG, "Error suggesting selection for text. Using fallback.", e);
         }
-        return mFallback.suggestSelection(text, selectionStartIndex, selectionEndIndex, options);
+        return mFallback.suggestSelection(request);
     }
 
     /**
@@ -98,25 +85,20 @@
      */
     @Override
     @WorkerThread
-    public TextClassification classifyText(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int startIndex,
-            @IntRange(from = 0) int endIndex,
-            @Nullable TextClassification.Options options) {
-        Utils.validate(text, startIndex, endIndex, false /* allowInMainThread */);
+    public TextClassification classifyText(TextClassification.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
         try {
             final TextClassificationCallback callback = new TextClassificationCallback();
-            mManagerService.onClassifyText(text, startIndex, endIndex, options, callback);
+            mManagerService.onClassifyText(mSessionId, request, callback);
             final TextClassification classification = callback.mReceiver.get();
             if (classification != null) {
                 return classification;
             }
-        } catch (RemoteException e) {
-            e.rethrowAsRuntimeException();
-        } catch (InterruptedException e) {
-            Log.d(LOG_TAG, e.getMessage());
+        } catch (RemoteException | InterruptedException e) {
+            Log.e(LOG_TAG, "Error classifying text. Using fallback.", e);
         }
-        return mFallback.classifyText(text, startIndex, endIndex, options);
+        return mFallback.classifyText(request);
     }
 
     /**
@@ -124,33 +106,26 @@
      */
     @Override
     @WorkerThread
-    public TextLinks generateLinks(
-            @NonNull CharSequence text, @Nullable TextLinks.Options options) {
-        Utils.validate(text, false /* allowInMainThread */);
+    public TextLinks generateLinks(@NonNull TextLinks.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
 
-        final boolean legacyFallback = options != null && options.isLegacyFallback();
-        if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
-            return Utils.generateLegacyLinks(text, options);
+        if (!mSettings.isSmartLinkifyEnabled() && request.isLegacyFallback()) {
+            return Utils.generateLegacyLinks(request);
         }
 
         try {
-            if (options == null) {
-                options = new TextLinks.Options().setCallingPackageName(mPackageName);
-            } else if (!mPackageName.equals(options.getCallingPackageName())) {
-                options.setCallingPackageName(mPackageName);
-            }
+            request.setCallingPackageName(mPackageName);
             final TextLinksCallback callback = new TextLinksCallback();
-            mManagerService.onGenerateLinks(text, options, callback);
+            mManagerService.onGenerateLinks(mSessionId, request, callback);
             final TextLinks links = callback.mReceiver.get();
             if (links != null) {
                 return links;
             }
-        } catch (RemoteException e) {
-            e.rethrowAsRuntimeException();
-        } catch (InterruptedException e) {
-            Log.d(LOG_TAG, e.getMessage());
+        } catch (RemoteException | InterruptedException e) {
+            Log.e(LOG_TAG, "Error generating links. Using fallback.", e);
         }
-        return mFallback.generateLinks(text, options);
+        return mFallback.generateLinks(request);
     }
 
     /**
@@ -164,24 +139,31 @@
     }
 
     @Override
-    public Logger getLogger(@NonNull Logger.Config config) {
-        Preconditions.checkNotNull(config);
-        synchronized (mLoggerLock) {
-            if (mLogger == null || !config.equals(mLoggerConfig)) {
-                mLoggerConfig = config;
-                mLogger = new Logger(config) {
-                    @Override
-                    public void writeEvent(SelectionEvent event) {
-                        try {
-                            mManagerService.onSelectionEvent(event);
-                        } catch (RemoteException e) {
-                            e.rethrowAsRuntimeException();
-                        }
-                    }
-                };
+    public void destroy() {
+        try {
+            if (mSessionId != null) {
+                mManagerService.onDestroyTextClassificationSession(mSessionId);
             }
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "Error destroying classification session.", e);
         }
-        return mLogger;
+    }
+
+    /**
+     * Attempts to initialize a new classification session.
+     *
+     * @param classificationContext the classification context
+     * @param sessionId the session's id
+     */
+    void initializeRemoteSession(
+            @NonNull TextClassificationContext classificationContext,
+            @NonNull TextClassificationSessionId sessionId) {
+        mSessionId = Preconditions.checkNotNull(sessionId);
+        try {
+            mManagerService.onCreateTextClassificationSession(classificationContext, mSessionId);
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "Error starting a new classification session.", e);
+        }
     }
 
     private static final class TextSelectionCallback extends ITextSelectionCallback.Stub {
diff --git a/core/java/android/view/textclassifier/TextClassification.aidl b/core/java/android/view/textclassifier/TextClassification.aidl
index 9fefe5d..bfb143c 100644
--- a/core/java/android/view/textclassifier/TextClassification.aidl
+++ b/core/java/android/view/textclassifier/TextClassification.aidl
@@ -17,4 +17,4 @@
 package android.view.textclassifier;
 
 parcelable TextClassification;
-parcelable TextClassification.Options;
\ No newline at end of file
+parcelable TextClassification.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index b413d48..f80625f 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -38,6 +38,7 @@
 import android.util.ArrayMap;
 import android.view.View.OnClickListener;
 import android.view.textclassifier.TextClassifier.EntityType;
+import android.view.textclassifier.TextClassifier.Utils;
 
 import com.android.internal.util.Preconditions;
 
@@ -123,7 +124,7 @@
     @Nullable private final OnClickListener mLegacyOnClickListener;
     @NonNull private final List<RemoteAction> mActions;
     @NonNull private final EntityConfidence mEntityConfidence;
-    @NonNull private final String mSignature;
+    @Nullable private final String mId;
 
     private TextClassification(
             @Nullable String text,
@@ -133,7 +134,7 @@
             @Nullable OnClickListener legacyOnClickListener,
             @NonNull List<RemoteAction> actions,
             @NonNull Map<String, Float> entityConfidence,
-            @NonNull String signature) {
+            @Nullable String id) {
         mText = text;
         mLegacyIcon = legacyIcon;
         mLegacyLabel = legacyLabel;
@@ -141,7 +142,7 @@
         mLegacyOnClickListener = legacyOnClickListener;
         mActions = Collections.unmodifiableList(actions);
         mEntityConfidence = new EntityConfidence(entityConfidence);
-        mSignature = signature;
+        mId = id;
     }
 
     /**
@@ -237,20 +238,18 @@
     }
 
     /**
-     * Returns the signature for this object.
-     * The TextClassifier that generates this object may use it as a way to internally identify
-     * this object.
+     * Returns the id, if one exists, for this object.
      */
-    @NonNull
-    public String getSignature() {
-        return mSignature;
+    @Nullable
+    public String getId() {
+        return mId;
     }
 
     @Override
     public String toString() {
         return String.format(Locale.US,
-                "TextClassification {text=%s, entities=%s, actions=%s, signature=%s}",
-                mText, mEntityConfidence, mActions, mSignature);
+                "TextClassification {text=%s, entities=%s, actions=%s, id=%s}",
+                mText, mEntityConfidence, mActions, mId);
     }
 
     /**
@@ -264,7 +263,7 @@
             try {
                 intent.send();
             } catch (PendingIntent.CanceledException e) {
-                Log.e(LOG_TAG, "Error creating OnClickListener from PendingIntent", e);
+                Log.e(LOG_TAG, "Error sending PendingIntent", e);
             }
         };
     }
@@ -289,25 +288,6 @@
         }
     }
 
-    /**
-     * Triggers the specified intent.
-     *
-     * @throws IllegalArgumentException if context or intent is null
-     * @hide
-     */
-    public static void fireIntent(@NonNull final Context context, @NonNull final Intent intent) {
-        switch (getIntentType(intent, context)) {
-            case IntentType.ACTIVITY:
-                context.startActivity(intent);
-                return;
-            case IntentType.SERVICE:
-                context.startService(intent);
-                return;
-            default:
-                return;
-        }
-    }
-
     @IntentType
     private static int getIntentType(@NonNull Intent intent, @NonNull Context context) {
         Preconditions.checkArgument(context != null);
@@ -402,11 +382,12 @@
         @Nullable String mLegacyLabel;
         @Nullable Intent mLegacyIntent;
         @Nullable OnClickListener mLegacyOnClickListener;
-        @NonNull private String mSignature = "";
+        @Nullable private String mId;
 
         /**
          * Sets the classified text.
          */
+        @NonNull
         public Builder setText(@Nullable String text) {
             mText = text;
             return this;
@@ -421,6 +402,7 @@
          *      0 implies the entity does not exist for the classified text.
          *      Values greater than 1 are clamped to 1.
          */
+        @NonNull
         public Builder setEntityType(
                 @NonNull @EntityType String type,
                 @FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
@@ -433,6 +415,7 @@
          * order of likelihood that the user will use them, with the most likely action being added
          * first.
          */
+        @NonNull
         public Builder addAction(@NonNull RemoteAction action) {
             Preconditions.checkArgument(action != null);
             mActions.add(action);
@@ -446,6 +429,7 @@
          * @deprecated Use {@link #addAction(RemoteAction)} instead.
          */
         @Deprecated
+        @NonNull
         public Builder setIcon(@Nullable Drawable icon) {
             mLegacyIcon = icon;
             return this;
@@ -458,6 +442,7 @@
          * @deprecated Use {@link #addAction(RemoteAction)} instead.
          */
         @Deprecated
+        @NonNull
         public Builder setLabel(@Nullable String label) {
             mLegacyLabel = label;
             return this;
@@ -470,6 +455,7 @@
          * @deprecated Use {@link #addAction(RemoteAction)} instead.
          */
         @Deprecated
+        @NonNull
         public Builder setIntent(@Nullable Intent intent) {
             mLegacyIntent = intent;
             return this;
@@ -482,58 +468,79 @@
          *
          * @deprecated Use {@link #addAction(RemoteAction)} instead.
          */
+        @Deprecated
+        @NonNull
         public Builder setOnClickListener(@Nullable OnClickListener onClickListener) {
             mLegacyOnClickListener = onClickListener;
             return this;
         }
 
         /**
-         * Sets a signature for the TextClassification object.
-         * The TextClassifier that generates the TextClassification object may use it as a way to
-         * internally identify the TextClassification object.
+         * Sets an id for the TextClassification object.
          */
-        public Builder setSignature(@NonNull String signature) {
-            mSignature = Preconditions.checkNotNull(signature);
+        @NonNull
+        public Builder setId(@Nullable String id) {
+            mId = id;
             return this;
         }
 
         /**
          * Builds and returns a {@link TextClassification} object.
          */
+        @NonNull
         public TextClassification build() {
             return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent,
-                    mLegacyOnClickListener, mActions, mEntityConfidence, mSignature);
+                    mLegacyOnClickListener, mActions, mEntityConfidence, mId);
         }
     }
 
     /**
-     * Optional input parameters for generating TextClassification.
+     * A request object for generating TextClassification.
      */
-    public static final class Options implements Parcelable {
+    public static final class Request implements Parcelable {
 
-        private @Nullable LocaleList mDefaultLocales;
-        private @Nullable ZonedDateTime mReferenceTime;
+        private final CharSequence mText;
+        private final int mStartIndex;
+        private final int mEndIndex;
+        @Nullable private final LocaleList mDefaultLocales;
+        @Nullable private final ZonedDateTime mReferenceTime;
 
-        public Options() {}
-
-        /**
-         * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
-         *      the provided text. If no locale preferences exist, set this to null or an empty
-         *      locale list.
-         */
-        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+        private Request(
+                CharSequence text,
+                int startIndex,
+                int endIndex,
+                LocaleList defaultLocales,
+                ZonedDateTime referenceTime) {
+            mText = text;
+            mStartIndex = startIndex;
+            mEndIndex = endIndex;
             mDefaultLocales = defaultLocales;
-            return this;
+            mReferenceTime = referenceTime;
         }
 
         /**
-         * @param referenceTime reference time based on which relative dates (e.g. "tomorrow" should
-         *      be interpreted. This should usually be the time when the text was originally
-         *      composed. If no reference time is set, now is used.
+         * Returns the text providing context for the text to classify (which is specified
+         *      by the sub sequence starting at startIndex and ending at endIndex)
          */
-        public Options setReferenceTime(ZonedDateTime referenceTime) {
-            mReferenceTime = referenceTime;
-            return this;
+        @NonNull
+        public CharSequence getText() {
+            return mText;
+        }
+
+        /**
+         * Returns start index of the text to classify.
+         */
+        @IntRange(from = 0)
+        public int getStartIndex() {
+            return mStartIndex;
+        }
+
+        /**
+         * Returns end index of the text to classify.
+         */
+        @IntRange(from = 0)
+        public int getEndIndex() {
+            return mEndIndex;
         }
 
         /**
@@ -554,6 +561,69 @@
             return mReferenceTime;
         }
 
+        /**
+         * A builder for building TextClassification requests.
+         */
+        public static final class Builder {
+
+            private final CharSequence mText;
+            private final int mStartIndex;
+            private final int mEndIndex;
+
+            @Nullable private LocaleList mDefaultLocales;
+            @Nullable private ZonedDateTime mReferenceTime;
+
+            /**
+             * @param text text providing context for the text to classify (which is specified
+             *      by the sub sequence starting at startIndex and ending at endIndex)
+             * @param startIndex start index of the text to classify
+             * @param endIndex end index of the text to classify
+             */
+            public Builder(
+                    @NonNull CharSequence text,
+                    @IntRange(from = 0) int startIndex,
+                    @IntRange(from = 0) int endIndex) {
+                Utils.checkArgument(text, startIndex, endIndex);
+                mText = text;
+                mStartIndex = startIndex;
+                mEndIndex = endIndex;
+            }
+
+            /**
+             * @param defaultLocales ordered list of locale preferences that may be used to
+             *      disambiguate the provided text. If no locale preferences exist, set this to null
+             *      or an empty locale list.
+             *
+             * @return this builder
+             */
+            @NonNull
+            public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+                mDefaultLocales = defaultLocales;
+                return this;
+            }
+
+            /**
+             * @param referenceTime reference time based on which relative dates (e.g. "tomorrow"
+             *      should be interpreted. This should usually be the time when the text was
+             *      originally composed. If no reference time is set, now is used.
+             *
+             * @return this builder
+             */
+            @NonNull
+            public Builder setReferenceTime(@Nullable ZonedDateTime referenceTime) {
+                mReferenceTime = referenceTime;
+                return this;
+            }
+
+            /**
+             * Builds and returns the request object.
+             */
+            @NonNull
+            public Request build() {
+                return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime);
+            }
+        }
+
         @Override
         public int describeContents() {
             return 0;
@@ -561,6 +631,9 @@
 
         @Override
         public void writeToParcel(Parcel dest, int flags) {
+            dest.writeString(mText.toString());
+            dest.writeInt(mStartIndex);
+            dest.writeInt(mEndIndex);
             dest.writeInt(mDefaultLocales != null ? 1 : 0);
             if (mDefaultLocales != null) {
                 mDefaultLocales.writeToParcel(dest, flags);
@@ -571,26 +644,25 @@
             }
         }
 
-        public static final Parcelable.Creator<Options> CREATOR =
-                new Parcelable.Creator<Options>() {
+        public static final Parcelable.Creator<Request> CREATOR =
+                new Parcelable.Creator<Request>() {
                     @Override
-                    public Options createFromParcel(Parcel in) {
-                        return new Options(in);
+                    public Request createFromParcel(Parcel in) {
+                        return new Request(in);
                     }
 
                     @Override
-                    public Options[] newArray(int size) {
-                        return new Options[size];
+                    public Request[] newArray(int size) {
+                        return new Request[size];
                     }
                 };
 
-        private Options(Parcel in) {
-            if (in.readInt() > 0) {
-                mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
-            }
-            if (in.readInt() > 0) {
-                mReferenceTime = ZonedDateTime.parse(in.readString());
-            }
+        private Request(Parcel in) {
+            mText = in.readString();
+            mStartIndex = in.readInt();
+            mEndIndex = in.readInt();
+            mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+            mReferenceTime = in.readInt() == 0 ? null : ZonedDateTime.parse(in.readString());
         }
     }
 
@@ -615,7 +687,7 @@
         // mOnClickListener is not parcelable.
         dest.writeTypedList(mActions);
         mEntityConfidence.writeToParcel(dest, flags);
-        dest.writeString(mSignature);
+        dest.writeString(mId);
     }
 
     public static final Parcelable.Creator<TextClassification> CREATOR =
@@ -647,6 +719,69 @@
         mLegacyOnClickListener = null;  // not parcelable
         mActions = in.createTypedArrayList(RemoteAction.CREATOR);
         mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
-        mSignature = in.readString();
+        mId = in.readString();
+    }
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /**
+     * Optional input parameters for generating TextClassification.
+     * @hide
+     */
+    public static final class Options {
+
+        @Nullable private final TextClassificationSessionId mSessionId;
+        @Nullable private final Request mRequest;
+        @Nullable private LocaleList mDefaultLocales;
+        @Nullable private ZonedDateTime mReferenceTime;
+
+        public Options() {
+            this(null, null);
+        }
+
+        private Options(
+                @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
+            mSessionId = sessionId;
+            mRequest = request;
+        }
+
+        /** Helper to create Options from a Request. */
+        public static Options from(TextClassificationSessionId sessionId, Request request) {
+            final Options options = new Options(sessionId, request);
+            options.setDefaultLocales(request.getDefaultLocales());
+            options.setReferenceTime(request.getReferenceTime());
+            return options;
+        }
+
+        /** @param defaultLocales ordered list of locale preferences. */
+        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        /** @param referenceTime refrence time used for interpreting relatives dates */
+        public Options setReferenceTime(@Nullable ZonedDateTime referenceTime) {
+            mReferenceTime = referenceTime;
+            return this;
+        }
+
+        @Nullable
+        public LocaleList getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        @Nullable
+        public ZonedDateTime getReferenceTime() {
+            return mReferenceTime;
+        }
+
+        @Nullable
+        public Request getRequest() {
+            return mRequest;
+        }
+
+        @Nullable
+        public TextClassificationSessionId getSessionId() {
+            return mSessionId;
+        }
     }
 }
diff --git a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl b/core/java/android/view/textclassifier/TextClassificationContext.aidl
similarity index 68%
copy from core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
copy to core/java/android/view/textclassifier/TextClassificationContext.aidl
index e528aa7..0d6b033 100644
--- a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
+++ b/core/java/android/view/textclassifier/TextClassificationContext.aidl
@@ -13,15 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.hardware.biometrics;
 
-import android.os.Bundle;
-import android.os.UserHandle;
+package android.view.textclassifier;
 
-/**
- * Communication channel from the BiometricDialog (SysUI) back to AuthenticationClient.
- * @hide
- */
-oneway interface IBiometricDialogReceiver {
-    void onDialogDismissed(int reason);
-}
+parcelable TextClassificationContext;
diff --git a/core/java/android/view/textclassifier/TextClassificationContext.java b/core/java/android/view/textclassifier/TextClassificationContext.java
index a88f2f6..a15411f 100644
--- a/core/java/android/view/textclassifier/TextClassificationContext.java
+++ b/core/java/android/view/textclassifier/TextClassificationContext.java
@@ -18,6 +18,8 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.view.textclassifier.TextClassifier.WidgetType;
 
 import com.android.internal.util.Preconditions;
@@ -28,7 +30,7 @@
  * A representation of the context in which text classification would be performed.
  * @see TextClassificationManager#createTextClassificationSession(TextClassificationContext)
  */
-public final class TextClassificationContext {
+public final class TextClassificationContext implements Parcelable {
 
     private final String mPackageName;
     private final String mWidgetType;
@@ -120,4 +122,35 @@
             return new TextClassificationContext(mPackageName, mWidgetType, mWidgetVersion);
         }
     }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel parcel, int flags) {
+        parcel.writeString(mPackageName);
+        parcel.writeString(mWidgetType);
+        parcel.writeString(mWidgetVersion);
+    }
+
+    private TextClassificationContext(Parcel in) {
+        mPackageName = in.readString();
+        mWidgetType = in.readString();
+        mWidgetVersion = in.readString();
+    }
+
+    public static final Parcelable.Creator<TextClassificationContext> CREATOR =
+            new Parcelable.Creator<TextClassificationContext>() {
+                @Override
+                public TextClassificationContext createFromParcel(Parcel parcel) {
+                    return new TextClassificationContext(parcel);
+                }
+
+                @Override
+                public TextClassificationContext[] newArray(int size) {
+                    return new TextClassificationContext[size];
+                }
+            };
 }
diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java
index 6938e1a..4c64198 100644
--- a/core/java/android/view/textclassifier/TextClassificationSession.java
+++ b/core/java/android/view/textclassifier/TextClassificationSession.java
@@ -17,7 +17,6 @@
 package android.view.textclassifier;
 
 import android.annotation.WorkerThread;
-import android.view.textclassifier.DefaultLogger.SignatureParser;
 import android.view.textclassifier.SelectionEvent.InvocationMethod;
 
 import com.android.internal.util.Preconditions;
@@ -33,32 +32,42 @@
 
     private final TextClassifier mDelegate;
     private final SelectionEventHelper mEventHelper;
+    private final TextClassificationSessionId mSessionId;
+    private final TextClassificationContext mClassificationContext;
 
     private boolean mDestroyed;
 
     TextClassificationSession(TextClassificationContext context, TextClassifier delegate) {
+        mClassificationContext = Preconditions.checkNotNull(context);
         mDelegate = Preconditions.checkNotNull(delegate);
-        mEventHelper = new SelectionEventHelper(new TextClassificationSessionId(), context);
+        mSessionId = new TextClassificationSessionId();
+        mEventHelper = new SelectionEventHelper(mSessionId, mClassificationContext);
+        initializeRemoteSession();
     }
 
     @Override
-    public TextSelection suggestSelection(CharSequence text, int selectionStartIndex,
-            int selectionEndIndex, TextSelection.Options options) {
+    public TextSelection suggestSelection(TextSelection.Request request) {
         checkDestroyed();
-        return mDelegate.suggestSelection(text, selectionStartIndex, selectionEndIndex, options);
+        return mDelegate.suggestSelection(request);
+    }
+
+    private void initializeRemoteSession() {
+        if (mDelegate instanceof SystemTextClassifier) {
+            ((SystemTextClassifier) mDelegate).initializeRemoteSession(
+                    mClassificationContext, mSessionId);
+        }
     }
 
     @Override
-    public TextClassification classifyText(CharSequence text, int startIndex, int endIndex,
-            TextClassification.Options options) {
+    public TextClassification classifyText(TextClassification.Request request) {
         checkDestroyed();
-        return mDelegate.classifyText(text, startIndex, endIndex, options);
+        return mDelegate.classifyText(request);
     }
 
     @Override
-    public TextLinks generateLinks(CharSequence text, TextLinks.Options options) {
+    public TextLinks generateLinks(TextLinks.Request request) {
         checkDestroyed();
-        return mDelegate.generateLinks(text, options);
+        return mDelegate.generateLinks(request);
     }
 
     @Override
@@ -73,6 +82,7 @@
     @Override
     public void destroy() {
         mEventHelper.endSession();
+        mDelegate.destroy();
         mDestroyed = true;
     }
 
@@ -162,7 +172,7 @@
                         .setEnd(event.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
             }
             if (mSmartEvent != null) {
-                event.setSignature(mSmartEvent.getSignature())
+                event.setResultId(mSmartEvent.getResultId())
                         .setSmartStart(
                                 mSmartEvent.getAbsoluteStart() - mStartEvent.getAbsoluteStart())
                         .setSmartEnd(mSmartEvent.getAbsoluteEnd() - mStartEvent.getAbsoluteStart());
@@ -195,7 +205,7 @@
                 case SelectionEvent.EVENT_SMART_SELECTION_SINGLE:  // fall through
                 case SelectionEvent.EVENT_SMART_SELECTION_MULTI:  // fall through
                 case SelectionEvent.EVENT_AUTO_SELECTION:
-                    if (isPlatformLocalTextClassifierSmartSelection(event.getSignature())) {
+                    if (isPlatformLocalTextClassifierSmartSelection(event.getResultId())) {
                         if (event.getAbsoluteEnd() - event.getAbsoluteStart() > 1) {
                             event.setEventType(SelectionEvent.EVENT_SMART_SELECTION_MULTI);
                         } else {
@@ -211,7 +221,8 @@
         }
 
         private static boolean isPlatformLocalTextClassifierSmartSelection(String signature) {
-            return DefaultLogger.CLASSIFIER_ID.equals(SignatureParser.getClassifierId(signature));
+            return SelectionSessionLogger.CLASSIFIER_ID.equals(
+                    SelectionSessionLogger.SignatureParser.getClassifierId(signature));
         }
     }
 }
diff --git a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl b/core/java/android/view/textclassifier/TextClassificationSessionId.aidl
similarity index 68%
copy from core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
copy to core/java/android/view/textclassifier/TextClassificationSessionId.aidl
index e528aa7..1bbf2da 100644
--- a/core/java/android/hardware/biometrics/IBiometricDialogReceiver.aidl
+++ b/core/java/android/view/textclassifier/TextClassificationSessionId.aidl
@@ -13,15 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package android.hardware.biometrics;
 
-import android.os.Bundle;
-import android.os.UserHandle;
+package android.view.textclassifier;
 
-/**
- * Communication channel from the BiometricDialog (SysUI) back to AuthenticationClient.
- * @hide
- */
-oneway interface IBiometricDialogReceiver {
-    void onDialogDismissed(int reason);
-}
+parcelable TextClassificationSessionId;
diff --git a/core/java/android/view/textclassifier/TextClassificationSessionId.java b/core/java/android/view/textclassifier/TextClassificationSessionId.java
index 3e4dc1c..1378bd9 100644
--- a/core/java/android/view/textclassifier/TextClassificationSessionId.java
+++ b/core/java/android/view/textclassifier/TextClassificationSessionId.java
@@ -22,6 +22,7 @@
 
 import com.android.internal.util.Preconditions;
 
+import java.util.Locale;
 import java.util.UUID;
 
 /**
@@ -77,6 +78,11 @@
     }
 
     @Override
+    public String toString() {
+        return String.format(Locale.US, "TextClassificationSessionId {%s}", mValue);
+    }
+
+    @Override
     public void writeToParcel(Parcel parcel, int flags) {
         parcel.writeString(mValue);
     }
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 2048f2b..da47bcb 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -33,7 +33,6 @@
 import android.text.util.Linkify.LinkifyMask;
 import android.util.ArrayMap;
 import android.util.ArraySet;
-import android.util.Slog;
 
 import com.android.internal.util.Preconditions;
 
@@ -42,8 +41,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Interface for providing text classification related features.
@@ -156,76 +156,44 @@
      *
      * <p><strong>NOTE: </strong>Call on a worker thread.
      *
-     * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+     * <p><strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
      *
-     * @param text text providing context for the selected text (which is specified
-     *      by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
-     * @param selectionStartIndex start index of the selected part of text
-     * @param selectionEndIndex end index of the selected part of text
-     * @param options optional input parameters
-     *
-     * @throws IllegalArgumentException if text is null; selectionStartIndex is negative;
-     *      selectionEndIndex is greater than text.length() or not greater than selectionStartIndex
-     *
-     * @see #suggestSelection(CharSequence, int, int)
+     * @param request the text selection request
      */
     @WorkerThread
     @NonNull
-    default TextSelection suggestSelection(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int selectionStartIndex,
-            @IntRange(from = 0) int selectionEndIndex,
-            @Nullable TextSelection.Options options) {
-        Utils.validate(text, selectionStartIndex, selectionEndIndex, false);
-        return new TextSelection.Builder(selectionStartIndex, selectionEndIndex).build();
+    default TextSelection suggestSelection(@NonNull TextSelection.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
+        return new TextSelection.Builder(request.getStartIndex(), request.getEndIndex()).build();
     }
 
     /**
      * Returns suggested text selection start and end indices, recognized entity types, and their
      * associated confidence scores. The entity types are ordered from highest to lowest scoring.
      *
-     * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
-     * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}. If that method
-     * calls this method, a stack overflow error will happen.
-     *
      * <p><strong>NOTE: </strong>Call on a worker thread.
      *
-     * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
+     * <p><strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
      *
+     * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
+     * {@link #suggestSelection(TextSelection.Request)}. If that method calls this method,
+     * a stack overflow error will happen.
+     *
      * @param text text providing context for the selected text (which is specified
      *      by the sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
      * @param selectionStartIndex start index of the selected part of text
      * @param selectionEndIndex end index of the selected part of text
+     * @param defaultLocales ordered list of locale preferences that may be used to
+     *      disambiguate the provided text. If no locale preferences exist, set this to null
+     *      or an empty locale list.
      *
      * @throws IllegalArgumentException if text is null; selectionStartIndex is negative;
      *      selectionEndIndex is greater than text.length() or not greater than selectionStartIndex
      *
-     * @see #suggestSelection(CharSequence, int, int, TextSelection.Options)
-     */
-    @WorkerThread
-    @NonNull
-    default TextSelection suggestSelection(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int selectionStartIndex,
-            @IntRange(from = 0) int selectionEndIndex) {
-        return suggestSelection(text, selectionStartIndex, selectionEndIndex,
-                (TextSelection.Options) null);
-    }
-
-    /**
-     * See {@link #suggestSelection(CharSequence, int, int)} or
-     * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}.
-     *
-     * <p><strong>NOTE: </strong>Call on a worker thread.
-     *
-     * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
-     * {@link #suggestSelection(CharSequence, int, int, TextSelection.Options)}. If that method
-     * calls this method, a stack overflow error will happen.
-     *
-     * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
-     * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+     * @see #suggestSelection(TextSelection.Request)
      */
     @WorkerThread
     @NonNull
@@ -234,10 +202,31 @@
             @IntRange(from = 0) int selectionStartIndex,
             @IntRange(from = 0) int selectionEndIndex,
             @Nullable LocaleList defaultLocales) {
-        final TextSelection.Options options = (defaultLocales != null)
-                ? new TextSelection.Options().setDefaultLocales(defaultLocales)
-                : null;
-        return suggestSelection(text, selectionStartIndex, selectionEndIndex, options);
+        final TextSelection.Request request = new TextSelection.Request.Builder(
+                text, selectionStartIndex, selectionEndIndex)
+                .setDefaultLocales(defaultLocales)
+                .build();
+        return suggestSelection(request);
+    }
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
+    default TextSelection suggestSelection(
+            @NonNull CharSequence text,
+            @IntRange(from = 0) int selectionStartIndex,
+            @IntRange(from = 0) int selectionEndIndex,
+            @Nullable TextSelection.Options options) {
+        if (options == null) {
+            return suggestSelection(new TextSelection.Request.Builder(
+                    text, selectionStartIndex, selectionEndIndex).build());
+        } else if (options.getRequest() != null) {
+            return suggestSelection(options.getRequest());
+        } else {
+            return suggestSelection(
+                    new TextSelection.Request.Builder(text, selectionStartIndex, selectionEndIndex)
+                            .setDefaultLocales(options.getDefaultLocales())
+                            .build());
+        }
     }
 
     /**
@@ -249,25 +238,13 @@
      * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
      *
-     * @param text text providing context for the text to classify (which is specified
-     *      by the sub sequence starting at startIndex and ending at endIndex)
-     * @param startIndex start index of the text to classify
-     * @param endIndex end index of the text to classify
-     * @param options optional input parameters
-     *
-     * @throws IllegalArgumentException if text is null; startIndex is negative;
-     *      endIndex is greater than text.length() or not greater than startIndex
-     *
-     * @see #classifyText(CharSequence, int, int)
+     * @param request the text classification request
      */
     @WorkerThread
     @NonNull
-    default TextClassification classifyText(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int startIndex,
-            @IntRange(from = 0) int endIndex,
-            @Nullable TextClassification.Options options) {
-        Utils.validate(text, startIndex, endIndex, false);
+    default TextClassification classifyText(@NonNull TextClassification.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
         return TextClassification.EMPTY;
     }
 
@@ -278,8 +255,8 @@
      * <p><strong>NOTE: </strong>Call on a worker thread.
      *
      * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
-     * {@link #classifyText(CharSequence, int, int, TextClassification.Options)}. If that method
-     * calls this method, a stack overflow error will happen.
+     * {@link #classifyText(TextClassification.Request)}. If that method calls this method,
+     * a stack overflow error will happen.
      *
      * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
@@ -288,33 +265,14 @@
      *      by the sub sequence starting at startIndex and ending at endIndex)
      * @param startIndex start index of the text to classify
      * @param endIndex end index of the text to classify
+     * @param defaultLocales ordered list of locale preferences that may be used to
+     *      disambiguate the provided text. If no locale preferences exist, set this to null
+     *      or an empty locale list.
      *
      * @throws IllegalArgumentException if text is null; startIndex is negative;
      *      endIndex is greater than text.length() or not greater than startIndex
      *
-     * @see #classifyText(CharSequence, int, int, TextClassification.Options)
-     */
-    @WorkerThread
-    @NonNull
-    default TextClassification classifyText(
-            @NonNull CharSequence text,
-            @IntRange(from = 0) int startIndex,
-            @IntRange(from = 0) int endIndex) {
-        return classifyText(text, startIndex, endIndex, (TextClassification.Options) null);
-    }
-
-    /**
-     * See {@link #classifyText(CharSequence, int, int, TextClassification.Options)} or
-     * {@link #classifyText(CharSequence, int, int)}.
-     *
-     * <p><strong>NOTE: </strong>Call on a worker thread.
-     *
-     * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
-     * {@link #classifyText(CharSequence, int, int, TextClassification.Options)}. If that method
-     * calls this method, a stack overflow error will happen.
-     *
-     * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
-     * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
+     * @see #classifyText(TextClassification.Request)
      */
     @WorkerThread
     @NonNull
@@ -323,10 +281,31 @@
             @IntRange(from = 0) int startIndex,
             @IntRange(from = 0) int endIndex,
             @Nullable LocaleList defaultLocales) {
-        final TextClassification.Options options = (defaultLocales != null)
-                ? new TextClassification.Options().setDefaultLocales(defaultLocales)
-                : null;
-        return classifyText(text, startIndex, endIndex, options);
+        final TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(defaultLocales)
+                .build();
+        return classifyText(request);
+    }
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
+    default TextClassification classifyText(
+            @NonNull CharSequence text,
+            @IntRange(from = 0) int startIndex,
+            @IntRange(from = 0) int endIndex,
+            @Nullable TextClassification.Options options) {
+        if (options == null) {
+            return classifyText(
+                    new TextClassification.Request.Builder(text, startIndex, endIndex).build());
+        } else if (options.getRequest() != null) {
+            return classifyText(options.getRequest());
+        } else {
+            return classifyText(new TextClassification.Request.Builder(text, startIndex, endIndex)
+                    .setDefaultLocales(options.getDefaultLocales())
+                    .setReferenceTime(options.getReferenceTime())
+                    .build());
+        }
     }
 
     /**
@@ -338,48 +317,32 @@
      * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
      *
-     * @param text the text to generate annotations for
-     * @param options configuration for link generation
+     * @param request the text links request
      *
-     * @throws IllegalArgumentException if text is null or the text is too long for the
-     *      TextClassifier implementation.
-     *
-     * @see #generateLinks(CharSequence)
      * @see #getMaxGenerateLinksTextLength()
      */
     @WorkerThread
     @NonNull
+    default TextLinks generateLinks(@NonNull TextLinks.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
+        return new TextLinks.Builder(request.getText().toString()).build();
+    }
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /** @hide */
     default TextLinks generateLinks(
             @NonNull CharSequence text, @Nullable TextLinks.Options options) {
-        Utils.validate(text, false);
-        return new TextLinks.Builder(text.toString()).build();
-    }
-
-    /**
-     * Generates and returns a {@link TextLinks} that may be applied to the text to annotate it with
-     * links information.
-     *
-     * <p><strong>NOTE: </strong>Call on a worker thread.
-     *
-     * <p><b>NOTE:</b> Do not implement. The default implementation of this method calls
-     * {@link #generateLinks(CharSequence, TextLinks.Options)}. If that method calls this method,
-     * a stack overflow error will happen.
-     *
-     * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
-     * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
-     *
-     * @param text the text to generate annotations for
-     *
-     * @throws IllegalArgumentException if text is null or the text is too long for the
-     *      TextClassifier implementation.
-     *
-     * @see #generateLinks(CharSequence, TextLinks.Options)
-     * @see #getMaxGenerateLinksTextLength()
-     */
-    @WorkerThread
-    @NonNull
-    default TextLinks generateLinks(@NonNull CharSequence text) {
-        return generateLinks(text, null);
+        if (options == null) {
+            return generateLinks(new TextLinks.Request.Builder(text).build());
+        } else if (options.getRequest() != null) {
+            return generateLinks(options.getRequest());
+        } else {
+            return generateLinks(new TextLinks.Request.Builder(text)
+                    .setDefaultLocales(options.getDefaultLocales())
+                    .setEntityConfig(options.getEntityConfig())
+                    .build());
+        }
     }
 
     /**
@@ -388,8 +351,7 @@
      * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
      * throw an {@link IllegalStateException}. See {@link #isDestroyed()}.
      *
-     * @see #generateLinks(CharSequence)
-     * @see #generateLinks(CharSequence, TextLinks.Options)
+     * @see #generateLinks(TextLinks.Request)
      */
     @WorkerThread
     default int getMaxGenerateLinksTextLength() {
@@ -397,18 +359,6 @@
     }
 
     /**
-     * Returns a helper for logging TextClassifier related events.
-     *
-     * @param config logger configuration
-     * @hide
-     */
-    @WorkerThread
-    default Logger getLogger(@NonNull Logger.Config config) {
-        Preconditions.checkNotNull(config);
-        return Logger.DISABLED;
-    }
-
-    /**
      * Reports a selection event.
      *
      * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should
@@ -467,11 +417,17 @@
          *
          * @param hints Hints for the TextClassifier to determine what types of entities to find.
          */
-        public static EntityConfig create(@Nullable Collection<String> hints) {
+        public static EntityConfig createWithHints(@Nullable Collection<String> hints) {
             return new EntityConfig(/* useHints */ true, hints,
                     /* includedEntityTypes */null, /* excludedEntityTypes */ null);
         }
 
+        // TODO: Remove once apps can build against the latest sdk.
+        /** @hide */
+        public static EntityConfig create(@Nullable Collection<String> hints) {
+            return createWithHints(hints);
+        }
+
         /**
          * Creates an EntityConfig.
          *
@@ -495,11 +451,18 @@
          * @param entityTypes Complete set of entities, e.g. {@link #TYPE_URL} to find.
          *
          */
-        public static EntityConfig createWithEntityList(@Nullable Collection<String> entityTypes) {
+        public static EntityConfig createWithExplicitEntityList(
+                @Nullable Collection<String> entityTypes) {
             return new EntityConfig(/* useHints */ false, /* hints */ null,
                     /* includedEntityTypes */ entityTypes, /* excludedEntityTypes */ null);
         }
 
+        // TODO: Remove once apps can build against the latest sdk.
+        /** @hide */
+        public static EntityConfig createWithEntityList(@Nullable Collection<String> entityTypes) {
+            return createWithExplicitEntityList(entityTypes);
+        }
+
         /**
          * Returns a list of the final set of entities to find.
          *
@@ -507,21 +470,15 @@
          *
          * This method is intended for use by TextClassifier implementations.
          */
-        public List<String> resolveEntityListModifications(@NonNull Collection<String> entities) {
-            final ArrayList<String> finalList = new ArrayList<>();
+        public Collection<String> resolveEntityListModifications(
+                @NonNull Collection<String> entities) {
+            final Set<String> finalSet = new HashSet();
             if (mUseHints) {
-                for (String entity : entities) {
-                    if (!mExcludedEntityTypes.contains(entity)) {
-                        finalList.add(entity);
-                    }
-                }
+                finalSet.addAll(entities);
             }
-            for (String entity : mIncludedEntityTypes) {
-                if (!mExcludedEntityTypes.contains(entity) && !finalList.contains(entity)) {
-                    finalList.add(entity);
-                }
-            }
-            return finalList;
+            finalSet.addAll(mIncludedEntityTypes);
+            finalSet.removeAll(mExcludedEntityTypes);
+            return finalSet;
         }
 
         /**
@@ -584,42 +541,25 @@
          *      endIndex is greater than text.length() or is not greater than startIndex;
          *      options is null
          */
-        public static void validate(
-                @NonNull CharSequence text, int startIndex, int endIndex,
-                boolean allowInMainThread) {
+        static void checkArgument(@NonNull CharSequence text, int startIndex, int endIndex) {
             Preconditions.checkArgument(text != null);
             Preconditions.checkArgument(startIndex >= 0);
             Preconditions.checkArgument(endIndex <= text.length());
             Preconditions.checkArgument(endIndex > startIndex);
-            checkMainThread(allowInMainThread);
         }
 
-        /**
-         * @throws IllegalArgumentException if text is null or options is null
-         */
-        public static void validate(@NonNull CharSequence text, boolean allowInMainThread) {
-            Preconditions.checkArgument(text != null);
-            checkMainThread(allowInMainThread);
-        }
-
-        /**
-         * @throws IllegalArgumentException if text is null; the text is too long or options is null
-         */
-        public static void validate(@NonNull CharSequence text, int maxLength,
-                boolean allowInMainThread) {
-            validate(text, allowInMainThread);
+        static void checkTextLength(CharSequence text, int maxLength) {
             Preconditions.checkArgumentInRange(text.length(), 0, maxLength, "text.length()");
         }
 
         /**
          * Generates links using legacy {@link Linkify}.
          */
-        public static TextLinks generateLegacyLinks(
-                @NonNull CharSequence text, @NonNull TextLinks.Options options) {
-            final String string = Preconditions.checkNotNull(text).toString();
+        public static TextLinks generateLegacyLinks(@NonNull TextLinks.Request request) {
+            final String string = request.getText().toString();
             final TextLinks.Builder links = new TextLinks.Builder(string);
 
-            final List<String> entities = Preconditions.checkNotNull(options).getEntityConfig()
+            final Collection<String> entities = request.getEntityConfig()
                     .resolveEntityListModifications(Collections.emptyList());
             if (entities.contains(TextClassifier.TYPE_URL)) {
                 addLinks(links, string, TextClassifier.TYPE_URL);
@@ -670,9 +610,9 @@
             return scores;
         }
 
-        private static void checkMainThread(boolean allowInMainThread) {
-            if (!allowInMainThread && Looper.myLooper() == Looper.getMainLooper()) {
-                Slog.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
+        static void checkMainThread() {
+            if (Looper.myLooper() == Looper.getMainLooper()) {
+                Log.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
             }
         }
     }
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 8d1ed0e..2213355 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -94,11 +94,7 @@
 
     private final Object mLoggerLock = new Object();
     @GuardedBy("mLoggerLock") // Do not access outside this lock.
-    private Logger.Config mLoggerConfig;
-    @GuardedBy("mLoggerLock") // Do not access outside this lock.
-    private Logger mLogger;
-    @GuardedBy("mLoggerLock") // Do not access outside this lock.
-    private Logger mLogger2;  // This is the new logger. Will replace mLogger.
+    private SelectionSessionLogger mSessionLogger;
 
     private final TextClassificationConstants mSettings;
 
@@ -112,35 +108,32 @@
     /** @inheritDoc */
     @Override
     @WorkerThread
-    public TextSelection suggestSelection(
-            @NonNull CharSequence text, int selectionStartIndex, int selectionEndIndex,
-            @Nullable TextSelection.Options options) {
-        Utils.validate(text, selectionStartIndex, selectionEndIndex, false /* allowInMainThread */);
+    public TextSelection suggestSelection(TextSelection.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
         try {
-            final int rangeLength = selectionEndIndex - selectionStartIndex;
-            if (text.length() > 0
+            final int rangeLength = request.getEndIndex() - request.getStartIndex();
+            final String string = request.getText().toString();
+            if (string.length() > 0
                     && rangeLength <= mSettings.getSuggestSelectionMaxRangeLength()) {
-                final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
-                final String localesString = concatenateLocales(locales);
+                final String localesString = concatenateLocales(request.getDefaultLocales());
                 final ZonedDateTime refTime = ZonedDateTime.now();
-                final boolean darkLaunchAllowed = options != null && options.isDarkLaunchAllowed();
-                final TextClassifierImplNative nativeImpl = getNative(locales);
-                final String string = text.toString();
+                final TextClassifierImplNative nativeImpl = getNative(request.getDefaultLocales());
                 final int start;
                 final int end;
-                if (mSettings.isModelDarkLaunchEnabled() && !darkLaunchAllowed) {
-                    start = selectionStartIndex;
-                    end = selectionEndIndex;
+                if (mSettings.isModelDarkLaunchEnabled() && !request.isDarkLaunchAllowed()) {
+                    start = request.getStartIndex();
+                    end = request.getEndIndex();
                 } else {
                     final int[] startEnd = nativeImpl.suggestSelection(
-                            string, selectionStartIndex, selectionEndIndex,
+                            string, request.getStartIndex(), request.getEndIndex(),
                             new TextClassifierImplNative.SelectionOptions(localesString));
                     start = startEnd[0];
                     end = startEnd[1];
                 }
                 if (start < end
                         && start >= 0 && end <= string.length()
-                        && start <= selectionStartIndex && end >= selectionEndIndex) {
+                        && start <= request.getStartIndex() && end >= request.getEndIndex()) {
                     final TextSelection.Builder tsBuilder = new TextSelection.Builder(start, end);
                     final TextClassifierImplNative.ClassificationResult[] results =
                             nativeImpl.classifyText(
@@ -153,9 +146,8 @@
                     for (int i = 0; i < size; i++) {
                         tsBuilder.setEntityType(results[i].getCollection(), results[i].getScore());
                     }
-                    return tsBuilder
-                            .setSignature(
-                                    getSignature(string, selectionStartIndex, selectionEndIndex))
+                    return tsBuilder.setId(createId(
+                            string, request.getStartIndex(), request.getEndIndex()))
                             .build();
                 } else {
                     // We can not trust the result. Log the issue and ignore the result.
@@ -169,37 +161,34 @@
                     t);
         }
         // Getting here means something went wrong, return a NO_OP result.
-        return mFallback.suggestSelection(
-                text, selectionStartIndex, selectionEndIndex, options);
+        return mFallback.suggestSelection(request);
     }
 
     /** @inheritDoc */
     @Override
     @WorkerThread
-    public TextClassification classifyText(
-            @NonNull CharSequence text, int startIndex, int endIndex,
-            @Nullable TextClassification.Options options) {
-        Utils.validate(text, startIndex, endIndex, false /* allowInMainThread */);
+    public TextClassification classifyText(TextClassification.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkMainThread();
         try {
-            final int rangeLength = endIndex - startIndex;
-            if (text.length() > 0 && rangeLength <= mSettings.getClassifyTextMaxRangeLength()) {
-                final String string = text.toString();
-                final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
-                final String localesString = concatenateLocales(locales);
-                final ZonedDateTime refTime =
-                        (options != null && options.getReferenceTime() != null)
-                                ? options.getReferenceTime() : ZonedDateTime.now();
-
+            final int rangeLength = request.getEndIndex() - request.getStartIndex();
+            final String string = request.getText().toString();
+            if (string.length() > 0 && rangeLength <= mSettings.getClassifyTextMaxRangeLength()) {
+                final String localesString = concatenateLocales(request.getDefaultLocales());
+                final ZonedDateTime refTime = request.getReferenceTime() != null
+                        ? request.getReferenceTime() : ZonedDateTime.now();
                 final TextClassifierImplNative.ClassificationResult[] results =
-                        getNative(locales)
-                                .classifyText(string, startIndex, endIndex,
+                        getNative(request.getDefaultLocales())
+                                .classifyText(
+                                        string, request.getStartIndex(), request.getEndIndex(),
                                         new TextClassifierImplNative.ClassificationOptions(
                                                 refTime.toInstant().toEpochMilli(),
                                                 refTime.getZone().getId(),
                                                 localesString));
                 if (results.length > 0) {
                     return createClassificationResult(
-                            results, string, startIndex, endIndex, refTime.toInstant());
+                            results, string,
+                            request.getStartIndex(), request.getEndIndex(), refTime.toInstant());
                 }
             }
         } catch (Throwable t) {
@@ -207,42 +196,40 @@
             Log.e(LOG_TAG, "Error getting text classification info.", t);
         }
         // Getting here means something went wrong, return a NO_OP result.
-        return mFallback.classifyText(text, startIndex, endIndex, options);
+        return mFallback.classifyText(request);
     }
 
     /** @inheritDoc */
     @Override
     @WorkerThread
-    public TextLinks generateLinks(
-            @NonNull CharSequence text, @Nullable TextLinks.Options options) {
-        Utils.validate(text, getMaxGenerateLinksTextLength(), false /* allowInMainThread */);
+    public TextLinks generateLinks(@NonNull TextLinks.Request request) {
+        Preconditions.checkNotNull(request);
+        Utils.checkTextLength(request.getText(), getMaxGenerateLinksTextLength());
+        Utils.checkMainThread();
 
-        final boolean legacyFallback = options != null && options.isLegacyFallback();
-        if (!mSettings.isSmartLinkifyEnabled() && legacyFallback) {
-            return Utils.generateLegacyLinks(text, options);
+        if (!mSettings.isSmartLinkifyEnabled() && request.isLegacyFallback()) {
+            return Utils.generateLegacyLinks(request);
         }
 
-        final String textString = text.toString();
+        final String textString = request.getText().toString();
         final TextLinks.Builder builder = new TextLinks.Builder(textString);
 
         try {
             final long startTimeMs = System.currentTimeMillis();
-            final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null;
             final ZonedDateTime refTime = ZonedDateTime.now();
-            final Collection<String> entitiesToIdentify =
-                    options != null && options.getEntityConfig() != null
-                            ? options.getEntityConfig().resolveEntityListModifications(
-                                    getEntitiesForHints(options.getEntityConfig().getHints()))
-                            : mSettings.getEntityListDefault();
+            final Collection<String> entitiesToIdentify = request.getEntityConfig() != null
+                    ? request.getEntityConfig().resolveEntityListModifications(
+                            getEntitiesForHints(request.getEntityConfig().getHints()))
+                    : mSettings.getEntityListDefault();
             final TextClassifierImplNative nativeImpl =
-                    getNative(defaultLocales);
+                    getNative(request.getDefaultLocales());
             final TextClassifierImplNative.AnnotatedSpan[] annotations =
                     nativeImpl.annotate(
                         textString,
                         new TextClassifierImplNative.AnnotationOptions(
                                 refTime.toInstant().toEpochMilli(),
-                                refTime.getZone().getId(),
-                                concatenateLocales(defaultLocales)));
+                                        refTime.getZone().getId(),
+                                concatenateLocales(request.getDefaultLocales())));
             for (TextClassifierImplNative.AnnotatedSpan span : annotations) {
                 final TextClassifierImplNative.ClassificationResult[] results =
                         span.getClassification();
@@ -258,18 +245,17 @@
             }
             final TextLinks links = builder.build();
             final long endTimeMs = System.currentTimeMillis();
-            final String callingPackageName =
-                    options == null || options.getCallingPackageName() == null
-                            ? mContext.getPackageName()  // local (in process) TC.
-                            : options.getCallingPackageName();
+            final String callingPackageName = request.getCallingPackageName() == null
+                    ? mContext.getPackageName()  // local (in process) TC.
+                    : request.getCallingPackageName();
             mGenerateLinksLogger.logGenerateLinks(
-                    text, links, callingPackageName, endTimeMs - startTimeMs);
+                    request.getText(), links, callingPackageName, endTimeMs - startTimeMs);
             return links;
         } catch (Throwable t) {
             // Avoid throwing from this method. Log the error.
             Log.e(LOG_TAG, "Error getting links info.", t);
         }
-        return mFallback.generateLinks(text, options);
+        return mFallback.generateLinks(request);
     }
 
     /** @inheritDoc */
@@ -293,28 +279,14 @@
         }
     }
 
-    /** @inheritDoc */
-    @Override
-    public Logger getLogger(@NonNull Logger.Config config) {
-        Preconditions.checkNotNull(config);
-        synchronized (mLoggerLock) {
-            if (mLogger == null || !config.equals(mLoggerConfig)) {
-                mLoggerConfig = config;
-                mLogger = new DefaultLogger(config);
-            }
-        }
-        return mLogger;
-    }
-
     @Override
     public void onSelectionEvent(SelectionEvent event) {
         Preconditions.checkNotNull(event);
         synchronized (mLoggerLock) {
-            if (mLogger2 == null) {
-                mLogger2 = new DefaultLogger(
-                        new Logger.Config(mContext, WIDGET_TYPE_UNKNOWN, null));
+            if (mSessionLogger == null) {
+                mSessionLogger = new SelectionSessionLogger();
             }
-            mLogger2.writeEvent(event);
+            mSessionLogger.writeEvent(event);
         }
     }
 
@@ -339,9 +311,9 @@
         }
     }
 
-    private String getSignature(String text, int start, int end) {
+    private String createId(String text, int start, int end) {
         synchronized (mLock) {
-            return DefaultLogger.createSignature(text, start, end, mContext, mModel.getVersion(),
+            return SelectionSessionLogger.createId(text, start, end, mContext, mModel.getVersion(),
                     mModel.getSupportedLocales());
         }
     }
@@ -455,7 +427,7 @@
             builder.addAction(action);
         }
 
-        return builder.setSignature(getSignature(text, start, end)).build();
+        return builder.setId(createId(text, start, end)).build();
     }
 
     /**
@@ -512,7 +484,7 @@
             return mPath;
         }
 
-        /** A name to use for signature generation. Effectively the name of the model file. */
+        /** A name to use for id generation. Effectively the name of the model file. */
         String getName() {
             return mName;
         }
diff --git a/core/java/android/view/textclassifier/TextLinks.aidl b/core/java/android/view/textclassifier/TextLinks.aidl
index 1bbb798..5de2c77 100644
--- a/core/java/android/view/textclassifier/TextLinks.aidl
+++ b/core/java/android/view/textclassifier/TextLinks.aidl
@@ -17,4 +17,4 @@
 package android.view.textclassifier;
 
 parcelable TextLinks;
-parcelable TextLinks.Options;
\ No newline at end of file
+parcelable TextLinks.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index 38a7d9a..3d503e2 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -25,6 +25,7 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.Spannable;
+import android.text.method.MovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.URLSpan;
 import android.text.util.Linkify;
@@ -43,6 +44,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.function.Function;
 
@@ -79,15 +81,15 @@
     public @interface ApplyStrategy {}
 
     /**
-      * Do not replace {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to
-      * be applied to. Do not apply the TextLinkSpan.
-      */
+     * Do not replace {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to
+     * be applied to. Do not apply the TextLinkSpan.
+     */
     public static final int APPLY_STRATEGY_IGNORE = 0;
 
     /**
-      * Replace any {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to be
-      * applied to.
-      */
+     * Replace any {@link ClickableSpan}s that exist where the {@link TextLinkSpan} needs to be
+     * applied to.
+     */
     public static final int APPLY_STRATEGY_REPLACE = 1;
 
     private final String mFullText;
@@ -99,70 +101,54 @@
     }
 
     /**
+     * Returns the text that was used to generate these links.
+     * @hide
+     */
+    @NonNull
+    public String getText() {
+        return mFullText;
+    }
+
+    /**
      * Returns an unmodifiable Collection of the links.
      */
+    @NonNull
     public Collection<TextLink> getLinks() {
         return mLinks;
     }
 
     /**
      * Annotates the given text with the generated links. It will fail if the provided text doesn't
-     * match the original text used to crete the TextLinks.
+     * match the original text used to create the TextLinks.
+     *
+     * <p><strong>NOTE: </strong>It may be necessary to set a LinkMovementMethod on the TextView
+     * widget to properly handle links. See {@link TextView#setMovementMethod(MovementMethod)}
      *
      * @param text the text to apply the links to. Must match the original text
-     * @param applyStrategy strategy for resolving link conflicts
-     * @param spanFactory a factory to generate spans from TextLinks. Will use a default if null
-     * @param allowPrefix whether to allow applying links only to a prefix of the text.
+     * @param applyStrategy the apply strategy used to determine how to apply links to text.
+     *      e.g {@link TextLinks#APPLY_STRATEGY_IGNORE}
+     * @param spanFactory a custom span factory for converting TextLinks to TextLinkSpans.
+     *      Set to {@code null} to use the default span factory.
      *
      * @return a status code indicating whether or not the links were successfully applied
-     *
-     * @hide
+     *      e.g. {@link #STATUS_LINKS_APPLIED}
      */
     @Status
     public int apply(
             @NonNull Spannable text,
             @ApplyStrategy int applyStrategy,
-            @Nullable Function<TextLink, TextLinkSpan> spanFactory,
-            boolean allowPrefix) {
+            @Nullable Function<TextLink, TextLinkSpan> spanFactory) {
         Preconditions.checkNotNull(text);
-        checkValidApplyStrategy(applyStrategy);
-        final String textString = text.toString();
-        if (!mFullText.equals(textString) && !(allowPrefix && textString.startsWith(mFullText))) {
-            return STATUS_DIFFERENT_TEXT;
-        }
-        if (mLinks.isEmpty()) {
-            return STATUS_NO_LINKS_FOUND;
-        }
+        return new TextLinksParams.Builder()
+                .setApplyStrategy(applyStrategy)
+                .setSpanFactory(spanFactory)
+                .build()
+                .apply(text, this);
+    }
 
-        if (spanFactory == null) {
-            spanFactory = DEFAULT_SPAN_FACTORY;
-        }
-        int applyCount = 0;
-        for (TextLink link : mLinks) {
-            final TextLinkSpan span = spanFactory.apply(link);
-            if (span != null) {
-                final ClickableSpan[] existingSpans = text.getSpans(
-                        link.getStart(), link.getEnd(), ClickableSpan.class);
-                if (existingSpans.length > 0) {
-                    if (applyStrategy == APPLY_STRATEGY_REPLACE) {
-                        for (ClickableSpan existingSpan : existingSpans) {
-                            text.removeSpan(existingSpan);
-                        }
-                        text.setSpan(span, link.getStart(), link.getEnd(),
-                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-                        applyCount++;
-                    }
-                } else {
-                    text.setSpan(span, link.getStart(), link.getEnd(),
-                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-                    applyCount++;
-                }
-            }
-        }
-        if (applyCount == 0) {
-            return STATUS_NO_LINKS_APPLIED;
-        }
-        return STATUS_LINKS_APPLIED;
+    @Override
+    public String toString() {
+        return String.format(Locale.US, "TextLinks{fullText=%s, links=%s}", mFullText, mLinks);
     }
 
     @Override
@@ -271,6 +257,13 @@
         }
 
         @Override
+        public String toString() {
+            return String.format(Locale.US,
+                    "TextLink{start=%s, end=%s, entityScores=%s, urlSpan=%s}",
+                    mStart, mEnd, mEntityScores, mUrlSpan);
+        }
+
+        @Override
         public int describeContents() {
             return 0;
         }
@@ -304,108 +297,35 @@
     }
 
     /**
-     * Optional input parameters for generating TextLinks.
+     * A request object for generating TextLinks.
      */
-    public static final class Options implements Parcelable {
+    public static final class Request implements Parcelable {
 
-        private LocaleList mDefaultLocales;
-        private TextClassifier.EntityConfig mEntityConfig;
-        private boolean mLegacyFallback;
-
-        private @ApplyStrategy int mApplyStrategy;
-        private Function<TextLink, TextLinkSpan> mSpanFactory;
-
+        private final CharSequence mText;
+        @Nullable private final LocaleList mDefaultLocales;
+        @Nullable private final TextClassifier.EntityConfig mEntityConfig;
+        private final boolean mLegacyFallback;
         private String mCallingPackageName;
 
-        /**
-         * Returns a new options object based on the specified link mask.
-         */
-        public static Options fromLinkMask(@LinkifyMask int mask) {
-            final List<String> entitiesToFind = new ArrayList<>();
-
-            if ((mask & Linkify.WEB_URLS) != 0) {
-                entitiesToFind.add(TextClassifier.TYPE_URL);
-            }
-            if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
-                entitiesToFind.add(TextClassifier.TYPE_EMAIL);
-            }
-            if ((mask & Linkify.PHONE_NUMBERS) != 0) {
-                entitiesToFind.add(TextClassifier.TYPE_PHONE);
-            }
-            if ((mask & Linkify.MAP_ADDRESSES) != 0) {
-                entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
-            }
-
-            return new Options().setEntityConfig(
-                    TextClassifier.EntityConfig.createWithEntityList(entitiesToFind));
-        }
-
-        public Options() {}
-
-        /**
-         * @param defaultLocales ordered list of locale preferences that may be used to
-         *                       disambiguate the provided text. If no locale preferences exist,
-         *                       set this to null or an empty locale list.
-         */
-        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+        private Request(
+                CharSequence text,
+                LocaleList defaultLocales,
+                TextClassifier.EntityConfig entityConfig,
+                boolean legacyFallback,
+                String callingPackageName) {
+            mText = text;
             mDefaultLocales = defaultLocales;
-            return this;
-        }
-
-        /**
-         * Sets the entity configuration to use. This determines what types of entities the
-         * TextClassifier will look for.
-         *
-         * @param entityConfig EntityConfig to use
-         */
-        public Options setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
             mEntityConfig = entityConfig;
-            return this;
-        }
-
-        /**
-         * Sets whether the TextClassifier can fallback to legacy links if smart linkify is
-         * disabled.
-         * <strong>Note: </strong>This is not parcelled.
-         * @hide
-         */
-        public Options setLegacyFallback(boolean legacyFallback) {
             mLegacyFallback = legacyFallback;
-            return this;
-        }
-
-        /**
-         * Sets a strategy for resolving conflicts when applying generated links to text that
-         * already have links.
-         *
-         * @throws IllegalArgumentException if applyStrategy is not valid
-         *
-         * @see #APPLY_STRATEGY_IGNORE
-         * @see #APPLY_STRATEGY_REPLACE
-         */
-        public Options setApplyStrategy(@ApplyStrategy int applyStrategy) {
-            checkValidApplyStrategy(applyStrategy);
-            mApplyStrategy = applyStrategy;
-            return this;
-        }
-
-        /**
-         * Sets a factory for converting a TextLink to a TextLinkSpan.
-         *
-         * <p><strong>Note: </strong>This is not parceled over IPC.
-         */
-        public Options setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
-            mSpanFactory = spanFactory;
-            return this;
-        }
-
-        /**
-         * Sets the name of the package that requested the links to get generated.
-         * @hide
-         */
-        public Options setCallingPackageName(@Nullable String callingPackageName) {
             mCallingPackageName = callingPackageName;
-            return this;
+        }
+
+        /**
+         * Returns the text to generate links for.
+         */
+        @NonNull
+        public CharSequence getText() {
+            return mText;
         }
 
         /**
@@ -437,26 +357,91 @@
         }
 
         /**
-         * @return the strategy for resolving conflictswhen applying generated links to text that
-         * already have links
-         *
-         * @see #APPLY_STRATEGY_IGNORE
-         * @see #APPLY_STRATEGY_REPLACE
+         * Sets the name of the package that requested the links to get generated.
          */
-        @ApplyStrategy
-        public int getApplyStrategy() {
-            return mApplyStrategy;
+        void setCallingPackageName(@Nullable String callingPackageName) {
+            mCallingPackageName = callingPackageName;
         }
 
         /**
-         * Returns a factory for converting a TextLink to a TextLinkSpan.
-         *
-         * <p><strong>Note: </strong>This is not parcelable and will always return null if read
-         *      from a parcel
+         * A builder for building TextLinks requests.
          */
-        @Nullable
-        public Function<TextLink, TextLinkSpan> getSpanFactory() {
-            return mSpanFactory;
+        public static final class Builder {
+
+            private final CharSequence mText;
+
+            @Nullable private LocaleList mDefaultLocales;
+            @Nullable private TextClassifier.EntityConfig mEntityConfig;
+            private boolean mLegacyFallback = true; // Use legacy fall back by default.
+            private String mCallingPackageName;
+
+            public Builder(@NonNull CharSequence text) {
+                mText = Preconditions.checkNotNull(text);
+            }
+
+            /**
+             * @param defaultLocales ordered list of locale preferences that may be used to
+             *                       disambiguate the provided text. If no locale preferences exist,
+             *                       set this to null or an empty locale list.
+             * @return this builder
+             */
+            @NonNull
+            public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+                mDefaultLocales = defaultLocales;
+                return this;
+            }
+
+            /**
+             * Sets the entity configuration to use. This determines what types of entities the
+             * TextClassifier will look for.
+             * Set to {@code null} for the default entity config and teh TextClassifier will
+             * automatically determine what links to generate.
+             *
+             * @return this builder
+             */
+            @NonNull
+            public Builder setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+                mEntityConfig = entityConfig;
+                return this;
+            }
+
+            /**
+             * Sets whether the TextClassifier can fallback to legacy links if smart linkify is
+             * disabled.
+             *
+             * <p><strong>Note: </strong>This is not parcelled.
+             *
+             * @return this builder
+             * @hide
+             */
+            @NonNull
+            public Builder setLegacyFallback(boolean legacyFallback) {
+                mLegacyFallback = legacyFallback;
+                return this;
+            }
+
+            /**
+             * Sets the name of the package that requested the links to get generated.
+             *
+             * @return this builder
+             * @hide
+             */
+            @NonNull
+            public Builder setCallingPackageName(@Nullable String callingPackageName) {
+                mCallingPackageName = callingPackageName;
+                return this;
+            }
+
+            /**
+             * Builds and returns the request object.
+             */
+            @NonNull
+            public Request build() {
+                return new Request(
+                        mText, mDefaultLocales, mEntityConfig,
+                        mLegacyFallback, mCallingPackageName);
+            }
+
         }
 
         /**
@@ -476,6 +461,7 @@
 
         @Override
         public void writeToParcel(Parcel dest, int flags) {
+            dest.writeString(mText.toString());
             dest.writeInt(mDefaultLocales != null ? 1 : 0);
             if (mDefaultLocales != null) {
                 mDefaultLocales.writeToParcel(dest, flags);
@@ -484,42 +470,33 @@
             if (mEntityConfig != null) {
                 mEntityConfig.writeToParcel(dest, flags);
             }
-            dest.writeInt(mApplyStrategy);
             dest.writeString(mCallingPackageName);
         }
 
-        public static final Parcelable.Creator<Options> CREATOR =
-                new Parcelable.Creator<Options>() {
+        public static final Parcelable.Creator<Request> CREATOR =
+                new Parcelable.Creator<Request>() {
                     @Override
-                    public Options createFromParcel(Parcel in) {
-                        return new Options(in);
+                    public Request createFromParcel(Parcel in) {
+                        return new Request(in);
                     }
 
                     @Override
-                    public Options[] newArray(int size) {
-                        return new Options[size];
+                    public Request[] newArray(int size) {
+                        return new Request[size];
                     }
                 };
 
-        private Options(Parcel in) {
-            if (in.readInt() > 0) {
-                mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
-            }
-            if (in.readInt() > 0) {
-                mEntityConfig = TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
-            }
-            mApplyStrategy = in.readInt();
+        private Request(Parcel in) {
+            mText = in.readString();
+            mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+            mEntityConfig = in.readInt() == 0
+                    ? null : TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
+            mLegacyFallback = true;
             mCallingPackageName = in.readString();
         }
     }
 
     /**
-     * A function to create spans from TextLinks.
-     */
-    private static final Function<TextLink, TextLinkSpan> DEFAULT_SPAN_FACTORY =
-            textLink -> new TextLinkSpan(textLink);
-
-    /**
      * A ClickableSpan for a TextLink.
      *
      * <p>Applies only to TextViews.
@@ -596,6 +573,7 @@
          *
          * @throws IllegalArgumentException if entityScores is null or empty.
          */
+        @NonNull
         public Builder addLink(int start, int end, Map<String, Float> entityScores) {
             mLinks.add(new TextLink(start, end, entityScores, null));
             return this;
@@ -605,6 +583,7 @@
          * @see #addLink(int, int, Map)
          * @param urlSpan An optional URLSpan to delegate to. NOTE: Not parcelled.
          */
+        @NonNull
         Builder addLink(int start, int end, Map<String, Float> entityScores,
                 @Nullable URLSpan urlSpan) {
             mLinks.add(new TextLink(start, end, entityScores, urlSpan));
@@ -614,6 +593,7 @@
         /**
          * Removes all {@link TextLink}s.
          */
+        @NonNull
         public Builder clearTextLinks() {
             mLinks.clear();
             return this;
@@ -624,18 +604,129 @@
          *
          * @return the constructed TextLinks
          */
+        @NonNull
         public TextLinks build() {
             return new TextLinks(mFullText, mLinks);
         }
     }
 
+    // TODO: Remove once apps can build against the latest sdk.
     /**
-     * @throws IllegalArgumentException if the value is invalid
+     * Optional input parameters for generating TextLinks.
+     * @hide
      */
-    private static void checkValidApplyStrategy(int applyStrategy) {
-        if (applyStrategy != APPLY_STRATEGY_IGNORE && applyStrategy != APPLY_STRATEGY_REPLACE) {
-            throw new IllegalArgumentException(
-                    "Invalid apply strategy. See TextLinks.ApplyStrategy for options.");
+    public static final class Options {
+
+        @Nullable private final TextClassificationSessionId mSessionId;
+        @Nullable private final Request mRequest;
+        @Nullable private LocaleList mDefaultLocales;
+        @Nullable private TextClassifier.EntityConfig mEntityConfig;
+        private boolean mLegacyFallback;
+
+        private @ApplyStrategy int mApplyStrategy;
+        private Function<TextLink, TextLinkSpan> mSpanFactory;
+
+        private String mCallingPackageName;
+
+        public Options() {
+            this(null, null);
+        }
+
+        private Options(
+                @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
+            mSessionId = sessionId;
+            mRequest = request;
+        }
+
+        /** Helper to create Options from a Request. */
+        public static Options from(TextClassificationSessionId sessionId, Request request) {
+            final Options options = new Options(sessionId, request);
+            options.setDefaultLocales(request.getDefaultLocales());
+            options.setEntityConfig(request.getEntityConfig());
+            return options;
+        }
+
+        /** Returns a new options object based on the specified link mask. */
+        public static Options fromLinkMask(@LinkifyMask int mask) {
+            final List<String> entitiesToFind = new ArrayList<>();
+
+            if ((mask & Linkify.WEB_URLS) != 0) {
+                entitiesToFind.add(TextClassifier.TYPE_URL);
+            }
+            if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
+                entitiesToFind.add(TextClassifier.TYPE_EMAIL);
+            }
+            if ((mask & Linkify.PHONE_NUMBERS) != 0) {
+                entitiesToFind.add(TextClassifier.TYPE_PHONE);
+            }
+            if ((mask & Linkify.MAP_ADDRESSES) != 0) {
+                entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
+            }
+
+            return new Options().setEntityConfig(
+                    TextClassifier.EntityConfig.createWithEntityList(entitiesToFind));
+        }
+
+        /** @param defaultLocales ordered list of locale preferences. */
+        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        /** @param entityConfig definition of which entity types to look for. */
+        public Options setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+            mEntityConfig = entityConfig;
+            return this;
+        }
+
+        /** @param applyStrategy strategy to use when resolving conflicts. */
+        public Options setApplyStrategy(@ApplyStrategy int applyStrategy) {
+            checkValidApplyStrategy(applyStrategy);
+            mApplyStrategy = applyStrategy;
+            return this;
+        }
+
+        /** @param spanFactory factory for converting TextLink to TextLinkSpan. */
+        public Options setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
+            mSpanFactory = spanFactory;
+            return this;
+        }
+
+        @Nullable
+        public LocaleList getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        @Nullable
+        public TextClassifier.EntityConfig getEntityConfig() {
+            return mEntityConfig;
+        }
+
+        @ApplyStrategy
+        public int getApplyStrategy() {
+            return mApplyStrategy;
+        }
+
+        @Nullable
+        public Function<TextLink, TextLinkSpan> getSpanFactory() {
+            return mSpanFactory;
+        }
+
+        @Nullable
+        public Request getRequest() {
+            return mRequest;
+        }
+
+        @Nullable
+        public TextClassificationSessionId getSessionId() {
+            return mSessionId;
+        }
+
+        private static void checkValidApplyStrategy(int applyStrategy) {
+            if (applyStrategy != APPLY_STRATEGY_IGNORE && applyStrategy != APPLY_STRATEGY_REPLACE) {
+                throw new IllegalArgumentException(
+                        "Invalid apply strategy. See TextLinks.ApplyStrategy for options.");
+            }
         }
     }
 }
diff --git a/core/java/android/view/textclassifier/TextLinksParams.java b/core/java/android/view/textclassifier/TextLinksParams.java
new file mode 100644
index 0000000..be4c3bc
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextLinksParams.java
@@ -0,0 +1,206 @@
+/*
+ * 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.view.textclassifier;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.text.Spannable;
+import android.text.style.ClickableSpan;
+import android.text.util.Linkify;
+import android.text.util.Linkify.LinkifyMask;
+import android.view.textclassifier.TextLinks.TextLink;
+import android.view.textclassifier.TextLinks.TextLinkSpan;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * Parameters for generating and applying links.
+ * @hide
+ */
+public final class TextLinksParams {
+
+    /**
+     * A function to create spans from TextLinks.
+     */
+    private static final Function<TextLink, TextLinkSpan> DEFAULT_SPAN_FACTORY =
+            textLink -> new TextLinkSpan(textLink);
+
+    @TextLinks.ApplyStrategy
+    private final int mApplyStrategy;
+    private final Function<TextLink, TextLinkSpan> mSpanFactory;
+    private final TextClassifier.EntityConfig mEntityConfig;
+
+    private TextLinksParams(
+            @TextLinks.ApplyStrategy int applyStrategy,
+            Function<TextLink, TextLinkSpan> spanFactory) {
+        mApplyStrategy = applyStrategy;
+        mSpanFactory = spanFactory;
+        mEntityConfig = TextClassifier.EntityConfig.createWithHints(null);
+    }
+
+    /**
+     * Returns a new TextLinksParams object based on the specified link mask.
+     *
+     * @param mask the link mask
+     *      e.g. {@link LinkifyMask#PHONE_NUMBERS} | {@link LinkifyMask#EMAIL_ADDRESSES}
+     * @hide
+     */
+    @NonNull
+    public static TextLinksParams fromLinkMask(@LinkifyMask int mask) {
+        final List<String> entitiesToFind = new ArrayList<>();
+        if ((mask & Linkify.WEB_URLS) != 0) {
+            entitiesToFind.add(TextClassifier.TYPE_URL);
+        }
+        if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
+            entitiesToFind.add(TextClassifier.TYPE_EMAIL);
+        }
+        if ((mask & Linkify.PHONE_NUMBERS) != 0) {
+            entitiesToFind.add(TextClassifier.TYPE_PHONE);
+        }
+        if ((mask & Linkify.MAP_ADDRESSES) != 0) {
+            entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
+        }
+        return new TextLinksParams.Builder().setEntityConfig(
+                TextClassifier.EntityConfig.createWithExplicitEntityList(entitiesToFind))
+                .build();
+    }
+
+    /**
+     * Returns the entity config used to determine what entity types to generate.
+     */
+    @NonNull
+    public TextClassifier.EntityConfig getEntityConfig() {
+        return mEntityConfig;
+    }
+
+    /**
+     * Annotates the given text with the generated links. It will fail if the provided text doesn't
+     * match the original text used to crete the TextLinks.
+     *
+     * @param text the text to apply the links to. Must match the original text
+     * @param textLinks the links to apply to the text
+     *
+     * @return a status code indicating whether or not the links were successfully applied
+     * @hide
+     */
+    @TextLinks.Status
+    public int apply(@NonNull Spannable text, @NonNull TextLinks textLinks) {
+        Preconditions.checkNotNull(text);
+        Preconditions.checkNotNull(textLinks);
+
+        final String textString = text.toString();
+        if (!textString.startsWith(textLinks.getText())) {
+            return TextLinks.STATUS_DIFFERENT_TEXT;
+        }
+        if (textLinks.getLinks().isEmpty()) {
+            return TextLinks.STATUS_NO_LINKS_FOUND;
+        }
+
+        int applyCount = 0;
+        for (TextLink link : textLinks.getLinks()) {
+            final TextLinkSpan span = mSpanFactory.apply(link);
+            if (span != null) {
+                final ClickableSpan[] existingSpans = text.getSpans(
+                        link.getStart(), link.getEnd(), ClickableSpan.class);
+                if (existingSpans.length > 0) {
+                    if (mApplyStrategy == TextLinks.APPLY_STRATEGY_REPLACE) {
+                        for (ClickableSpan existingSpan : existingSpans) {
+                            text.removeSpan(existingSpan);
+                        }
+                        text.setSpan(span, link.getStart(), link.getEnd(),
+                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                        applyCount++;
+                    }
+                } else {
+                    text.setSpan(span, link.getStart(), link.getEnd(),
+                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                    applyCount++;
+                }
+            }
+        }
+        if (applyCount == 0) {
+            return TextLinks.STATUS_NO_LINKS_APPLIED;
+        }
+        return TextLinks.STATUS_LINKS_APPLIED;
+    }
+
+    /**
+     * A builder for building TextLinksParams.
+     */
+    public static final class Builder {
+
+        @TextLinks.ApplyStrategy
+        private int mApplyStrategy = TextLinks.APPLY_STRATEGY_IGNORE;
+        private Function<TextLink, TextLinkSpan> mSpanFactory = DEFAULT_SPAN_FACTORY;
+
+        /**
+         * Sets the apply strategy used to determine how to apply links to text.
+         *      e.g {@link TextLinks#APPLY_STRATEGY_IGNORE}
+         *
+         * @return this builder
+         */
+        public Builder setApplyStrategy(@TextLinks.ApplyStrategy int applyStrategy) {
+            mApplyStrategy = checkApplyStrategy(applyStrategy);
+            return this;
+        }
+
+        /**
+         * Sets a custom span factory for converting TextLinks to TextLinkSpans.
+         * Set to {@code null} to use the default span factory.
+         *
+         * @return this builder
+         */
+        public Builder setSpanFactory(@Nullable Function<TextLink, TextLinkSpan> spanFactory) {
+            mSpanFactory = spanFactory == null ? DEFAULT_SPAN_FACTORY : spanFactory;
+            return this;
+        }
+
+        /**
+         * Sets the entity configuration used to determine what entity types to generate.
+         * Set to {@code null} for the default entity config which will automatically determine
+         * what links to generate.
+         *
+         * @return this builder
+         */
+        public Builder setEntityConfig(@Nullable TextClassifier.EntityConfig entityConfig) {
+            return this;
+        }
+
+        /**
+         * Builds and returns a TextLinksParams object.
+         */
+        public TextLinksParams build() {
+            return new TextLinksParams(mApplyStrategy, mSpanFactory);
+        }
+    }
+
+    /** @throws IllegalArgumentException if the value is invalid */
+    @TextLinks.ApplyStrategy
+    private static int checkApplyStrategy(int applyStrategy) {
+        if (applyStrategy != TextLinks.APPLY_STRATEGY_IGNORE
+                && applyStrategy != TextLinks.APPLY_STRATEGY_REPLACE) {
+            throw new IllegalArgumentException(
+                    "Invalid apply strategy. See TextLinksParams.ApplyStrategy for options.");
+        }
+        return applyStrategy;
+    }
+}
+
diff --git a/core/java/android/view/textclassifier/TextSelection.aidl b/core/java/android/view/textclassifier/TextSelection.aidl
index dab1aef..b2fd9be 100644
--- a/core/java/android/view/textclassifier/TextSelection.aidl
+++ b/core/java/android/view/textclassifier/TextSelection.aidl
@@ -17,4 +17,4 @@
 package android.view.textclassifier;
 
 parcelable TextSelection;
-parcelable TextSelection.Options;
\ No newline at end of file
+parcelable TextSelection.Request;
\ No newline at end of file
diff --git a/core/java/android/view/textclassifier/TextSelection.java b/core/java/android/view/textclassifier/TextSelection.java
index 1c93be7..17687c9 100644
--- a/core/java/android/view/textclassifier/TextSelection.java
+++ b/core/java/android/view/textclassifier/TextSelection.java
@@ -25,6 +25,7 @@
 import android.os.Parcelable;
 import android.util.ArrayMap;
 import android.view.textclassifier.TextClassifier.EntityType;
+import android.view.textclassifier.TextClassifier.Utils;
 
 import com.android.internal.util.Preconditions;
 
@@ -38,16 +39,15 @@
 
     private final int mStartIndex;
     private final int mEndIndex;
-    @NonNull private final EntityConfidence mEntityConfidence;
-    @NonNull private final String mSignature;
+    private final EntityConfidence mEntityConfidence;
+    @Nullable private final String mId;
 
     private TextSelection(
-            int startIndex, int endIndex, @NonNull Map<String, Float> entityConfidence,
-            @NonNull String signature) {
+            int startIndex, int endIndex, Map<String, Float> entityConfidence, String id) {
         mStartIndex = startIndex;
         mEndIndex = endIndex;
         mEntityConfidence = new EntityConfidence(entityConfidence);
-        mSignature = signature;
+        mId = id;
     }
 
     /**
@@ -80,7 +80,8 @@
      * @see #getEntityCount() for the number of entities available.
      */
     @NonNull
-    public @EntityType String getEntity(int index) {
+    @EntityType
+    public String getEntity(int index) {
         return mEntityConfidence.getEntities().get(index);
     }
 
@@ -95,21 +96,19 @@
     }
 
     /**
-     * Returns the signature for this object.
-     * The TextClassifier that generates this object may use it as a way to internally identify
-     * this object.
+     * Returns the id, if one exists, for this object.
      */
-    @NonNull
-    public String getSignature() {
-        return mSignature;
+    @Nullable
+    public String getId() {
+        return mId;
     }
 
     @Override
     public String toString() {
         return String.format(
                 Locale.US,
-                "TextSelection {startIndex=%d, endIndex=%d, entities=%s, signature=%s}",
-                mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+                "TextSelection {id=%s, startIndex=%d, endIndex=%d, entities=%s}",
+                mId, mStartIndex, mEndIndex, mEntityConfidence);
     }
 
     /**
@@ -119,8 +118,8 @@
 
         private final int mStartIndex;
         private final int mEndIndex;
-        @NonNull private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
-        @NonNull private String mSignature = "";
+        private final Map<String, Float> mEntityConfidence = new ArrayMap<>();
+        @Nullable private String mId;
 
         /**
          * Creates a builder used to build {@link TextSelection} objects.
@@ -142,56 +141,96 @@
          *      0 implies the entity does not exist for the classified text.
          *      Values greater than 1 are clamped to 1.
          */
+        @NonNull
         public Builder setEntityType(
                 @NonNull @EntityType String type,
                 @FloatRange(from = 0.0, to = 1.0) float confidenceScore) {
+            Preconditions.checkNotNull(type);
             mEntityConfidence.put(type, confidenceScore);
             return this;
         }
 
         /**
-         * Sets a signature for the TextSelection object.
-         *
-         * The TextClassifier that generates the TextSelection object may use it as a way to
-         * internally identify the TextSelection object.
+         * Sets an id for the TextSelection object.
          */
-        public Builder setSignature(@NonNull String signature) {
-            mSignature = Preconditions.checkNotNull(signature);
+        @NonNull
+        public Builder setId(@NonNull String id) {
+            mId = Preconditions.checkNotNull(id);
             return this;
         }
 
         /**
          * Builds and returns {@link TextSelection} object.
          */
+        @NonNull
         public TextSelection build() {
             return new TextSelection(
-                    mStartIndex, mEndIndex, mEntityConfidence, mSignature);
+                    mStartIndex, mEndIndex, mEntityConfidence, mId);
         }
     }
 
     /**
-     * Optional input parameters for generating TextSelection.
+     * A request object for generating TextSelection.
      */
-    public static final class Options implements Parcelable {
+    public static final class Request implements Parcelable {
 
-        private @Nullable LocaleList mDefaultLocales;
-        private boolean mDarkLaunchAllowed;
+        private final CharSequence mText;
+        private final int mStartIndex;
+        private final int mEndIndex;
+        @Nullable private final LocaleList mDefaultLocales;
+        private final boolean mDarkLaunchAllowed;
 
-        public Options() {}
-
-        /**
-         * @param defaultLocales ordered list of locale preferences that may be used to disambiguate
-         *      the provided text. If no locale preferences exist, set this to null or an empty
-         *      locale list.
-         */
-        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+        private Request(
+                CharSequence text,
+                int startIndex,
+                int endIndex,
+                LocaleList defaultLocales,
+                boolean darkLaunchAllowed) {
+            mText = text;
+            mStartIndex = startIndex;
+            mEndIndex = endIndex;
             mDefaultLocales = defaultLocales;
-            return this;
+            mDarkLaunchAllowed = darkLaunchAllowed;
         }
 
         /**
-         * @return ordered list of locale preferences that can be used to disambiguate
-         *      the provided text.
+         * Returns the text providing context for the selected text (which is specified by the
+         * sub sequence starting at startIndex and ending at endIndex).
+         */
+        @NonNull
+        public CharSequence getText() {
+            return mText;
+        }
+
+        /**
+         * Returns start index of the selected part of text.
+         */
+        @IntRange(from = 0)
+        public int getStartIndex() {
+            return mStartIndex;
+        }
+
+        /**
+         * Returns end index of the selected part of text.
+         */
+        @IntRange(from = 0)
+        public int getEndIndex() {
+            return mEndIndex;
+        }
+
+        /**
+         * Returns true if the TextClassifier should return selection suggestions when "dark
+         * launched". Otherwise, returns false.
+         *
+         * @hide
+         */
+        public boolean isDarkLaunchAllowed() {
+            return mDarkLaunchAllowed;
+        }
+
+        /**
+         * @return ordered list of locale preferences that can be used to disambiguate the
+         * provided text.
          */
         @Nullable
         public LocaleList getDefaultLocales() {
@@ -199,26 +238,71 @@
         }
 
         /**
-         * @param allowed whether or not the TextClassifier should return selection suggestions
-         *      when "dark launched". When a TextClassifier is dark launched, it can suggest
-         *      selection changes that should not be used to actually change the user's selection.
-         *      Instead, the suggested selection is logged, compared with the user's selection
-         *      interaction, and used to generate quality metrics for the TextClassifier.
-         *
-         * @hide
+         * A builder for building TextSelection requests.
          */
-        public void setDarkLaunchAllowed(boolean allowed) {
-            mDarkLaunchAllowed = allowed;
-        }
+        public static final class Builder {
 
-        /**
-         * Returns true if the TextClassifier should return selection suggestions when
-         * "dark launched". Otherwise, returns false.
-         *
-         * @hide
-         */
-        public boolean isDarkLaunchAllowed() {
-            return mDarkLaunchAllowed;
+            private final CharSequence mText;
+            private final int mStartIndex;
+            private final int mEndIndex;
+
+            @Nullable private LocaleList mDefaultLocales;
+            private boolean mDarkLaunchAllowed;
+
+            /**
+             * @param text text providing context for the selected text (which is specified by the
+             *      sub sequence starting at selectionStartIndex and ending at selectionEndIndex)
+             * @param startIndex start index of the selected part of text
+             * @param endIndex end index of the selected part of text
+             */
+            public Builder(
+                    @NonNull CharSequence text,
+                    @IntRange(from = 0) int startIndex,
+                    @IntRange(from = 0) int endIndex) {
+                Utils.checkArgument(text, startIndex, endIndex);
+                mText = text;
+                mStartIndex = startIndex;
+                mEndIndex = endIndex;
+            }
+
+            /**
+             * @param defaultLocales ordered list of locale preferences that may be used to
+             *      disambiguate the provided text. If no locale preferences exist, set this to null
+             *      or an empty locale list.
+             *
+             * @return this builder.
+             */
+            @NonNull
+            public Builder setDefaultLocales(@Nullable LocaleList defaultLocales) {
+                mDefaultLocales = defaultLocales;
+                return this;
+            }
+
+            /**
+             * @param allowed whether or not the TextClassifier should return selection suggestions
+             *      when "dark launched". When a TextClassifier is dark launched, it can suggest
+             *      selection changes that should not be used to actually change the user's
+             *      selection. Instead, the suggested selection is logged, compared with the user's
+             *      selection interaction, and used to generate quality metrics for the
+             *      TextClassifier. Not parceled.
+             *
+             * @return this builder.
+             * @hide
+             */
+            @NonNull
+            public Builder setDarkLaunchAllowed(boolean allowed) {
+                mDarkLaunchAllowed = allowed;
+                return this;
+            }
+
+            /**
+             * Builds and returns the request object.
+             */
+            @NonNull
+            public Request build() {
+                return new Request(mText, mStartIndex, mEndIndex,
+                        mDefaultLocales, mDarkLaunchAllowed);
+            }
         }
 
         @Override
@@ -228,31 +312,34 @@
 
         @Override
         public void writeToParcel(Parcel dest, int flags) {
+            dest.writeString(mText.toString());
+            dest.writeInt(mStartIndex);
+            dest.writeInt(mEndIndex);
             dest.writeInt(mDefaultLocales != null ? 1 : 0);
             if (mDefaultLocales != null) {
                 mDefaultLocales.writeToParcel(dest, flags);
             }
-            dest.writeInt(mDarkLaunchAllowed ? 1 : 0);
         }
 
-        public static final Parcelable.Creator<Options> CREATOR =
-                new Parcelable.Creator<Options>() {
+        public static final Parcelable.Creator<Request> CREATOR =
+                new Parcelable.Creator<Request>() {
                     @Override
-                    public Options createFromParcel(Parcel in) {
-                        return new Options(in);
+                    public Request createFromParcel(Parcel in) {
+                        return new Request(in);
                     }
 
                     @Override
-                    public Options[] newArray(int size) {
-                        return new Options[size];
+                    public Request[] newArray(int size) {
+                        return new Request[size];
                     }
                 };
 
-        private Options(Parcel in) {
-            if (in.readInt() > 0) {
-                mDefaultLocales = LocaleList.CREATOR.createFromParcel(in);
-            }
-            mDarkLaunchAllowed = in.readInt() != 0;
+        private Request(Parcel in) {
+            mText = in.readString();
+            mStartIndex = in.readInt();
+            mEndIndex = in.readInt();
+            mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
+            mDarkLaunchAllowed = false;
         }
     }
 
@@ -266,7 +353,7 @@
         dest.writeInt(mStartIndex);
         dest.writeInt(mEndIndex);
         mEntityConfidence.writeToParcel(dest, flags);
-        dest.writeString(mSignature);
+        dest.writeString(mId);
     }
 
     public static final Parcelable.Creator<TextSelection> CREATOR =
@@ -286,6 +373,58 @@
         mStartIndex = in.readInt();
         mEndIndex = in.readInt();
         mEntityConfidence = EntityConfidence.CREATOR.createFromParcel(in);
-        mSignature = in.readString();
+        mId = in.readString();
+    }
+
+
+    // TODO: Remove once apps can build against the latest sdk.
+    /**
+     * Optional input parameters for generating TextSelection.
+     * @hide
+     */
+    public static final class Options {
+
+        @Nullable private final TextClassificationSessionId mSessionId;
+        @Nullable private final Request mRequest;
+        @Nullable private LocaleList mDefaultLocales;
+        private boolean mDarkLaunchAllowed;
+
+        public Options() {
+            this(null, null);
+        }
+
+        private Options(
+                @Nullable TextClassificationSessionId sessionId, @Nullable Request request) {
+            mSessionId = sessionId;
+            mRequest = request;
+        }
+
+        /** Helper to create Options from a Request. */
+        public static Options from(TextClassificationSessionId sessionId, Request request) {
+            final Options options = new Options(sessionId, request);
+            options.setDefaultLocales(request.getDefaultLocales());
+            return options;
+        }
+
+        /** @param defaultLocales ordered list of locale preferences. */
+        public Options setDefaultLocales(@Nullable LocaleList defaultLocales) {
+            mDefaultLocales = defaultLocales;
+            return this;
+        }
+
+        @Nullable
+        public LocaleList getDefaultLocales() {
+            return mDefaultLocales;
+        }
+
+        @Nullable
+        public Request getRequest() {
+            return mRequest;
+        }
+
+        @Nullable
+        public TextClassificationSessionId getSessionId() {
+            return mSessionId;
+        }
     }
 }
diff --git a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
index 157b3d8..f7d75cd 100644
--- a/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
+++ b/core/java/android/view/textclassifier/logging/SmartSelectionEventTracker.java
@@ -473,7 +473,7 @@
             final String entityType = classification.getEntityCount() > 0
                     ? classification.getEntity(0)
                     : TextClassifier.TYPE_UNKNOWN;
-            final String versionTag = getVersionInfo(classification.getSignature());
+            final String versionTag = getVersionInfo(classification.getId());
             return new SelectionEvent(
                     start, end, EventType.SELECTION_MODIFIED, entityType, versionTag);
         }
@@ -489,7 +489,7 @@
          */
         public static SelectionEvent selectionModified(
                 int start, int end, @NonNull TextSelection selection) {
-            final boolean smartSelection = getSourceClassifier(selection.getSignature())
+            final boolean smartSelection = getSourceClassifier(selection.getId())
                     .equals(TextClassifier.DEFAULT_LOG_TAG);
             final int eventType;
             if (smartSelection) {
@@ -503,7 +503,7 @@
             final String entityType = selection.getEntityCount() > 0
                     ? selection.getEntity(0)
                     : TextClassifier.TYPE_UNKNOWN;
-            final String versionTag = getVersionInfo(selection.getSignature());
+            final String versionTag = getVersionInfo(selection.getId());
             return new SelectionEvent(start, end, eventType, entityType, versionTag);
         }
 
@@ -538,7 +538,7 @@
             final String entityType = classification.getEntityCount() > 0
                     ? classification.getEntity(0)
                     : TextClassifier.TYPE_UNKNOWN;
-            final String versionTag = getVersionInfo(classification.getSignature());
+            final String versionTag = getVersionInfo(classification.getId());
             return new SelectionEvent(start, end, actionType, entityType, versionTag);
         }
 
diff --git a/core/java/android/webkit/FindAddress.java b/core/java/android/webkit/FindAddress.java
index 31b2427..9183227 100644
--- a/core/java/android/webkit/FindAddress.java
+++ b/core/java/android/webkit/FindAddress.java
@@ -429,20 +429,21 @@
 
                     // At this point we've matched a state; try to match a zip code after it.
                     Matcher zipMatcher = sWordRe.matcher(content);
-                    if (zipMatcher.find(stateMatch.end())
-                            && isValidZipCode(zipMatcher.group(0), stateMatch)) {
-                        return zipMatcher.end();
+                    if (zipMatcher.find(stateMatch.end())) {
+                        if (isValidZipCode(zipMatcher.group(0), stateMatch)) {
+                            return zipMatcher.end();
+                        }
+                    } else {
+                        // The content ends with a state but no zip
+                        // code. This is a legal match according to the
+                        // documentation. N.B. This is equivalent to the
+                        // original c++ implementation, which only allowed
+                        // the zip code to be optional at the end of the
+                        // string, which presumably is a bug.  We tried
+                        // relaxing this to work in other places but it
+                        // caused too many false positives.
+                        nonZipMatch = stateMatch.end();
                     }
-                    // The content ends with a state but no zip
-                    // code. This is a legal match according to the
-                    // documentation. N.B. This differs from the
-                    // original c++ implementation, which only allowed
-                    // the zip code to be optional at the end of the
-                    // string, which presumably is a bug.  Now we
-                    // prefer to find a match with a zip code, but
-                    // remember non-zip matches and return them if
-                    // necessary.
-                    nonZipMatch = stateMatch.end();
                 }
             }
         }
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index fc94b1f..10748ac 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1837,8 +1837,12 @@
      *
      * @param addr the string to search for addresses
      * @return the address, or if no address is found, {@code null}
+     * @deprecated this method is superseded by {@link TextClassifier#generateLinks(
+     * android.view.textclassifier.TextLinks.Request)}. Avoid using this method even when targeting
+     * API levels where no alternative is available.
      */
     @Nullable
+    @Deprecated
     public static String findAddress(String addr) {
         if (addr == null) {
             throw new NullPointerException("addr is null");
@@ -2455,14 +2459,6 @@
         return mWebViewThread;
     }
 
-    /**
-     * Returns the {@link Looper} corresponding to the thread on which WebView calls must be made.
-     */
-    @NonNull
-    public Looper getLooper() {
-        return mWebViewThread;
-    }
-
     //-------------------------------------------------------------------------
     // Interface for WebView providers
     //-------------------------------------------------------------------------
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 9946726..6af678b 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -6031,7 +6031,9 @@
             mSwitchedLines = false;
             final int selectionStart = mTextView.getSelectionStart();
             final int selectionEnd = mTextView.getSelectionEnd();
-            if (selectionStart > selectionEnd) {
+            if (selectionStart < 0 || selectionEnd < 0) {
+                Selection.removeSelection((Spannable) mTextView.getText());
+            } else if (selectionStart > selectionEnd) {
                 Selection.setSelection((Spannable) mTextView.getText(),
                         selectionEnd, selectionStart);
             }
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 4b951fa..1372987 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -817,8 +817,6 @@
         if (mScaleType != scaleType) {
             mScaleType = scaleType;
 
-            setWillNotCacheDrawing(mScaleType == ScaleType.CENTER);
-
             requestLayout();
             invalidate();
         }
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index c1c5d9d..5eb6699 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -393,6 +393,12 @@
         private int mWindowPositionY;
         private boolean mPendingWindowPositionUpdate;
 
+        // The lock used to synchronize the UI and render threads when a #destroy
+        // is performed on the UI thread and a frame callback on the render thread.
+        // When both mLock and mDestroyLock need to be held at the same time,
+        // mDestroyLock should be acquired before mLock in order to avoid deadlocks.
+        private final Object mDestroyLock = new Object();
+
         InternalPopupWindow(final Context context, final Display display,
                 final Surface parentSurface,
                 final int width, final int height, final float elevation, final float cornerRadius,
@@ -517,9 +523,11 @@
          * Destroys this instance.
          */
         public void destroy() {
+            synchronized (mDestroyLock) {
+                mSurface.destroy();
+            }
             synchronized (mLock) {
                 mRenderer.destroy();
-                mSurface.destroy();
                 mSurfaceControl.destroy();
                 mSurfaceSession.kill();
                 mBitmapRenderNode.destroy();
@@ -567,21 +575,23 @@
                     final int pendingY = mWindowPositionY;
 
                     callback = frame -> {
-                        synchronized (mLock) {
+                        synchronized (mDestroyLock) {
                             if (!mSurface.isValid()) {
                                 return;
                             }
-                            mRenderer.setLightCenter(mDisplay, pendingX, pendingY);
-                            // Show or move the window at the content draw frame.
-                            SurfaceControl.openTransaction();
-                            mSurfaceControl.deferTransactionUntil(mSurface, frame);
-                            if (updateWindowPosition) {
-                                mSurfaceControl.setPosition(pendingX, pendingY);
+                            synchronized (mLock) {
+                                mRenderer.setLightCenter(mDisplay, pendingX, pendingY);
+                                // Show or move the window at the content draw frame.
+                                SurfaceControl.openTransaction();
+                                mSurfaceControl.deferTransactionUntil(mSurface, frame);
+                                if (updateWindowPosition) {
+                                    mSurfaceControl.setPosition(pendingX, pendingY);
+                                }
+                                if (firstDraw) {
+                                    mSurfaceControl.show();
+                                }
+                                SurfaceControl.closeTransaction();
                             }
-                            if (firstDraw) {
-                                mSurfaceControl.show();
-                            }
-                            SurfaceControl.closeTransaction();
                         }
                     };
                 } else {
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 8b49ccb..468abdc 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -33,9 +33,9 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ActionMode;
-import android.view.textclassifier.Logger;
 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.TextClassificationManager;
@@ -499,7 +499,8 @@
             mOriginalEnd = mSelectionEnd = selectionEnd;
             mAllowReset = false;
             maybeInvalidateLogger();
-            mLogger.logSelectionStarted(text, selectionStart,
+            mLogger.logSelectionStarted(mTextView.getTextClassificationSession(),
+                    text, selectionStart,
                     isLink ? SelectionEvent.INVOCATION_LINK : SelectionEvent.INVOCATION_MANUAL);
         }
 
@@ -633,6 +634,7 @@
                             mSelectionStart, mSelectionEnd,
                             SelectionEvent.ACTION_ABANDON, null /* classification */);
                     mSelectionStart = mSelectionEnd = -1;
+                    mTextView.getTextClassificationSession().destroy();
                     mIsPending = false;
                 }
             }
@@ -661,20 +663,17 @@
         private static final String LOG_TAG = "SelectionMetricsLogger";
         private static final Pattern PATTERN_WHITESPACE = Pattern.compile("\\s+");
 
-        private final Supplier<TextClassifier> mTextClassificationSession;
-        private final Logger mLogger;
         private final boolean mEditTextLogger;
         private final BreakIterator mTokenIterator;
+
+        @Nullable private TextClassifier mClassificationSession;
         private int mStartIndex;
         private String mText;
 
         SelectionMetricsLogger(TextView textView) {
             Preconditions.checkNotNull(textView);
-            mTextClassificationSession = textView::getTextClassificationSession;
-            mLogger = textView.getTextClassifier().getLogger(
-                    new Logger.Config(textView.getContext(), getWidetType(textView), null));
             mEditTextLogger = textView.isTextEditable();
-            mTokenIterator = mLogger.getTokenIterator(textView.getTextLocale());
+            mTokenIterator = SelectionSessionLogger.getTokenIterator(textView.getTextLocale());
         }
 
         @TextClassifier.WidgetType
@@ -689,6 +688,7 @@
         }
 
         public void logSelectionStarted(
+                TextClassifier classificationSession,
                 CharSequence text, int index,
                 @InvocationMethod int invocationMethod) {
             try {
@@ -699,9 +699,8 @@
                 }
                 mTokenIterator.setText(mText);
                 mStartIndex = index;
-                mLogger.logSelectionStartedEvent(invocationMethod, 0);
-                // TODO: Remove the above legacy logging.
-                mTextClassificationSession.get().onSelectionEvent(
+                mClassificationSession = classificationSession;
+                mClassificationSession.onSelectionEvent(
                         SelectionEvent.createSelectionStartedEvent(invocationMethod, 0));
             } catch (Exception e) {
                 // Avoid crashes due to logging.
@@ -716,26 +715,23 @@
                 Preconditions.checkArgumentInRange(end, start, mText.length(), "end");
                 int[] wordIndices = getWordDelta(start, end);
                 if (selection != null) {
-                    mLogger.logSelectionModifiedEvent(
-                            wordIndices[0], wordIndices[1], selection);
-                    // TODO: Remove the above legacy logging.
-                    mTextClassificationSession.get().onSelectionEvent(
-                            SelectionEvent.createSelectionModifiedEvent(
-                                    wordIndices[0], wordIndices[1], selection));
+                    if (mClassificationSession != null) {
+                        mClassificationSession.onSelectionEvent(
+                                SelectionEvent.createSelectionModifiedEvent(
+                                        wordIndices[0], wordIndices[1], selection));
+                    }
                 } else if (classification != null) {
-                    mLogger.logSelectionModifiedEvent(
-                            wordIndices[0], wordIndices[1], classification);
-                    // TODO: Remove the above legacy logging.
-                    mTextClassificationSession.get().onSelectionEvent(
-                            SelectionEvent.createSelectionModifiedEvent(
-                                    wordIndices[0], wordIndices[1], classification));
+                    if (mClassificationSession != null) {
+                        mClassificationSession.onSelectionEvent(
+                                SelectionEvent.createSelectionModifiedEvent(
+                                        wordIndices[0], wordIndices[1], classification));
+                    }
                 } else {
-                    mLogger.logSelectionModifiedEvent(
-                            wordIndices[0], wordIndices[1]);
-                    // TODO: Remove the above legacy logging.
-                    mTextClassificationSession.get().onSelectionEvent(
-                            SelectionEvent.createSelectionModifiedEvent(
-                                    wordIndices[0], wordIndices[1]));
+                    if (mClassificationSession != null) {
+                        mClassificationSession.onSelectionEvent(
+                                SelectionEvent.createSelectionModifiedEvent(
+                                        wordIndices[0], wordIndices[1]));
+                    }
                 }
             } catch (Exception e) {
                 // Avoid crashes due to logging.
@@ -752,27 +748,21 @@
                 Preconditions.checkArgumentInRange(end, start, mText.length(), "end");
                 int[] wordIndices = getWordDelta(start, end);
                 if (classification != null) {
-                    mLogger.logSelectionActionEvent(
-                            wordIndices[0], wordIndices[1], action, classification);
-                    // TODO: Remove the above legacy logging.
-                    mTextClassificationSession.get().onSelectionEvent(
-                            SelectionEvent.createSelectionActionEvent(
-                                    wordIndices[0], wordIndices[1], action, classification));
+                    if (mClassificationSession != null) {
+                        mClassificationSession.onSelectionEvent(
+                                SelectionEvent.createSelectionActionEvent(
+                                        wordIndices[0], wordIndices[1], action, classification));
+                    }
                 } else {
-                    mLogger.logSelectionActionEvent(
-                            wordIndices[0], wordIndices[1], action);
-                    // TODO: Remove the above legacy logging.
-                    mTextClassificationSession.get().onSelectionEvent(
-                            SelectionEvent.createSelectionActionEvent(
-                                    wordIndices[0], wordIndices[1], action));
+                    if (mClassificationSession != null) {
+                        mClassificationSession.onSelectionEvent(
+                                SelectionEvent.createSelectionActionEvent(
+                                        wordIndices[0], wordIndices[1], action));
+                    }
                 }
             } catch (Exception e) {
                 // Avoid crashes due to logging.
                 Log.e(LOG_TAG, "" + e.getMessage(), e);
-            } finally {
-                if (SelectionEvent.isTerminal(action)) {
-                    mTextClassificationSession.get().destroy();
-                }
             }
         }
 
@@ -926,9 +916,8 @@
         /** End index relative to mText. */
         private int mSelectionEnd;
 
-        private final TextSelection.Options mSelectionOptions = new TextSelection.Options();
-        private final TextClassification.Options mClassificationOptions =
-                new TextClassification.Options();
+        @Nullable
+        private LocaleList mDefaultLocales;
 
         /** Trimmed text starting from mTrimStart in mText. */
         private CharSequence mTrimmedText;
@@ -966,9 +955,7 @@
             Preconditions.checkArgument(selectionEnd > selectionStart);
             mSelectionStart = selectionStart;
             mSelectionEnd = selectionEnd;
-            mClassificationOptions.setDefaultLocales(locales);
-            mSelectionOptions.setDefaultLocales(locales)
-                    .setDarkLaunchAllowed(true);
+            mDefaultLocales = locales;
         }
 
         @WorkerThread
@@ -983,13 +970,16 @@
             trimText();
             final TextSelection selection;
             if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
-                selection = mTextClassifier.get().suggestSelection(
-                        mTrimmedText, mRelativeStart, mRelativeEnd, mSelectionOptions);
+                final TextSelection.Request request = new TextSelection.Request.Builder(
+                        mTrimmedText, mRelativeStart, mRelativeEnd)
+                        .setDefaultLocales(mDefaultLocales)
+                        .setDarkLaunchAllowed(true)
+                        .build();
+                selection = mTextClassifier.get().suggestSelection(request);
             } else {
                 // Use old APIs.
                 selection = mTextClassifier.get().suggestSelection(
-                        mTrimmedText, mRelativeStart, mRelativeEnd,
-                        mSelectionOptions.getDefaultLocales());
+                        mTrimmedText, mRelativeStart, mRelativeEnd, mDefaultLocales);
             }
             // Do not classify new selection boundaries if TextClassifier should be dark launched.
             if (!mDarkLaunchEnabled) {
@@ -1024,25 +1014,26 @@
             if (!Objects.equals(mText, mLastClassificationText)
                     || mSelectionStart != mLastClassificationSelectionStart
                     || mSelectionEnd != mLastClassificationSelectionEnd
-                    || !Objects.equals(
-                            mClassificationOptions.getDefaultLocales(),
-                            mLastClassificationLocales)) {
+                    || !Objects.equals(mDefaultLocales, mLastClassificationLocales)) {
 
                 mLastClassificationText = mText;
                 mLastClassificationSelectionStart = mSelectionStart;
                 mLastClassificationSelectionEnd = mSelectionEnd;
-                mLastClassificationLocales = mClassificationOptions.getDefaultLocales();
+                mLastClassificationLocales = mDefaultLocales;
 
                 trimText();
                 final TextClassification classification;
                 if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
-                    classification = mTextClassifier.get().classifyText(
-                            mTrimmedText, mRelativeStart, mRelativeEnd, mClassificationOptions);
+                    final TextClassification.Request request =
+                            new TextClassification.Request.Builder(
+                                    mTrimmedText, mRelativeStart, mRelativeEnd)
+                                    .setDefaultLocales(mDefaultLocales)
+                                    .build();
+                    classification = mTextClassifier.get().classifyText(request);
                 } else {
                     // Use old APIs.
                     classification = mTextClassifier.get().classifyText(
-                            mTrimmedText, mRelativeStart, mRelativeEnd,
-                            mClassificationOptions.getDefaultLocales());
+                            mTrimmedText, mRelativeStart, mRelativeEnd, mDefaultLocales);
                 }
                 mLastClassificationResult = new SelectionResult(
                         mSelectionStart, mSelectionEnd, classification, selection);
diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java
index 53318c9..d8a9cca 100644
--- a/core/java/android/widget/TextClock.java
+++ b/core/java/android/widget/TextClock.java
@@ -408,6 +408,15 @@
     }
 
     /**
+     * Update the displayed time if necessary and invalidate the view.
+     * @hide
+     */
+    public void refresh() {
+        onTimeChanged();
+        invalidate();
+    }
+
+    /**
      * Indicates whether the system is currently using the 24-hour mode.
      *
      * When the system is in 24-hour mode, this view will use the pattern
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 8bf497e..fae6db5d 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -36,6 +36,7 @@
 import android.annotation.StyleRes;
 import android.annotation.XmlRes;
 import android.app.Activity;
+import android.app.PendingIntent;
 import android.app.assist.AssistStructure;
 import android.content.ClipData;
 import android.content.ClipDescription;
@@ -9379,7 +9380,7 @@
         final int selectionStart = getSelectionStart();
         final int selectionEnd = getSelectionEnd();
 
-        return selectionStart >= 0 && selectionStart != selectionEnd;
+        return selectionStart >= 0 && selectionEnd > 0 && selectionStart != selectionEnd;
     }
 
     String getSelectedText() {
@@ -11541,6 +11542,7 @@
 
     /**
      * Returns a session-aware text classifier.
+     * This method creates one if none already exists or the current one is destroyed.
      */
     @NonNull
     TextClassifier getTextClassificationSession() {
@@ -11623,15 +11625,20 @@
             final int start = spanned.getSpanStart(clickedSpan);
             final int end = spanned.getSpanEnd(clickedSpan);
             if (start >= 0 && end <= mText.length() && start < end) {
-                final TextClassification.Options options = new TextClassification.Options()
-                        .setDefaultLocales(getTextLocales());
+                final TextClassification.Request request = new TextClassification.Request.Builder(
+                        mText, start, end)
+                        .setDefaultLocales(getTextLocales())
+                        .build();
                 final Supplier<TextClassification> supplier = () ->
-                        getTextClassifier().classifyText(mText, start, end, options);
+                        getTextClassifier().classifyText(request);
                 final Consumer<TextClassification> consumer = classification -> {
                     if (classification != null) {
-                        final Intent intent = classification.getIntent();
-                        if (intent != null) {
-                            TextClassification.fireIntent(mContext, intent);
+                        if (!classification.getActions().isEmpty()) {
+                            try {
+                                classification.getActions().get(0).getActionIntent().send();
+                            } catch (PendingIntent.CanceledException e) {
+                                Log.e(LOG_TAG, "Error sending PendingIntent", e);
+                            }
                         } else {
                             Log.d(LOG_TAG, "No link action to perform");
                         }
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 6e0ba341..97043c7 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -389,6 +389,10 @@
 
     @Override
     public void showTargetDetails(ResolveInfo ri) {
+        if (ri == null) {
+            return;
+        }
+
         ComponentName name = ri.activityInfo.getComponentName();
         boolean pinned = mPinnedSharedPrefs.getBoolean(name.flattenToString(), false);
         ResolverTargetActionsDialogFragment f =
diff --git a/core/java/com/android/internal/app/ColorDisplayController.java b/core/java/com/android/internal/app/ColorDisplayController.java
index 278d31a..f1539ee 100644
--- a/core/java/com/android/internal/app/ColorDisplayController.java
+++ b/core/java/com/android/internal/app/ColorDisplayController.java
@@ -365,6 +365,10 @@
      * Get the current color mode.
      */
     public int getColorMode() {
+        if (getAccessibilityTransformActivated()) {
+            return COLOR_MODE_SATURATED;
+        }
+
         final int colorMode = System.getIntForUser(mContext.getContentResolver(),
             System.DISPLAY_COLOR_MODE, -1, mUserId);
         if (colorMode < COLOR_MODE_NATURAL || colorMode > COLOR_MODE_SATURATED) {
@@ -416,6 +420,18 @@
                 R.integer.config_nightDisplayColorTemperatureDefault);
     }
 
+    /**
+     * Returns true if any Accessibility color transforms are enabled.
+     */
+    public boolean getAccessibilityTransformActivated() {
+        final ContentResolver cr = mContext.getContentResolver();
+        return
+            Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
+                    0, mUserId) == 1
+            || Secure.getIntForUser(cr, Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
+                    0, mUserId) == 1;
+    }
+
     private void onSettingChanged(@NonNull String setting) {
         if (DEBUG) {
             Slog.d(TAG, "onSettingChanged: " + setting);
@@ -441,6 +457,10 @@
                 case System.DISPLAY_COLOR_MODE:
                     mCallback.onDisplayColorModeChanged(getColorMode());
                     break;
+                case Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED:
+                case Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED:
+                    mCallback.onAccessibilityTransformChanged(getAccessibilityTransformActivated());
+                    break;
             }
         }
     }
@@ -471,6 +491,12 @@
                         false /* notifyForDescendants */, mContentObserver, mUserId);
                 cr.registerContentObserver(System.getUriFor(System.DISPLAY_COLOR_MODE),
                         false /* notifyForDecendants */, mContentObserver, mUserId);
+                cr.registerContentObserver(
+                        Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED),
+                        false /* notifyForDecendants */, mContentObserver, mUserId);
+                cr.registerContentObserver(
+                        Secure.getUriFor(Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED),
+                        false /* notifyForDecendants */, mContentObserver, mUserId);
             }
         }
     }
@@ -531,5 +557,12 @@
          * @param displayColorMode the color mode
          */
         default void onDisplayColorModeChanged(int displayColorMode) {}
+
+        /**
+         * Callback invoked when Accessibility color transforms change.
+         *
+         * @param state the state Accessibility color transforms (true of active)
+         */
+        default void onAccessibilityTransformChanged(boolean state) {}
     }
 }
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 03dd77f..514ff76 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -93,7 +93,6 @@
     void noteVibratorOff(int uid);
     void noteGpsChanged(in WorkSource oldSource, in WorkSource newSource);
     void noteGpsSignalQuality(int signalLevel);
-    void noteUsbConnectionState(boolean connected);
     void noteScreenState(int state);
     void noteScreenBrightness(int brightness);
     void noteUserActivity(int uid, int event);
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
new file mode 100644
index 0000000..322c876
--- /dev/null
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -0,0 +1,82 @@
+/*
+ * 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.app;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.Slog;
+import android.view.Window;
+import android.view.WindowManager;
+
+import com.android.internal.R;
+
+public class SuspendedAppActivity extends AlertActivity
+        implements DialogInterface.OnClickListener {
+    private static final String TAG = "SuspendedAppActivity";
+
+    public static final String EXTRA_DIALOG_MESSAGE = "SuspendedAppActivity.extra.DIALOG_MESSAGE";
+    public static final String EXTRA_MORE_DETAILS_INTENT =
+            "SuspendedAppActivity.extra.MORE_DETAILS_INTENT";
+
+    private Intent mMoreDetailsIntent;
+    private int mUserId;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        Window window = getWindow();
+        window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
+        super.onCreate(icicle);
+
+        final Intent intent = getIntent();
+        mMoreDetailsIntent = intent.getParcelableExtra(EXTRA_MORE_DETAILS_INTENT);
+        mUserId = intent.getIntExtra(Intent.EXTRA_USER_ID, -1);
+        if (mUserId < 0) {
+            Slog.wtf(TAG, "Invalid user: " + mUserId);
+            finish();
+            return;
+        }
+        String dialogMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
+        if (dialogMessage == null) {
+            dialogMessage = getString(R.string.app_suspended_default_message);
+        }
+
+        final AlertController.AlertParams ap = mAlertParams;
+        ap.mTitle = getString(R.string.app_suspended_title);
+        ap.mMessage = String.format(getResources().getConfiguration().getLocales().get(0),
+                dialogMessage, intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME));
+        ap.mPositiveButtonText = getString(android.R.string.ok);
+        if (mMoreDetailsIntent != null) {
+            ap.mNeutralButtonText = getString(R.string.app_suspended_more_details);
+        }
+        ap.mPositiveButtonListener = ap.mNeutralButtonListener = this;
+        setupAlert();
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        switch (which) {
+            case AlertDialog.BUTTON_NEUTRAL:
+                startActivityAsUser(mMoreDetailsIntent, UserHandle.of(mUserId));
+                Slog.i(TAG, "Started more details activity");
+                break;
+        }
+        finish();
+    }
+}
diff --git a/core/java/com/android/internal/net/NetworkStatsFactory.java b/core/java/com/android/internal/net/NetworkStatsFactory.java
index 0cf5375..98afebc 100644
--- a/core/java/com/android/internal/net/NetworkStatsFactory.java
+++ b/core/java/com/android/internal/net/NetworkStatsFactory.java
@@ -56,11 +56,6 @@
     private static final boolean USE_NATIVE_PARSING = true;
     private static final boolean SANITY_CHECK_NATIVE = false;
 
-    private static final String CLATD_INTERFACE_PREFIX = "v4-";
-    // Delta between IPv4 header (20b) and IPv6 header (40b).
-    // Used for correct stats accounting on clatd interfaces.
-    private static final int IPV4V6_HEADER_DELTA = 20;
-
     /** Path to {@code /proc/net/dev}. */
     private final File mStatsIfaceDev;
     /** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */
@@ -96,7 +91,7 @@
      * {@link #noteStackedIface(String, String)}, but only interfaces noted before this method
      * is called are guaranteed to be included.
      */
-    public static String[] augmentWithStackedInterfacesLocked(@Nullable String[] requiredIfaces) {
+    public static String[] augmentWithStackedInterfaces(@Nullable String[] requiredIfaces) {
         if (requiredIfaces == NetworkStats.INTERFACES_ALL) {
             return null;
         }
@@ -118,6 +113,15 @@
         return relatedIfaces.toArray(outArray);
     }
 
+    /**
+     * Applies 464xlat adjustments with ifaces noted with {@link #noteStackedIface(String, String)}.
+     * @see NetworkStats#apply464xlatAdjustments(NetworkStats, NetworkStats, Map)
+     */
+    public static void apply464xlatAdjustments(NetworkStats baseTraffic,
+            NetworkStats stackedTraffic) {
+        NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, sStackedIfaces);
+    }
+
     @VisibleForTesting
     public static void clearStackedIfaces() {
         sStackedIfaces.clear();
@@ -289,48 +293,10 @@
             NetworkStats lastStats) throws IOException {
         final NetworkStats stats =
               readNetworkStatsDetailInternal(limitUid, limitIfaces, limitTag, lastStats);
-        // Total 464xlat traffic to subtract from uid 0 on all base interfaces.
-        // sStackedIfaces may grow afterwards, but NetworkStats will just be resized automatically.
-        final NetworkStats adjustments = new NetworkStats(0, sStackedIfaces.size());
 
-        NetworkStats.Entry entry = null; // For recycling
-
-        // For 464xlat traffic, xt_qtaguid sees every IPv4 packet twice, once as a native IPv4
-        // packet on the stacked interface, and once as translated to an IPv6 packet on the
-        // base interface. For correct stats accounting on the base interface, every 464xlat
-        // packet needs to be subtracted from the root UID on the base interface both for tx
-        // and rx traffic (http://b/12249687, http:/b/33681750).
-        for (int i = 0; i < stats.size(); i++) {
-            entry = stats.getValues(i, entry);
-            if (entry.iface == null || !entry.iface.startsWith(CLATD_INTERFACE_PREFIX)) {
-                continue;
-            }
-            final String baseIface = sStackedIfaces.get(entry.iface);
-            if (baseIface == null) {
-                continue;
-            }
-
-            NetworkStats.Entry adjust =
-                    new NetworkStats.Entry(baseIface, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L, 0L);
-            // Subtract any 464lat traffic seen for the root UID on the current base interface.
-            adjust.rxBytes -= (entry.rxBytes + entry.rxPackets * IPV4V6_HEADER_DELTA);
-            adjust.txBytes -= (entry.txBytes + entry.txPackets * IPV4V6_HEADER_DELTA);
-            adjust.rxPackets -= entry.rxPackets;
-            adjust.txPackets -= entry.txPackets;
-            adjustments.combineValues(adjust);
-
-            // For 464xlat traffic, xt_qtaguid only counts the bytes of the native IPv4 packet sent
-            // on the stacked interface with prefix "v4-" and drops the IPv6 header size after
-            // unwrapping. To account correctly for on-the-wire traffic, add the 20 additional bytes
-            // difference for all packets (http://b/12249687, http:/b/33681750).
-            entry.rxBytes = entry.rxPackets * IPV4V6_HEADER_DELTA;
-            entry.txBytes = entry.txPackets * IPV4V6_HEADER_DELTA;
-            entry.rxPackets = 0;
-            entry.txPackets = 0;
-            stats.combineValues(entry);
-        }
-
-        stats.combineAllValues(adjustments);
+        // No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap.
+        // TODO: remove this and only apply adjustments in NetworkStatsService.
+        stats.apply464xlatAdjustments(sStackedIfaces);
 
         return stats;
     }
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
index 1e5bd18..b49aace 100644
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ b/core/java/com/android/internal/os/BatteryStatsHelper.java
@@ -657,7 +657,7 @@
      * {@link #removeHiddenBatterySippers(List)}.
      */
     private void addAmbientDisplayUsage() {
-        long ambientDisplayMs = mStats.getScreenDozeTime(mRawRealtimeUs, mStatsType);
+        long ambientDisplayMs = mStats.getScreenDozeTime(mRawRealtimeUs, mStatsType) / 1000;
         double power = mPowerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY)
                 * ambientDisplayMs / (60 * 60 * 1000);
         if (power > 0) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 89f6156..5da3874 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -21,10 +21,13 @@
 import android.app.ActivityManager;
 import android.bluetooth.BluetoothActivityEnergyInfo;
 import android.bluetooth.UidTraffic;
+import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.database.ContentObserver;
+import android.hardware.usb.UsbManager;
 import android.net.ConnectivityManager;
 import android.net.NetworkStats;
 import android.net.Uri;
@@ -766,7 +769,10 @@
     int mCameraOnNesting;
     StopwatchTimer mCameraOnTimer;
 
-    int mUsbDataState; // 0: unknown, 1: disconnected, 2: connected
+    private static final int USB_DATA_UNKNOWN = 0;
+    private static final int USB_DATA_DISCONNECTED = 1;
+    private static final int USB_DATA_CONNECTED = 2;
+    int mUsbDataState = USB_DATA_UNKNOWN;
 
     int mGpsSignalQualityBin = -1;
     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
@@ -5241,8 +5247,30 @@
         }
     }
 
-    public void noteUsbConnectionStateLocked(boolean connected) {
-        int newState = connected ? 2 : 1;
+    private void registerUsbStateReceiver(Context context) {
+        final IntentFilter usbStateFilter = new IntentFilter();
+        usbStateFilter.addAction(UsbManager.ACTION_USB_STATE);
+        context.registerReceiver(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                final boolean state = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
+                synchronized (BatteryStatsImpl.this) {
+                    noteUsbConnectionStateLocked(state);
+                }
+            }
+        }, usbStateFilter);
+        synchronized (this) {
+            if (mUsbDataState == USB_DATA_UNKNOWN) {
+                final Intent usbState = context.registerReceiver(null, usbStateFilter);
+                final boolean initState = usbState != null && usbState.getBooleanExtra(
+                        UsbManager.USB_CONNECTED, false);
+                noteUsbConnectionStateLocked(initState);
+            }
+        }
+    }
+
+    private void noteUsbConnectionStateLocked(boolean connected) {
+        int newState = connected ? USB_DATA_CONNECTED : USB_DATA_DISCONNECTED;
         if (mUsbDataState != newState) {
             mUsbDataState = newState;
             if (connected) {
@@ -13218,6 +13246,7 @@
 
     public void systemServicesReady(Context context) {
         mConstants.startObserving(context.getContentResolver());
+        registerUsbStateReceiver(context);
     }
 
     @VisibleForTesting
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index bb5a0ad..a9cd5c8 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -34,6 +34,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.Objects;
 import java.util.TimeZone;
 import java.util.logging.LogManager;
 import org.apache.harmony.luni.internal.util.TimezoneGetter;
@@ -67,8 +68,12 @@
      * but apps can override that behavior.
      */
     private static class LoggingHandler implements Thread.UncaughtExceptionHandler {
+        public volatile boolean mTriggered = false;
+
         @Override
         public void uncaughtException(Thread t, Throwable e) {
+            mTriggered = true;
+
             // Don't re-enter if KillApplicationHandler has already run
             if (mCrashing) return;
 
@@ -96,12 +101,33 @@
     /**
      * Handle application death from an uncaught exception.  The framework
      * catches these for the main threads, so this should only matter for
-     * threads created by applications.  Before this method runs,
-     * {@link LoggingHandler} will already have logged details.
+     * threads created by applications. Before this method runs, the given
+     * instance of {@link LoggingHandler} should already have logged details
+     * (and if not it is run first).
      */
     private static class KillApplicationHandler implements Thread.UncaughtExceptionHandler {
+        private final LoggingHandler mLoggingHandler;
+
+        /**
+         * Create a new KillApplicationHandler that follows the given LoggingHandler.
+         * If {@link #uncaughtException(Thread, Throwable) uncaughtException} is called
+         * on the created instance without {@code loggingHandler} having been triggered,
+         * {@link LoggingHandler#uncaughtException(Thread, Throwable)
+         * loggingHandler.uncaughtException} will be called first.
+         *
+         * @param loggingHandler the {@link LoggingHandler} expected to have run before
+         *     this instance's {@link #uncaughtException(Thread, Throwable) uncaughtException}
+         *     is being called.
+         */
+        public KillApplicationHandler(LoggingHandler loggingHandler) {
+            this.mLoggingHandler = Objects.requireNonNull(loggingHandler);
+        }
+
+        @Override
         public void uncaughtException(Thread t, Throwable e) {
             try {
+                ensureLogging(t, e);
+
                 // Don't re-enter -- avoid infinite loops if crash-reporting crashes.
                 if (mCrashing) return;
                 mCrashing = true;
@@ -132,6 +158,33 @@
                 System.exit(10);
             }
         }
+
+        /**
+         * Ensures that the logging handler has been triggered.
+         *
+         * See b/73380984. This reinstates the pre-O behavior of
+         *
+         *   {@code thread.getUncaughtExceptionHandler().uncaughtException(thread, e);}
+         *
+         * logging the exception (in addition to killing the app). This behavior
+         * was never documented / guaranteed but helps in diagnostics of apps
+         * using the pattern.
+         *
+         * If this KillApplicationHandler is invoked the "regular" way (by
+         * {@link Thread#dispatchUncaughtException(Throwable)
+         * Thread.dispatchUncaughtException} in case of an uncaught exception)
+         * then the pre-handler (expected to be {@link #mLoggingHandler}) will already
+         * have run. Otherwise, we manually invoke it here.
+         */
+        private void ensureLogging(Thread t, Throwable e) {
+            if (!mLoggingHandler.mTriggered) {
+                try {
+                    mLoggingHandler.uncaughtException(t, e);
+                } catch (Throwable loggingThrowable) {
+                    // Ignored.
+                }
+            }
+        }
     }
 
     protected static final void commonInit() {
@@ -141,8 +194,9 @@
          * set handlers; these apply to all threads in the VM. Apps can replace
          * the default handler, but not the pre handler.
          */
-        Thread.setUncaughtExceptionPreHandler(new LoggingHandler());
-        Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler());
+        LoggingHandler loggingHandler = new LoggingHandler();
+        Thread.setUncaughtExceptionPreHandler(loggingHandler);
+        Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));
 
         /*
          * Install a TimezoneGetter subclass for ZoneInfo.db
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index ad5743d..2790324 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -18,7 +18,7 @@
 
 import android.content.ComponentName;
 import android.graphics.Rect;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.os.Bundle;
 import android.service.notification.StatusBarNotification;
 
@@ -141,7 +141,7 @@
     void showShutdownUi(boolean isReboot, String reason);
 
     // Used to show the dialog when FingerprintService starts authentication
-    void showFingerprintDialog(in Bundle bundle, IBiometricDialogReceiver receiver);
+    void showFingerprintDialog(in Bundle bundle, IBiometricPromptReceiver receiver);
     // Used to hide the dialog when a finger is authenticated
     void onFingerprintAuthenticated();
     // Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 0c5efe2..24f2fbf 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -20,7 +20,7 @@
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.service.notification.StatusBarNotification;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 
 import com.android.internal.statusbar.IStatusBar;
 import com.android.internal.statusbar.StatusBarIcon;
@@ -88,7 +88,7 @@
     void showPinningEscapeToast();
 
     // Used to show the dialog when FingerprintService starts authentication
-    void showFingerprintDialog(in Bundle bundle, IBiometricDialogReceiver receiver);
+    void showFingerprintDialog(in Bundle bundle, IBiometricPromptReceiver receiver);
     // Used to hide the dialog when a finger is authenticated
     void onFingerprintAuthenticated();
     // Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc
diff --git a/core/java/com/android/internal/widget/MessagingGroup.java b/core/java/com/android/internal/widget/MessagingGroup.java
index 239beaa..07d78fe 100644
--- a/core/java/com/android/internal/widget/MessagingGroup.java
+++ b/core/java/com/android/internal/widget/MessagingGroup.java
@@ -20,7 +20,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.StyleRes;
-import android.app.Notification;
+import android.app.Person;
 import android.content.Context;
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -63,8 +63,8 @@
     private boolean mFirstLayout;
     private boolean mIsHidingAnimated;
     private boolean mNeedsGeneratedAvatar;
-    private Notification.Person mSender;
-    private boolean mAvatarsAtEnd;
+    private Person mSender;
+    private boolean mImagesAtEnd;
     private ViewGroup mImageContainer;
     private MessagingImageMessage mIsolatedMessage;
     private boolean mTransformingImages;
@@ -126,7 +126,7 @@
         return position;
     }
 
-    public void setSender(Notification.Person sender, CharSequence nameOverride) {
+    public void setSender(Person sender, CharSequence nameOverride) {
         mSender = sender;
         if (nameOverride == null) {
             nameOverride = sender.getName();
@@ -342,7 +342,7 @@
                 mAddedMessages.add(message);
             }
             boolean isImage = message instanceof MessagingImageMessage;
-            if (mAvatarsAtEnd && isImage) {
+            if (mImagesAtEnd && isImage) {
                 isolatedMessage = (MessagingImageMessage) message;
             } else {
                 if (removeFromParentIfDifferent(message, mMessageContainer)) {
@@ -466,7 +466,7 @@
         return mNeedsGeneratedAvatar;
     }
 
-    public Notification.Person getSender() {
+    public Person getSender() {
         return mSender;
     }
 
@@ -474,9 +474,9 @@
         mTransformingImages = transformingImages;
     }
 
-    public void setDisplayAvatarsAtEnd(boolean atEnd) {
-        if (mAvatarsAtEnd != atEnd) {
-            mAvatarsAtEnd = atEnd;
+    public void setDisplayImagesAtEnd(boolean atEnd) {
+        if (mImagesAtEnd != atEnd) {
+            mImagesAtEnd = atEnd;
             mImageContainer.setVisibility(atEnd ? View.VISIBLE : View.GONE);
         }
     }
diff --git a/core/java/com/android/internal/widget/MessagingLayout.java b/core/java/com/android/internal/widget/MessagingLayout.java
index 5279636..f8236c7 100644
--- a/core/java/com/android/internal/widget/MessagingLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLayout.java
@@ -21,6 +21,7 @@
 import android.annotation.Nullable;
 import android.annotation.StyleRes;
 import android.app.Notification;
+import android.app.Person;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
@@ -79,9 +80,9 @@
     private Icon mLargeIcon;
     private boolean mIsOneToOne;
     private ArrayList<MessagingGroup> mAddedGroups = new ArrayList<>();
-    private Notification.Person mUser;
+    private Person mUser;
     private CharSequence mNameReplacement;
-    private boolean mIsCollapsed;
+    private boolean mDisplayImagesAtEnd;
 
     public MessagingLayout(@NonNull Context context) {
         super(context);
@@ -128,8 +129,8 @@
     }
 
     @RemotableViewMethod
-    public void setIsCollapsed(boolean isCollapsed) {
-        mIsCollapsed = isCollapsed;
+    public void setDisplayImagesAtEnd(boolean atEnd) {
+        mDisplayImagesAtEnd = atEnd;
     }
 
     @RemotableViewMethod
@@ -160,7 +161,7 @@
         for (int i = remoteInputHistory.length - 1; i >= 0; i--) {
             CharSequence message = remoteInputHistory[i];
             newMessages.add(new Notification.MessagingStyle.Message(
-                    message, 0, (Notification.Person) null));
+                    message, 0, (Person) null));
         }
     }
 
@@ -296,13 +297,13 @@
         mIsOneToOne = oneToOne;
     }
 
-    public void setUser(Notification.Person user) {
+    public void setUser(Person user) {
         mUser = user;
         if (mUser.getIcon() == null) {
             Icon userIcon = Icon.createWithResource(getContext(),
                     com.android.internal.R.drawable.messaging_user);
             userIcon.setTint(mLayoutColor);
-            mUser.setIcon(userIcon);
+            mUser = mUser.toBuilder().setIcon(userIcon).build();
         }
     }
 
@@ -310,7 +311,7 @@
             List<MessagingMessage> messages) {
         // Let's first find our groups!
         List<List<MessagingMessage>> groups = new ArrayList<>();
-        List<Notification.Person> senders = new ArrayList<>();
+        List<Person> senders = new ArrayList<>();
 
         // Lets first find the groups
         findGroups(historicMessages, messages, groups, senders);
@@ -320,7 +321,7 @@
     }
 
     private void createGroupViews(List<List<MessagingMessage>> groups,
-            List<Notification.Person> senders) {
+            List<Person> senders) {
         mGroups.clear();
         for (int groupIndex = 0; groupIndex < groups.size(); groupIndex++) {
             List<MessagingMessage> group = groups.get(groupIndex);
@@ -337,9 +338,9 @@
                 newGroup = MessagingGroup.createGroup(mMessagingLinearLayout);
                 mAddedGroups.add(newGroup);
             }
-            newGroup.setDisplayAvatarsAtEnd(mIsCollapsed);
+            newGroup.setDisplayImagesAtEnd(mDisplayImagesAtEnd);
             newGroup.setLayoutColor(mLayoutColor);
-            Notification.Person sender = senders.get(groupIndex);
+            Person sender = senders.get(groupIndex);
             CharSequence nameOverride = null;
             if (sender != mUser && mNameReplacement != null) {
                 nameOverride = mNameReplacement;
@@ -357,7 +358,7 @@
 
     private void findGroups(List<MessagingMessage> historicMessages,
             List<MessagingMessage> messages, List<List<MessagingMessage>> groups,
-            List<Notification.Person> senders) {
+            List<Person> senders) {
         CharSequence currentSenderKey = null;
         List<MessagingMessage> currentGroup = null;
         int histSize = historicMessages.size();
@@ -369,7 +370,7 @@
                 message = messages.get(i - histSize);
             }
             boolean isNewGroup = currentGroup == null;
-            Notification.Person sender = message.getMessage().getSenderPerson();
+            Person sender = message.getMessage().getSenderPerson();
             CharSequence key = sender == null ? null
                     : sender.getKey() == null ? sender.getName() : sender.getKey();
             isNewGroup |= !TextUtils.equals(key, currentSenderKey);
diff --git a/core/java/com/android/internal/widget/MessagingMessage.java b/core/java/com/android/internal/widget/MessagingMessage.java
index bf1c5ca..a2cc7cf 100644
--- a/core/java/com/android/internal/widget/MessagingMessage.java
+++ b/core/java/com/android/internal/widget/MessagingMessage.java
@@ -16,6 +16,7 @@
 
 package com.android.internal.widget;
 
+import android.app.ActivityManager;
 import android.app.Notification;
 import android.view.View;
 
@@ -33,7 +34,7 @@
 
     static MessagingMessage createMessage(MessagingLayout layout,
             Notification.MessagingStyle.Message m) {
-        if (hasImage(m)) {
+        if (hasImage(m) && !ActivityManager.isLowRamDeviceStatic()) {
             return MessagingImageMessage.createMessage(layout, m);
         } else {
             return MessagingTextMessage.createMessage(layout, m);
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 1d22093..302189f 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -195,6 +195,7 @@
         "android_content_res_ObbScanner.cpp",
         "android_content_res_Configuration.cpp",
         "android_animation_PropertyValuesHolder.cpp",
+        "android_security_Scrypt.cpp",
         "com_android_internal_net_NetworkStatsFactory.cpp",
         "com_android_internal_os_ClassLoaderFactory.cpp",
         "com_android_internal_os_FuseAppLoop.cpp",
@@ -228,6 +229,7 @@
         "libseccomp_policy",
         "libselinux",
         "libgrallocusage",
+        "libscrypt_static",
     ],
 
     shared_libs: [
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 5ae4a52..f8dd7ac 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -208,6 +208,7 @@
 extern int register_android_content_res_ObbScanner(JNIEnv* env);
 extern int register_android_content_res_Configuration(JNIEnv* env);
 extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
+extern int register_android_security_Scrypt(JNIEnv *env);
 extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
 extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env);
 extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
@@ -1492,6 +1493,7 @@
     REG_JNI(register_android_content_res_Configuration),
 
     REG_JNI(register_android_animation_PropertyValuesHolder),
+    REG_JNI(register_android_security_Scrypt),
     REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
     REG_JNI(register_com_android_internal_net_NetworkStatsFactory),
     REG_JNI(register_com_android_internal_os_FuseAppLoop),
diff --git a/core/jni/android/graphics/ImageDecoder.cpp b/core/jni/android/graphics/ImageDecoder.cpp
index 825b7a0..3ea6049 100644
--- a/core/jni/android/graphics/ImageDecoder.cpp
+++ b/core/jni/android/graphics/ImageDecoder.cpp
@@ -116,9 +116,10 @@
     const auto& info = decoder->mCodec->getInfo();
     const int width = info.width();
     const int height = info.height();
+    const bool isNinePatch = decoder->mPeeker->mPatch != nullptr;
     return env->NewObject(gImageDecoder_class, gImageDecoder_constructorMethodID,
                           reinterpret_cast<jlong>(decoder.release()), width, height,
-                          animated);
+                          animated, isNinePatch);
 }
 
 static jobject ImageDecoder_nCreateFd(JNIEnv* env, jobject /*clazz*/,
@@ -332,13 +333,6 @@
         }
     }
 
-    float scaleX = 1.0f;
-    float scaleY = 1.0f;
-    if (scale) {
-        scaleX = (float) desiredWidth  / decodeInfo.width();
-        scaleY = (float) desiredHeight / decodeInfo.height();
-    }
-
     jbyteArray ninePatchChunk = nullptr;
     jobject ninePatchInsets = nullptr;
 
@@ -346,9 +340,6 @@
     if (!jpostProcess) {
         // FIXME: Share more code with BitmapFactory.cpp.
         if (decoder->mPeeker->mPatch != nullptr) {
-            if (scale) {
-                decoder->mPeeker->scale(scaleX, scaleY, desiredWidth, desiredHeight);
-            }
             size_t ninePatchArraySize = decoder->mPeeker->mPatch->serializedSize();
             ninePatchChunk = env->NewByteArray(ninePatchArraySize);
             if (ninePatchChunk == nullptr) {
@@ -408,7 +399,12 @@
 
         SkCanvas canvas(scaledBm, SkCanvas::ColorBehavior::kLegacy);
         canvas.translate(translateX, translateY);
-        canvas.scale(scaleX, scaleY);
+        if (scale) {
+            float scaleX = (float) desiredWidth  / decodeInfo.width();
+            float scaleY = (float) desiredHeight / decodeInfo.height();
+            canvas.scale(scaleX, scaleY);
+        }
+
         canvas.drawBitmap(bm, 0.0f, 0.0f, &paint);
 
         bm.swap(scaledBm);
@@ -532,7 +528,7 @@
 
 int register_android_graphics_ImageDecoder(JNIEnv* env) {
     gImageDecoder_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/graphics/ImageDecoder"));
-    gImageDecoder_constructorMethodID = GetMethodIDOrDie(env, gImageDecoder_class, "<init>", "(JIIZ)V");
+    gImageDecoder_constructorMethodID = GetMethodIDOrDie(env, gImageDecoder_class, "<init>", "(JIIZZ)V");
     gImageDecoder_postProcessMethodID = GetMethodIDOrDie(env, gImageDecoder_class, "postProcessAndRelease", "(Landroid/graphics/Canvas;)I");
 
     gSize_class = MakeGlobalRefOrDie(env, FindClassOrDie(env, "android/util/Size"));
diff --git a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
index b610b35..e02741f 100644
--- a/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
+++ b/core/jni/android_hardware_camera2_legacy_LegacyCameraDevice.cpp
@@ -49,6 +49,22 @@
 
 #define ALIGN(x, mask) ( ((x) + (mask) - 1) & ~((mask) - 1) )
 
+// Use BAD_VALUE for surface abandoned error
+#define OVERRIDE_SURFACE_ERROR(err) \
+do {                                \
+    if (err == -ENODEV) {           \
+        err = BAD_VALUE;            \
+    }                               \
+} while (0)
+
+#define UPDATE(md, tag, data, size)               \
+do {                                              \
+    if ((md).update((tag), (data), (size))) {     \
+        ALOGE("Update " #tag " failed!");         \
+        return BAD_VALUE;                         \
+    }                                             \
+} while (0)
+
 /**
  * Convert from RGB 888 to Y'CbCr using the conversion specified in JFIF v1.02
  */
@@ -108,6 +124,7 @@
     if (err != NO_ERROR) {
         ALOGE("%s: Failed to set native window usage flag, error %s (%d).", __FUNCTION__,
                 strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
 
@@ -117,6 +134,7 @@
     if (err != NO_ERROR) {
         ALOGE("%s: Failed to get native window min undequeued buffers, error %s (%d).",
                 __FUNCTION__, strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
 
@@ -126,6 +144,7 @@
     if (err != NO_ERROR) {
         ALOGE("%s: Failed to set native window buffer count, error %s (%d).", __FUNCTION__,
                 strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
@@ -180,7 +199,12 @@
 
     // TODO: Switch to using Surface::lock and Surface::unlockAndPost
     err = native_window_dequeue_buffer_and_wait(anw.get(), &anb);
-    if (err != NO_ERROR) return err;
+    if (err != NO_ERROR) {
+        ALOGE("%s: Failed to dequeue buffer, error %s (%d).", __FUNCTION__,
+                strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
+        return err;
+    }
 
     sp<GraphicBuffer> buf(GraphicBuffer::from(anb));
     uint32_t grallocBufWidth = buf->getWidth();
@@ -198,6 +222,7 @@
     if (err != NO_ERROR) {
         ALOGE("%s: Error while querying surface pixel format %s (%d).", __FUNCTION__,
                 strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
 
@@ -345,6 +370,7 @@
     err = anw->queueBuffer(anw.get(), buf->getNativeBuffer(), /*fenceFd*/-1);
     if (err != NO_ERROR) {
         ALOGE("%s: Failed to queue buffer, error %s (%d).", __FUNCTION__, strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
@@ -420,6 +446,7 @@
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying surface pixel format %s (%d).", __FUNCTION__, strerror(-err),
                 err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return fmt;
@@ -437,6 +464,7 @@
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying surface dataspace  %s (%d).", __FUNCTION__, strerror(-err),
                 err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return fmt;
@@ -466,12 +494,14 @@
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying surface width %s (%d).", __FUNCTION__, strerror(-err),
                 err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     err = anw->query(anw.get(), NATIVE_WINDOW_HEIGHT, dimenBuf + 1);
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying surface height %s (%d).", __FUNCTION__, strerror(-err),
                 err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     env->SetIntArrayRegion(dimens, /*start*/0, /*length*/ARRAY_SIZE(dimenBuf), dimenBuf);
@@ -493,6 +523,7 @@
     if(err != NO_ERROR) {
         jniThrowException(env, "java/lang/UnsupportedOperationException;",
             "Error while querying surface usage bits");
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return usage;
@@ -513,6 +544,7 @@
     if(err != NO_ERROR) {
         jniThrowException(env, "java/lang/UnsupportedOperationException;",
             "Error while disconnecting surface");
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
@@ -532,6 +564,7 @@
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying SurfaceTexture width %s (%d)", __FUNCTION__,
                 strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
 
@@ -539,6 +572,7 @@
     if(err != NO_ERROR) {
         ALOGE("%s: Error while querying SurfaceTexture height %s (%d)", __FUNCTION__,
                 strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
 
@@ -559,6 +593,7 @@
     status_t err = connectSurface(s, CAMERA_DEVICE_BUFFER_SLACK);
     if (err != NO_ERROR) {
         ALOGE("%s: Error while configuring surface %s (%d).", __FUNCTION__, strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
@@ -609,6 +644,7 @@
     status_t err = native_window_set_buffers_format(anw.get(), pixelFormat);
     if (err != NO_ERROR) {
         ALOGE("%s: Error while setting surface format %s (%d).", __FUNCTION__, strerror(-err), err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
@@ -629,6 +665,7 @@
     if (err != NO_ERROR) {
         ALOGE("%s: Error while setting surface user dimens %s (%d).", __FUNCTION__, strerror(-err),
                 err);
+        OVERRIDE_SURFACE_ERROR(err);
         return err;
     }
     return NO_ERROR;
diff --git a/core/jni/android_security_Scrypt.cpp b/core/jni/android_security_Scrypt.cpp
new file mode 100644
index 0000000..3350804
--- /dev/null
+++ b/core/jni/android_security_Scrypt.cpp
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "Scrypt"
+
+#include <nativehelper/JNIHelp.h>
+#include "jni.h"
+
+#include <android_runtime/Log.h>
+#include <utils/Timers.h>
+#include <utils/misc.h>
+#include <utils/String8.h>
+#include <utils/Log.h>
+
+extern "C" {
+#include "crypto_scrypt.h"
+}
+
+namespace android {
+
+static jbyteArray android_security_Scrypt_nativeScrypt(JNIEnv* env, jobject, jbyteArray password, jbyteArray salt, jint N, jint r, jint p, jint outLen) {
+    if (!password || !salt) {
+        return NULL;
+    }
+
+    int passwordLen = env->GetArrayLength(password);
+    int saltLen = env->GetArrayLength(salt);
+    jbyteArray ret = env->NewByteArray(outLen);
+
+    jbyte* passwordPtr = (jbyte*)env->GetByteArrayElements(password, NULL);
+    jbyte* saltPtr = (jbyte*)env->GetByteArrayElements(salt, NULL);
+    jbyte* retPtr = (jbyte*)env->GetByteArrayElements(ret, NULL);
+
+    int rc = crypto_scrypt((const uint8_t *)passwordPtr, passwordLen,
+                       (const uint8_t *)saltPtr, saltLen, N, r, p, (uint8_t *)retPtr,
+                       outLen);
+    env->ReleaseByteArrayElements(password, passwordPtr, JNI_ABORT);
+    env->ReleaseByteArrayElements(salt, saltPtr, JNI_ABORT);
+    env->ReleaseByteArrayElements(ret, retPtr, 0);
+
+    if (!rc) {
+        return ret;
+    } else {
+        SLOGE("scrypt failed");
+        return NULL;
+    }
+}
+
+static const JNINativeMethod sMethods[] = {
+     /* name, signature, funcPtr */
+    {"nativeScrypt", "([B[BIIII)[B", (void*)android_security_Scrypt_nativeScrypt},
+};
+
+int register_android_security_Scrypt(JNIEnv* env) {
+    return jniRegisterNativeMethods(env, "android/security/Scrypt",
+                                    sMethods, NELEM(sMethods));
+}
+
+} /* namespace android */
diff --git a/core/jni/android_text_MeasuredParagraph.cpp b/core/jni/android_text_MeasuredParagraph.cpp
index 9d79417..41a81ac 100644
--- a/core/jni/android_text_MeasuredParagraph.cpp
+++ b/core/jni/android_text_MeasuredParagraph.cpp
@@ -111,20 +111,13 @@
 }
 
 // Regular JNI
-static void nGetBounds(JNIEnv* env, jobject, jlong ptr, jcharArray javaText, jlong paintPtr,
-                           jint start, jint end, jint bidiFlags, jobject bounds) {
+static void nGetBounds(JNIEnv* env, jobject, jlong ptr, jcharArray javaText, jint start, jint end,
+                       jobject bounds) {
     ScopedCharArrayRO text(env, javaText);
     const minikin::U16StringPiece textBuffer(text.get(), text.size());
+    const minikin::Range range(start, end);
 
-    minikin::MeasuredText* mt = toMeasuredParagraph(ptr);
-    Paint* paint = toPaint(paintPtr);
-    const Typeface* typeface = Typeface::resolveDefault(paint->getAndroidTypeface());
-    minikin::Layout layout = MinikinUtils::doLayout(paint,
-            static_cast<minikin::Bidi>(bidiFlags), typeface, textBuffer.data(), start, end - start,
-            textBuffer.size(), mt);
-
-    minikin::MinikinRect rect;
-    layout.getBounds(&rect);
+    minikin::MinikinRect rect = toMeasuredParagraph(ptr)->getBounds(textBuffer, range);
 
     SkRect r;
     r.fLeft = rect.mLeft;
@@ -156,7 +149,7 @@
 
     // MeasuredParagraph native functions.
     {"nGetWidth", "(JII)F", (void*) nGetWidth},  // Critical Natives
-    {"nGetBounds", "(J[CJIIILandroid/graphics/Rect;)V", (void*) nGetBounds},  // Regular JNI
+    {"nGetBounds", "(J[CIILandroid/graphics/Rect;)V", (void*) nGetBounds},  // Regular JNI
     {"nGetReleaseFunc", "()J", (void*) nGetReleaseFunc},  // Critical Natives
     {"nGetMemoryUsage", "(J)I", (void*) nGetMemoryUsage},  // Critical Native
 };
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index b0f68cd..3f58afa 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -327,6 +327,11 @@
     transaction->setAnimationTransaction();
 }
 
+static void nativeSetEarlyWakeup(JNIEnv* env, jclass clazz, jlong transactionObj) {
+    auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+    transaction->setEarlyWakeup();
+}
+
 static void nativeSetLayer(JNIEnv* env, jclass clazz, jlong transactionObj,
         jlong nativeObject, jint zorder) {
     auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
@@ -934,6 +939,8 @@
             (void*)nativeMergeTransaction },
     {"nativeSetAnimationTransaction", "(J)V",
             (void*)nativeSetAnimationTransaction },
+    {"nativeSetEarlyWakeup", "(J)V",
+            (void*)nativeSetEarlyWakeup },
     {"nativeSetLayer", "(JJI)V",
             (void*)nativeSetLayer },
     {"nativeSetRelativeLayer", "(JJLandroid/os/IBinder;I)V",
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 451f278..7481f1c 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -992,6 +992,10 @@
     Properties::isolatedProcess = isolated;
 }
 
+static void android_view_ThreadedRenderer_setContextPriority(JNIEnv*, jclass,
+        jint contextPriority) {
+    Properties::contextPriority = contextPriority;
+}
 
 // ----------------------------------------------------------------------------
 // FrameMetricsObserver
@@ -1103,6 +1107,7 @@
             (void*)android_view_ThreadedRenderer_hackySetRTAnimationsEnabled },
     { "nSetDebuggingEnabled", "(Z)V", (void*)android_view_ThreadedRenderer_setDebuggingEnabled },
     { "nSetIsolatedProcess", "(Z)V", (void*)android_view_ThreadedRenderer_setIsolatedProcess },
+    { "nSetContextPriority", "(I)V", (void*)android_view_ThreadedRenderer_setContextPriority },
 };
 
 static JavaVM* mJvm = nullptr;
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
new file mode 100644
index 0000000..ed42e2e
--- /dev/null
+++ b/core/proto/OWNERS
@@ -0,0 +1,13 @@
+# Be sure you are familiar with proto when you modify this directory.
+
+# Metrics
+bookatz@google.com
+cjyu@google.com
+jinyithu@google.com
+joeo@google.com
+kwekua@google.com
+singhtejinder@google.com
+
+# Frameworks
+ogunwale@google.com
+jjaggi@google.com
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index ea0b825..ab15d4f 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -118,17 +118,17 @@
 
     // Stack dumps
     optional android.os.BackTraceProto native_traces = 1200 [
-        (section).type = SECTION_NONE,
+        (section).type = SECTION_TOMBSTONE,
         (section).args = "native"
     ];
 
     optional android.os.BackTraceProto hal_traces = 1201 [
-        (section).type = SECTION_NONE,
+        (section).type = SECTION_TOMBSTONE,
         (section).args = "hal"
     ];
 
     optional android.os.BackTraceProto java_traces = 1202 [
-        (section).type = SECTION_NONE,
+        (section).type = SECTION_TOMBSTONE,
         (section).args = "java"
     ];
 
@@ -170,7 +170,7 @@
     ];
 
     optional BatteryTypeProto battery_type = 2006 [
-        (section).type = SECTION_FILE,
+        (section).type = SECTION_NONE, // disabled since the path is device specific!
         (section).args = "/sys/class/power_supply/bms/battery_type"
     ];
 
@@ -228,7 +228,7 @@
     ];
 
     optional android.service.print.PrintServiceDumpProto print = 3010 [
-        (section).type = SECTION_DUMPSYS,
+        (section).type = SECTION_NONE, // Turn off until we get approval for it.
         (section).args = "print --proto"
     ];
 
diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto
index b5303c8..05686a0 100644
--- a/core/proto/android/providers/settings/global.proto
+++ b/core/proto/android/providers/settings/global.proto
@@ -451,6 +451,7 @@
         // If set to 1, {@link Secure#LOCATION_MODE} will be set to {@link
         // Secure#LOCATION_MODE_OFF} temporarily for all users.
         optional SettingProto global_kill_switch = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+        optional SettingProto gnss_satellite_blacklist = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
     }
     optional Location location = 69;
 
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 593747d..237efd8 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -213,6 +213,13 @@
     optional SettingProto keyguard_slice_uri = 29;
     optional SettingProto last_setup_shown = 30 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
+    message Launcher {
+        option (android.msg_privacy).dest = DEST_EXPLICIT;
+
+        optional SettingProto swipe_up_to_switch_apps_enabled = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    }
+    optional Launcher launcher = 70;
+
     message Location {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -340,6 +347,11 @@
     }
     optional Rotation rotation = 46;
 
+    // User-selected RTT mode. When on, outgoing and incoming calls will be
+    // answered as RTT calls when supported by the device and carrier. Boolean
+    // value.
+    optional SettingProto rtt_calling_mode = 69 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
     message Screensaver {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
 
@@ -474,5 +486,5 @@
 
     // Please insert fields in alphabetical order and group them into messages
     // if possible (to avoid reaching the method limit).
-    // Next tag = 69;
+    // Next tag = 71;
 }
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index 6b6edd2..dfc4081 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -151,10 +151,7 @@
     }
     optional Rotation rotation = 20;
 
-    // User-selected RTT mode. When on, outgoing and incoming calls will be
-    // answered as RTT calls when supported by the device and carrier. Boolean
-    // value.
-    optional SettingProto rtt_calling_mode = 21 [ (android.privacy).dest = DEST_AUTOMATIC ];
+    reserved 21; // rtt_calling_mode moved to Settings.Secure
 
     message Screen {
         option (android.msg_privacy).dest = DEST_EXPLICIT;
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index cccd2fe..bcd7f29 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -65,7 +65,7 @@
     optional bool can_vibrate = 7;
     optional bool can_show_light = 8;
     optional string group_key = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
-    optional int32 importance = 10;
+    optional sint32 importance = 10;
 }
 
 message ListenersDisablingEffectsProto {
@@ -122,11 +122,11 @@
         // Default value is UNKNOWN_UID = USER_NULL = -10000.
         optional int32 uid = 2;
         // Default is IMPORTANCE_UNSPECIFIED (-1000).
-        optional int32 importance = 3;
+        optional sint32 importance = 3;
         // Default is PRIORITY_DEFAULT (0).
         optional int32 priority = 4;
         // Default is VISIBILITY_NO_OVERRIDE (-1000).
-        optional int32 visibility = 5;
+        optional sint32 visibility = 5;
         // Default is true.
         optional bool show_badge = 6;
         repeated android.app.NotificationChannelProto channels = 7;
diff --git a/core/proto/android/service/print.proto b/core/proto/android/service/print.proto
index f783b86..994814b 100644
--- a/core/proto/android/service/print.proto
+++ b/core/proto/android/service/print.proto
@@ -75,7 +75,7 @@
     repeated PrintJobInfoProto print_jobs = 1;
 
     // Files used by these print jobs
-    repeated string print_job_files = 2;
+    repeated string print_job_files = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
 
     // Approved print services
     repeated android.content.ComponentNameProto approved_services = 3;
@@ -101,7 +101,7 @@
 }
 
 message PrinterInfoProto {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_EXPLICIT;
 
     // The id of the printer
     optional PrinterIdProto id = 1;
@@ -123,7 +123,7 @@
         STATUS_UNAVAILABLE = 3;
     }
     // The status of the printer
-    optional Status status = 3;
+    optional Status status = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
     // The description of the printer
     optional string description = 4;
@@ -171,13 +171,13 @@
 }
 
 message PrinterIdProto {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_EXPLICIT;
 
     // Component name of the service that reported the printer
-    optional android.content.ComponentNameProto service_name = 1;
+    optional android.content.ComponentNameProto service_name = 1 [ (android.privacy).dest = DEST_AUTOMATIC ];
 
     // Local id of the printer
-    optional string local_id = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+    optional string local_id = 2;
 }
 
 message ActivePrintServiceProto {
@@ -331,7 +331,7 @@
     optional string label = 1 [ (android.privacy).dest = DEST_EXPLICIT ];
 
     // Id of the job
-    optional string print_job_id = 2;
+    optional string print_job_id = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
 
     enum State {
         // Unknown state
@@ -366,7 +366,7 @@
     optional PrinterIdProto printer = 4;
 
     // Tag assigned to the job
-    optional string tag = 5;
+    optional string tag = 5 [ (android.privacy).dest = DEST_EXPLICIT ];
 
     // Time the job was created
     optional int64 creation_time = 6;
@@ -401,4 +401,4 @@
 
     // The print job
     optional PrintJobInfoProto print_job = 2;
-}
\ No newline at end of file
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f4715fc..c5ab2e6 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -487,6 +487,7 @@
     <protected-broadcast android:name="android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED" />
     <protected-broadcast android:name="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED" />
     <protected-broadcast android:name="android.telephony.action.SHOW_VOICEMAIL_NOTIFICATION" />
+    <protected-broadcast android:name="android.telephony.action.SUBSCRIPTION_PLANS_CHANGED" />
 
     <protected-broadcast android:name="com.android.bluetooth.btservice.action.ALARM_WAKEUP" />
     <protected-broadcast android:name="com.android.server.action.NETWORK_STATS_POLL" />
@@ -2030,6 +2031,15 @@
     <permission android:name="android.permission.START_ANY_ACTIVITY"
         android:protectionLevel="signature" />
 
+    <!-- @SystemApi Must be required by activities that handle the intent action
+         {@link Intent#ACTION_SEND_SHOW_SUSPENDED_APP_DETAILS}. This is for use by apps that
+         hold {@link Manifest.permission#SUSPEND_APPS} to interact with the system.
+         <p>Not for use by third-party applications.
+         @hide -->
+    <permission android:name="android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS"
+                android:protectionLevel="signature" />
+    <uses-permission android:name="android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS" />
+
     <!-- @deprecated The {@link android.app.ActivityManager#restartPackage}
         API is no longer supported. -->
     <permission android:name="android.permission.RESTART_PACKAGES"
@@ -4116,6 +4126,12 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="com.android.internal.app.SuspendedAppActivity"
+                  android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
+                  android:excludeFromRecents="true"
+                  android:process=":ui">
+        </activity>
+
         <activity android:name="com.android.internal.app.UnlaunchableAppActivity"
                 android:theme="@style/Theme.DeviceDefault.Light.Dialog.Alert"
                 android:excludeFromRecents="true"
@@ -4248,14 +4264,9 @@
                   android:exported="false">
         </receiver>
 
-        <receiver android:name="com.android.server.am.BatteryStatsService$UsbConnectionReceiver"
+        <receiver android:name="com.android.server.stats.StatsCompanionService$PeriodicAlarmReceiver"
+                  android:permission="android.permission.STATSCOMPANION"
                   android:exported="false">
-            <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED" />
-            </intent-filter>
-            <intent-filter>
-                <action android:name="android.hardware.usb.action.USB_STATE" />
-            </intent-filter>
         </receiver>
 
         <service android:name="android.hardware.location.GeofenceHardwareService"
diff --git a/core/res/res/anim/activity_translucent_close_exit.xml b/core/res/res/anim/activity_translucent_close_exit.xml
index 04c5dea..02df0ff 100644
--- a/core/res/res/anim/activity_translucent_close_exit.xml
+++ b/core/res/res/anim/activity_translucent_close_exit.xml
@@ -20,6 +20,6 @@
     <translate
         android:fromYDelta="0%"
         android:toYDelta="100%"
-        android:interpolator="@interpolator/fast_out_linear_in"
-        android:duration="300"/>
+        android:interpolator="@interpolator/accelerate_quad"
+        android:duration="250"/>
 </set>
diff --git a/core/res/res/anim/wallpaper_close_enter.xml b/core/res/res/anim/wallpaper_close_enter.xml
index 7256a3c..c56efa3 100644
--- a/core/res/res/anim/wallpaper_close_enter.xml
+++ b/core/res/res/anim/wallpaper_close_enter.xml
@@ -22,13 +22,14 @@
 
     <alpha android:fromAlpha="0" android:toAlpha="1.0"
         android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
-        android:interpolator="@interpolator/decelerate_quart"
-        android:startOffset="300"
-        android:duration="167"/>
+        android:interpolator="@interpolator/linear"
+        android:duration="133"/>
 
-    <translate android:fromYDelta="110%" android:toYDelta="0"
+    <scale android:fromXScale="70%" android:toXScale="100%"
+        android:fromYScale="70%" android:toYScale="100%"
+        android:pivotX="50%"
+        android:pivotY="50%"
         android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
-        android:interpolator="@interpolator/decelerate_quint"
-        android:startOffset="300"
-        android:duration="417" />
+        android:interpolator="@interpolator/linear_out_slow_in"
+        android:duration="275" />
 </set>
\ No newline at end of file
diff --git a/core/res/res/anim/wallpaper_close_exit.xml b/core/res/res/anim/wallpaper_close_exit.xml
index 12b31aef..9376876 100644
--- a/core/res/res/anim/wallpaper_close_exit.xml
+++ b/core/res/res/anim/wallpaper_close_exit.xml
@@ -20,5 +20,5 @@
 <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:detachWallpaper="true" android:shareInterpolator="false" android:zAdjustment="normal">
     <alpha android:fromAlpha="1.0" android:toAlpha="1.0"
-            android:duration="417" />
+            android:duration="275" />
 </set>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_account_circle.xml b/core/res/res/drawable/ic_account_circle.xml
index a8c5b8c..f7317db 100644
--- a/core/res/res/drawable/ic_account_circle.xml
+++ b/core/res/res/drawable/ic_account_circle.xml
@@ -16,9 +16,16 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="48.0dp"
         android:height="48.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-    <path
-        android:pathData="M24,0C10.8,0 0,10.8 0,24s10.8,24 24,24s24,-10.8 24,-24S37.200001,0 24,0zM24,7.2c3.96,0 7.2,3.24 7.2,7.2s-3.24,7.2 -7.2,7.2s-7.2,-3.24 -7.2,-7.2S20.040001,7.2 24,7.2zM24,41.279999c-6,0 -11.28,-3.12 -14.4,-7.68c0.12,-4.8 9.6,-7.44 14.4,-7.44s14.28,2.64 14.4,7.44C35.279999,38.16 30,41.279999 24,41.279999z"
-        android:fillColor="#FFFFFFFF"/>
+        android:viewportWidth="20.0"
+        android:viewportHeight="20.0">
+    <group
+        android:translateX="-2"
+        android:translateY="-2" >
+        <path
+            android:pathData="M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2zM18.36,16.83c-1.43,-1.74 -4.9,-2.33 -6.36,-2.33s-4.93,0.59 -6.36,2.33C4.62,15.49 4,13.82 4,12c0,-4.41 3.59,-8 8,-8c4.41,0 8,3.59 8,8C20,13.82 19.38,15.49 18.36,16.83z"
+            android:fillColor="#FFFFFFFF" />
+        <path
+            android:pathData="M12,6c-1.94,0 -3.5,1.56 -3.5,3.5S10.06,13 12,13c1.94,0 3.5,-1.56 3.5,-3.5S13.94,6 12,6z"
+            android:fillColor="#FFFFFFFF" />
+    </group>
 </vector>
diff --git a/core/res/res/drawable/ic_lock_bugreport.xml b/core/res/res/drawable/ic_lock_bugreport.xml
index 5501254..ebeb532 100644
--- a/core/res/res/drawable/ic_lock_bugreport.xml
+++ b/core/res/res/drawable/ic_lock_bugreport.xml
@@ -21,5 +21,11 @@
         android:tint="?attr/colorControlNormal">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M20.0,8.0l-2.81,0.0a5.985,5.985 0.0,0.0 0.0,-1.82 -1.96l0.93,-0.93a0.99,0.996 0.0,1.0 0.0,-1.41 -1.41l-1.47,1.47C12.96,5.06 12.49,5.0 12.0,5.0s-0.9,0.06 -1.4,0.17L9.12,3.7a0.99,0.996 0.0,1.0 0.0,-1.41 1.41l0.9,0.92C7.88,6.55 7.26,7.22 6.81,8.0L4.0,8.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.09,0.0c0.0,0.33 0.0,0.66 -0.09,1.0l0.0,1.0L4.0,12.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.0,0.0l0.0,1.0c0.0,0.3 0.0,0.6 0.09,1.0L4.0,16.0c-0.55,0.0 -1.0,0.45 -1.0,1.0s0.45,1.0 1.0,1.0l2.81,0.0c1.04,1.79 2.97,3.0 5.19,3.0s4.15,-1.21 5.19,-3.0L20.0,18.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0l-2.09,0.0c0.05,-0.3 0.09,-0.6 0.09,-1.0l0.0,-1.0l2.0,0.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0l-2.0,0.0l0.0,-1.0c0.0,-0.34 -0.04,-0.67 -0.09,-1.0L20.0,10.0c0.55,0.0 1.0,-0.45 1.0,-1.0s-0.45,-1.0 -1.0,-1.0zm-6.0,8.0l-4.0,0.0l0.0,-2.0l4.0,0.0l0.0,2.0zm0.0,-4.0l-4.0,0.0l0.0,-2.0l4.0,0.0l0.0,2.0z"/>
+        android:pathData="M20,10V8h-2.81c-0.45,-0.78 -1.07,-1.46 -1.82,-1.96L17,4.41L15.59,3l-2.17,2.17c-0.03,-0.01 -0.05,-0.01 -0.08,-0.01c-0.16,-0.04 -0.32,-0.06 -0.49,-0.09c-0.06,-0.01 -0.11,-0.02 -0.17,-0.03C12.46,5.02 12.23,5 12,5h0c-0.49,0 -0.97,0.07 -1.42,0.18l0.02,-0.01L8.41,3L7,4.41l1.62,1.63l0.01,0C7.88,6.54 7.26,7.22 6.81,8H4v2h2.09C6.03,10.33 6,10.66 6,11v1H4v2h2v1c0,0.34 0.04,0.67 0.09,1H4v2h2.81c1.04,1.79 2.97,3 5.19,3h0c2.22,0 4.15,-1.21 5.19,-3H20v-2h-2.09l0,0c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1l0,0H20zM16,15c0,2.21 -1.79,4 -4,4c-2.21,0 -4,-1.79 -4,-4v-4c0,-2.21 1.79,-4 4,-4h0c2.21,0 4,1.79 4,4V15z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M10,14h4v2h-4z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M10,10h4v2h-4z"/>
 </vector>
diff --git a/core/res/res/drawable/ic_zen_24dp.xml b/core/res/res/drawable/ic_zen_24dp.xml
new file mode 100644
index 0000000..790bfb9
--- /dev/null
+++ b/core/res/res/drawable/ic_zen_24dp.xml
@@ -0,0 +1,26 @@
+<!--
+     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:viewportHeight="24.0"
+        android:viewportWidth="24.0"
+        android:height="24dp"
+        android:width="24dp" >
+
+    <path
+        android:fillColor="?android:attr/colorControlActivated"
+        android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 11H8c-.55 0-1-.45-1-1s.45-1 1-1h8c.55 0 1 .45 1 1s-.45 1-1 1z" />
+
+</vector>
\ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 1040f3b9..10738e0 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Stuur e-pos aan gekose adres"</string>
     <string name="dial" msgid="1253998302767701559">"Bel"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Bel gekose foonnommer"</string>
-    <string name="map" msgid="6521159124535543457">"Spoor op"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Kry gekose adres"</string>
+    <string name="map" msgid="5441053548030107189">"Kaart"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Maak oop"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Maak gekose URL oop"</string>
     <string name="sms" msgid="4560537514610063430">"SMS"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 2b3c3be..0f61664 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ለተመሹጡ አዔራሻዎቜ ኱ሜይል ላክ"</string>
     <string name="dial" msgid="1253998302767701559">"ጄáˆȘ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ወደተመሹጠውን ሔልክ ቁጄር ደውል"</string>
-    <string name="map" msgid="6521159124535543457">"ቩታውን አግኝ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ዹተመሹጡ አዔራሻዎቜን á‰ áŠ«áˆ­á‰łá‹Žá‰œ ላይ ያግኙ"</string>
+    <string name="map" msgid="5441053548030107189">"áŠ«áˆ­á‰ł"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ክፈቔ"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ዹተመሹጠውን ዩአርኀል ክፈቔ"</string>
     <string name="sms" msgid="4560537514610063430">"መልዕክቔ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 73b9c0b..d1a90c40 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1093,8 +1093,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Ù…Ű±Ű§ŰłÙ„Ű© Ű§Ù„ŰčÙ†ÙˆŰ§Ù† Ű§Ù„Ù…ŰźŰȘۧ۱ Űčۚ۱ Ű§Ù„ŰšŰ±ÙŠŰŻ Ű§Ù„Ű„Ù„ÙƒŰȘŰ±ÙˆÙ†ÙŠ"</string>
     <string name="dial" msgid="1253998302767701559">"ۧŰȘŰ”Ű§Ù„"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ű§Ù„Ű§ŰȘŰ”Ű§Ù„ ŰšŰ±Ù‚Ù… Ű§Ù„Ù‡Ű§ŰȘف Ű§Ù„Ù…ŰźŰȘۧ۱"</string>
-    <string name="map" msgid="6521159124535543457">"ŰȘŰ­ŰŻÙŠŰŻ Ű§Ù„Ù…ÙˆÙ‚Űč"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ŰȘŰ­ŰŻÙŠŰŻ موقŰč Ű§Ù„ŰčÙ†ÙˆŰ§Ù† Ű§Ù„Ù…ŰźŰȘۧ۱"</string>
+    <string name="map" msgid="5441053548030107189">"ŰźŰ±ÙŠŰ·Ű©"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"فŰȘŰ­"</string>
     <string name="browse_desc" msgid="8220976549618935044">"‏فŰȘŰ­ ŰčÙ†ÙˆŰ§Ù† URL Ű§Ù„Ù…ŰźŰȘۧ۱"</string>
     <string name="sms" msgid="4560537514610063430">"Ű±ŰłŰ§Ù„Ű©"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 90f9822..dc28e01 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àŠ•à§‹àŠšà§‹ àŠ­àŠ‡àŠš àŠžà§‡à§±àŠŸ àŠšàŠŸàŠ‡"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àŠ§à§àŠŹàŠšàŠż àŠžà§‡à§±àŠŸ àŠŹàŠŸ àŠœà§°à§à§°à§€àŠ•àŠŸàŠČà§€àŠš àŠ•àŠČৰ àŠžà§‡à§±àŠŸ àŠ‰àŠȘàŠČàŠŹà§àŠ§ àŠšàŠčàŠŻàŠŒ"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠŹàŠŸàŠčàŠ•à§‡ àŠžàŠŸàŠźàŠŻàŠŒàŠżàŠ•àŠ­àŠŸà§±à§‡ àŠ…àŠ« àŠ•à§°àŠż àŠ„à§ˆàŠ›à§‡"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠŹàŠŸàŠčàŠ•à§‡ <xliff:g id="SIMNUMBER">%d</xliff:g> àŠ›àŠżàŠźà§° àŠŹàŠŸàŠŹà§‡ àŠžàŠŸàŠźàŠŻàŠŒàŠżàŠ•àŠ­àŠŸà§±à§‡ àŠ…àŠ« àŠ•à§°àŠżàŠ›à§‡"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àŠź\'àŠŹàŠŸàŠ‡àŠČ àŠšà§‡àŠŸà§±à§°à§àŠ•à§° àŠČàŠ—àŠ€ àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠŸàŠ‡"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"àŠȘàŠšàŠšà§àŠŠà§° àŠšà§‡àŠŸà§±à§°à§àŠ• àŠžàŠČàŠšàŠż àŠ•à§°àŠż àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•à§°àŠż àŠšàŠŸàŠ“àŠ•à„€ àŠžàŠČàŠšàŠż àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•à„€"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àŠœà§°à§à§°à§€àŠ•àŠŸàŠČà§€àŠš àŠ•àŠČ àŠ•à§°àŠŸà§° àŠžà§àŠŹàŠżàŠ§àŠŸ àŠ‰àŠȘàŠČàŠŹà§àŠ§ àŠšàŠčàŠŻàŠŒ"</string>
@@ -176,7 +175,6 @@
     <string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČৰ àŠȘà§à§°àŠ¶àŠŸàŠžàŠ•à§‡ àŠȘà§°à§àŠŻàŠŹà§‡àŠ•à§àŠ·àŠŁ àŠ•à§°àŠż àŠ†àŠ›à§‡"</string>
     <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>ৰ àŠŠà§àŠŹàŠŸà§°àŠŸ"</string>
     <string name="work_profile_deleted" msgid="5005572078641980632">"àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČ àŠźàŠšàŠŸ àŠč\'àŠČ"</string>
-    <string name="work_profile_deleted_description" msgid="1100529432509639864">"àŠȘà§à§°àŠ¶àŠŸàŠžàŠ• àŠàŠȘ্ àŠšàŠ„àŠ•àŠŸà§° àŠŹàŠŸàŠŹà§‡ àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČ àŠźàŠšàŠŸ àŠč\'àŠČ"</string>
     <string name="work_profile_deleted_details" msgid="6307630639269092360">"àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČৰ àŠȘà§à§°àŠ¶àŠŸàŠžàŠ• àŠàŠȘ্ àŠšàŠŸàŠ‡ àŠŹàŠŸ àŠŹà§àŠŻà§±àŠčàŠŸà§°àŠŻà§‹àŠ—à§àŠŻ àŠčৈ àŠ„àŠ•àŠŸ àŠšàŠŸàŠ‡à„€ àŠŻàŠŸà§° àŠ«àŠČàŠ€ àŠ†àŠȘà§‹àŠšàŠŸà§° àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČ àŠ†à§°à§ àŠ‡àŠŻàŠŒàŠŸà§° àŠČàŠ—àŠ€ àŠœàŠĄàŠŒàŠżàŠ€ àŠ…àŠšà§àŠŻ àŠĄà§‡àŠŸàŠŸàŠžàŠźà§‚àŠč àŠźàŠšàŠŸ àŠčà§ˆàŠ›à§‡à„€ àŠžàŠčàŠŸàŠŻàŠŒà§° àŠŹàŠŸàŠŹà§‡ àŠ†àŠȘà§‹àŠšàŠŸà§° àŠȘà§à§°àŠ¶àŠŸàŠžàŠ•à§° àŠžà§ˆàŠ€à§‡ àŠžàŠźà§àŠȘàŠ°à§àŠ• àŠ•à§°àŠ•à„€"</string>
     <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠ•à§°à§àŠźàŠžà§àŠ„àŠŸàŠšà§° àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČ àŠàŠ‡ àŠĄàŠżàŠ­àŠŸàŠ‡àŠšàŠŸà§‹àŠ€ àŠ†à§°à§ àŠ‰àŠȘàŠČàŠŹà§àŠ§ àŠšàŠčàŠŻàŠŒ"</string>
     <string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"àŠŹàŠčà§àŠ€àŠŹàŠŸà§° àŠ­à§àŠČàŠ•à§ˆ àŠȘàŠŸàŠ›à§±à§°à§àŠĄ àŠŠàŠżàŠŻàŠŒàŠŸ àŠčà§ˆàŠ›à§‡"</string>
@@ -485,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àŠàŠȘàŠŸà§‹àŠ• àŠšàŠżàŠŻàŠŒà§‡à§° àŠ«àŠżàŠČà§àŠĄ àŠ•àŠźàŠżàŠ‰àŠšàŠżàŠ•à§‡àŠ¶à§àŠŹàŠš (NFC) àŠŸà§‡àŠ—, àŠ•àŠŸà§°à§àŠĄ àŠ†à§°à§ à§°àŠżàŠĄàŠŸà§°àŠžàŠźà§‚àŠčৰ àŠžà§ˆàŠ€à§‡ àŠŻà§‹àŠ—àŠŸàŠŻà§‹àŠ— àŠ•à§°àŠżàŠŹàŠČৈ àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠŻàŠŒà§‡à„€"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠžà§àŠ•à§à§°à§€àŠŁ àŠČ\'àŠ• àŠ…àŠ•à§àŠ·àŠź àŠ•à§°àŠ•"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àŠàŠȘàŠŸà§‹àŠ• àŠ•à§€ àŠČ\'àŠ• àŠ†à§°à§ àŠœàŠĄàŠŒàŠżàŠ€ àŠčà§‹à§±àŠŸ àŠŻàŠżàŠ•à§‹àŠšà§‹ àŠȘàŠŸàŠ›à§±à§°à§àŠĄà§° àŠžà§à§°àŠ•à§àŠ·àŠŸ àŠ…àŠ•à§àŠ·àŠź àŠ•à§°àŠżàŠŹ àŠŠàŠżàŠŻàŠŒà§‡à§· àŠ‰àŠŠàŠŸàŠčà§°àŠŁ àŠžà§àŠŹà§°à§‚àŠȘে, àŠ•à§‹àŠšà§‹ àŠ…àŠšà§àŠ€à§°à§àŠ—àŠŸàŠźà§€ àŠ«\'àŠš àŠ•àŠČ àŠ‰àŠ à§‹à§±àŠŸà§° àŠžàŠźàŠŻàŠŒàŠ€ àŠ«\'àŠšàŠŸà§‹à§±à§‡ àŠ•à§€-àŠČàŠ•àŠŸà§‹ àŠ…àŠ•à§àŠ·àŠź àŠ•à§°à§‡, àŠ€àŠŸà§°àŠȘàŠżàŠ›àŠ€ àŠ•àŠČ àŠ¶à§‡àŠ· àŠč\'àŠČà§‡àŠ‡ àŠ•à§€ àŠČàŠ•àŠŸà§‹ àŠȘà§àŠšà§° àŠžàŠ•à§àŠ·àŠź àŠ•à§°à§‡à§·"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àŠŹàŠŸàŠŻàŠŒà§‹àŠźà§‡àŠŸà§à§°àŠżàŠ• àŠčàŠŸà§°à§àŠĄà§±à§‡à§° àŠŹà§àŠŻàŠŒà§±àŠčàŠŸà§° àŠ•à§°àŠ•"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àŠŹàŠżàŠ¶à§àŠŹàŠŸàŠžàŠŻà§‹àŠ—à§àŠŻàŠŒàŠ€àŠŸ àŠȘà§à§°àŠźàŠŸàŠŁà§€àŠ•à§°àŠŁà§° àŠŹàŠŸàŠŹà§‡ àŠàŠȘàŠ• àŠŹàŠŸàŠŻàŠŒà§‹àŠźà§‡àŠŸà§à§°àŠżàŠ• àŠčàŠŸà§°à§àŠĄà§±à§‡à§° àŠŹà§àŠŻàŠŒà§±àŠčàŠŸà§° àŠ•à§°àŠżàŠŹàŠČৈ àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠŻàŠŒà§‡"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠčàŠŸà§°à§àŠĄà§±à§‡à§° àŠȘà§°àŠżàŠšàŠŸàŠČàŠšàŠŸ àŠ•à§°àŠżàŠŹ àŠȘàŠŸà§°à§‡"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠŸà§‡àŠźà§àŠȘ্àŠČà§‡àŠŸàŠžàŠźà§‚àŠč àŠŻà§‹àŠ— àŠ•à§°àŠŸ àŠŹàŠŸ àŠźàŠšàŠŸà§° àŠȘàŠŠà§àŠ§àŠ€àŠżàŠžàŠźà§‚àŠč àŠ•àŠŸàŠźàŠ€ àŠČàŠ—àŠŸàŠŹàŠČৈ àŠšàŠżà§°à§àŠŠà§‡àŠ¶ àŠŠàŠżàŠŹàŠČৈ àŠàŠȘàŠŸà§‹àŠ• àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠŻàŠŒà§‡à„€"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠčàŠŸà§°à§àŠĄà§±à§‡à§° àŠŹà§àŠŻà§±àŠčàŠŸà§° àŠ•à§°àŠżàŠŹ àŠȘàŠŸà§°à§‡"</string>
@@ -501,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àŠšàŠżàŠšàŠŸàŠ•à§àŠ€ àŠ•à§°àŠżàŠŹàŠȘà§°àŠŸ àŠšàŠ—\'àŠČ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸà§° àŠžàŠ€à§àŠŻàŠŸàŠȘàŠš àŠ•à§°àŠŸ àŠč’àŠČ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠčàŠŸà§°à§àŠĄà§±à§‡à§° àŠšàŠŸàŠ‡à„€"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠžàŠžà§àŠšàŠŻàŠŒ àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠ—\'àŠČà„€ àŠȘà§‚àŠ°à§àŠŹà§‡ àŠžàŠžà§àŠšàŠżàŠ€ àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠàŠŸàŠŸ àŠ†àŠàŠ€à§°àŠŸàŠ“àŠ•à„€"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"àŠ«àŠżàŠ‚àŠ—àŠŸà§°àŠȘà§à§°àŠżàŠŁà§àŠŸ àŠ—à§à§°àŠčàŠŁà§° àŠžàŠźàŠŻàŠŒàŠžà§€àŠźàŠŸ àŠ‰àŠ•àŠČàŠż àŠ—à§ˆàŠ›à§‡à„€ àŠ†àŠ•à§Œ àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•à§°àŠ•à„€"</string>
@@ -1015,32 +1010,25 @@
     <string name="inputMethod" msgid="1653630062304567879">"àŠ‡àŠšàŠȘà§àŠŸ àŠȘàŠŠà§àŠ§àŠ€àŠż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àŠȘàŠŸàŠ  àŠŹàŠżàŠ·àŠŻàŠŒàŠ• àŠ•àŠŸà§°à§àŠŻ"</string>
     <string name="email" msgid="4560673117055050403">"àŠ‡àŠźà§‡àŠ‡àŠČ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠ àŠżàŠ•àŠšàŠŸàŠ€ àŠ‡àŠźà§‡àŠ‡àŠČ àŠ•à§°àŠ•"</string>
     <string name="dial" msgid="1253998302767701559">"àŠ•àŠČ àŠ•à§°àŠ•"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠ«\'àŠš àŠšàŠŸàŠźà§àŠŹàŠŸà§°àŠ€ àŠ•àŠČ àŠ•à§°àŠ•"</string>
+    <!-- no translation found for map (5441053548030107189) -->
     <skip />
-    <string name="map" msgid="6521159124535543457">"àŠ…à§±àŠžà§àŠ„àŠŸàŠš àŠšàŠżà§°à§‚àŠȘàŠŁ àŠ•à§°àŠ•"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àŠ–à§‹àŠČàŠ•"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ URL àŠ–à§‹àŠČàŠ•"</string>
     <string name="sms" msgid="4560537514610063430">"àŠŹàŠŸà§°à§àŠ€àŠŸ"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠ«\'àŠš àŠšàŠŸàŠźà§àŠŹàŠŸà§°àŠ€ àŠŹàŠŸà§°à§àŠ€àŠŸ àŠȘàŠ àŠżàŠŻàŠŒàŠŸàŠ“àŠ•"</string>
     <string name="add_contact" msgid="7867066569670597203">"àŠŻà§‹àŠ— àŠŠàŠżàŠŻàŠŒàŠ•"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àŠžàŠ°à§àŠźà§àŠȘàŠ•àŠžà§‚àŠšà§€àŠ€ àŠŻà§‹àŠ— àŠ•à§°àŠ•"</string>
     <string name="view_calendar" msgid="979609872939597838">"àŠšàŠŸàŠ“àŠ•"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àŠ•à§‡àŠČà§‡àŠŁà§àŠĄàŠŸà§°àŠ€ àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠžàŠźàŠŻàŠŒ àŠšàŠŸàŠ“àŠ•"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àŠžà§‚àŠšà§€"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠžàŠźàŠŻàŠŒà§° àŠŹàŠŸàŠŹà§‡ àŠ•àŠŸà§°à§àŠŻàŠ•à§à§°àŠźà§° àŠ€àŠŸàŠČàŠżàŠ•àŠŸ àŠŹàŠšàŠŸàŠ“àŠ•"</string>
     <string name="view_flight" msgid="7691640491425680214">"àŠŸà§à§°à§‡àŠ• àŠ•à§°àŠ•"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠŸ àŠŹàŠżàŠźàŠŸàŠšàŠŸà§‹ àŠŸà§à§°à§‡àŠ• àŠ•à§°àŠ•"</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">"àŠ›àŠżàŠ·à§àŠŸà§‡àŠźà§° àŠŹàŠŸàŠŹà§‡ àŠȘà§°à§àŠŻàŠŸàŠȘà§àŠ€ àŠ–àŠŸàŠČী àŠ àŠŸàŠ‡ àŠšàŠŸàŠ‡à„€ àŠ†àŠȘà§‹àŠšàŠŸà§° à§šà§«à§ŠàŠàŠź. àŠŹàŠż. àŠ–àŠŸàŠČী àŠ àŠŸàŠ‡ àŠ„àŠ•àŠŸàŠŸà§‹ àŠšàŠżàŠ¶à§àŠšàŠżàŠ€ àŠ•à§°àŠ• àŠ†à§°à§ à§°àŠżàŠ·à§àŠŸàŠŸà§°à§àŠŸ àŠ•à§°àŠ•à„€"</string>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>àŠ àŠ…àŠ‡àŠš àŠàŠȘàŠŹà§‹à§°à§° àŠ“àŠȘà§°àŠ€ àŠȘà§à§°àŠŠà§°à§àŠ¶àŠżàŠ€ àŠčৈ àŠ†àŠ›à§‡"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"àŠ†àŠȘà§àŠšàŠż àŠŻàŠŠàŠż <xliff:g id="NAME">%s</xliff:g>àŠ àŠàŠ‡ àŠžà§àŠŹàŠżàŠ§àŠŸàŠŸà§‹ àŠŹà§àŠŻà§±àŠčàŠŸà§° àŠ•à§°àŠŸàŠŸà§‹ àŠšàŠżàŠŹàŠżàŠšàŠŸà§°à§‡ àŠ€à§‡àŠšà§àŠ€à§‡ àŠŸàŠżàŠȘàŠż àŠ›à§‡àŠŸàŠżàŠ‚àŠžàŠźà§‚àŠč àŠ–à§‹àŠČàŠ• àŠ†à§°à§ àŠ‡àŠŻàŠŒàŠŸàŠ• àŠ…àŠ« àŠ•à§°àŠ•à„€"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àŠ…àŠ« àŠ•à§°àŠ•"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> àŠȘà§°à§€àŠ•à§àŠ·àŠŸ àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àŠŹà§°à§àŠ€àŠźàŠŸàŠšà§° àŠžàŠźàŠČৰ àŠžàŠźà§€àŠ•à§àŠ·àŠŸ àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"àŠšàŠ€à§àŠš <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àŠ›à§‡àŠŸ àŠ†àŠȘ àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àŠ«àŠŸ\' àŠ†à§°à§ àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§°àŠŁà§° àŠŹàŠŸàŠŹà§‡"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>àŠ€ àŠ•àŠżàŠŹàŠŸ àŠžàŠźàŠžà§àŠŻàŠŸ àŠ†àŠ›à§‡"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àŠžàŠźàŠŸàŠ§àŠŸàŠš àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àŠŹà§àŠŻà§±àŠčàŠŸà§°àŠŻà§‹àŠ—à§àŠŻ àŠčৈ àŠ„àŠ•àŠŸ àŠšàŠŸàŠ‡à„€ àŠ àŠżàŠ• àŠ•à§°àŠżàŠŹàŠČৈ àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠ•à„€"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>àŠ• àŠŹà§àŠŻà§±àŠčàŠŸà§° àŠ•à§°àŠżàŠŹ àŠšà§‹à§±àŠŸà§°àŠż"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àŠàŠ‡ àŠĄàŠżàŠ­àŠŸàŠ‡àŠšàŠŸà§‹à§±à§‡ <xliff:g id="NAME">%s</xliff:g>àŠ• àŠŹà§àŠŻà§±àŠčàŠŸà§° àŠ•à§°àŠżàŠŹ àŠšà§‹à§±àŠŸà§°à§‡à„€ àŠŹà§àŠŻà§±àŠčàŠŸà§° àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠ«à§°à§àŠźà§‡àŠŸàŠ€ àŠ›à§‡àŠŸ àŠ†àŠȘ àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•à„€"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àŠàŠ‡ àŠĄàŠżàŠ­àŠŸàŠ‡àŠšàŠŸà§‹à§±à§‡ <xliff:g id="NAME">%s</xliff:g>àŠ• àŠšàŠČàŠŸàŠŹ àŠšà§‹à§±àŠŸà§°à§‡à„€ àŠšàŠČàŠŸàŠŹ àŠȘà§°àŠŸ àŠ•à§‹àŠšà§‹ àŠ«à§°à§àŠźà§‡àŠŸàŠ€ àŠ›à§‡àŠŸ àŠ†àŠȘ àŠ•à§°àŠżàŠŹàŠČৈ àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠ•à„€"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àŠ…àŠȘà§à§°àŠ€à§àŠŻàŠŒàŠŸàŠ¶àŠżàŠ€àŠ­àŠŸà§±à§‡ àŠ†àŠàŠ€à§°à§‹à§±àŠŸ àŠč\'àŠČ"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àŠžàŠźàŠČ àŠčà§‡à§°à§àŠ“à§±àŠŸà§° àŠȘà§°àŠŸ àŠčàŠŸàŠ€ àŠžàŠŸà§°àŠżàŠŹàŠČৈ àŠ†àŠàŠ€à§°à§‹à§±àŠŸà§° àŠ†àŠ—àŠ€à§‡ àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠŹàŠŸàŠčàŠżà§° àŠ•à§°àŠ•"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> àŠ†àŠàŠ€à§°à§‹à§±àŠŸ àŠč\'àŠČ"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àŠ•àŠżàŠ›à§àŠźàŠŸàŠš àŠ•àŠŸà§°à§àŠŻàŠ•à§àŠ·àŠźàŠ€àŠŸàŠ‡ àŠžàŠ àŠżàŠ•àŠ­àŠŸà§±à§‡ àŠ•àŠŸàŠź àŠšàŠ•à§°àŠżàŠŹ àŠȘàŠŸà§°à§‡à„€ àŠšàŠ€à§àŠš àŠžàŠžà§àŠšàŠŻàŠŒàŠŸàŠ—àŠŸà§° àŠ­à§°àŠŸàŠ“àŠ•à„€"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> àŠŹàŠŸàŠčàŠżà§° àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àŠ†àŠàŠ€à§°àŠŸàŠ‡ àŠšàŠżàŠŠàŠżàŠŹ"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àŠ›à§‡àŠŸ àŠ†àŠȘ àŠ•à§°àŠ•"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àŠŹàŠŸàŠčàŠżà§° àŠ•à§°àŠ•"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àŠ…àŠšà§àŠŹà§‡àŠ·àŠŁ àŠ•à§°àŠ•"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àŠ‰àŠȘàŠČàŠŹà§àŠ§ àŠšàŠčàŠŻàŠŒ"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"àŠĄàŠżàŠ­àŠŸàŠ‡àŠš àŠ†àŠ•à§Œ àŠ­à§°àŠŸàŠ“àŠ•"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>àŠ• àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§° àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"àŠĄà§‡àŠŸàŠŸ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§° àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àŠžàŠźàŠČৰ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§°àŠŁ àŠžàŠźàŠŸàŠȘà§àŠ€ àŠč\'àŠČ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"<xliff:g id="NAME">%s</xliff:g>àŠČৈ àŠžàŠźàŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§° àŠ•à§°àŠŸ àŠč\'àŠČ"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àŠžàŠźàŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§° àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠ—\'àŠČ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àŠžàŠźàŠČ àŠ†àŠ•à§Œ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§° àŠ•à§°àŠżàŠŹàŠČৈ àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•à§°àŠ•"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àŠ†àŠàŠ€à§°à§‹à§±àŠŸ àŠč\'àŠČ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àŠŹàŠŸàŠčàŠżà§°àŠČৈ àŠ‰àŠČàŠżàŠ“à§±àŠŸ àŠč\'àŠČ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àŠȘà§°à§€àŠ•à§àŠ·àŠŸ àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡…"</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"àŠ­àŠ‡àŠšà§° àŠŹàŠŸàŠŹà§‡ àŠ›àŠżàŠźà§° àŠȘ্ৰ\'àŠ­àŠżàŠœàŠš àŠ•à§°àŠŸ àŠčà§‹à§±àŠŸ àŠšàŠŸàŠ‡"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"àŠ­àŠ‡àŠšà§° àŠŹàŠŸàŠŹà§‡ àŠ›àŠżàŠź àŠŹà§àŠŻà§±àŠčàŠŸà§°à§° àŠ…àŠšà§àŠźàŠ€àŠż àŠšàŠŸàŠ‡"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àŠ­àŠ‡àŠšà§° àŠŹàŠŸàŠŹà§‡ àŠ«\'àŠš àŠŹà§àŠŻà§±àŠčàŠŸà§°à§° àŠ…àŠšà§àŠźàŠ€àŠż àŠšàŠŸàŠ‡"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"àŠ›àŠżàŠź <xliff:g id="SIMNUMBER">%d</xliff:g> àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠčàŠŻàŠŒ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"àŠ›àŠżàŠź <xliff:g id="SIMNUMBER">%d</xliff:g>ৰ àŠȘ্ৰ\'àŠ­àŠżàŠœàŠš àŠ•à§°àŠŸ àŠčà§‹à§±àŠŸ àŠšàŠŸàŠ‡"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"àŠ›àŠżàŠź <xliff:g id="SIMNUMBER">%d</xliff:g> àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠčàŠŻàŠŒ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"àŠ›àŠżàŠź <xliff:g id="SIMNUMBER">%d</xliff:g> àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠčàŠŻàŠŒ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"àŠȘàŠȘàŠ†àŠȘ à§±àŠżàŠŁà§àŠĄ\'"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àŠàŠȘৰ àŠžàŠ‚àŠžà§àŠ•à§°àŠŁ àŠ…à§±àŠšàŠźàŠżàŠ€ àŠ•à§°àŠŸ àŠčà§ˆàŠ›à§‡, àŠŹàŠŸ àŠ‡ àŠàŠ‡ àŠ¶à§àŠŹà§°à§àŠŸàŠ•àŠŸàŠŸàŠŸà§‹à§° àŠČàŠ—àŠ€ àŠ–àŠŸàŠȘ àŠšàŠŸàŠ–àŠŸàŠŻàŠŒ"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index c51249f..e666583 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"SeçilmiƟ ünvana e-məktub yazın"</string>
     <string name="dial" msgid="1253998302767701559">"Zəng"</string>
     <string name="dial_desc" msgid="6573723404985517250">"SeçilmiƟ telefon nömrəsinə zəng edin"</string>
-    <string name="map" msgid="6521159124535543457">"Tapmaq"</string>
-    <string name="map_desc" msgid="9036645769910215302">"SeçilmiƟ ünvanı yerləƟdirin"</string>
+    <string name="map" msgid="5441053548030107189">"Xəritə"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Açın"</string>
     <string name="browse_desc" msgid="8220976549618935044">"SeçilmiƟ linki açın"</string>
     <string name="sms" msgid="4560537514610063430">"Mesaj"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index c4b9fa3..fdf5cd7 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Pošaljite imejl na izabranu adresu"</string>
     <string name="dial" msgid="1253998302767701559">"Pozovi"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Pozovite izabrani broj telefona"</string>
-    <string name="map" msgid="6521159124535543457">"Pronađi"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Pronađite izabranu adresu"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Otvori"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Otvorite izabrani URL"</string>
     <string name="sms" msgid="4560537514610063430">"Pošalji SMS"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7a43e8b..83bb71c 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -84,8 +84,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ĐŃĐŒĐ° сэрĐČісу галасаĐČых ĐČыĐșліĐșаў"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ГаласаĐČыя Đ°Đ±ĐŸ эĐșŃŃ‚Ń€Đ°ĐœĐœŃ‹Ń ĐČыĐșліĐșі ĐœĐ”ĐŽĐ°ŃŃ‚ŃƒĐżĐœŃ‹Ń"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Đ§Đ°ŃĐŸĐČĐ° ĐČыĐșĐ»ŃŽŃ‡Đ°ĐœĐ° Đ°ĐżĐ”Ń€Đ°Ń‚Đ°Ń€Đ°ĐŒ суĐČŃĐ·Ń–"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Đ§Đ°ŃĐŸĐČĐ° Đ°ĐŽĐșĐ»ŃŽŃ‡Đ°ĐœĐ° ĐŽĐ»Ń SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Đ°ĐżĐ”Ń€Đ°Ń‚Đ°Ń€Đ°ĐŒ суĐČŃĐ·Ń–"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ХДтĐșĐ° ĐŒĐ°Đ±Ń–Đ»ŃŒĐœĐ°Đč суĐČŃĐ·Ń– ĐœĐ”ĐŽĐ°ŃŃ‚ŃƒĐżĐœĐ°Ń"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ĐĐ°Ń†Ń–ŃĐœŃ–Ń†Đ”, Đșаб ĐČŃ‹Đ±Ń€Đ°Ń†ŃŒ Ń–ĐœŃˆŃƒŃŽ сДтĐșу."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Đ­ĐșŃŃ‚Ń€Đ°ĐœĐœŃ‹Ń ĐČыĐșліĐșі ĐœĐ”ĐŽĐ°ŃŃ‚ŃƒĐżĐœŃ‹Ń"</string>
@@ -490,7 +489,7 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"ДазĐČĐ°Đ»ŃĐ” прыĐșĐ»Đ°ĐŽĐ°ĐœĐœzv ŃĐżĐ°Đ»ŃƒŃ‡Đ°Ń†Ń†Đ° Đ· Ń‚ŃĐłĐ°ĐŒŃ–, ĐșĐ°Ń€Ń‚Đ°ĐŒŃ– і счытĐČĐ°ŃŽŃ‡Ń‹ĐŒŃ– ĐżŃ€Ń‹Đ»Đ°ĐŽĐ°ĐŒŃ– Near Field Communication (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Đ°ĐŽĐșĐ»ŃŽŃ‡ŃĐœĐœĐ” блаĐșiŃ€ĐŸŃžĐși эĐșŃ€Đ°ĐœĐ°"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ДазĐČĐ°Đ»ŃĐ” прыĐșĐ»Đ°ĐŽĐ°ĐœĐœŃĐŒ Đ°ĐŽĐșĐ»ŃŽŃ‡Đ°Ń†ŃŒ блаĐșiŃ€ĐŸŃžĐșу ĐșлаĐČіятуры і Đ»ŃŽĐ±Ń‹Ń ŃŃ€ĐŸĐŽĐșі Đ°Đ±Đ°Ń€ĐŸĐœŃ‹, Đ·ĐČŃĐ·Đ°ĐœŃ‹Ń Đ· ĐżĐ°Ń€ĐŸĐ»Đ”ĐŒ. ПрыĐșĐ»Đ°ĐŽĐ°ĐŒ гэтага Đ·\'ŃŃžĐ»ŃĐ”Ń†Ń†Đ° Đ°ĐŽĐșĐ»ŃŽŃ‡ŃĐœĐœĐ” Ń‚ŃĐ»Đ”Ń„ĐŸĐœĐ°ĐŒ блаĐșiŃ€ĐŸŃžĐși ĐșлаĐČіятуры пры Đ°Ń‚Ń€Ń‹ĐŒĐ°ĐœĐœŃ– ўĐČĐ°Ń…ĐŸĐŽĐœĐ°ĐłĐ° ĐČыĐșліĐșу і ĐżĐ°ŃžŃ‚ĐŸŃ€ĐœĐ°Đ” ўĐșĐ»ŃŽŃ‡ŃĐœĐœĐ” блаĐșiŃ€ĐŸŃžĐși ĐșлаĐČіятуры, Đșалі ĐČыĐșліĐș Đ·Đ°ĐČĐ”Ń€ŃˆĐ°ĐœŃ‹."</string>
-    <string name="permlab_useBiometric" msgid="8837753668509919318">"ĐČыĐșĐ°Ń€Ń‹ŃŃ‚ĐŸŃžĐČаць Đ±Ń–ŃĐŒĐ”Ń‚Ń€Ń‹Ń‡ĐœĐ°Đ” Đ°Đ±ŃŃ‚Đ°Đ»ŃĐČĐ°ĐœĐœŃ"</string>
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"ĐČыĐșĐ°Ń€Ń‹ŃŃ‚ĐŸŃžĐČаць Đ±Ń–ŃĐŒĐ”Ń‚Ń€Ń‹Ń‡ĐœĐ°Đ” Đ°Đ±ŃŃ‚Đ°Đ»ŃĐČĐ°ĐœĐœĐ”"</string>
     <string name="permdesc_useBiometric" msgid="8389855232721612926">"ДазĐČĐ°Đ»ŃĐ” ĐżŃ€Đ°ĐłŃ€Đ°ĐŒĐ” ĐČыĐșĐ°Ń€Ń‹ŃŃ‚ĐŸŃžĐČаць ĐŽĐ»Ń Đ°ŃžŃ‚ŃĐœŃ‚Ń‹Ń„Ń–Đșацыі Đ±Ń–ŃĐŒĐ”Ń‚Ń€Ń‹Ń‡ĐœĐ°Đ” Đ°Đ±ŃŃ‚Đ°Đ»ŃĐČĐ°ĐœĐœĐ”"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"ĐșіраĐČаць Đ°ĐżĐ°Ń€Đ°Ń‚ĐœŃ‹ĐŒŃ– ŃŃ€ĐŸĐŽĐșĐ°ĐŒŃ– ĐŽĐ»Ń аЎбітĐșаў ĐżĐ°Đ»ŃŒŃ†Đ°Ńž"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"ДазĐČĐ°Đ»ŃĐ” ĐżŃ€Đ°ĐłŃ€Đ°ĐŒĐ” ĐČыĐșĐ°Ń€Ń‹ŃŃ‚ĐŸŃžĐČаць ŃĐżĐŸŃĐ°Đ±Ń‹ ĐŽĐ°ĐŽĐ°ĐœĐœŃ і ĐČŃ‹ĐŽĐ°Đ»Đ”ĐœĐœŃ ŃˆĐ°Đ±Đ»ĐŸĐœĐ°Ńž аЎбітĐșаў ĐżĐ°Đ»ŃŒŃ†Đ°Ńž ĐŽĐ»Ń ĐČыĐșĐ°Ń€Ń‹ŃŃ‚Đ°ĐœĐœŃ."</string>
@@ -504,8 +503,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ĐĐ” Ń€Đ°ŃĐżĐ°Đ·ĐœĐ°ĐœŃ‹"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"АЎбітаĐș ĐżĐ°Đ»ŃŒŃ†Đ° Ń€Đ°ŃĐżĐ°Đ·ĐœĐ°ĐœŃ‹"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ĐĐżĐ°Ń€Đ°Ń‚ĐœŃ‹Ń ŃŃ€ĐŸĐŽĐșі аЎбітĐșаў ĐżĐ°Đ»ŃŒŃ†Đ°Ńž ĐœĐ”ĐŽĐ°ŃŃ‚ŃƒĐżĐœŃ‹Ń."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"АЎбітĐșі ĐżĐ°Đ»ŃŒŃ†Đ°Ńž ĐœĐ”Đ»ŃŒĐłĐ° Đ·Đ°Ń…Đ°ĐČаць. ВыЎаліцД Ń–ŃĐœŃ‹ аЎбітаĐș."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чаĐșĐ°ĐœĐœŃ аЎбітĐșаў ĐżĐ°Đ»ŃŒŃ†Đ°Ńž ĐČыĐčшаў. ĐŸĐ°ŃĐżŃ€Đ°Đ±ŃƒĐčцД яшчэ раз."</string>
@@ -1052,15 +1050,16 @@
     <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="email_desc" msgid="3638665569546416795">"Напісаць ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐœŃ‹ ліст ĐœĐ° ĐČŃ‹Đ±Ń€Đ°ĐœŃ‹ аЮрас"</string>
     <string name="dial" msgid="1253998302767701559">"ВыĐșліĐșаць"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ЗĐČŃĐ·Đ°Ń†Ń†Đ° Đ· Đ°Đ±Đ°ĐœĐ”ĐœŃ‚Đ°ĐŒ"</string>
-    <string name="map" msgid="6521159124535543457">"Đ—ĐœĐ°Đčсці"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ПаĐșĐ°Đ·Đ°Ń†ŃŒ аЮрас ĐœĐ° ĐșарцД"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"АЎĐșрыць"</string>
     <string name="browse_desc" msgid="8220976549618935044">"АЎĐșрыць URL у браўзДры"</string>
     <string name="sms" msgid="4560537514610063430">"ПаĐČĐ”ĐŽĐ°ĐŒĐ»Đ”ĐœĐœĐ”"</string>
-    <string name="sms_desc" msgid="7526588350969638809">"АЮпраĐČіць паĐČĐ”ĐŽĐ°ĐŒĐ»Đ”ĐœĐœĐ”"</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>
@@ -1317,49 +1316,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> паĐșĐ°Đ·ĐČ. паĐČДрх Ń–ĐœŃˆŃ‹Ń… ĐżŃ€Đ°ĐłŃ€Đ°ĐŒ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Калі ĐČы ĐœĐ” Ń…ĐŸŃ‡Đ°Ń†Đ”, Đșаб ĐżŃ€Đ°ĐłŃ€Đ°ĐŒĐ° <xliff:g id="NAME">%s</xliff:g> ĐČыĐșĐ°Ń€Ń‹ŃŃ‚ĐŸŃžĐČала гэту Ń„ŃƒĐœĐșцыю, ĐŽĐ°ĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб Đ°ĐŽĐșрыць ĐœĐ°Đ»Đ°ĐŽŃ‹ і Đ°ĐŽĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ гэта."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ВыĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"ПраĐČŃŃ€Đ°Đ”Ń†Ń†Đ° ĐœĐŸŃŃŒĐ±Ń–Ń‚ <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ПраĐČŃŃ€Đ°Đ”Ń†Ń†Đ° Đ·ĐŒĐ”ŃŃ†Ń–ĐČĐ°"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Đ—ĐœĐŸĐčĐŽĐ·Đ”ĐœĐ° ĐœĐŸĐČая прылаЎа: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб ĐœĐ°Đ»Đ°ĐŽĐ·Ń–Ń†ŃŒ"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Đ”Đ»Ń пДраЎачы фатаграфіĐč і ĐŒĐ”ĐŽŃ‹ŃŃ„Đ°Đčлаў"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ĐŸŃ€Đ°Đ±Đ»Đ”ĐŒĐ° Đ· ĐœĐŸŃŃŒĐ±Ń–Ń‚Đ°ĐŒ (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ĐĐ°Ń†Ń–ŃĐœŃ–Ń†Đ”, Đșаб ĐČыпраĐČіць"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"ĐĐŸŃŃŒĐ±Ń–Ń‚ <xliff:g id="NAME">%s</xliff:g> пашĐșĐŸĐŽĐ¶Đ°ĐœŃ‹. ВыбДрыцД, Đșаб ĐČыпраĐČіць."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> ĐœĐ” ĐżĐ°ĐŽŃ‚Ń€Ń‹ĐŒĐ»Ń–ĐČаДцца"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Гэта прылаЎа ĐœĐ” ĐżĐ°ĐŽŃ‚Ń€Ń‹ĐŒĐ»Ń–ĐČĐ°Đ” ĐœĐŸŃŃŒĐ±Ń–Ń‚ <xliff:g id="NAME">%s</xliff:g>. ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб ĐœĐ°Đ»Đ°ĐŽĐ·Ń–Ń†ŃŒ ŃĐłĐŸ ў Ń„Đ°Ń€ĐŒĐ°Ń†Đ”, яĐșі ĐżĐ°ĐŽŃ‚Ń€Ń‹ĐŒĐ»Ń–ĐČаДцца."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Гэта прылаЎа ĐœĐ” ĐżĐ°ĐŽŃ‚Ń€Ń‹ĐŒĐ»Ń–ĐČĐ°Đ” ĐœĐŸŃŃŒĐ±Ń–Ń‚ <xliff:g id="NAME">%s</xliff:g>. ВыбДрыцД, Đșаб ĐœĐ°Đ»Đ°ĐŽĐ·Ń–Ń†ŃŒ ŃĐłĐŸ ў Ń„Đ°Ń€ĐŒĐ°Ń†Đ”, яĐșі ĐżĐ°ĐŽŃ‚Ń€Ń‹ĐŒĐ»Ń–ĐČаДцца."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"ĐĐŸŃŃŒĐ±Ń–Ń‚ <xliff:g id="NAME">%s</xliff:g> ĐœĐ”Ń‡Đ°ĐșĐ°ĐœĐ° ĐČŃ‹ĐœŃŃ‚Ń‹"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"АЎĐșлючыцД ĐœĐŸŃŃŒĐ±Ń–Ń‚ пДраЎ Ń‚Ń‹ĐŒ, яĐș Юастаць ŃĐłĐŸ, Đșаб ĐœĐ” страціць Đ·ĐŒĐ”ŃŃ†Ń–ĐČĐ°"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"ĐĐŸŃŃŒĐ±Ń–Ń‚ (<xliff:g id="NAME">%s</xliff:g>) ĐČŃ‹ĐœŃŃ‚Ń‹"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ĐĐ”ĐșĐ°Ń‚ĐŸŃ€Ń‹Ń Ń„ŃƒĐœĐșцыі ĐŒĐŸĐłŃƒŃ†ŃŒ ĐșДпсĐșĐ° працаĐČаць. УстаўцД ĐœĐŸĐČы ĐœĐŸŃŃŒĐ±Ń–Ń‚."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> Đ°ĐŽĐșлючаДцца"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ĐĐ” ЮастаĐČĐ°ĐčцД ĐœĐŸŃŃŒĐ±Ń–Ń‚"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ĐĐ°Đ»Đ°ĐŽĐ·Ń–Ń†ŃŒ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Đ’Ń‹ĐœŃŃ†ŃŒ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ĐŸŃ€Đ°ĐłĐ»ŃĐŽĐ·Đ”Ń†ŃŒ"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> Đ°ĐŽŃŃƒŃ‚ĐœŃ–Ń‡Đ°Đ”"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"УстаўцД ĐżŃ€Ń‹Đ»Đ°ĐŽŃƒ яшчэ раз"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"ĐŸĐ”Ń€Đ°ĐŒŃŃˆŃ‡ŃĐœĐœĐ” <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ĐŸĐ”Ń€Đ°ĐŒŃŃˆŃ‡ŃĐœĐœĐ” ĐŽĐ°ĐœŃ‹Ń…"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ĐŸĐ”Ń€Đ°ĐŽĐ°Ń‡Đ° Đ·ĐŒĐ”ŃŃ†Ń–ĐČĐ° Đ·Đ°ĐČĐ”Ń€ŃˆĐ°ĐœĐ°"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Đ—ĐŒĐ”ŃŃ†Ń–ĐČĐ° ĐżĐ”Ń€Đ°ĐœĐ”ŃĐ”ĐœĐ° ĐœĐ° ĐœĐŸŃŃŒĐ±Ń–Ń‚: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ĐĐ” ŃžĐŽĐ°Đ»ĐŸŃŃ ĐżĐ”Ń€Đ°ĐŒŃŃŃ†Ń–Ń†ŃŒ Đ·ĐŒĐ”ŃŃ†Ń–ĐČĐ°"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ĐŸĐ°ŃĐżŃ€Đ°Đ±ŃƒĐčцД ĐżĐ”Ń€Đ°ĐŒŃŃŃ†Ń–Ń†ŃŒ Đ·ĐŒĐ”ŃŃ†Ń–ĐČĐ° яшчэ раз"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ĐĐŸŃŃŒĐ±Ń–Ń‚ ĐČŃ‹ĐŽĐ°Đ»Đ”ĐœŃ‹"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ĐĐŸŃŃŒĐ±Ń–Ń‚ ĐČŃ‹ĐœŃŃ‚Ń‹"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"ПраĐČДрĐșĐ°..."</string>
@@ -1933,14 +1917,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"ĐŃĐŒĐ° SIM-Đșарты ĐŽĐ»Ń ĐŽĐ·Đ”ŃĐœĐœŃŃž Đ· ĐłĐŸĐ»Đ°ŃĐ°ĐŒ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Đ”Đ·Đ”ŃĐœĐœŃ– Đ· ĐłĐŸĐ»Đ°ŃĐ°ĐŒ ĐŽĐ»Ń гэтаĐč SIM-Đșарты ĐœĐ” ЎапусĐșаюцца"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Đ”Đ·Đ”ŃĐœĐœŃ– Đ· ĐłĐŸĐ»Đ°ŃĐ°ĐŒ ĐŽĐ»Ń гэтага Ń‚ŃĐ»Đ”Ń„ĐŸĐœĐ° ĐœĐ” ЎапусĐșаюцца"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Đ”Đ·Đ”ŃĐœĐœŃ– Đ· SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐœĐ” ĐŽĐ°Đ·ĐČĐŸĐ»Đ”ĐœŃ‹"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Đ°ĐŽŃŃƒŃ‚ĐœŃ–Ń‡Đ°Đ”"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Đ”Đ·Đ”ŃĐœĐœŃ– Đ· SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐœĐ” ĐŽĐ°Đ·ĐČĐŸĐ»Đ”ĐœŃ‹"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Đ”Đ·Đ”ŃĐœĐœŃ– Đ· SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐœĐ” ĐŽĐ°Đ·ĐČĐŸĐ»Đ”ĐœŃ‹"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Đ’Ń‹ĐżĐ»Ń‹ŃžĐœĐŸĐ” Đ°ĐșĐœĐŸ"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ЯрлыĐș Đ°ĐŽĐœĐŸŃŃ–Ń†Ń†Đ° ĐŽĐ° старэĐčшаĐč ĐČДрсіі ĐżŃ€Đ°ĐłŃ€Đ°ĐŒŃ‹ Đ°Đ±ĐŸ ĐœĐ”ŃŃƒĐŒŃŃˆŃ‡Đ°Đ»ŃŒĐœŃ‹ Đ· ёю"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index c31decc..7299834 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Đ˜Đ·ĐżŃ€Đ°Ń‰Đ°ĐœĐ” ĐœĐ° ĐžĐŒĐ”ĐčĐ» ĐŽĐŸ ĐžĐ·Đ±Ń€Đ°ĐœĐžŃ аЎрДс"</string>
     <string name="dial" msgid="1253998302767701559">"ĐžĐ±Đ°Đ¶ĐŽĐ°ĐœĐ”"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐžĐ±Đ°Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐžĐ·Đ±Ń€Đ°ĐœĐžŃ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœĐ”Đœ ĐœĐŸĐŒĐ”Ń€"</string>
-    <string name="map" msgid="6521159124535543457">"ĐĐ°ĐŒĐžŃ€Đ°ĐœĐ”"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐĐ°ĐŒĐžŃ€Đ°ĐœĐ” ĐœĐ° ĐžĐ·Đ±Ń€Đ°ĐœĐžŃ аЎрДс"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ОтĐČĐ°Ń€ŃĐœĐ”"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ОтĐČĐ°Ń€ŃĐœĐ” ĐœĐ° ĐžĐ·Đ±Ń€Đ°ĐœĐžŃ URL аЎрДс"</string>
     <string name="sms" msgid="4560537514610063430">"ĐĄŃŠĐŸĐ±Ń‰Đ”ĐœĐžĐ”"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 80bf8cf..198e67b 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àŠ­àŠŻàŠŒà§‡àŠž àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸ àŠšà§‡àŠ‡"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àŠ­àŠŻàŠŒà§‡àŠž àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸ àŠ…àŠ„àŠŹàŠŸ àŠœàŠ°à§àŠ°àŠż àŠ•àŠČà§‡àŠ° àŠžà§àŠŹàŠżàŠ§àŠŸ àŠšà§‡àŠ‡"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸ àŠȘà§àŠ°àŠŠàŠŸàŠšàŠ•àŠŸàŠ°à§€ àŠàŠ‡ àŠžà§àŠŹàŠżàŠ§àŠŸ àŠžàŠŸàŠźàŠŻàŠŒàŠżàŠ•àŠ­àŠŸàŠŹà§‡ àŠŹàŠšà§àŠ§ àŠ°à§‡àŠ–à§‡àŠ›à§‡"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"àŠ†àŠȘàŠšàŠŸàŠ° àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸ àŠȘà§àŠ°àŠŠàŠŸàŠšàŠ•àŠŸàŠ°à§€ <xliff:g id="SIMNUMBER">%d</xliff:g> àŠžàŠżàŠźàŠŸàŠż àŠ…àŠžà§àŠ„àŠŸàŠŻàŠŒà§€àŠ­àŠŸàŠŹà§‡ àŠŹàŠšà§àŠ§ àŠ•àŠ°à§‡àŠ›à§‡"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àŠźà§‹àŠŹàŠŸàŠ‡àŠČ àŠšà§‡àŠŸàŠ“àŠŻàŠŒàŠŸàŠ°à§àŠ•à§‡ àŠ•àŠŸàŠšà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠšà§àŠ›à§‡ àŠšàŠŸ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"àŠȘàŠ›àŠšà§àŠŠà§‡àŠ° àŠšà§‡àŠŸàŠ“àŠŻàŠŒàŠŸàŠ°à§àŠ• àŠȘàŠ°àŠżàŠŹàŠ°à§àŠ€àŠš àŠ•àŠ°à§‡ àŠŠà§‡àŠ–à§àŠšà„€ àŠ…àŠšà§àŠŻ àŠšà§‡àŠŸàŠ“àŠŻàŠŒàŠŸàŠ°à§àŠ• àŠŹà§‡àŠ›à§‡ àŠšàŠżàŠ€à§‡ àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§àŠšà„€"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àŠœàŠ°à§àŠ°àŠż àŠ•àŠČ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŹà§‡ àŠšàŠŸ"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àŠ…à§àŠŻàŠŸàŠȘ্àŠČàŠżàŠ•à§‡àŠ¶àŠŸàŠšàŠ•à§‡ àŠšàŠżàŠŻàŠŒàŠŸàŠ° àŠ«àŠżàŠČà§àŠĄ àŠ•àŠźàŠżàŠ‰àŠšàŠżàŠ•à§‡àŠ¶àŠš (NFC) àŠŸà§àŠŻàŠŸàŠ—, àŠ•àŠŸàŠ°à§àŠĄ àŠàŠŹàŠ‚ àŠ°àŠżàŠĄàŠŸàŠ°àŠ—à§àŠČàŠżàŠ° àŠžàŠŸàŠ„à§‡ àŠŻà§‹àŠ—àŠŸàŠŻà§‹àŠ— àŠ•àŠ°àŠ€à§‡ àŠŠà§‡àŠŻàŠŒà§·"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àŠ†àŠȘàŠšàŠŸàŠ° àŠžà§àŠ•à§àŠ°àŠżàŠš àŠČàŠ• àŠ…àŠ•à§àŠ·àŠź àŠ•àŠ°à§àŠš"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àŠ•à§€-àŠČàŠ• àŠàŠŹàŠ‚ àŠŻà§‡àŠ•à§‹àŠšà§‹ àŠžàŠ‚àŠ¶à§àŠČàŠżàŠ·à§àŠŸ àŠȘàŠŸàŠžàŠ“àŠŻàŠŒàŠŸàŠ°à§àŠĄ àŠžà§àŠ°àŠ•à§àŠ·àŠŸ àŠ…àŠ•à§àŠ·àŠź àŠ•àŠ°àŠ€à§‡ àŠ…à§àŠŻàŠŸàŠȘ্àŠČàŠżàŠ•à§‡àŠ¶àŠŸàŠšàŠŸàŠżàŠ•à§‡ àŠźàŠžà§àŠœà§àŠ° àŠ•àŠ°à§‡à§· àŠ‰àŠŠàŠŸàŠčàŠ°àŠŁàŠžà§àŠŹàŠ°à§‚àŠȘ, àŠàŠ•àŠŸàŠż àŠ‡àŠšàŠ•àŠŸàŠźàŠżàŠ‚ àŠ«à§‹àŠš àŠ•àŠČ àŠ—à§àŠ°àŠčàŠŁ àŠ•àŠ°àŠŸàŠ° àŠžàŠźàŠŻàŠŒà§‡ àŠ«à§‹àŠšàŠŸàŠż àŠ•à§€-àŠČàŠ• àŠ…àŠ•à§àŠ·àŠź àŠ•àŠ°à§‡, àŠ€àŠŸàŠ°àŠȘàŠ°à§‡ àŠ•àŠČ àŠ¶à§‡àŠ· àŠčàŠŻàŠŒà§‡ àŠ—à§‡àŠČে àŠ•à§€-àŠČàŠ•àŠŸàŠżàŠ•à§‡ àŠ†àŠŹàŠŸàŠ° àŠžàŠ•à§àŠ·àŠź àŠ•àŠ°à§‡à§·"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àŠŹàŠŸàŠŻàŠŒà§‹àŠźà§‡àŠŸà§àŠ°àŠżàŠ• àŠčàŠŸàŠ°à§àŠĄàŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ° àŠŹà§àŠŻàŠŹàŠčàŠŸàŠ° àŠ•àŠ°à§àŠš"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àŠ…à§àŠŻàŠŸàŠȘàŠŸàŠżàŠ•à§‡ àŠŻàŠŸàŠšàŠŸàŠ‡àŠ•àŠ°àŠŁà§‡àŠ° àŠœàŠšà§àŠŻ àŠŹàŠŸàŠŻàŠŒà§‹àŠźà§‡àŠŸà§àŠ°àŠżàŠ• àŠčàŠŸàŠ°à§àŠĄàŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ° àŠŹà§àŠŻàŠŹàŠčàŠŸàŠ° àŠ•àŠ°àŠŸàŠ° àŠ…àŠšà§àŠźàŠ€àŠż àŠŠà§‡àŠŻàŠŒ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠčàŠŸàŠ°à§àŠĄàŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ° àŠȘàŠ°àŠżàŠšàŠŸàŠČàŠšàŠŸ àŠ•àŠ°à§àŠš"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àŠŹà§àŠŻàŠŹàŠčàŠŸàŠ° àŠ•àŠ°àŠŸàŠ° àŠœàŠšà§àŠŻ àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘà§‡àŠ° àŠŸà§‡àŠźà§àŠȘ্àŠČà§‡àŠŸàŠ—à§àŠČàŠż àŠŻà§‹àŠ— àŠ•àŠ°àŠŸ àŠàŠŹàŠ‚ àŠźà§‹àŠ›àŠŸàŠ° àŠȘàŠŠà§àŠ§àŠ€àŠżàŠ—à§àŠČàŠż àŠ—à§àŠ°àŠčàŠš àŠ•àŠ°àŠ€à§‡ àŠ…à§àŠŻàŠŸàŠȘ্àŠČàŠżàŠ•à§‡àŠ¶àŠŸàŠšàŠŸàŠżàŠ€à§‡ àŠ…àŠźà§àŠźàŠ€àŠż àŠŠà§‡àŠŻàŠŒà§·"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠčàŠŸàŠ°à§àŠĄàŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ° àŠŹà§àŠŻàŠŹàŠčàŠŸàŠ° àŠ•àŠ°à§àŠš"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àŠžà§àŠŹà§€àŠ•à§ƒàŠ€ àŠšàŠŻàŠŒ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠŻàŠŸàŠšàŠŸàŠ‡ àŠ•àŠ°àŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠčàŠŸàŠ°à§àŠĄàŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ° àŠ…àŠšà§àŠȘàŠČàŠŹà§àŠ§à§·"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠžàŠ‚àŠ°àŠ•à§àŠ·àŠŁ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŹà§‡ àŠšàŠŸà§· àŠ…àŠšà§àŠ—à§àŠ°àŠč àŠ•àŠ°à§‡ àŠàŠ•àŠŸàŠż àŠŹàŠżàŠŠà§àŠŻàŠźàŠŸàŠš àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠžàŠ°àŠŸàŠšà§·"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"àŠ†àŠ™à§àŠ—à§àŠČà§‡àŠ° àŠ›àŠŸàŠȘ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠžàŠźàŠŻàŠŒàŠžà§€àŠźàŠŸ àŠ¶à§‡àŠ· àŠčàŠŻà§‡àŠ›à§‡à§· àŠ†àŠŹàŠŸàŠ° àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•àŠ°à§àŠšà§·"</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àŠ‡àŠšàŠȘà§àŠŸ àŠȘàŠŠà§àŠ§àŠ€àŠż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àŠȘàŠŸàŠ à§àŠŻ àŠ•à§àŠ°àŠżàŠŻàŠŒàŠŸàŠ—à§àŠČàŠż"</string>
     <string name="email" msgid="4560673117055050403">"àŠ‡àŠźà§‡àŠČ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠ†àŠ‡àŠĄàŠżàŠ€à§‡ àŠ‡àŠźà§‡àŠČ àŠȘàŠŸàŠ àŠŸàŠš"</string>
     <string name="dial" msgid="1253998302767701559">"àŠ•àŠČ"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àŠ…àŠŹàŠžà§àŠ„àŠŸàŠš àŠšàŠżàŠ°à§àŠŁàŠŻàŠŒ àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠ«à§‹àŠš àŠšàŠźà§àŠŹàŠ°à§‡ àŠ•àŠČ àŠ•àŠ°à§àŠš"</string>
+    <string name="map" msgid="5441053548030107189">"àŠźà§àŠŻàŠŸàŠȘ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àŠ–à§àŠČà§àŠš"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠ‡àŠ‰àŠ†àŠ°àŠàŠČে àŠŻàŠŸàŠš"</string>
     <string name="sms" msgid="4560537514610063430">"àŠźà§‡àŠžà§‡àŠœ"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠ«à§‹àŠš àŠšàŠźà§àŠŹàŠ°à§‡ àŠźà§‡àŠžà§‡àŠœ àŠȘàŠŸàŠ àŠŸàŠš"</string>
     <string name="add_contact" msgid="7867066569670597203">"àŠŻà§‹àŠ— àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àŠȘàŠ°àŠżàŠšàŠżàŠ€àŠżàŠ€à§‡ àŠŻà§‹àŠ— àŠ•àŠ°à§àŠš"</string>
     <string name="view_calendar" msgid="979609872939597838">"àŠŠà§‡àŠ–à§àŠš"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠŠàŠżàŠšàŠŸàŠż àŠ•à§àŠŻàŠŸàŠČà§‡àŠšà§àŠĄàŠŸàŠ°à§‡ àŠŠà§‡àŠ–à§àŠš"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àŠžàŠźàŠŻàŠŒàŠžà§‚àŠšà§€"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠžàŠźàŠŻàŠŒà§‡ àŠ‡àŠ­à§‡àŠšà§àŠŸ àŠžà§‡àŠŸ àŠ•àŠ°à§àŠš"</string>
     <string name="view_flight" msgid="7691640491425680214">"àŠŸà§àŠ°à§àŠŻàŠŸàŠ•"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àŠŹà§‡àŠ›à§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸ àŠ«à§àŠČàŠŸàŠ‡àŠŸ àŠŸà§àŠ°à§àŠŻàŠŸàŠ• àŠ•àŠ°à§àŠš"</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">"àŠžàŠżàŠžà§àŠŸà§‡àŠźà§‡àŠ° àŠœàŠšà§àŠŻ àŠŻàŠ„à§‡àŠ·à§àŠŸ àŠžà§àŠŸà§‹àŠ°à§‡àŠœ àŠšà§‡àŠ‡à§· àŠ†àŠȘàŠšàŠŸàŠ° àŠ•àŠŸàŠ›à§‡ à§šà§«à§ŠàŠàŠźàŠŹàŠż àŠ«àŠŸàŠàŠ•àŠŸ àŠžà§àŠ„àŠŸàŠš àŠ°àŠŻàŠŒà§‡àŠ›à§‡ àŠ•àŠżàŠšàŠŸ àŠžà§‡ àŠŹàŠżàŠ·àŠŻàŠŒà§‡ àŠšàŠżàŠ¶à§àŠšàŠżàŠ€ àŠčàŠš àŠàŠŹàŠ‚ àŠžàŠżàŠžà§àŠŸà§‡àŠź àŠšàŠŸàŠČু àŠ•àŠ°à§àŠšà§·"</string>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> àŠ…àŠšà§àŠŻàŠŸàŠšà§àŠŻ àŠ…à§àŠŻàŠŸàŠȘà§‡àŠ° àŠ“àŠȘàŠ° àŠȘà§àŠ°àŠŠàŠ°à§àŠ¶àŠżàŠ€ àŠčàŠšà§àŠ›à§‡"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> àŠ•à§‡ àŠàŠ‡ àŠŹà§ˆàŠ¶àŠżàŠ·à§àŠŸà§àŠŻàŠŸàŠż àŠŹà§àŠŻàŠŹàŠčàŠŸàŠ° àŠ•àŠ°àŠ€à§‡ àŠŠàŠżàŠ€à§‡ àŠšàŠŸ àŠšàŠŸàŠ‡àŠČে, àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§‡ àŠžà§‡àŠŸàŠżàŠ‚àŠžà§‡ àŠŻàŠŸàŠš àŠ“ àŠŹà§ˆàŠ¶àŠżàŠ·à§àŠŸà§àŠŻàŠŸàŠż àŠŹàŠšà§àŠ§ àŠ•àŠ°à§‡ àŠŠàŠżàŠšà„€"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àŠŹàŠšà§àŠ§ àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> àŠȘàŠ°à§€àŠ•à§àŠ·àŠŸ àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àŠŹàŠ°à§àŠ€àŠźàŠŸàŠš àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸàŠŸàŠż àŠȘàŠ°à§àŠŻàŠŸàŠČà§‹àŠšàŠšàŠŸ àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"àŠšàŠ€à§àŠš <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àŠžà§‡àŠŸ-àŠ†àŠȘ àŠ•àŠ°àŠ€à§‡ àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§àŠš"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àŠ«àŠŸà§‹ àŠàŠŹàŠ‚ àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠŸà§àŠ°àŠŸàŠšà§àŠžàŠ«àŠŸàŠ°"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> àŠšàŠżàŠŻàŠŒà§‡ àŠžàŠźàŠžà§àŠŻàŠŸ àŠ†àŠ›à§‡"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àŠ àŠżàŠ• àŠ•àŠ°àŠ€à§‡ àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§àŠš"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àŠ€à§àŠ°à§àŠŸàŠżàŠȘà§‚àŠ°à§àŠŁà„€ àŠźà§‡àŠ°àŠŸàŠźàŠ€ àŠ•àŠ°àŠ€à§‡ àŠŹà§‡àŠ›à§‡ àŠšàŠżàŠšà„€"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> àŠ…àŠžàŠźàŠ°à§àŠ„àŠżàŠ€"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àŠàŠ‡ àŠĄàŠżàŠ­àŠŸàŠ‡àŠžàŠŸàŠż <xliff:g id="NAME">%s</xliff:g> àŠžàŠźàŠ°à§àŠ„àŠš àŠ•àŠ°à§‡ àŠšàŠŸà„€ àŠ•à§‹àŠšà§‹ àŠžàŠźàŠ°à§àŠ„àŠżàŠ€ àŠ«àŠ°à§àŠźà§àŠŻàŠŸàŠŸà§‡ àŠžà§‡àŠŸ àŠ†àŠȘ àŠ•àŠ°àŠ€à§‡ àŠ†àŠČàŠ€à§‹ àŠšàŠŸàŠȘà§àŠšà„€"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àŠàŠ‡ àŠĄàŠżàŠ­àŠŸàŠ‡àŠžàŠŸàŠż <xliff:g id="NAME">%s</xliff:g> àŠžàŠźàŠ°à§àŠ„àŠš àŠ•àŠ°à§‡ àŠšàŠŸà„€ àŠ•à§‹àŠšà§‹ àŠžàŠźàŠ°à§àŠ„àŠżàŠ€ àŠ«àŠ°à§àŠźà§àŠŻàŠŸàŠŸà§‡ àŠžà§‡àŠŸ àŠ†àŠȘ àŠ•àŠ°àŠ€à§‡ àŠšàŠŸàŠ‡àŠČে àŠŹà§‡àŠ›à§‡ àŠšàŠżàŠšà„€"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àŠ…àŠȘà§àŠ°àŠ€à§àŠŻàŠŸàŠ¶àŠżàŠ€àŠ­àŠŸàŠŹà§‡ àŠźà§àŠ›à§‡ àŠ«à§‡àŠČàŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠžàŠ°àŠżàŠŻàŠŒà§‡ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠ†àŠ—à§‡ àŠžà§‡àŠŸàŠż àŠžàŠżàŠžà§àŠŸà§‡àŠź àŠ„à§‡àŠ•à§‡ àŠ‡àŠœà§‡àŠ•à§àŠŸ àŠ•àŠ°à§àŠš, àŠšàŠŸàŠčàŠČে àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸ àŠžà§‡àŠ­ àŠšàŠŸàŠ“ àŠčàŠ€à§‡ àŠȘàŠŸàŠ°à§‡"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> àŠžàŠ°àŠŸàŠšà§‹ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àŠ•àŠżàŠ›à§ àŠ•à§àŠ°àŠżàŠŻàŠŒàŠŸàŠ•àŠČàŠŸàŠȘ àŠžàŠ àŠżàŠ•àŠ­àŠŸàŠŹà§‡ àŠ•àŠŸàŠœ àŠšàŠŸàŠ“ àŠ•àŠ°àŠ€à§‡ àŠȘàŠŸàŠ°à§‡à„€ àŠšàŠ€à§àŠš àŠžà§àŠŸà§‹àŠ°à§‡àŠœ àŠČàŠŸàŠ—àŠŸàŠšà„€"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> àŠ‡àŠœà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àŠžàŠ°àŠŸàŠŹà§‡àŠš àŠšàŠŸ"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àŠžà§‡àŠŸ àŠ†àŠȘ àŠ•àŠ°à§àŠš"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àŠŹà§‡àŠ° àŠ•àŠ°à§‡ àŠšàŠżàŠš"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àŠ˜à§àŠ°à§‡ àŠŠà§‡àŠ–à§àŠš"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àŠ…àŠšà§àŠȘàŠžà§àŠ„àŠżàŠ€"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"àŠĄàŠżàŠ­àŠŸàŠ‡àŠžàŠŸàŠż àŠ†àŠŹàŠŸàŠ° àŠąà§‹àŠ•àŠŸàŠš"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> àŠžàŠ°àŠŸàŠšà§‹ àŠčàŠšà§àŠ›à§‡"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"àŠĄà§‡àŠŸàŠŸ àŠžàŠ°àŠŸàŠšà§‹ àŠčàŠšà§àŠ›à§‡"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸ àŠŸà§àŠ°àŠŸàŠšà§àŠžàŠ«àŠŸàŠ° àŠ•àŠ°àŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸ <xliff:g id="NAME">%s</xliff:g>-àŠ€à§‡ àŠžàŠ°àŠŸàŠšà§‹ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸ àŠžàŠ°àŠŸàŠšà§‹ àŠŻàŠŸàŠšà§àŠ›à§‡ àŠšàŠŸ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àŠ†àŠŹàŠŸàŠ° àŠ•àŠšà§àŠŸà§‡àŠšà§àŠŸ àŠžàŠ°àŠŸàŠšà§‹àŠ° àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•àŠ°à§àŠš"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àŠžàŠ°àŠŸàŠšà§‹ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àŠžàŠ°àŠżàŠŻàŠŒà§‡ àŠŠà§‡àŠ“àŠŻàŠŒàŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àŠȘàŠ°à§€àŠ•à§àŠ·àŠŸ àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡..."</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"àŠžàŠżàŠźàŠŸàŠż àŠ­àŠŻàŠŒà§‡àŠž àŠ•àŠČà§‡àŠ° àŠœàŠšà§àŠŻ àŠȘà§àŠ°àŠžà§àŠ€à§àŠ€ àŠšàŠŻàŠŒ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"àŠàŠ‡ àŠžàŠżàŠź àŠŠàŠżàŠŻàŠŒà§‡ àŠ­àŠŻàŠŒà§‡àŠž àŠ•àŠČ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŹà§‡ àŠšàŠŸ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àŠàŠ‡ àŠ«à§‹àŠš àŠŠàŠżàŠŻàŠŒà§‡ àŠ­àŠŻàŠŒà§‡àŠž àŠ•àŠČ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŹà§‡ àŠšàŠŸ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> àŠžàŠżàŠźàŠŸàŠż àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠŻàŠŒ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> àŠžàŠżàŠźàŠŸàŠż àŠȘà§àŠ°àŠžà§àŠ€à§àŠ€ àŠšàŠŻàŠŒ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> àŠžàŠżàŠźàŠŸàŠż àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠŻàŠŒ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> àŠžàŠżàŠźàŠŸàŠż àŠ…àŠšà§àŠźà§‹àŠŠàŠżàŠ€ àŠšàŠŻàŠŒ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"àŠȘàŠȘ-àŠ†àŠȘ àŠ‰àŠ‡àŠšà§àŠĄà§‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>àŠŸàŠż"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àŠ…à§àŠŻàŠŸàŠȘà§‡àŠ° àŠ­àŠŸàŠ°à§àŠžàŠš àŠĄàŠŸàŠ‰àŠšàŠ—à§àŠ°à§‡àŠĄ àŠ•àŠ°àŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡ àŠ…àŠ„àŠŹàŠŸ àŠàŠ‡ àŠ¶àŠ°à§àŠŸàŠ•àŠŸàŠŸà§‡àŠ° àŠœàŠšà§àŠŻ àŠ‰àŠȘàŠŻà§àŠ•à§àŠ€ àŠšàŠŻàŠŒ"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 70e51b9..686e35e 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -316,8 +316,8 @@
     <string name="permdesc_statusBar" msgid="8434669549504290975">"Dozvoljava aplikaciji onemogućavanje statusne trake ili dodavanje i uklanjanje sistemskih ikona."</string>
     <string name="permlab_statusBarService" msgid="4826835508226139688">"funkcioniranje u vidu statusne trake"</string>
     <string name="permdesc_statusBarService" msgid="716113660795976060">"Dozvoljava aplikaciji da postane statusna traka."</string>
-    <string name="permlab_expandStatusBar" msgid="1148198785937489264">"otvaranje/zatvaranje statusne trake"</string>
-    <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Dozvoljava aplikaciji otvaranje ili zatvaranje statusne trake."</string>
+    <string name="permlab_expandStatusBar" msgid="1148198785937489264">"proširivanje/suĆŸavanje statusne trake"</string>
+    <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Dozvoljava aplikaciji proširivanje ili suĆŸavanje statusne trake."</string>
     <string name="permlab_install_shortcut" msgid="4279070216371564234">"instaliranje prečica"</string>
     <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Omogućava aplikaciji dodavanje prečice za početni ekran bez intervencije korisnika."</string>
     <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"uklanjanje prečica"</string>
@@ -486,8 +486,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"Dozvoljava aplikaciji komuniciranje sa NFC (komunikacija bliskog polja) oznakama, karticama i čitačima."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"deaktivacija zaključavanja ekrana"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Omogućava aplikaciji deaktivaciju zaključane tastature i svih povezanih zaštita. Naprimjer, telefon deaktivira zaključavanje tastature kod dolaznog telefonskog poziva, a zatim ponovo aktivira zaključavanje tastature kada je poziv završen."</string>
-    <string name="permlab_useBiometric" msgid="8837753668509919318">"koristi hardver za otiske prstiju"</string>
-    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Omogućava aplikaciji da za autentifikaciju koristi hardver za otiske prstiju"</string>
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"koristi biometrijski hardver za otiske prstij"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Omogućava aplikaciji da za autentifikaciju koristi biometrijski hardver"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"upravljanje hardverom za otiske prstiju"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Omogućava aplikaciji da koristi metode za dodavanje i brisanje šablona otisaka prstiju za upotrebu."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"korištenje hardvera za otiske prstiju"</string>
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"E-pošta odabrane adrese"</string>
     <string name="dial" msgid="1253998302767701559">"Pozovite"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Pozovite odabrani broj telefona"</string>
-    <string name="map" msgid="6521159124535543457">"Odredite lokaciju"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Lokacija odabrane adrese"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Otvorite"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Otvorite odabrani URL"</string>
     <string name="sms" msgid="4560537514610063430">"Poruka"</string>
@@ -1309,7 +1310,7 @@
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Neočekivano uklonjen uređaj <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Izbacite medij prije uklanjanja da izbjegnete gubitak sadrĆŸaja"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Medij <xliff:g id="NAME">%s</xliff:g> je uklonjen"</string>
-    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Neke funkcionalnosti moĆŸda neće raditi ispravno. Ubacite novu memoriju."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Neke funkcionalnosti moĆŸda neće raditi ispravno. Ubacite novu pohranu."</string>
     <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Izbacivanje medija <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nemojte uklanjati"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Postavi"</string>
@@ -1766,7 +1767,7 @@
     <string name="zen_mode_forever" msgid="931849471004038757">"Dok ne isključite"</string>
     <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dok ne isključite način rada Ne ometaj"</string>
     <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
-    <string name="toolbar_collapse_description" msgid="2821479483960330739">"Skupi"</string>
+    <string name="toolbar_collapse_description" msgid="2821479483960330739">"Suzi"</string>
     <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string>
     <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prestanak rada"</string>
     <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Radni dan uvečer"</string>
@@ -1786,7 +1787,7 @@
     <string name="stk_cc_ss_to_ss" msgid="7716729801537709054">"Promijenjeno u novi SS zahtjev"</string>
     <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil za posao"</string>
     <string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Proširi"</string>
-    <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Skupi"</string>
+    <string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Suzi"</string>
     <string name="expand_action_accessibility" msgid="5307730695723718254">"aktiviraj/deaktiviraj proširenje"</string>
     <string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB ulaz za periferijske uređaje"</string>
     <string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index bd3b602..2d1b37f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sense servei de veu"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hi ha servei de veu ni trucades d\'emergència"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"L\'operador de telefonia mòbil ho ha desactivat temporalment"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"L\'operador de telefonia mòbil ho ha desactivat temporalment per a la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No es pot accedir a la xarxa mòbil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova de canviar de xarxa preferida. Toca per canviar-la."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Les trucades d\'emergència no estan disponibles"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No s\'ha reconegut"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"L\'empremta digital s\'ha autenticat"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Envia un correu electrònic a l\'adreça seleccionada"</string>
     <string name="dial" msgid="1253998302767701559">"Truca"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Truca al número de telèfon seleccionat"</string>
-    <string name="map" msgid="6521159124535543457">"Localitza"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Obre l\'adreça seleccionada al mapa"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Obre"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Obre l\'URL seleccionat"</string>
     <string name="sms" msgid="4560537514610063430">"Missatge"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactiva"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"S\'està comprovant el suport (<xliff:g id="NAME">%s</xliff:g>)…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"S\'està revisant el contingut actual"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Suport extern nou (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toca per configurar"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per transferir fotos i fitxers multimèdia"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema amb el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toca per solucionar el problema"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"La unitat següent està malmesa: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per solucionar-ho."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no és compatible"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositiu no admet la unitat <xliff:g id="NAME">%s</xliff:g>. Toca per configurar-la amb un format compatible."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Aquest dispositiu no admet la unitat següent: <xliff:g id="NAME">%s</xliff:g>. Selecciona-la per configurar-la en un format compatible."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"S\'ha extret <xliff:g id="NAME">%s</xliff:g> de manera inesperada"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Expulsa el suport extern abans d\'extreure\'l per evitar perdre\'n el contingut"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"S\'ha suprimit el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Pot ser que algunes funcions no funcionin correctament. Insereix un altre dispositiu d\'emmagatzematge."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"S\'està expulsant el suport (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"No extreguis el suport extern"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsa"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Explora"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"No es detecta <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Torna a inserir el dispositiu"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"S\'està desplaçant l\'aplicació <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"S\'estan desplaçant dades"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"S\'ha transferit el contingut"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"El contingut s\'ha transferit al suport extern (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"No s\'ha pogut transferir"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Torna a provar de transferir el contingut"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"S\'ha retirat"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"S\'ha expulsat"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"S\'està comprovant..."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"La SIM no està proporcionada per a la veu"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"La SIM no és compatible per a la veu"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"El telèfon no és compatible per a la veu"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"La SIM <xliff:g id="SIMNUMBER">%d</xliff:g> no s\'ha proporcionat"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"No s\'admet la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"S\'ha canviat a una versió anterior de l\'aplicació o la versió actual no és compatible amb aquesta drecera"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0fb65ea..960f1f1 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1053,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Napsat na vybranou e-mailovou adresu"</string>
     <string name="dial" msgid="1253998302767701559">"Zavolat"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Zavolat na vybrané telefonní číslo"</string>
-    <string name="map" msgid="6521159124535543457">"Najít"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Vyhledat vybranou adresu"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Otevƙít"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Otevƙít vybranou adresu URL"</string>
     <string name="sms" msgid="4560537514610063430">"Zpráva"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 03ced00..deedfe5 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ingen taletjeneste"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ingen taletjeneste eller nødopkald"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Midlertidigt deaktiveret af dit mobilselskab"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Midlertidigt deaktiveret af dit mobilselskab for SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Der er ingen forbindelse til mobilnetværket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv at skifte dit foretrukne netværk. Tryk for skifte."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Det er ikke muligt at foretage nødopkald"</string>
@@ -222,7 +221,7 @@
     <string name="global_action_logout" msgid="935179188218826050">"Afslut sessionen"</string>
     <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string>
     <string name="bugreport_title" msgid="2667494803742548533">"Lav fejlrapport"</string>
-    <string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string>
+    <string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string>
     <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
     <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten, angive flere oplysninger om problemet og tage screenshots. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis."</string>
     <string name="bugreport_option_full_title" msgid="6354382025840076439">"Fuld rapport"</string>
@@ -375,13 +374,13 @@
     <string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Giver appen lov til at sende klæbende udsendelser, som ikke forsvinder, når udsendelsen er slut. Overdreven brug kan gøre fjernsynet langsomt eller ustabilt ved at få det til at bruge for meget hukommelse."</string>
     <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tillader, at appen kan sende klæbende udsendelser, der forbliver tilbage, når udsendelsen er slut. Overdreven brug kan gøre din telefon langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
     <string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontaktpersoner"</string>
-    <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
+    <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
     <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Giver appen lov til at læse data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på andre måder kommunikeret med bestemte personer. Denne tilladelse gør det muligt for apps at gemme dine kontaktoplysninger, og ondsindede apps kan dele kontaktoplysninger uden din viden."</string>
-    <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
+    <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
     <string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontaktpersoner"</string>
-    <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en e-mail eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
+    <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en mail eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
     <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Giver appen lov til at ændre data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på anden måde kommunikeret med bestemte kontaktpersoner. Denne tilladelse gør det muligt for apps at slette kontaktoplysninger."</string>
-    <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en e-mail til dem eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
+    <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en mail til dem eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
     <string name="permlab_readCallLog" msgid="3478133184624102739">"læse opkaldsliste"</string>
     <string name="permdesc_readCallLog" msgid="3204122446463552146">"Denne app kan læse din opkaldshistorik."</string>
     <string name="permlab_writeCallLog" msgid="8552045664743499354">"skriv opkaldsliste"</string>
@@ -394,7 +393,7 @@
     <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"Denne app kan læse alle kalenderbegivenheder, der er gemt på din tablet, og dele eller gemme dine kalenderdata."</string>
     <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"Denne app kan læse alle kalenderbegivenheder, der er gemt på dit fjernsyn, og dele eller gemme dine kalenderdata."</string>
     <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"Denne app kan læse alle kalenderbegivenheder, der er gemt på din telefon, og dele eller gemme dine kalenderdata."</string>
-    <string name="permlab_writeCalendar" msgid="8438874755193825647">"tilføje eller ændre kalenderbegivenheder og sende e-mail til gæster uden ejerens viden"</string>
+    <string name="permlab_writeCalendar" msgid="8438874755193825647">"tilføje eller ændre kalenderbegivenheder og sende mail til gæster uden ejerens viden"</string>
     <string name="permdesc_writeCalendar" product="tablet" msgid="1675270619903625982">"Denne app kan tilføje, fjerne eller ændre kalenderbegivenheder på din tablet. Denne app kan sende meddelelser, der kan se ud, som om de kommer fra kalenderejere, eller ændre begivenheder uden at give ejeren besked."</string>
     <string name="permdesc_writeCalendar" product="tv" msgid="9017809326268135866">"Denne app kan tilføje, fjerne eller ændre kalenderbegivenheder på dit fjernsyn. Denne app kan sende meddelelser, der kan se ud, som om de kommer fra kalenderejere, eller ændre begivenheder uden at give ejeren besked."</string>
     <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Denne app kan tilføje, fjerne eller ændre kalenderbegivenheder på din telefon. Denne app kan sende meddelelser, der kan se ud, som om de kommer fra kalenderejere, eller ændre begivenheder uden at give ejeren besked."</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke genkendt"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeraftrykket blev godkendt"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardwaren til fingeraftryk er ikke tilgængelig."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeraftrykket kan ikke gemmes. Fjern et eksisterende fingeraftryk."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string>
@@ -779,7 +777,7 @@
     <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Oplåsning af konto"</string>
     <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"For mange forsøg på at tegne mønstret korrekt"</string>
     <string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Lås op ved at logge ind med din Google-konto."</string>
-    <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Brugernavn (e-mail)"</string>
+    <string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"Brugernavn (mail)"</string>
     <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"Adgangskode"</string>
     <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Log ind"</string>
     <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Ugyldigt brugernavn eller ugyldig adgangskode."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Send en mail til den valgte adresse"</string>
     <string name="dial" msgid="1253998302767701559">"Ring op"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ring til det valgte telefonnummer"</string>
-    <string name="map" msgid="6521159124535543457">"Find"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Find den valgte adresse"</string>
+    <string name="map" msgid="5441053548030107189">"Kort"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Åbn"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Åbn den valgte webadresse"</string>
     <string name="sms" msgid="4560537514610063430">"Besked"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktiver"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Tjekker <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Tjekker aktuelt indhold"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nyt <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tryk for at konfigurere"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til overførsel af billeder og medier"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem med <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tryk for at løse problemet"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er beskadiget. Vælg for at rette."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> understøttes ikke"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Tryk for at konfigurere det til et understøttet format."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Denne enhed understøtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Vælg for at konfigurere mediet i et understøttet format."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> blev fjernet uventet"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Demonter mediet, inden du fjerner det, så du ikke mister dit indhold"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> er fjernet"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Nogle funktioner virker muligvis ikke som de skal. Indsæt en ny lagerenhed."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Skubber <xliff:g id="NAME">%s</xliff:g> ud"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Fjern ikke"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Skub ud"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Udforsk"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> er ikke til stede"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Indsæt enheden igen"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Flytter data"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Overførslen af indhold er udført"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Indholdet blev flyttet til <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Indholdet kunne ikke flyttes"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Prøv at flytte indholdet igen"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Fjernet"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Skubbet ud"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerer…"</string>
@@ -1544,7 +1528,7 @@
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Pinkoderne stemmer ikke overens"</string>
     <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"For mange forsøg på at tegne mønstret korrekt"</string>
     <string name="kg_login_instructions" msgid="1100551261265506448">"Lås op ved at logge ind med din Google-konto."</string>
-    <string name="kg_login_username_hint" msgid="5718534272070920364">"Brugernavn (e-mail)"</string>
+    <string name="kg_login_username_hint" msgid="5718534272070920364">"Brugernavn (mail)"</string>
     <string name="kg_login_password_hint" msgid="9057289103827298549">"Adgangskode"</string>
     <string name="kg_login_submit_button" msgid="5355904582674054702">"Log ind"</string>
     <string name="kg_login_invalid_input" msgid="5754664119319872197">"Ugyldigt brugernavn eller ugyldig adgangskode."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kort er ikke aktiveret for tale"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort er ikke tilladt for tale"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon er ikke tilladt for tale"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tilladt"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke provisioneret"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tilladt"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tilladt"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Pop op-vindue"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> mere"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Appversionen er nedgraderet, eller også er den ikke kompatibel med denne genvej"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 97298b1..935f9e1 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Keine Anrufe"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Keine Anrufe oder Notrufe"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Vorübergehend von deinem Mobilfunkanbieter deaktiviert"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Von deinem Mobilfunkanbieter für SIM <xliff:g id="SIMNUMBER">%d</xliff:g> vorübergehend deaktiviert"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobilfunknetz nicht erreichbar"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Versuche, das bevorzugte Netzwerk zu ändern. Tippe, um ein anderes auszuwählen."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Notrufe nicht möglich"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nicht erkannt"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerabdruck wurde authentifiziert"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerabdruckhardware nicht verfügbar"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuche es erneut."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"E-Mail an ausgewählte Adresse senden"</string>
     <string name="dial" msgid="1253998302767701559">"Anrufen"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ausgewählte Telefonnummer anrufen"</string>
-    <string name="map" msgid="6521159124535543457">"Suchen"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Ausgewählte Adresse finden"</string>
+    <string name="map" msgid="5441053548030107189">"Karte"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Öffnen"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Ausgewählte URL öffnen"</string>
     <string name="sms" msgid="4560537514610063430">"SMS"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Deaktivieren"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> wird geprüft…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Aktuelle Inhalte werden geprüft"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Neues Speichergerät (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Zum Einrichten tippen"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Zum Übertragen von Fotos und Medien"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem mit <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tippen, um das Problem zu beheben"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt. Zur Problembehebung auswählen."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nicht unterstützt"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zum Einrichten in einem unterstützten Format tippen."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> wird von diesem Gerät nicht unterstützt. Zur Einrichtung eines unterstützten Formats auswählen."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> wurde unerwartet entfernt"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Lass das Speichergerät vor dem Entfernen auswerfen, damit keine Daten verloren gehen"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> wurde entfernt"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Einige Funktionen können möglicherweise nicht richtig genutzt werden. Sorge dafür, dass ein neues Speichergerät genutzt werden kann."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> wird ausgeworfen"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nicht entfernen"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Einrichten"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Auswerfen"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Ansehen"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> fehlt"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Gerät wieder einlegen"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> wird verschoben"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Daten werden verschoben"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Die Inhalte wurden übertragen"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Inhalte auf <xliff:g id="NAME">%s</xliff:g> verschoben"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Verschieben nicht möglich"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Versuch noch einmal, die Inhalte zu verschieben"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Entfernt"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ausgeworfen"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Wird überprüft…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM nicht für Sprachfunktion eingerichtet"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM unterstützt die Sprachfunktion nicht"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone unterstützt Sprachfunktion nicht"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ist nicht zulässig"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ist nicht eingerichtet"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ist nicht zulässig"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ist nicht zulässig"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up-Fenster"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Die App-Version wurde zurückgestuft oder ist mit dieser Verknüpfung nicht kompatibel"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 6c42468..3c91e66 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ΑποστολÎź μηνύματος ηλεκτρονικού ταχυδρομεÎŻου στην επιλεγμένη διεύθυνση ηλεκτρονικού ταχυδρομεÎŻου"</string>
     <string name="dial" msgid="1253998302767701559">"ΚλÎźση"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ΚλÎźση επιλεγμένου αριθμού τηλεφώνου"</string>
-    <string name="map" msgid="6521159124535543457">"Εντοπισμός"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Εντοπισμός επιλεγμένης διεύθυνσης"</string>
+    <string name="map" msgid="5441053548030107189">"ΧÎŹρτης"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Άνοιγμα"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Άνοιγμα επιλεγμένου URL"</string>
     <string name="sms" msgid="4560537514610063430">"ΜÎźνυμα"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index e7f40b0..edd19d7 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
     <string name="dial" msgid="1253998302767701559">"Call"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
-    <string name="map" msgid="6521159124535543457">"Locate"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
+    <string name="map" msgid="5441053548030107189">"Map"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Open"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
     <string name="sms" msgid="4560537514610063430">"Message"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 21115a8..856be3f 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
     <string name="dial" msgid="1253998302767701559">"Call"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
-    <string name="map" msgid="6521159124535543457">"Locate"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
+    <string name="map" msgid="5441053548030107189">"Map"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Open"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
     <string name="sms" msgid="4560537514610063430">"Message"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index e7f40b0..edd19d7 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
     <string name="dial" msgid="1253998302767701559">"Call"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
-    <string name="map" msgid="6521159124535543457">"Locate"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
+    <string name="map" msgid="5441053548030107189">"Map"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Open"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
     <string name="sms" msgid="4560537514610063430">"Message"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index e7f40b0..edd19d7 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Email selected address"</string>
     <string name="dial" msgid="1253998302767701559">"Call"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Call selected phone number"</string>
-    <string name="map" msgid="6521159124535543457">"Locate"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Locale selected address"</string>
+    <string name="map" msgid="5441053548030107189">"Map"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Open"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Open selected URL"</string>
     <string name="sms" msgid="4560537514610063430">"Message"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 09d735b..462fd4b 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -1013,8 +1013,8 @@
     <string name="email_desc" msgid="3638665569546416795">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎‏‏‎Email selected address‎‏‎‎‏‎"</string>
     <string name="dial" msgid="1253998302767701559">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‏‏‎Call‎‏‎‎‏‎"</string>
     <string name="dial_desc" msgid="6573723404985517250">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‏‎‎Call selected phone number‎‏‎‎‏‎"</string>
-    <string name="map" msgid="6521159124535543457">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎Locate‎‏‎‎‏‎"</string>
-    <string name="map_desc" msgid="9036645769910215302">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‎Locale selected address‎‏‎‎‏‎"</string>
+    <string name="map" msgid="5441053548030107189">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‎‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎Map‎‏‎‎‏‎"</string>
+    <string name="map_desc" msgid="1836995341943772348">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‎Locate selected address‎‏‎‎‏‎"</string>
     <string name="browse" msgid="1245903488306147205">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‏‎‏‎‎‏‎‏‎‏‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‏‎Open‎‏‎‎‏‎"</string>
     <string name="browse_desc" msgid="8220976549618935044">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‏‎‎‎Open selected URL‎‏‎‎‏‎"</string>
     <string name="sms" msgid="4560537514610063430">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎Message‎‏‎‎‏‎"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 8a58972..e48efb5 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu proveedor"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"El proveedor desactivó temporalmente el servicio para la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede acceder a la red móvil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Presiona para cambiar la red preferida."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se autenticó la huella digital"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware para detectar huellas digitales no está disponible."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Enviar un correo electrónico a la dirección seleccionada"</string>
     <string name="dial" msgid="1253998302767701559">"Llamar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
-    <string name="map" msgid="6521159124535543457">"Buscar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Abrir la dirección seleccionada en el mapa"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abrir URL seleccionada"</string>
     <string name="sms" msgid="4560537514610063430">"Mensaje"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Revisando <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Revisando el contenido actual"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nuevo dispositivo: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Presiona para configurar"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y contenido multimedia"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema con <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Presiona para solucionar el problema"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> se dañó. Selecciona el medio para solucionar el problema."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> no es compatible"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no es compatible con <xliff:g id="NAME">%s</xliff:g>. Presiona la pantalla para configurarlo en un formato compatible."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Este dispositivo no es compatible con: <xliff:g id="NAME">%s</xliff:g>. Selecciona para configurar el medio en un formato compatible."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Se extrajo <xliff:g id="NAME">%s</xliff:g> de forma inesperada."</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Expulsa los dispositivos multimedia antes de extraerlos para evitar la pérdida de contenido"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Se quitó <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Es posible que algunas funciones no funcionen correctamente. Inserta un nuevo dispositivo de almacenamiento."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Expulsando <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"No quites el medio externo"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"No se encuentra dispositivo <xliff:g id="NAME">%s</xliff:g>."</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Vuelve a insertar dispositivo"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfiriendo la aplicación <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Transfiriendo los datos"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Se transfirió el contenido"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Se transfirió el contenido a <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"No se pudo transferir contenido"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Vuelve a transferir el contenido"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"No se brindó una SIM para las acciones de voz"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"La SIM no admite acciones de voz"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"El teléfono no admite acciones de voz"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"No se admite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"No se aprovisionó la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"No se admite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"No se admite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La app pasó a una versión anterior o no es compatible con este acceso directo"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ec406d4..a07e6c1 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Sin servicio de voz"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"No hay ningún servicio de voz ni de llamadas de emergencia"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Desactivado temporalmente por tu operador"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tu operador ha desactivado el servicio de la SIM <xliff:g id="SIMNUMBER">%d</xliff:g> de forma temporal"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"No se puede establecer conexión con la red móvil"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Toca para cambiar la red preferida."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Servicio de llamadas de emergencia no disponible"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se ha autenticado la huella digital"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware de huella digital no está disponible."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Enviar un correo electrónico a la dirección seleccionada"</string>
     <string name="dial" msgid="1253998302767701559">"Llamar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Llamar al número de teléfono seleccionado"</string>
-    <string name="map" msgid="6521159124535543457">"Localizar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Abrir la dirección seleccionada en el mapa"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abrir la URL seleccionada"</string>
     <string name="sms" msgid="4560537514610063430">"Mensaje"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desactivar"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Comprobando <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Revisando el contenido actual"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nueva unidad: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toca para configurar"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Para transferir fotos y multimedia"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema con <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Toca para solucionar el problema"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> está dañada. Selecciónala para arreglarla."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Medio externo (<xliff:g id="NAME">%s</xliff:g>) no admitido"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"El dispositivo no admite este medio externo (<xliff:g id="NAME">%s</xliff:g>). Toca para configurarlo con un formato admitido."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"El dispositivo no admite esta <xliff:g id="NAME">%s</xliff:g>. Selecciónala para configurarla en un formato admitido."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Extracción inesperada de <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Extrae el dispositivo de forma segura antes de sacarlo para evitar perder contenido"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> se ha extraído"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Es posible que algunas funciones no funcionen correctamente. Inserta una unidad de almacenamiento."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Expulsando <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"No extraer"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Expulsar"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Explorar"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Falta <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Introduce el dispositivo"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Moviendo <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Moviendo datos"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"La transferencia ha finalizado"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"El contenido se ha movido a <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"No se pudo mover el contenido"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Intenta mover el contenido de nuevo"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Extraído"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Expulsado"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Comprobando..."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM no proporcionada para voz"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM no permitida para voz"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Teléfono no permitido para voz"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"No se permite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"La SIM <xliff:g id="SIMNUMBER">%d</xliff:g> no se ha aprovisionado"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"No se permite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"No se permite la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Se ha instalado una versión anterior de la aplicación o no es compatible con este acceso directo"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 1dd6cef..2e75289 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Häälkõned pole saadaval"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Häälteenused ja hädaabikõned puuduvad"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Operaator on ajutiselt välja lülitanud"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Operaator on SIM-kaardi <xliff:g id="SIMNUMBER">%d</xliff:g> puhul ajutiselt välja lülitanud"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiilsidevõrguga ei saa ühendust"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Proovige eelistatud võrku vahetada. Puudutage muutmiseks."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hädaabikõned pole saadaval"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tuvastatud"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sõrmejälg autenditi"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sõrmejälje riistvara pole saadaval."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Valitud aadressile meili saatmine"</string>
     <string name="dial" msgid="1253998302767701559">"Helista"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Valitud telefoninumbrile helistamine"</string>
-    <string name="map" msgid="6521159124535543457">"Leia"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Valitud aadressi leidmine"</string>
+    <string name="map" msgid="5441053548030107189">"Kaart"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ava"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Valitud URL-i avamine"</string>
     <string name="sms" msgid="4560537514610063430">"Saada sõnum"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> kuvat. teiste rakenduste peal"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Lülita välja"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Üksuse <xliff:g id="NAME">%s</xliff:g> kontrollimine …"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Kontrollitakse praegust sisu"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Uus üksus <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Puudutage seadistamiseks"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotode ja meedia ülekandmiseks"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Probleem üksusega <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Puudutage parandamiseks"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Kaart <xliff:g id="NAME">%s</xliff:g> on rikutud. Valige parandamiseks."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Toetamata <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"See seade ei toeta üksust <xliff:g id="NAME">%s</xliff:g>. Puudutage toetatud vormingus seadistamiseks."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"See seade ei toeta kaarti <xliff:g id="NAME">%s</xliff:g>. Valige toetatud vormingus seadistamiseks."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Üksus <xliff:g id="NAME">%s</xliff:g> eemaldati ootamatult"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Enne eemaldamist väljutage meedia, et vältida sisu kaotsiminekut"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> on eemaldatud"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Mõni funktsiooni ei pruugi õigesti töötada. Sisestage uus salvestusseade."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Üksuse <xliff:g id="NAME">%s</xliff:g> väljutamine …"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ärge eemaldage"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Seadistus"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Eemaldamine"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Avastamine"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Üksust <xliff:g id="NAME">%s</xliff:g> pole"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Sisestage seade uuesti"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Seadme <xliff:g id="NAME">%s</xliff:g> teisaldamine"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Andmete teisaldamine"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Sisu ülekandmine õnnestus"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Sisu teisaldati asukohta <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Sisu ei õnnestunud teisaldada"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Proovige sisu uuesti teisaldada"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Eemaldatud"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Väljutatud"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollimine ..."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kaart pole häälega kasutamiseks ettevalmistatud"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kaarti ei lubata häälega kasutada"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoni ei lubata häälega kasutada"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kaart <xliff:g id="SIMNUMBER">%d</xliff:g> pole lubatud"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-kaart <xliff:g id="SIMNUMBER">%d</xliff:g> on ettevalmistamata"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kaart <xliff:g id="SIMNUMBER">%d</xliff:g> pole lubatud"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kaart <xliff:g id="SIMNUMBER">%d</xliff:g> pole lubatud"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Hüpikaken"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Rakendus viidi üle vanemale versioonile või see ei ühildu selle otseteega"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index c576129..27bfedf 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ez dago ahots-deien zerbitzurik"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ez dago ahozko zerbitzurik eta ezin da egin larrialdi-deirik"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Operadoreak desaktibatu egin du aldi baterako"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Operadoreak <xliff:g id="SIMNUMBER">%d</xliff:g> SIM txartela desaktibatu egin du aldi baterako"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ezin da konektatu sare mugikorrera"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Aldatu sare hobetsia. Sakatu aldatzeko."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Ezin da egin larrialdi-deirik"</string>
@@ -147,7 +146,7 @@
     <string name="httpErrorOk" msgid="1191919378083472204">"Ados"</string>
     <string name="httpError" msgid="7956392511146698522">"Sareko errore bat gertatu da."</string>
     <string name="httpErrorLookup" msgid="4711687456111963163">"Ezin izan da URLa aurkitu."</string>
-    <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Gunearen autentifikazio-eskema ez da onartzen."</string>
+    <string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"Webgunearen autentifikazio-eskema ez da onartzen."</string>
     <string name="httpErrorAuth" msgid="1435065629438044534">"Ezin izan da autentifikatu."</string>
     <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Proxy zerbitzariaren bidezko autentifikazioak huts egin du."</string>
     <string name="httpErrorConnect" msgid="8714273236364640549">"Ezin izan da zerbitzarira konektatu."</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ez da ezagutzen"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentifikatu da hatz-marka"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hatz-markaren hardwarea ez dago erabilgarri."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string>
@@ -866,7 +864,7 @@
     <string name="permlab_addVoicemail" msgid="5525660026090959044">"gehitu erantzungailua"</string>
     <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Erantzungailuko sarrera-ontzian mezuak gehitzea baimentzen die aplikazioei."</string>
     <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"aldatu arakatzailearen geokokapenaren baimenak"</string>
-    <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Arakatzailearen geokokapenaren baimenak aldatzea baimentzen die aplikazioei. Aplikazio gaiztoek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako web-orrietara bidaltzeko."</string>
+    <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Arakatzailearen geokokapenaren baimenak aldatzea baimentzen die aplikazioei. Aplikazio gaiztoek hori erabil dezakete kokapenari buruzko informazioa haiek hautatutako webguneetara bidaltzeko."</string>
     <string name="save_password_message" msgid="767344687139195790">"Arakatzaileak pasahitza gogoratzea nahi duzu?"</string>
     <string name="save_password_notnow" msgid="6389675316706699758">"Ez une honetan"</string>
     <string name="save_password_remember" msgid="6491879678996749466">"Gogoratu"</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Bidali mezu elektroniko bat hautatutako helbidera"</string>
     <string name="dial" msgid="1253998302767701559">"Deitu"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Deitu hautatutako telefono-zenbakira"</string>
-    <string name="map" msgid="6521159124535543457">"Aurkitu"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Bilatu hautatutako helbidea"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ireki"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Ireki hautatutako URLa"</string>
     <string name="sms" msgid="4560537514610063430">"Bidali mezua"</string>
@@ -1274,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"Besteen gainean agertzen da <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Desaktibatu"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> egiaztatzen…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Uneko edukia berrikusten"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Euskarri berria: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Sakatu konfiguratzeko"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Argazkiak eta multimedia-fitxategiak transferitzeko"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Arazo bat dago honekin: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Sakatu konpontzeko"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Hondatuta dago <xliff:g id="NAME">%s</xliff:g>. Hauta ezazu konpontzeko."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Ez da onartzen <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Sakatu onartzen den formatu batean konfiguratzeko."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Gailuak ez du <xliff:g id="NAME">%s</xliff:g> onartzen. Hauta ezazu onartzen den formatu batean konfiguratzeko."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ustekabean kendu da"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Kendu aurretik, kanporatu euskarria edukirik ez galtzeko"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Kendu egin da <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Funtzio batzuek agian ez dute behar bezala funtzionatuko. Sartu biltegiratze-gailu berria."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> kanporatzen"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ez kendu"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Konfiguratu"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Atera"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Arakatu"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Ez dago <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Sartu gailua berriro"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> mugitzen"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Datuak mugitzen"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transferitu da edukia"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Eraman da edukia <xliff:g id="NAME">%s</xliff:g> gailura"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ezin izan da mugitu edukia"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Saiatu berriro edukia mugitzen"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Kendu egin da"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Kanporatu egin da"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Egiaztatzen…"</string>
@@ -1864,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM txartela ez dago hornituta ahotsa erabiltzeko"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM txartela ezin da erabili ahotsa erabiltzeko"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonoa ezin da erabili ahotsa erabiltzeko"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Ezin da erabili <xliff:g id="SIMNUMBER">%d</xliff:g> SIM txartela"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Ez dago <xliff:g id="SIMNUMBER">%d</xliff:g> SIM txartelik"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Ezin da erabili <xliff:g id="SIMNUMBER">%d</xliff:g> SIM txartela"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Ezin da erabili <xliff:g id="SIMNUMBER">%d</xliff:g> SIM txartela"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Leiho gainerakorra"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"Beste <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikazioaren bertsio zaharrago batera aldatu da, edo aplikazioa ez da lasterbide honekin bateragarria"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 7738505..121345c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Ű§Ű±ŰłŰ§Ù„ Ű±Ű§ÛŒŰ§Ù†Ű§Ù…Ù‡ ŰšÙ‡ Ù†ŰŽŰ§Ù†ÛŒ Ű§Ù†ŰȘŰźŰ§ŰšÛŒ"</string>
     <string name="dial" msgid="1253998302767701559">"ŰȘÙ…Ű§Űł"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ŰȘÙ…Ű§Űł ۚۧ ŰŽÙ…Ű§Ű±Ù‡ ŰȘلفن Ű§Ù†ŰȘŰźŰ§ŰšÛŒ"</string>
-    <string name="map" msgid="6521159124535543457">"Ù…Ú©Ű§Ù†‌ÛŒŰ§ŰšÛŒ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Ù…Ú©Ű§Ù†‌ÛŒŰ§ŰšÛŒ Ù†ŰŽŰ§Ù†ÛŒ Ű§Ù†ŰȘŰźŰ§ŰšÛŒ"</string>
+    <string name="map" msgid="5441053548030107189">"Ù†Ù‚ŰŽÙ‡"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ۚۧŰČ Ú©Ű±ŰŻÙ†"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ۚۧŰČ Ú©Ű±ŰŻÙ† Ù†ŰŽŰ§Ù†ÛŒ ÙˆŰš Ű§Ù†ŰȘŰźŰ§ŰšÛŒ"</string>
     <string name="sms" msgid="4560537514610063430">"ÙŸÛŒŰ§Ù…"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index b119911..acbe970 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ei äänipuheluja"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ei äänipalvelua tai hätäpuheluita"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Operaattorin tilapäisesti käytöstä poistama"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Operaattori poisti tämän väliaikaisesti käytöstä SIM-kortilla <xliff:g id="SIMNUMBER">%d</xliff:g>."</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobiiliverkkoon ei saada yhteyttä"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Kokeile vaihtaa ensisijaista verkkoa. Vaihda se napauttamalla."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Hätäpuhelut eivät ole käytettävissä"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tunnistettu"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sormenjälki tunnistettu"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sormenjälkilaitteisto ei ole käytettävissä."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Lähetä sähköposti valittuun osoitteeseen"</string>
     <string name="dial" msgid="1253998302767701559">"Soita"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Soita valittuun puhelinnumeroon"</string>
-    <string name="map" msgid="6521159124535543457">"Paikanna"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Etsi valittu osoite kartalta"</string>
+    <string name="map" msgid="5441053548030107189">"Kartta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Avaa"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Avaa valittu URL-osoite"</string>
     <string name="sms" msgid="4560537514610063430">"Viesti"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> näkyy sovellusten päällä"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Poista käytöstä"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> tarkastetaan…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Tarkastetaan nykyistä sisältöä"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Uusi <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Määritä koskettamalla."</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Kuvien ja median siirtämiseen"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Ongelma: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Korjaa napauttamalla."</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> on viallinen. Korjaa valitsemalla."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Epäyhteensopiva <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"<xliff:g id="NAME">%s</xliff:g> ei ole yhteensopiva tämän laitteen kanssa. Ota se käyttöön tuetussa tilassa napauttamalla."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Tämä laite ei tue laitetta <xliff:g id="NAME">%s</xliff:g>. Valitse laite, niin voit suorittaa määrityksen tuetussa muodossa."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> poistettiin yllättäen"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Poista media ennen sen irrottamista, niin et menetä sisältöä."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> poistettu"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Kaikki ominaisuudet eivät ehkä toimi kunnolla. Liitä uusi tallennuslaite."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> poistetaan…"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Älä irrota"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Määritä asetukset"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Poista"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Tutustu"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> puuttuu."</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Liitä laite uudelleen"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Siirretään <xliff:g id="NAME">%s</xliff:g>."</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Siirretään tietoja."</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Sisältö siirretty"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Sisältö siirretty paikkaan <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Sisällön siirto epäonnistui"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Yritä uudelleen siirtää sisältöä"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Irrotettu"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Poistettu"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Tarkistetaan…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kortti ei käyttäjien hallinnassa"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Äänipalvelujen käyttö ei sallittua SIM-kortilla"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Äänipalvelujen käyttö ei sallittua puhelimella"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kortti <xliff:g id="SIMNUMBER">%d</xliff:g> hylätty"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-kortille <xliff:g id="SIMNUMBER">%d</xliff:g> ei ole käyttäjänhallintaa"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kortti <xliff:g id="SIMNUMBER">%d</xliff:g> hylätty"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kortti <xliff:g id="SIMNUMBER">%d</xliff:g> hylätty"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Ponnahdusikkuna"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Sovellusversio on päivitetty vanhempaan versioon tai ei ole yhteensopiva tämän pikakuvakkeen kanssa."</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index fd5ab0a..bffe248 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun de service vocal ni d\'appel d\'urgence"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Temporairement désactivé par votre fournisseur de services"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Temporairement désactivé par votre fournisseur de services pour la carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible de joindre le réseau cellulaire"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer de réseau préféré. Touchez l\'écran pour changer."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Le service d\'appel d\'urgence n\'est pas accessible"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"désactiver le verrouillage de l\'écran"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"utiliser le matériel biométrique"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Permet à l\'application d\'utiliser du matériel biométrique pour l\'authentification"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"gérer le matériel d\'empreinte digitale"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Permet à l\'application de faire appel à des méthodes d\'ajout et de suppression de modèles d\'empreinte digitale que vous pouvez utiliser."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"utiliser le matériel d\'empreinte digitale"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Doigt non reconnu"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"Mode de saisie"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"Actions sur le texte"</string>
     <string name="email" msgid="4560673117055050403">"Courriel"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"Envoyer un courriel à l\'adresse sélectionnée"</string>
     <string name="dial" msgid="1253998302767701559">"Appel"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"Localiser"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"Téléphoner au numéro sélectionné"</string>
+    <string name="map" msgid="5441053548030107189">"Carte"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"Ouvrir l\'adresse URL sélectionnée"</string>
     <string name="sms" msgid="4560537514610063430">"Message"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"Envoyer un message texte au numéro de téléphone sélectionné"</string>
     <string name="add_contact" msgid="7867066569670597203">"Ajouter"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"Ajouter aux contacts"</string>
     <string name="view_calendar" msgid="979609872939597838">"Afficher"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"Voir la date sélectionnée dans l\'agenda"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"Calendrier"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planifier un événement pour l\'heure sélectionnée"</string>
     <string name="view_flight" msgid="7691640491425680214">"Effectuer le suivi"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"Faire le suivi du vol sélectionné"</string>
     <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string>
     <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
     <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1284,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> aff. contenu par-dessus applis"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalités, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Vérification de <xliff:g id="NAME">%s</xliff:g> en cours…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Vérification du contenu actuel"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouveau périphérique <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Toucher pour configurer"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer des photos et d\'autres fichiers"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Il y a un problème avec <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Touchez la notification pour corriger la situation"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Le média « <xliff:g id="NAME">%s</xliff:g> » est corrompu. Sélectionnez-le pour corriger la situation."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage « <xliff:g id="NAME">%s</xliff:g> ». Touchez pour la configurer dans un format compatible."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Cet appareil ne prend pas en charge ce média « <xliff:g id="NAME">%s</xliff:g> ». Sélectionnez-le pour le configurer dans un format compatible."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de la mémoire « <xliff:g id="NAME">%s</xliff:g> »"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Éjectez les périphériques avant de les retirer pour éviter toute perte de données."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> retiré(e)"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Il se peut que certaines fonctionnalités ne fonctionnent pas correctement. Veuillez insérer un nouveau dispositif de stockage."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Éjection de <xliff:g id="NAME">%s</xliff:g> en cours…"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne pas retirer"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Découvrir"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage <xliff:g id="NAME">%s</xliff:g> manquante"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez l\'appareil de nouveau"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Déplacement de <xliff:g id="NAME">%s</xliff:g> en cours..."</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données..."</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Transfert de contenu terminé"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenu déplacé vers <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossible de déplacer le contenu"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Essayez de déplacer le contenu de nouveau"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Supprimée"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Éjectée"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Vérification en cours…"</string>
@@ -1874,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Cette carte SIM n\'est pas autorisée pour la voix"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ce téléphone n\'est pas autorisé pour la voix"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas configurée"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"La carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> n\'est pas autorisée"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre contextuelle"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application a été rétrogradée ou n\'est pas compatible avec ce raccourci"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f167b6f..8a19b4f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Aucun service vocal"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Aucun service vocal ni d\'appels d\'urgence"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Service temporairement désactivé par votre opérateur"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Service temporairement désactivé par votre opérateur concernant la carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossible d\'accéder au réseau mobile"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Essayez de changer le réseau préféré. Appuyez pour le modifier."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Appels d\'urgence non disponibles"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non reconnu"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Envoyer un e-mail à l\'adresse sélectionnée"</string>
     <string name="dial" msgid="1253998302767701559">"Appeler"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Appeler le numéro de téléphone sélectionné"</string>
-    <string name="map" msgid="6521159124535543457">"Localiser"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localiser l\'adresse sélectionnée"</string>
+    <string name="map" msgid="5441053548030107189">"Carte"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Ouvrir l\'URL sélectionnée"</string>
     <string name="sms" msgid="4560537514610063430">"Envoyer un message"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se superpose aux autres applis"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Désactiver"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Vérification de \"<xliff:g id="NAME">%s</xliff:g>\"…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Vérification du contenu actuel"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nouveau périphérique : <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Appuyer pour configurer"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Pour transférer photos et fichiers"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problème avec : <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Appuyez sur la notification pour résoudre le problème"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"La <xliff:g id="NAME">%s</xliff:g> est corrompue. Sélectionnez cette option pour résoudre le problème."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non compatible"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Cet appareil n\'est pas compatible avec la mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\". Appuyez ici pour le configurer dans un format accepté."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Cet appareil n\'est pas compatible avec cette <xliff:g id="NAME">%s</xliff:g>. Sélectionnez cette option pour la configurer dans un format accepté."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Retrait inattendu de mémoire \"<xliff:g id="NAME">%s</xliff:g>\""</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Éjectez le périphérique externe avant de le retirer pour éviter toute perte de contenu"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> supprimé"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Certaines fonctionnalités risquent de ne pas s\'exécuter correctement. Insérez un nouveau périphérique de stockage externe."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Éjection de \"<xliff:g id="NAME">%s</xliff:g>\""</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne retirez pas le périphérique"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurer"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Éjecter"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Parcourir"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" manquante"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Insérez le périphérique"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Transfert de l\'application <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Déplacement des données en cours"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Le contenu a bien été déplacé"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenu déplacé vers : <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossible de déplacer le contenu"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Nouvelle tentative de déplacement du contenu"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Supprimé"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Éjecté"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Vérification en cours…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Carte SIM non provisionnée pour les commandes vocales"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Carte SIM non autorisée pour les commandes vocales"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Téléphone non autorisé pour les commandes vocales"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non autorisée"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non provisionnée"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non autorisée"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Carte SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non autorisée"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre pop-up"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> autres"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application est revenue à une version antérieure ou n\'est pas compatible avec cet raccourci"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 9bbc82a..0440f3e 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Envía un correo electrónico ao enderezo seleccionado"</string>
     <string name="dial" msgid="1253998302767701559">"Chamar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Chama ao número de teléfono seleccionado"</string>
-    <string name="map" msgid="6521159124535543457">"Localizar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localiza o enderezo seleccionado"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abre o URL seleccionado"</string>
     <string name="sms" msgid="4560537514610063430">"Mensaxe"</string>
@@ -1024,7 +1025,7 @@
     <string name="view_calendar" msgid="979609872939597838">"Ver"</string>
     <string name="view_calendar_desc" msgid="5828320291870344584">"Consulta a hora seleccionada no calendario"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
-    <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programa o evento para a hora seleccionada"</string>
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"Programa un evento para unha data seleccionada"</string>
     <string name="view_flight" msgid="7691640491425680214">"Realizar seguimento"</string>
     <string name="view_flight_desc" msgid="3876322502674253506">"Fai un seguimento do voo seleccionado"</string>
     <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Estase esgotando o espazo de almacenamento"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 1ea5c5a..8690318 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àȘ•à«‹àȘˆ àȘ”ૉàȘ‡àȘž àȘžà«‡àȘ”àȘŸ àȘšàȘ„ી"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àȘ•à«‹àȘˆ àȘ”ૉàȘ‡àȘž àȘžà«‡àȘ”àȘŸ àȘ…àȘ„àȘ”àȘŸ àȘ•àȘŸà«‹àȘ•àȘŸà«€àȘšà«€ àȘ•à«‰àȘČàȘżàȘ‚àȘ— àȘžà«‡àȘ”àȘŸ àȘšàȘ„ી"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àȘ€àȘźàȘŸàȘ°àȘŸ àȘ•à«…àȘ°àȘżàȘ…àȘ°à«‡ àȘčàȘ‚àȘ—àȘŸàȘźà«€ àȘ°à«‚àȘȘે àȘŹàȘ‚àȘ§ àȘ•àȘ°à«€ àȘ›à«‡"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"àȘ€àȘźàȘŸàȘ°àȘŸ àȘ•à«…àȘ°àȘżàȘ…àȘ° àȘŠà«àȘ”àȘŸàȘ°àȘŸ àȘžàȘżàȘź <xliff:g id="SIMNUMBER">%d</xliff:g> àȘźàȘŸàȘŸà«‡ àȘčàȘ‚àȘ—àȘŸàȘźà«€ àȘ°à«‚àȘȘે àȘŹàȘ‚àȘ§ àȘ•àȘ°à«‡àȘČ àȘ›à«‡"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àȘźà«‹àȘŹàȘŸàȘ‡àȘČ àȘšà«‡àȘŸàȘ”àȘ°à«àȘ• àȘžà«àȘ§à«€ àȘȘàȘčોàȘ‚àȘšà«€ àȘ¶àȘ•àȘŸàȘ€à«àȘ‚ àȘšàȘ„ી"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"àȘȘàȘžàȘ‚àȘŠàȘ—à«€àȘšà«àȘ‚ àȘšà«‡àȘŸàȘ”àȘ°à«àȘ• àȘŹàȘŠàȘČàȘ”àȘŸàȘšà«‹ àȘȘ્àȘ°àȘŻàȘŸàȘž àȘ•àȘ°à«‹. àȘŹàȘŠàȘČàȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àȘ•àȘŸà«‹àȘ•àȘŸà«€àȘšà«€ àȘ•à«‰àȘČàȘżàȘ‚àȘ— àȘžà«‡àȘ”àȘŸ àȘ…àȘšà«àȘȘàȘČàȘŹà«àȘ§"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšàȘšà«‡ àȘšàȘżàȘ…àȘ° àȘ«à«€àȘČ્àȘĄ àȘ•àȘźà«àȘŻà«àȘšàȘżàȘ•à«‡àȘ¶àȘš (NFC) àȘŸà«…àȘ—, àȘ•àȘŸàȘ°à«àȘĄ àȘ…àȘšà«‡ àȘ°à«€àȘĄàȘ° àȘžàȘŸàȘ„ે àȘžàȘ‚àȘšàȘŸàȘ° àȘ•àȘ°àȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘે àȘ›à«‡."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àȘ€àȘźàȘŸàȘ°à«àȘ‚ àȘžà«àȘ•à«àȘ°à«€àȘš àȘČૉàȘ• àȘ…àȘ•à«àȘ·àȘź àȘ•àȘ°à«‹"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšàȘšà«‡ àȘ•à«€àȘČૉàȘ• àȘ…àȘšà«‡ àȘ•à«‹àȘˆàȘȘàȘŁ àȘžàȘ‚àȘ•àȘłàȘŸàȘŻà«‡àȘČ àȘȘàȘŸàȘžàȘ”àȘ°à«àȘĄ àȘžà«àȘ°àȘ•à«àȘ·àȘŸ àȘ…àȘ•à«àȘ·àȘź àȘ•àȘ°àȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘે àȘ›à«‡. àȘ‰àȘŠàȘŸàȘčàȘ°àȘŁ àȘ€àȘ°à«€àȘ•à«‡, àȘ‡àȘšàȘ•àȘźàȘżàȘ‚àȘ— àȘ«à«‹àȘš àȘ•à«‰àȘČ àȘȘ્àȘ°àȘŸàȘȘ્àȘ€ àȘ•àȘ°àȘ€à«€ àȘ”àȘ–àȘ€à«‡ àȘ«à«‹àȘš, àȘ•à«€àȘČૉàȘ•àȘšà«‡ àȘ…àȘ•à«àȘ·àȘź àȘ•àȘ°à«‡ àȘ›à«‡, àȘȘàȘ›à«€ àȘ•à«‰àȘČ àȘžàȘźàȘŸàȘȘ્àȘ€ àȘ„àȘˆ àȘœàȘ”àȘŸ àȘȘàȘ° àȘ•à«€àȘČૉàȘ• àȘ«àȘ°à«€àȘ„ી àȘžàȘ•à«àȘ·àȘź àȘ•àȘ°à«‡ àȘ›à«‡."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àȘŹàȘŸàȘŻà«‹àȘźà«‡àȘŸà«àȘ°àȘżàȘ• àȘčàȘŸàȘ°à«àȘĄàȘ”ેàȘ°àȘšà«‹ àȘ‰àȘȘàȘŻà«‹àȘ— àȘ•àȘ°à«‹"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àȘàȘȘàȘšà«‡ àȘȘ્àȘ°àȘźàȘŸàȘŁà«€àȘ•àȘ°àȘŁ àȘźàȘŸàȘŸà«‡ àȘŹàȘŸàȘŻà«‹àȘźà«‡àȘŸà«àȘ°àȘżàȘ• àȘčàȘŸàȘ°à«àȘĄàȘ”ેàȘ°àȘšà«‹ àȘ‰àȘȘàȘŻà«‹àȘ— àȘ•àȘ°àȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘે àȘ›à«‡"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘčàȘŸàȘ°à«àȘĄàȘ”ેàȘ°àȘšà«‡ àȘžàȘ‚àȘšàȘŸàȘČàȘżàȘ€ àȘ•àȘ°à«‹"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšàȘšà«‡ àȘ‰àȘȘàȘŻà«‹àȘ— àȘźàȘŸàȘŸà«‡ àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘšàȘźà«‚àȘšàȘŸ àȘ‰àȘźà«‡àȘ°àȘ”àȘŸ àȘ…àȘšà«‡ àȘ•àȘŸàȘąà«€ àȘšàȘŸàȘ–àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘȘàȘŠà«àȘ§àȘ€àȘżàȘ“àȘšà«€ àȘ”àȘżàȘšàȘ‚àȘ€à«€ àȘ•àȘ°àȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘે àȘ›à«‡."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘčàȘŸàȘ°à«àȘĄàȘ”ેàȘ°àȘšà«‹ àȘ‰àȘȘàȘŻà«‹àȘ— àȘ•àȘ°à«‹"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àȘ“àȘłàȘ–àȘŸàȘŻà«‡àȘČ àȘšàȘ„ી"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘȘ્àȘ°àȘźàȘŸàȘŁàȘżàȘ€ àȘ•àȘ°à«€"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘčàȘŸàȘ°à«àȘĄàȘ”ેàȘ° àȘ‰àȘȘàȘČàȘŹà«àȘ§ àȘšàȘ„ી."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘžàȘ‚àȘ—્àȘ°àȘčàȘżàȘ€ àȘ•àȘ°à«€ àȘ¶àȘ•àȘŸàȘ€à«€ àȘšàȘ„ી. àȘ•à«ƒàȘȘàȘŸ àȘ•àȘ°à«€àȘšà«‡ àȘ…àȘžà«àȘ€àȘżàȘ€à«àȘ”àȘźàȘŸàȘ‚àȘšà«€ àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸ àȘŠà«‚àȘ° àȘ•àȘ°à«‹."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"àȘ«àȘżàȘ‚àȘ—àȘ°àȘȘ્àȘ°àȘżàȘšà«àȘŸàȘšà«‹ àȘžàȘźàȘŻ àȘŹàȘŸàȘč્àȘŻ àȘ„àȘŻà«‹. àȘ«àȘ°à«€ àȘȘ્àȘ°àȘŻàȘŸàȘž àȘ•àȘ°à«‹."</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àȘ‡àȘšàȘȘુàȘŸ àȘȘàȘŠà«àȘ§àȘ€àȘż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àȘŸà«‡àȘ•à«àȘžà«àȘŸ àȘ•à«àȘ°àȘżàȘŻàȘŸàȘ“"</string>
     <string name="email" msgid="4560673117055050403">"àȘ‡àȘźà«‡àȘ‡àȘČ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘàȘĄà«àȘ°à«‡àȘž àȘȘàȘ° àȘ‡àȘźà«‡àȘ‡àȘČ àȘźà«‹àȘ•àȘČો"</string>
     <string name="dial" msgid="1253998302767701559">"àȘ•à«‰àȘČ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àȘ¶à«‹àȘ§à«‹"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘ«à«‹àȘš àȘšàȘ‚àȘŹàȘ° àȘȘàȘ° àȘ•à«‰àȘČ àȘ•àȘ°à«‹"</string>
+    <string name="map" msgid="5441053548030107189">"àȘšàȘ•àȘ¶à«‹"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àȘ–à«‹àȘČો"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ URL àȘ–à«‹àȘČો"</string>
     <string name="sms" msgid="4560537514610063430">"àȘžàȘ‚àȘŠà«‡àȘ¶ àȘźà«‹àȘ•àȘČો"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘ«à«‹àȘš àȘšàȘ‚àȘŹàȘ° àȘȘàȘ° àȘžàȘ‚àȘŠà«‡àȘ¶ àȘźà«‹àȘ•àȘČો"</string>
     <string name="add_contact" msgid="7867066569670597203">"àȘ‰àȘźà«‡àȘ°à«‹"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àȘžàȘ‚àȘȘàȘ°à«àȘ•à«‹àȘźàȘŸàȘ‚ àȘ‰àȘźà«‡àȘ°à«‹"</string>
     <string name="view_calendar" msgid="979609872939597838">"àȘœà«àȘ“"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àȘ•à«…àȘČેàȘšà«àȘĄàȘ°àȘźàȘŸàȘ‚ àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘžàȘźàȘŻ àȘœà«àȘ“"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àȘ¶à«‡àȘĄà«àȘŻà«‚àȘČ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘžàȘźàȘŻ àȘźàȘŸàȘŸà«‡ àȘ‡àȘ”ેàȘšà«àȘŸ àȘ¶à«‡àȘĄà«àȘŻà«‚àȘČ àȘ•àȘ°à«‹"</string>
     <string name="view_flight" msgid="7691640491425680214">"àȘŸà«àȘ°à«…àȘ• àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‡àȘČ àȘ«à«àȘČàȘŸàȘ‡àȘŸàȘšà«‡ àȘŸà«àȘ°à«…àȘ• àȘ•àȘ°à«‹"</string>
     <string name="low_internal_storage_view_title" msgid="5576272496365684834">"àȘžà«àȘŸà«‹àȘ°à«‡àȘœ àȘžà«àȘ„àȘŸàȘš àȘžàȘźàȘŸàȘȘ્àȘ€ àȘ„àȘŻà«àȘ‚"</string>
     <string name="low_internal_storage_view_text" msgid="6640505817617414371">"àȘ•à«‡àȘŸàȘČàȘŸàȘ• àȘžàȘżàȘžà«àȘŸàȘź Tasks àȘ•àȘŸàȘź àȘ•àȘ°à«€ àȘ¶àȘ•àȘ¶à«‡ àȘšàȘčીàȘ‚"</string>
     <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"àȘžàȘżàȘžà«àȘŸàȘź àȘźàȘŸàȘŸà«‡ àȘȘàȘ°à«àȘŻàȘŸàȘȘ્àȘ€ àȘžà«àȘŸà«‹àȘ°à«‡àȘœ àȘšàȘ„ી. àȘ–àȘŸàȘ€àȘ°à«€ àȘ•àȘ°à«‹ àȘ•à«‡ àȘ€àȘźàȘŸàȘ°à«€ àȘȘàȘŸàȘžà«‡ 250MB àȘ–àȘŸàȘČી àȘžà«àȘ„àȘŸàȘš àȘ›à«‡ àȘ…àȘšà«‡ àȘ«àȘ°à«€àȘ„ી àȘȘ્àȘ°àȘŸàȘ°àȘ‚àȘ­ àȘ•àȘ°à«‹."</string>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> àȘ…àȘšà«àȘŻ àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšà«‹ àȘȘàȘ° àȘŠà«‡àȘ–àȘŸàȘˆ àȘ›à«‡"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"àȘœà«‹ àȘ€àȘźà«‡ àȘšàȘ„ી àȘ‡àȘšà«àȘ›àȘ€àȘŸ àȘ•à«‡ <xliff:g id="NAME">%s</xliff:g> àȘ† àȘžà«àȘ”àȘżàȘ§àȘŸàȘšà«‹ àȘ‰àȘȘàȘŻà«‹àȘ— àȘ•àȘ°à«‡, àȘ€à«‹ àȘžà«‡àȘŸàȘżàȘ‚àȘ—્àȘž àȘ–à«‹àȘČàȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹ àȘ…àȘšà«‡ àȘ€à«‡àȘšà«‡ àȘŹàȘ‚àȘ§ àȘ•àȘ°à«‹."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àȘŹàȘ‚àȘ§ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> àȘ€àȘȘàȘŸàȘžà«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àȘčàȘŸàȘČàȘšàȘŸ àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸàȘšà«‡ àȘ°àȘżàȘ”્àȘŻà«‚ àȘ•àȘ°àȘ”ુàȘ‚"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"àȘšàȘ”ુàȘ‚ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àȘžà«‡àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àȘ«à«‹àȘŸà«‹ àȘ…àȘšà«‡ àȘźà«€àȘĄàȘżàȘŻàȘŸ àȘŸà«àȘ°àȘŸàȘšà«àȘžàȘ«àȘ° àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>àȘšà«€ àȘžàȘźàȘžà«àȘŻàȘŸ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àȘ à«€àȘ• àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àȘŠà«‚àȘ·àȘżàȘ€ àȘ›à«‡. àȘžà«àȘ§àȘŸàȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‹."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"àȘ…àȘžàȘźàȘ°à«àȘ„àȘżàȘ€ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àȘ† àȘ‰àȘȘàȘ•àȘ°àȘŁ àȘ† <xliff:g id="NAME">%s</xliff:g> àȘšà«àȘ‚ àȘžàȘźàȘ°à«àȘ„àȘš àȘ•àȘ°àȘ€à«àȘ‚ àȘšàȘ„ી. àȘžàȘźàȘ°à«àȘ„àȘżàȘ€ àȘ«à«‹àȘ°à«àȘźà«‡àȘŸàȘźàȘŸàȘ‚ àȘžà«‡àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àȘ† àȘ‰àȘȘàȘ•àȘ°àȘŁ àȘ† <xliff:g id="NAME">%s</xliff:g> àȘšà«àȘ‚ àȘžàȘźàȘ°à«àȘ„àȘš àȘ•àȘ°àȘ€à«àȘ‚ àȘšàȘ„ી. àȘžàȘźàȘ°à«àȘ„àȘżàȘ€ àȘ«à«‰àȘ°à«àȘźà«‡àȘŸàȘźàȘŸàȘ‚ àȘžà«‡àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‹."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àȘ…àȘšàȘȘેàȘ•à«àȘ·àȘżàȘ€ àȘ°à«€àȘ€à«‡ àȘŠà«‚àȘ° àȘ•àȘ°à«àȘŻà«àȘ‚"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸ àȘ—ુàȘźàȘŸàȘ”àȘ”àȘŸàȘšà«àȘ‚ àȘŸàȘŸàȘłàȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘźà«€àȘĄàȘżàȘŻàȘŸàȘšà«‡ àȘŠà«‚àȘ° àȘ•àȘ°àȘ€àȘŸ àȘȘàȘčેàȘČàȘŸàȘ‚ àȘŹàȘčàȘŸàȘ° àȘ•àȘŸàȘąà«‹"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> àȘ•àȘŸàȘąà«€ àȘšàȘŸàȘ–્àȘŻà«àȘ‚"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àȘ•à«‡àȘŸàȘČીàȘ• àȘ•àȘŸàȘ°à«àȘŻàȘ•à«àȘ·àȘźàȘ€àȘŸ àȘ•àȘŠàȘŸàȘš àȘŻà«‹àȘ—્àȘŻ àȘ°à«€àȘ€à«‡ àȘ•àȘŸàȘź àȘš àȘ•àȘ°à«€ àȘ¶àȘ•à«‡. àȘšàȘ”ુàȘ‚ àȘžà«àȘŸà«‹àȘ°à«‡àȘœ àȘŠàȘŸàȘ–àȘČ àȘ•àȘ°à«‹."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>àȘšà«‡ àȘŹàȘčàȘŸàȘ° àȘ•àȘŸàȘąà«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àȘ•àȘŸàȘąà«€ àȘšàȘŸàȘ–àȘ¶à«‹ àȘšàȘčીàȘ‚"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àȘžà«‡àȘŸ àȘ•àȘ°à«‹"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àȘŹàȘčàȘŸàȘ° àȘ•àȘŸàȘąà«‹"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àȘ…àȘšà«àȘ”ેàȘ·àȘŁ àȘ•àȘ°à«‹"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àȘ–à«‚àȘŸà«‡ àȘ›à«‡"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"àȘ«àȘ°à«€àȘ„ી àȘ‰àȘȘàȘ•àȘ°àȘŁ àȘŠàȘŸàȘ–àȘČ àȘ•àȘ°à«‹"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> àȘ–àȘžà«‡àȘĄà«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"àȘĄà«‡àȘŸàȘŸàȘšà«‡ àȘ–àȘžà«‡àȘĄà«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸ àȘŸà«àȘ°àȘŸàȘšà«àȘžàȘ«àȘ° àȘ•àȘ°àȘ”àȘŸàȘšà«àȘ‚ àȘȘૂàȘ°à«àȘŁ àȘ„àȘŻà«àȘ‚"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸ <xliff:g id="NAME">%s</xliff:g>àȘźàȘŸàȘ‚ àȘ–àȘžà«‡àȘĄà«àȘŻà«àȘ‚"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸ àȘ–àȘžà«‡àȘĄà«€ àȘ¶àȘ•à«àȘŻàȘŸàȘ‚ àȘšàȘ„ી"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àȘ«àȘ°à«€àȘ„ી àȘ•àȘšà«àȘŸà«‡àȘšà«àȘŸ àȘ–àȘžà«‡àȘĄàȘ”àȘŸàȘšà«‹ àȘȘ્àȘ°àȘŻàȘŸàȘž àȘ•àȘ°à«‹"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àȘŠà«‚àȘ° àȘ•àȘ°à«àȘŻà«àȘ‚"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àȘŹàȘčàȘŸàȘ° àȘ•àȘŸàȘąà«àȘŻà«àȘ‚"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àȘ€àȘȘàȘŸàȘžà«€ àȘ°àȘč્àȘŻà«àȘ‚ àȘ›à«‡..."</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"àȘ† àȘžàȘżàȘźàȘźàȘŸàȘ‚ àȘ”ૉàȘ‡àȘž àȘźàȘŸàȘŸà«‡ àȘ•à«‹àȘˆ àȘœà«‹àȘ—àȘ”àȘŸàȘˆ àȘšàȘ„ી"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"àȘ”ૉàȘ‡àȘž àȘźàȘŸàȘŸà«‡ àȘ† àȘžàȘżàȘźàȘšà«‡ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àȘ”ૉàȘ‡àȘž àȘźàȘŸàȘŸà«‡ àȘ† àȘ«à«‹àȘšàȘšà«‡ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"àȘžàȘżàȘź <xliff:g id="SIMNUMBER">%d</xliff:g>àȘšà«‡ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"àȘžàȘżàȘź <xliff:g id="SIMNUMBER">%d</xliff:g>àȘšà«€ àȘœà«‹àȘ—àȘ”àȘŸàȘˆ àȘ•àȘ°à«€ àȘšàȘ„ી"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"àȘžàȘżàȘź <xliff:g id="SIMNUMBER">%d</xliff:g>àȘšà«‡ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"àȘžàȘżàȘź <xliff:g id="SIMNUMBER">%d</xliff:g>àȘšà«‡ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"àȘȘૉàȘȘàȘ…àȘȘ àȘ”àȘżàȘ‚àȘĄà«‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àȘ† àȘàȘȘàȘšà«àȘ‚ àȘ”àȘ°à«àȘàȘš àȘĄàȘŸàȘ‰àȘšàȘ—્àȘ°à«‡àȘĄ àȘ•àȘ°àȘ”àȘŸàȘźàȘŸàȘ‚ àȘ†àȘ”્àȘŻà«àȘ‚ àȘ›à«‡ àȘ…àȘ„àȘ”àȘŸ àȘ† àȘ¶à«‰àȘ°à«àȘŸàȘ•àȘŸ àȘžàȘŸàȘ„ે àȘžà«àȘžàȘ‚àȘ—àȘ€ àȘšàȘ„ી"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 3b4f26a..b0586fd 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"à€•à„‹à€ˆ à€”à„‰à€‡à€ž à€žà„‡à€”à€Ÿ à€šà€čà„€à€‚ à€čà„ˆ"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"à€žà€Ÿà€źà€Ÿà€šà„à€Ż (à€”à„‰à€‡à€ž) à€•à„‰à€Č à€Żà€Ÿ à€†à€Șà€Ÿà€€à€•à€Ÿà€Čà„€à€š à€•à„‰à€Č à€Șà€° à€°à„‹à€• à€Čà€—à€Ÿ à€Šà„€ à€—à€ˆ à€čà„ˆ"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"à€†à€Șà€•à„€ à€źà„‹à€Źà€Ÿà€‡à€Č à€”à€° à€‡à€‚à€Ÿà€°à€šà„‡à€Ÿ à€žà„‡à€”à€Ÿ à€Šà„‡à€šà„‡ à€”à€Ÿà€Čà„€ à€•à€‚à€Șà€šà„€ à€šà„‡ à€žà„‡à€”à€Ÿ à€Șà€° à€•à„à€› à€žà€źà€Ż à€•à„‡ à€Čà€żà€ à€°à„‹à€• à€Čà€—à€Ÿ à€Šà„€ à€čà„ˆ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"à€žà€żà€ź <xliff:g id="SIMNUMBER">%d</xliff:g> à€Șà€° à€†à€Șà€•à„€ à€źà„‹à€Źà€Ÿà€‡à€Č à€”à€° à€‡à€‚à€Ÿà€°à€šà„‡à€Ÿ à€žà„‡à€”à€Ÿ à€Šà„‡à€šà„‡ à€”à€Ÿà€Čà„€ à€•à€‚à€Șà€šà„€ à€šà„‡ à€•à„à€› à€žà€źà€Ż à€•à„‡ à€Čà€żà€ à€žà„‡à€”à€Ÿ à€Źà€‚à€Š à€•à€° à€Šà„€ à€čà„ˆ"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"à€źà„‹à€Źà€Ÿà€‡à€Č à€šà„‡à€Ÿà€”à€°à„à€• à€žà„‡ à€•à€šà„‡à€•à„à€Ÿ à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€Ÿ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"à€Șà€žà€‚à€Šà„€à€Šà€Ÿ à€šà„‡à€Ÿà€”à€°à„à€• à€Źà€Šà€Čà€•à€° à€Šà„‡à€–à„‡à€‚. à€Źà€Šà€Čà€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"à€†à€Șà€Ÿà€€à€•à€Ÿà€Čà„€à€š à€•à„‰à€Č à€•à€°à€šà„‡ à€•à„€ à€žà„à€”à€żà€§à€Ÿ à€‰à€Șà€Čà€Źà„à€§ à€šà€čà„€à€‚ à€čà„ˆ"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"à€à€Șà„à€ž  à€•à„‹ à€šà€żà€Żà€° à€«à€Œà„€à€Čà„à€Ą à€•à€źà„à€Żà„‚à€šà€żà€•à„‡à€¶à€š (NFC) à€Ÿà„ˆà€—, à€•à€Ÿà€°à„à€Ą, à€”à€° à€°à„€à€Ąà€° à€•à„‡ à€žà€Ÿà€„ à€žà€‚à€šà€Ÿà€° à€•à€°à€šà„‡ à€Šà„‡à€€à€Ÿ à€čà„ˆ."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"à€…à€Șà€šà€Ÿ à€žà„‍à€•à„à€°à„€à€š à€Čà„‰à€• à€…à€•à„à€·à€ź à€•à€°à„‡à€‚"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"à€à€Șà„à€ž à€•à„‹ à€•à„€à€Čà„‰à€• à€”à€° à€•à„‹à€ˆ à€­à„€ à€žà€‚à€Źà€Šà„à€§ à€Șà€Ÿà€žà€”à€°à„à€Ą à€žà„à€°à€•à„à€·à€Ÿ à€…à€•à„à€·à€ź à€•à€°à€šà„‡ à€Šà„‡à€€à€Ÿ à€čà„ˆ. à€‰à€Šà€Ÿà€čà€°à€Ł à€•à„‡ à€Čà€żà€, à€‡à€šà€•à€źà€żà€‚à€— à€«à€Œà„‹à€š à€•à„‰à€Č à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à€€à„‡ à€žà€źà€Ż à€«à€Œà„‹à€š, à€•à„€à€Čà„‰à€• à€•à„‹ à€…à€•à„à€·à€ź à€•à€° à€Šà„‡à€€à€Ÿ à€čà„ˆ, à€«à€żà€° à€•à„‰à€Č à€žà€źà€Ÿà€Șà„à€€ à€čà„‹à€šà„‡ à€Șà€° à€•à„€à€Čà„‰à€• à€•à„‹ à€Șà„à€š: à€žà€•à„à€·à€ź à€•à€° à€Šà„‡à€€à€Ÿ à€čà„ˆ."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"à€Źà€Ÿà€Żà„‹à€źà„€à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€•à€°à€šà„‡ à€Šà„‡à€‚"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"à€Șà„à€·à„à€Ÿà€ż à€•à„‡ à€Čà€żà€, à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à„‹ à€Źà€Ÿà€Żà„‹à€źà„€à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€•à€°à€šà„‡ à€•à„€ à€źà€‚à€œà€Œà„‚à€°à„€ à€Šà„‡à€‚"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"à€‰à€‚à€—à€Čà„€ à€•à„€ à€›à€Ÿà€Ș à€•à„‡ à€Čà€żà€ à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€•à„‹ à€Șà„à€°à€Źà€‚à€§à€żà€€ à€•à€°à„‡à€‚"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"à€‰à€‚à€—à€Čà„€ à€•à„€ à€›à€Ÿà€Ș à€”à€Ÿà€Čà„‡ à€Ÿà„‡à€źà„à€Șà€Čà„‡à€Ÿ à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€œà„‹à€Ąà€Œà€šà„‡ à€”à€° à€čà€Ÿà€Ÿà€šà„‡ à€čà„‡à€€à„ à€à€Ș à€•à„‹ à€”à€żà€§à€żà€Żà€Ÿà€‚ à€Șà„à€°à€Ÿà€°à€‚à€­ à€•à€°à€šà„‡ à€Šà„‡à€€à„€ à€čà„ˆ."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"à€‰à€‚à€—à€Čà„€ à€•à„€ à€›à€Ÿà€Ș à€•à„‡ à€Čà€żà€ à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à„‡à€‚"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"à€Șà€čà€šà€Ÿà€šà€Ÿ à€šà€čà„€à€‚ à€—à€Żà€Ÿ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"à€«à€Œà€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€•à„€ à€Șà„à€·à„à€Ÿà€ż à€čà„‹ à€—à€ˆ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"à€«à€Œà€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€‰à€Șà€Čà€Źà„à€§ à€šà€čà„€à€‚ à€čà„ˆ."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"à€«à€Œà€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€•à„‹ à€žà€‚à€—à„à€°à€čà€żà€€ à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€Ÿ. à€•à„ƒà€Șà€Żà€Ÿ à€•à„‹à€ˆ à€źà„Œà€œà„‚à€Šà€Ÿ à€«à€Œà€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€šà€żà€•à€Ÿà€Čà„‡à€‚."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"à€«à€Œà€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€•à€Ÿ à€žà€źà€Ż à€žà€źà€Ÿà€Șà„à€€ à€čà„‹ à€—à€Żà€Ÿ. à€Șà„à€šà€ƒ à€Șà„à€°à€Żà€Ÿà€ž à€•à€°à„‡à€‚."</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"à€‡à€šà€Șà„à€Ÿ à€”à€żà€§à€ż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"à€Čà„‡à€– à€•à„à€°à€żà€Żà€Ÿà€à€‚"</string>
     <string name="email" msgid="4560673117055050403">"à€ˆà€źà„‡à€Č à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"à€šà„à€šà„‡ à€—à€ à€Șà€€à„‡ à€Șà€° à€ˆà€źà„‡à€Č à€­à„‡à€œà„‡à€‚"</string>
     <string name="dial" msgid="1253998302767701559">"à€•à„‰à€Č à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"à€Șà€€à€Ÿ à€Čà€—à€Ÿà€à€‚"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"à€šà„à€šà„‡ à€—à€ à€«à€Œà„‹à€š à€šà€‚à€Źà€° à€Șà€° à€•à„‰à€Č à€•à€°à„‡à€‚"</string>
+    <string name="map" msgid="5441053548030107189">"à€źà€Ÿà€šà€šà€żà€€à„à€°"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"à€–à„‹à€Čà„‡à€‚"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"à€šà„à€šà€Ÿ à€—à€Żà€Ÿ à€Żà„‚à€†à€°à€à€Č à€–à„‹à€Čà„‡à€‚"</string>
     <string name="sms" msgid="4560537514610063430">"à€źà„ˆà€žà„‡à€œ"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"à€šà„à€šà„‡ à€—à€ à€«à€Œà„‹à€š à€šà€‚à€Źà€° à€•à„‹ à€źà„ˆà€žà„‡à€œ à€•à€°à„‡à€‚"</string>
     <string name="add_contact" msgid="7867066569670597203">"à€œà„‹à€Ąà€Œà„‡à€‚"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"à€žà€‚à€Șà€°à„à€• à€žà„‚à€šà„€ à€źà„‡à€‚ à€œà„‹à€Ąà€Œà„‡à€‚"</string>
     <string name="view_calendar" msgid="979609872939597838">"à€Šà„‡à€–à„‡à€‚"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"à€šà„à€šà€Ÿ à€—à€Żà€Ÿ à€žà€źà€Ż à€•à„ˆà€Čà„‡à€‚à€Ąà€° à€źà„‡à€‚ à€Šà„‡à€–à„‡à€‚"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"à€šà„à€šà„‡ à€—à€ à€žà€źà€Ż à€•à„‡ à€Čà€żà€ à€‡à€”à„‡à€‚à€Ÿ à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€°à„‡à€‚"</string>
     <string name="view_flight" msgid="7691640491425680214">"à€źà„Œà€œà„‚à€Šà€Ÿ à€žà„à€„à€żà€€à€ż à€œà€Ÿà€šà„‡à€‚"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"à€šà„à€šà„€ à€—à€ˆ à€«à€Œà„à€Čà€Ÿà€‡à€Ÿ à€•à„€ à€źà„Œà€œà„‚à€Šà€Ÿ à€žà„à€„à€żà€€à€ż à€Šà„‡à€–à„‡à€‚"</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">"à€žà€żà€žà„à€Ÿà€ź à€•à„‡ à€Čà€żà€ à€œà€Œà€°à„‚à€°à„€ à€źà„‡à€źà„‹à€°à„€ à€šà€čà„€à€‚ à€čà„ˆ. à€Șà€•à„à€•à€Ÿ à€•à€°à„‡à€‚ à€•à€ż à€†à€Șà€•à„‡ à€Șà€Ÿà€ž 250à€à€źà€Źà„€ à€•à„€ à€–à€Ÿà€Čà„€ à€œà€—à€č à€čà„ˆ à€”à€° à€«à€żà€° à€žà„‡ à€¶à„à€°à„‚ à€•à€°à„‡à€‚."</string>
@@ -1284,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> à€…à€šà„à€Ż à€à€Ș à€Șà€° à€Šà€żà€–à€Ÿà€ˆ à€Šà„‡ à€°à€čà€Ÿ à€čà„ˆ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"à€…à€—à€° à€†à€Ș à€šà€čà„€à€‚ à€šà€Ÿà€čà€€à„‡ à€•à€ż <xliff:g id="NAME">%s</xliff:g> à€‡à€ž à€žà„à€”à€żà€§à€Ÿ à€•à€Ÿ à€‰à€Șà€Żà„‹à€— à€•à€°à„‡, à€€à„‹ à€žà„‡à€Ÿà€żà€‚à€— à€–à„‹à€Čà€šà„‡ à€”à€° à€‰à€žà„‡ à€Źà€‚à€Š à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"à€Źà€‚à€Š à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> à€ąà„‚à€‚à€ąà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"à€źà„Œà€œà„‚à€Šà€Ÿ à€žà€Ÿà€źà€—à„à€°à„€ à€•à„€ à€œà€Ÿà€à€š à€•à„€ à€œà€Ÿ à€°à€čà„€ à€čà„ˆ"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"à€šà€Żà€Ÿ <xliff:g id="NAME">%s</xliff:g> à€Čà€—à€Ÿà€Żà€Ÿ à€—à€Żà€Ÿ"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"à€žà„‡à€Ÿà€…à€Ș à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"à€«à€Œà„‹à€Ÿà„‹ à€”à€° à€źà„€à€Ąà€żà€Żà€Ÿ à€Ÿà„à€°à€Ÿà€‚à€žà€«à€° à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> à€źà„‡à€‚ à€—à€Ąà€Œà€Źà€Ąà€Œà„€ à€čà„ˆ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"à€žà€źà€žà„à€Żà€Ÿ à€ à„€à€• à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> à€•à€Ÿà€ź à€šà€čà„€à€‚ à€•à€° à€°à€čà€Ÿ à€čà„ˆ. à€ à„€à€• à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€šà„à€šà„‡à€‚."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"à€…à€žà€źà€°à„à€„à€żà€€ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"à€Żà€č à€Ąà€żà€”à€Ÿà€‡à€ž à€‡à€ž <xliff:g id="NAME">%s</xliff:g> à€•à€Ÿ à€žà€źà€°à„à€„à€š à€šà€čà„€à€‚ à€•à€°à€€à€Ÿ à€čà„ˆ. à€žà€źà€°à„à€„à€żà€€ à€Șà„à€°à€Ÿà€°à„‚à€Ș à€źà„‡à€‚ à€žà„‡à€Ÿ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"à€‡à€ž à€Ąà€żà€”à€Ÿà€‡à€ž à€Șà€° <xliff:g id="NAME">%s</xliff:g> à€•à€Ÿà€ź à€šà€čà„€à€‚ à€•à€°à€€à€Ÿ à€čà„ˆ. à€•à€Ÿà€ź à€•à€°à€šà„‡ à€”à€Ÿà€Čà„‡ à€Șà„à€°à€Ÿà€°à„‚à€Ș à€źà„‡à€‚ à€žà„‡à€Ÿ à€…à€Ș à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€šà„à€šà„‡à€‚."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> à€…à€Șà„à€°à€€à„à€Żà€Ÿà€¶à€żà€€ à€°à„‚à€Ș à€žà„‡ à€šà€żà€•à€Ÿà€Čà€Ÿ à€—à€Żà€Ÿ"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"à€źà„€à€Ąà€żà€Żà€Ÿ à€Ąà€żà€”à€Ÿà€‡à€ž à€šà€żà€•à€Ÿà€Čà€šà„‡ à€žà„‡ à€Șà€čà€Čà„‡, à€‰à€žà„‡ à€šà€żà€•à€Ÿà€Čà€šà„‡ à€•à€Ÿ à€”à€żà€•à€Čà„à€Ș à€šà„à€šà„‡à€‚ à€€à€Ÿà€•à€ż à€†à€Șà€•à„€ à€žà€Ÿà€źà€—à„à€°à„€ à€žà„à€°à€•à„à€·à€żà€€ à€°à€čà„‡"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> à€šà€żà€•à€Ÿà€Čà€Ÿ à€—à€Żà€Ÿ."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"à€čà„‹ à€žà€•à€€à€Ÿ à€čà„ˆ à€•à€ż à€•à„à€› à€žà„à€”à€żà€§à€Ÿà€à€‚ à€ à„€à€• à€€à€°à€č à€žà„‡ à€•à€Ÿà€ź à€š à€•à€°à„‡à€‚. à€œà€Œà„à€Żà€Ÿà€Šà€Ÿ à€œà€—à€č à€Șà€Ÿà€šà„‡ à€•à„‡ à€Čà€żà€ à€šà€Żà€Ÿ à€à€žà€Ąà„€ à€•à€Ÿà€°à„à€Ą à€œà„‹à€Ąà€Œà„‡à€‚."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> à€Źà€Ÿà€čà€° à€šà€żà€•à€Ÿà€Čà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ…"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"à€Źà€Ÿà€čà€° à€š à€šà€żà€•à€Ÿà€Čà„‡à€‚"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"à€žà„‡à€Ÿ à€•à€°à„‡à€‚"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"à€šà€żà€•à€Ÿà€Čà„‡à€‚"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"à€à€•à„à€žà€Șà„à€Čà„‹à€° à€•à€°à„‡à€‚"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> à€—à„à€ź à€čà„ˆ"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"à€Ąà€żà€”à€Ÿà€‡à€ž à€•à„‹ à€Šà„‹à€Źà€Ÿà€°à€Ÿ à€Čà€—à€Ÿà€à€‚"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> à€•à„‹ à€Čà„‡ à€œà€Ÿà€Żà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"à€Ąà„‡à€Ÿà€Ÿ à€Čà„‡ à€œà€Ÿà€Żà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"à€žà€Ÿà€źà€—à„à€°à„€ à€Ÿà„à€°à€Ÿà€‚à€žà€«à€Œà€° à€•à„€ à€—à€ˆ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"à€žà€Ÿà€źà€—à„à€°à„€ <xliff:g id="NAME">%s</xliff:g> à€źà„‡à€‚ à€Ÿà„à€°à€Ÿà€‚à€žà€«à€Œà€° à€•à„€ à€—à€ˆ"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"à€žà€Ÿà€źà€—à„à€°à„€ à€Ÿà„à€°à€Ÿà€‚à€žà€«à€Œà€° à€šà€čà„€à€‚ à€•à„€ à€œà€Ÿ à€žà€•à„€"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"à€žà€Ÿà€źà€—à„à€°à„€ à€Šà„‹à€Źà€Ÿà€°à€Ÿ à€Ÿà„à€°à€Ÿà€‚à€žà€«à€Œà€° à€•à€°à€šà„‡ à€•à„€ à€•à„‹à€¶à€żà€¶ à€•à€°à„‡à€‚"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"à€šà€żà€•à€Ÿà€Č à€Šà€żà€Żà€Ÿ à€—à€Żà€Ÿ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"à€šà€żà€•à€Ÿà€Čà€Ÿ à€—à€Żà€Ÿ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"à€œà€Ÿà€à€š à€•à„€ à€œà€Ÿ à€°à€čà„€ à€čà„ˆ..."</string>
@@ -1874,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"à€žà€żà€ź à€žà„‡ à€•à„‰à€Č à€•à€°à€šà„‡ à€•à„€ à€‡à€œà€Ÿà€œà€Œà€€ à€šà€čà„€à€‚ à€čà„ˆ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"à€žà€żà€ź à€žà„‡ à€•à„‰à€Č à€•à€°à€šà„‡ à€•à„€ à€‡à€œà€Ÿà€œà€Œà€€ à€šà€čà„€à€‚ à€čà„ˆ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"à€«à€Œà„‹à€š à€žà„‡ à€•à„‰à€Č à€•à€°à€šà„‡ à€•à„€ à€‡à€œà€Ÿà€œà€Œà€€ à€šà€čà„€à€‚ à€čà„ˆ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"à€žà€żà€ź <xliff:g id="SIMNUMBER">%d</xliff:g> à€•à„‹ à€•à„‰à€Č à€•à„‡ à€Čà€żà€ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€€à€Ÿ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"à€žà€żà€ź <xliff:g id="SIMNUMBER">%d</xliff:g> à€•à€Ÿà€ź à€šà€čà„€à€‚ à€•à€° à€°à€čà€Ÿ à€čà„ˆ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"à€žà€żà€ź <xliff:g id="SIMNUMBER">%d</xliff:g> à€•à„‹ à€•à„‰à€Č à€•à„‡ à€Čà€żà€ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€€à€Ÿ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"à€žà€żà€ź <xliff:g id="SIMNUMBER">%d</xliff:g> à€•à„‹ à€•à„‰à€Č à€•à„‡ à€Čà€żà€ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€€à€Ÿ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"à€Șà„‰à€Șà€…à€Ș à€”à€żà€‚à€Ąà„‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à€Ÿ à€”à€°à„à€¶à€š à€Șà„à€°à€Ÿà€šà€Ÿ à€čà„‹ à€šà„à€•à€Ÿ à€čà„ˆ à€Żà€Ÿ à€Żà€č à€‡à€ž à€¶à„‰à€°à„à€Ÿà€•à€Ÿ à€•à„‡ à€žà€Ÿà€„ à€•à€Ÿà€ź à€šà€čà„€à€‚ à€•à€°à€€à€Ÿ"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index e8cdfde..e59a43f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Slanje e-poruke na odabranu adresu"</string>
     <string name="dial" msgid="1253998302767701559">"Poziv"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Pozivanje odabranog telefonskog broja"</string>
-    <string name="map" msgid="6521159124535543457">"Lociraj"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Prikaz odabrane adrese na karti"</string>
+    <string name="map" msgid="5441053548030107189">"Karta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Otvori"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Otvaranje odabranog URL-a"</string>
     <string name="sms" msgid="4560537514610063430">"Poruka"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index b140c80..98d91da 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Hangszolgáltatás letiltva"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nincs hanghívás vagy segélyhívás"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"A szolgáltató ideiglenesen kikapcsolta"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"A szolgáltató ideiglenesen kikapcsolta a következƑ SIM-kártya esetében: <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"A mobilhálózat nem érhetƑ el"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Próbálja meg módosítani a preferált hálózatot. Koppintson a módosításhoz."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Segélyhívás nem lehetséges"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nem sikerült felismerni"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Ujjlenyomat hitelesítve"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Az ujjlenyomathoz szükséges hardver nem érhetƑ el."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévƑ ujjlenyomatot."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási mƱveletkor idƑtúllépés történt. Próbálkozzon újra."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Kiválasztott cím elküldése e-mailben"</string>
     <string name="dial" msgid="1253998302767701559">"Hívás"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Kiválasztott telefonszám hívása"</string>
-    <string name="map" msgid="6521159124535543457">"Helymeghatározás"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Kiválasztott cím megkeresése a térképen"</string>
+    <string name="map" msgid="5441053548030107189">"Térkép"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Megnyitás"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Kiválasztott URL megnyitása"</string>
     <string name="sms" msgid="4560537514610063430">"Üzenet"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> – a többi alkalmazás felett"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Kikapcsolás"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ellenƑrzése…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Az aktuális tartalom ellenƑrzése"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Új <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Koppintson ide a beállításhoz"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Fotók és más tartalmak átviteléhez"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Probléma a következƑvel: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Koppintson a javításhoz"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"A(z) <xliff:g id="NAME">%s</xliff:g> sérült. Válassza ki a javításhoz."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Nem támogatott <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ez az eszköz nem támogatja ezt a(z) <xliff:g id="NAME">%s</xliff:g> eszközt. Koppintson rá a támogatott formátumban való beállításhoz."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ez az eszköz nem támogatja a(z) <xliff:g id="NAME">%s</xliff:g> nevƱ alkalmazást. Válassza ki a támogatott formátumú beállításhoz."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"A(z) <xliff:g id="NAME">%s</xliff:g> váratlanul eltávolítva"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"A tartalomvesztés elkerülése érdekében az eltávolítás elƑtt elƑbb hajtsa végre az eszköz kiadását"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> eltávolítva"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Lehet, hogy egyes funkciók nem mƱködnek megfelelƑen. Csatlakoztasson új tárolót."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"A(z) <xliff:g id="NAME">%s</xliff:g> kiadása"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ne távolítsa el"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Beállítás"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Kiadás"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Tallózás"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"A(z) <xliff:g id="NAME">%s</xliff:g> nem található"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Csatlakoztassa újra az eszközt"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> áthelyezése"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Az áthelyezés folyamatban van"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"A tartalom átvitele befejezƑdött"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Tartalom áthelyezve ide: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Nem sikerült az áthelyezés"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Próbálja meg ismét áthelyezni a tartalmat"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Eltávolítva"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Kiadva"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"EllenƑrzés…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"A SIM-kártya nem támogatott a hangnál"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"A SIM-kártya nem engedélyezett a hanghoz"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"A telefon nem engedélyezett a hanghoz"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-kártya nem engedélyezett"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-kártya nincs engedélyezve"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-kártya nem engedélyezett"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-kártya nem engedélyezett"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ElƑugró ablak"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Az alkalmazás alacsonyabb verziójú, vagy nem kompatibilis ezzel a parancsikonnal"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index b20b72f..ce3983a 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ՁեՔնեՔին ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Ő¶ ŐĄŐ¶Ő°ŐĄŐœŐĄŐ¶Ő„ŐŹŐ« Ő§"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ՁեՔնեՔին ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Ő¶ վւ Ő·ŐżŐĄŐș ŐŻŐĄŐ¶ŐčŐ„Ö€Ő¶ ŐĄÖ€ŐŁŐ„ŐŹŐĄÖƒŐĄŐŻŐŸŐĄŐź Ő„Ő¶"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ՁՄր օŐșŐ„Ö€ŐĄŐżŐžÖ€Őš ŐȘŐĄŐŽŐĄŐ¶ŐĄŐŻŐĄŐŸŐžÖ€ŐĄŐșŐ„Őœ ŐĄŐ¶Ő»ŐĄŐżŐ„ŐŹ Ő§"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Ö„ŐĄÖ€ŐżŐ« օŐșŐ„Ö€ŐĄŐżŐžÖ€Őš ŐȘŐĄŐŽŐĄŐ¶ŐĄŐŻŐĄŐŸŐžÖ€ŐĄŐșŐ„Őœ ŐĄŐ¶Ő»ŐĄŐżŐ„ŐŹ Ő§"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ő‰Ő°ŐĄŐ»ŐžŐČŐŸŐ„Ö ŐŽŐ«ŐĄŐ¶ŐĄŐŹ ŐąŐ»Ő»ŐĄŐ”Ő«Ő¶ ցենցին"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Ő“ŐžÖ€Ő±Ő„Ö„ ŐĄŐ”ŐŹ ցենցի ŐŽŐ«ŐĄŐ¶ŐĄŐŹ: ՀŐșŐ„Ö„Ő Ő¶ŐĄŐ­ŐšŐ¶ŐżÖ€ŐĄŐź ցենց՚ ÖƒŐžŐ­Ő„ŐŹŐžÖ‚ հածար:"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ՇտաŐș ŐŻŐĄŐ¶ŐčŐ„Ö€Őš Ő°ŐĄŐœŐĄŐ¶Ő„ŐŹŐ« ŐčŐ„Ő¶"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ő‰ŐłŐĄŐ¶ŐĄŐčŐŸŐ„Ö"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Ő„ŐĄŐżŐ¶ŐĄŐ°Ő„ŐżÖ„Őš Ő¶ŐžÖ‚Ő”Ő¶ŐĄŐŻŐĄŐ¶ŐĄÖŐŸŐ„Ö"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ő„ŐĄŐżŐ¶ŐĄŐ°Ő„ŐżÖ„Ő« ŐœŐĄÖ€Ö„Ő¶ ŐĄŐ¶Ő°ŐĄŐœŐĄŐ¶Ő„ŐŹŐ« Ő§:"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ő€Ő¶ŐĄÖ€ŐĄŐŸŐžÖ€ ŐčŐ§ ŐșŐĄŐ°Ő„ŐŹ ŐŽŐĄŐżŐ¶ŐĄŐ°Ő„ŐżÖ„Őš: Ő€Ő„ŐŒŐĄÖÖ€Ő„Ö„ ŐĄŐŒŐŻŐĄ ŐŽŐĄŐżŐ¶ŐĄŐ°Ő„ŐżÖ„Őš:"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Ő„ŐĄŐżŐ¶ŐĄŐ°Ő„ŐżÖ„Ő« գրենցՎեն ŐȘŐĄŐŽŐĄŐ¶ŐĄŐŻŐš ŐœŐșŐĄŐŒŐŸŐ„ŐŹ Ő§: Ő“ŐžÖ€Ő±Ő„Ö„ ն՞րից:"</string>
@@ -833,7 +831,7 @@
     <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"ԳվրռվŐČŐžÖ‚Ő©Ő”ŐĄŐ¶ Ő°ŐĄŐœŐżŐĄŐżŐžÖ‚ŐŽ"</string>
     <string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"ÔŒÖ„Ő„ŐŹ ŐĄŐ”Őœ Ő§Ő»Őš"</string>
     <string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"Ő„Ő¶ŐĄŐŹ ŐĄŐ”Őœ Ő§Ő»ŐžÖ‚ŐŽ"</string>
-    <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nŐŽŐœŐżŐĄŐžŐ° Ő„Ö„, վր ցենկեն՞ւՎ Ő„Ö„ Ő°Ő„ŐŒŐĄŐ¶ŐĄŐŹ ŐĄŐ”Őœ էջից:"</string>
+    <string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nÔ»ŐœŐŻŐĄŐșŐ„ŐžŐœ վւթվւծ Ő„Ö„ Ő°Ő„ŐŒŐĄŐ¶ŐĄŐŹ ŐĄŐ”Őœ էջից:"</string>
     <string name="save_password_label" msgid="6860261758665825069">"Ő€ŐĄŐœŐżŐĄŐżŐ„ŐŹ"</string>
     <string name="double_tap_toast" msgid="4595046515400268881">"Ő€ŐžÖ‚Ő·ŐĄŐŻ` ŐŻÖ€ŐŻŐ¶ŐĄŐŻŐ« Ő°ŐșŐ„Ö„` ՎՄ՟եցնՄՏ՞ւ և ÖƒŐžÖ„Ö€ŐĄÖŐ¶Ő„ŐŹŐžÖ‚ հածար:"</string>
     <string name="autofill_this_form" msgid="4616758841157816676">"ԻնքնեՏրեց՞ւՎ"</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Նածակ վւŐČŐĄÖ€ŐŻŐ„ŐŹ ŐšŐ¶ŐżÖ€ŐŸŐĄŐź Ő°ŐĄŐœÖŐ„Ő«Ő¶"</string>
     <string name="dial" msgid="1253998302767701559">"Ô¶ŐĄŐ¶ŐŁŐ„ŐŹ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ô¶ŐĄŐ¶ŐŁŐ„ŐŹ ŐšŐ¶ŐżÖ€ŐŸŐĄŐź Ő°Ő„ŐŒŐĄŐ­ŐžŐœŐĄŐ°ŐĄŐŽŐĄÖ€Ő«Ő¶"</string>
-    <string name="map" msgid="6521159124535543457">"ÔłŐżŐ¶Ő„ŐŹ Ö„ŐĄÖ€ŐżŐ„ŐŠŐžÖ‚ŐŽ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Ց՞ւՔց ŐżŐĄŐŹ ŐšŐ¶ŐżÖ€ŐŸŐĄŐź Ő°ŐĄŐœÖŐ„Ő¶ Ö„ŐĄÖ€ŐżŐ„ŐŠŐ« ŐŸÖ€ŐĄ"</string>
+    <string name="map" msgid="5441053548030107189">"Ő”ŐĄÖ€ŐżŐ„ŐŠ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ÔČեցՄՏ"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ÔČեցՄՏ ŐšŐ¶ŐżÖ€ŐŸŐĄŐź URL-Őš"</string>
     <string name="sms" msgid="4560537514610063430">"SMS ŐŁÖ€Ő„ŐŹ"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> Ő°ŐĄŐŸŐ„ŐŹŐŸŐĄŐźŐš ÖŐžÖ‚ÖŐĄŐ€Ö€ŐŸŐžÖ‚ŐŽ Ő§ ŐĄŐ”ŐŹ Ő°ŐĄŐŸŐ„ŐŹŐŸŐĄŐźŐ¶Ő„Ö€Ő« ŐŸŐ„Ö€Ö‡ŐžÖ‚ŐŽ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ô”Ő©Ő„ ŐčŐ„Ö„ ցենկեն՞ւՎ, վր <xliff:g id="NAME">%s</xliff:g>-Ő¶ Ö…ŐŁŐżŐĄŐŁŐžÖ€ŐźŐ« ŐĄŐ”Őœ ŐŁŐžÖ€ŐźŐĄŐŒŐžÖ‚Ő”Ő©Őš, Ő°ŐșŐ„Ö„Ő ŐŻŐĄÖ€ŐŁŐĄŐŸŐžÖ€ŐžÖ‚ŐŽŐ¶Ő„Ö€Őš չեցՄՏ՞ւ և ŐĄŐ”Ő¶ ŐĄŐ¶Ő»ŐĄŐżŐ„ŐŹŐžÖ‚ հածար։"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Ô±Ő¶Ő»ŐĄŐżŐ„ŐŹ"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„Ő« ŐœŐżŐžÖ‚ŐŁŐžÖ‚ŐŽ…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ÔČŐžŐŸŐĄŐ¶Ő€ŐĄŐŻŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐœŐżŐžÖ‚ŐŁŐžÖ‚ŐŽ"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Նվր Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„ (<xliff:g id="NAME">%s</xliff:g>)"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ՀŐșŐ„Ö„Ő ŐŻŐĄÖ€ŐŁŐĄŐŸŐžÖ€Ő„ŐŹŐžÖ‚ հածար"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ÔŒŐžÖ‚ŐœŐĄŐ¶ŐŻŐĄÖ€Ő¶Ő„Ö€ և ŐŽŐ„Ő€Ő«ŐĄ Ö†ŐĄŐ”ŐŹŐ„Ö€ ŐżŐ„ŐČŐĄÖƒŐžŐ­Ő„ŐŹŐžÖ‚ հածար"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„Ő« Ő°Ő„Őż ŐŻŐĄŐșŐŸŐĄŐź Ő­Ő¶Ő€Ő«Ö€ ŐŻŐĄ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ՀŐșŐ„Ö„Ő Ő·ŐżŐŻŐ„ŐŹŐžÖ‚ հածար"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>-Őš ŐŸŐ¶ŐĄŐœŐŸŐĄŐź Ő§: ÔžŐ¶ŐżÖ€Ő„Ö„Ő Ő·ŐżŐŻŐ„ŐŹŐžÖ‚ հածար:"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ՉաŐșŐĄŐ°ŐžŐŸŐŸŐžŐČ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Ô±Ő”Őœ ŐœŐĄÖ€Ö„Őš ŐčŐ« եջեկց՞ւՎ ŐĄŐ”Őœ <xliff:g id="NAME">%s</xliff:g>-Őš: ՀŐșŐ„Ö„Ő ŐĄŐ»ŐĄŐŻÖŐŸŐžŐČ Ő±Ö‡ŐĄŐčŐĄÖƒŐžŐŸ ŐŻŐĄÖ€ŐŁŐĄŐŸŐžÖ€Ő„ŐŹŐžÖ‚ հածար:"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Ô±Ő”Őœ ŐœŐĄÖ€Ö„Őš ŐčŐ« եջեկց՞ւՎ ŐĄŐ”Őœ <xliff:g id="NAME">%s</xliff:g>-Őš: ÔžŐ¶ŐżÖ€Ő„Ö„Ő ŐĄŐ»ŐĄŐŻÖŐŸŐžŐČ Ő±Ö‡ŐĄŐčŐĄÖƒŐžŐŸ ŐŻŐĄÖ€ŐŁŐĄŐŸŐžÖ€Ő„ŐŹŐžÖ‚ հածար:"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-Őš Ő°Ő„ŐŒŐĄÖŐŸŐ„ŐŹ Ő§ ŐĄŐŒŐĄŐ¶Ö ŐĄŐ¶Ő»ŐĄŐżŐ„ŐŹŐžÖ‚"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ŐŐŸŐ”ŐĄŐŹŐ¶Ő„Ö€ Őčկ՞րցնՄՏ՞ւ հածար ŐŻÖ€Ő«ŐčŐš Ő°Ő„ŐŒŐĄÖŐ¶Ő„ŐŹŐžÖ‚Ö ŐĄŐŒŐĄŐ» ŐĄŐ¶Ő»ŐĄŐżŐ„Ö„ ŐĄŐ”Ő¶"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„Őš Ő°Ő„ŐŒŐĄÖŐŸŐ„ŐŹ Ő§"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ő€Ő¶ŐĄÖ€ŐĄŐŸŐžÖ€ է՝ ŐžÖ€ŐžŐ· ŐŁŐžÖ€ŐźŐĄŐŒŐžÖ‚Ő”Ő©Ő¶Ő„Ö€ ŐčŐĄŐ·Ő­ŐĄŐżŐ„Ő¶Ö‰ Նվր Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„ ŐżŐ„ŐČŐĄŐ€Ö€Ő„Ö„Ö‰"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> Ő°Ő«Ő·ŐĄŐœŐĄÖ€Ö„Ő¶ ŐĄŐ¶Ő»ŐĄŐżŐŸŐžÖ‚ŐŽ Ő§"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ő‰Ő°Ő„ŐŒŐĄÖŐ¶Ő„Ö„ ŐœŐĄÖ€Ö„Őš"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ÔżŐĄÖ€ŐŁŐĄŐŸŐžÖ€Ő„ŐŹ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ô±Ő¶Ő»ŐĄŐżŐ„ŐŹ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ŐˆÖ‚ŐœŐžÖ‚ŐŽŐ¶ŐĄŐœŐ«Ö€Ő„ŐŹ"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g>-Őš ŐżŐ„ŐČŐĄŐ€Ö€ŐŸŐĄŐź ŐčŐ§"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Ն՞րից ŐżŐ„ŐČŐĄŐ€Ö€Ő„Ö„ ŐœŐĄÖ€Ö„Őš"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>-Ő« ŐżŐ„ŐČափվխվւծ"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ŐŐŸŐ”ŐĄŐŹŐ¶Ő„Ö€Ő« ŐżŐ„ŐČափվխվւծ"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ÔČŐžŐŸŐĄŐ¶Ő€ŐĄŐŻŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Őš ŐżŐ„ŐČŐĄÖƒŐžŐ­ŐŸŐ„Ö"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"ÔČŐžŐŸŐĄŐ¶Ő€ŐĄŐŻŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Őš ŐżŐ„ŐČŐĄÖƒŐžŐ­ŐŸŐ„Ö <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ő‰Ő°ŐĄŐ»ŐžŐČŐŸŐ„Ö ŐżŐ„ŐČեփ՞խՄՏ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Ő“ŐžÖ€Ő±Ő„Ö„ ն՞րից"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Ő€Ő„ŐŒŐĄÖŐŸŐĄŐź Ő§"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ô±Ő¶Ő»ŐĄŐżŐŸŐĄŐź Ő§"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Ստվւգվւծ…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Ô±Ő”Őœ SIM քարտչ Ő¶ŐĄŐ­ŐĄŐșŐĄŐżÖ€ŐĄŐœŐżŐŸŐĄŐź ŐčŐ§ ŐŠŐĄŐ¶ŐŁŐ„ŐŹŐžÖ‚ հածար"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Ô±Ő”Őœ SIM Ö„ŐĄÖ€ŐżŐžŐŸ ŐčŐ„Ö„ կարվŐČ ŐŠŐĄŐ¶ŐŁŐ„ŐŹ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ô±Ő”Őœ Ő°Ő„ŐŒŐĄŐ­ŐžŐœŐžŐŸ ŐčŐ„Ö„ կարվŐČ ŐŠŐĄŐ¶ŐŁŐ„ŐŹ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> քարտչ ŐčŐ« Ő©ŐžÖ‚Ő”ŐŹŐĄŐżÖ€ŐŸŐžÖ‚ŐŽ Ö…ŐŁŐżŐĄŐŁŐžÖ€ŐźŐ„ŐŹ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> քարտչ ŐĄŐŻŐżŐ«ŐŸŐĄÖŐŸŐĄŐź ŐčŐ§"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> քարտչ ŐčŐ« Ő©ŐžÖ‚Ő”ŐŹŐĄŐżÖ€ŐŸŐžÖ‚ŐŽ Ö…ŐŁŐżŐĄŐŁŐžÖ€ŐźŐ„ŐŹ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> քարտչ ŐčŐ« Ő©ŐžÖ‚Ő”ŐŹŐĄŐżÖ€ŐŸŐžÖ‚ŐŽ Ö…ŐŁŐżŐĄŐŁŐžÖ€ŐźŐ„ŐŹ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Ő€ŐĄŐ”ŐżŐ¶ŐŸŐžŐČ ŐșŐĄŐżŐžÖ‚Ő°ŐĄŐ¶"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Սա Ő°ŐĄŐŸŐ„ŐŹŐŸŐĄŐźŐ« ŐĄŐŸŐ„ŐŹŐ« Ő°Ő«Ő¶ ŐżŐĄÖ€ŐąŐ„Ö€ŐĄŐŻŐ¶ Ő§ ŐŻŐĄŐŽ Ő°ŐĄŐŽŐĄŐżŐ„ŐČŐ„ŐŹŐ« ŐčŐ§ ŐĄŐ”Őœ ՀՔ՞ւրենցՎեն Ő°Ő„Őż"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index f9831a5..0ef2889 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Mengirimkan email ke alamat yang dipilih"</string>
     <string name="dial" msgid="1253998302767701559">"Panggil"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Panggil nomor telepon yang dipilih"</string>
-    <string name="map" msgid="6521159124535543457">"Temukan"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Melokalkan alamat yang dipilih"</string>
+    <string name="map" msgid="5441053548030107189">"Peta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Buka"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
     <string name="sms" msgid="4560537514610063430">"Pesan"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index c17d58a..9a235d4 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Símtöl eru ekki í boði"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Engin raddþjónusta eða neyðarsímtöl"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Símafyrirtækið slökkti tímabundið á þessu"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Símafyrirtækið slökkti tímabundið á þessu fyrir SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ekki næst samband við farsímakerfi"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prófaðu að velja annað símkerfi. Ýttu til að breyta."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Neyðarsímtöl eru ekki í boði"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Þekktist ekki"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingrafar staðfest"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Senda á valið netfang"</string>
     <string name="dial" msgid="1253998302767701559">"Símtal"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Hringja í valið símanúmer"</string>
-    <string name="map" msgid="6521159124535543457">"Staðsetja"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Opna valið heimilisfang"</string>
+    <string name="map" msgid="5441053548030107189">"Kort"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Opna"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Opna valda vefslóð"</string>
     <string name="sms" msgid="4560537514610063430">"Skilaboð"</string>
@@ -1274,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slökkva"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Athugar <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Fer yfir núverandi efni"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nýtt <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Ýttu til að setja upp"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Til að flytja myndir og aðrar skrár"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Vandamál með <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Ýttu til að lagfæra"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er skemmt. Veldu til að lagfæra."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Óstutt <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Ýttu til að setja upp með studdu sniði."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Þetta tæki styður ekki <xliff:g id="NAME">%s</xliff:g>. Veldu til að setja upp með studdu sniði."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> fjarlægt án fyrirvara"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Aftengdu geymslumiðil áður en þú tekur hann úr sambandi til að koma í veg fyrir að þú glatir efni"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> fjarlægt"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ekki er víst að allt virki eðlilega. Tengdu nýjan geymslumiðil."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Aftengir <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ekki fjarlægja"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Setja upp"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Fjarlægja"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Kanna"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> vantar"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Tengdu tækið aftur"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytur <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Flytur gögn"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Efni hefur verið flutt"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Efni flutt yfir í <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ekki var hægt að flytja efni"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Reyndu að flytja efni aftur"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Fjarlægð"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Aftengd"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Athugar…"</string>
@@ -1864,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-korti er ekki úthlutað fyrir rödd"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort er ekki heimilað fyrir rödd"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Sími er ekki heimilaður fyrir rödd"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> hefur ekki verið úthlutað"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kort <xliff:g id="SIMNUMBER">%d</xliff:g> er ekki leyft"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Sprettigluggi"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Útgáfa forritsins er of gömul eða er ekki samhæf þessari flýtileið"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 76d12d6..dcec074 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Nessun servizio di telefonia"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Nessun servizio vocale o di chiamate di emergenza"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Servizio disattivato temporaneamente dall\'operatore"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Servizio disattivato temporaneamente dall\'operatore per la SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Impossibile raggiungere la rete mobile"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prova a cambiare la rete preferita. Tocca per cambiare."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Chiamate di emergenza non disponibili"</string>
@@ -273,31 +272,31 @@
     <string name="managed_profile_label" msgid="8947929265267690522">"Passa a profilo di lavoro"</string>
     <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contatti"</string>
     <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedere ai contatti"</string>
-    <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti?"</string>
+    <string name="permgrouprequest_contacts" msgid="6032805601881764300">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai tuoi contatti?"</string>
     <string name="permgrouplab_location" msgid="7275582855722310164">"Geolocalizzazione"</string>
     <string name="permgroupdesc_location" msgid="1346617465127855033">"accedere alla posizione di questo dispositivo"</string>
-    <string name="permgrouprequest_location" msgid="3788275734953323491">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
+    <string name="permgrouprequest_location" msgid="3788275734953323491">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere alla posizione di questo dispositivo?"</string>
     <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
     <string name="permgroupdesc_calendar" msgid="3889615280211184106">"accedere al calendario"</string>
-    <string name="permgrouprequest_calendar" msgid="289900767793189421">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario?"</string>
+    <string name="permgrouprequest_calendar" msgid="289900767793189421">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere al tuo calendario?"</string>
     <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
     <string name="permgroupdesc_sms" msgid="4656988620100940350">"inviare e visualizzare SMS"</string>
-    <string name="permgrouprequest_sms" msgid="7168124215838204719">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS?"</string>
+    <string name="permgrouprequest_sms" msgid="7168124215838204719">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di inviare e visualizzare SMS?"</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"Archiviazione"</string>
     <string name="permgroupdesc_storage" msgid="637758554581589203">"accedere a foto, contenuti multimediali e file sul dispositivo"</string>
-    <string name="permgrouprequest_storage" msgid="7885942926944299560">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
+    <string name="permgrouprequest_storage" msgid="7885942926944299560">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere a foto, contenuti multimediali e file memorizzati sul dispositivo?"</string>
     <string name="permgrouplab_microphone" msgid="171539900250043464">"Microfono"</string>
     <string name="permgroupdesc_microphone" msgid="4988812113943554584">"registrare audio"</string>
-    <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio?"</string>
+    <string name="permgrouprequest_microphone" msgid="9167492350681916038">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di registrare audio?"</string>
     <string name="permgrouplab_camera" msgid="4820372495894586615">"Fotocamera"</string>
     <string name="permgroupdesc_camera" msgid="3250611594678347720">"scattare foto e registrare video"</string>
-    <string name="permgrouprequest_camera" msgid="1299833592069671756">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di scattare foto e registrare video?"</string>
+    <string name="permgrouprequest_camera" msgid="1299833592069671756">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di scattare foto e registrare video?"</string>
     <string name="permgrouplab_phone" msgid="5229115638567440675">"Telefono"</string>
     <string name="permgroupdesc_phone" msgid="6234224354060641055">"eseguire e gestire le telefonate"</string>
-    <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
+    <string name="permgrouprequest_phone" msgid="9166979577750581037">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di effettuare e gestire telefonate?"</string>
     <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensori per il corpo"</string>
     <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
-    <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Vuoi consentire all\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
+    <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Consentire a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; di accedere ai dati dei sensori relativi ai parametri vitali?"</string>
     <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperare contenuti della finestra"</string>
     <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Esaminare i contenuti di una finestra con cui interagisci."</string>
     <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Attivare Esplora al tocco"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non riconosciuto"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impronta digitale autenticata"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware per l\'impronta digitale non disponibile."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Invia un\'email all\'indirizzo selezionato"</string>
     <string name="dial" msgid="1253998302767701559">"Chiama"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Chiama il numero di telefono selezionato"</string>
-    <string name="map" msgid="6521159124535543457">"Localizza"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localizza l\'indirizzo selezionato"</string>
+    <string name="map" msgid="5441053548030107189">"Mappa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Apri"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Apri l\'URL selezionato"</string>
     <string name="sms" msgid="4560537514610063430">"Invia messaggio"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Disattiva"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Controllo del dispositivo <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Controllo dei contenuti correnti"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nuovo dispositivo <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tocca per configurare"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Per trasferire foto e altri file"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problema con <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tocca per risolvere il problema"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Il supporto esterno <xliff:g id="NAME">%s</xliff:g> è danneggiato. Seleziona per risolvere il problema."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> non supportata"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Il dispositivo non supporta il seguente elemento: <xliff:g id="NAME">%s</xliff:g>. Tocca per configurare un formato supportato."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Il dispositivo non supporta questo tipo di <xliff:g id="NAME">%s</xliff:g>. Seleziona per eseguire la configurazione in un formato supportato."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Rimozione imprevista della <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Espelli il supporto prima di rimuoverlo per evitare di perdere contenuti"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Dispositivo <xliff:g id="NAME">%s</xliff:g> rimosso"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Alcune funzionalità potrebbero non funzionare correttamente. Inserisci un nuovo supporto di archiviazione."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Espulsione di <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Non rimuovere"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configura"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Espelli"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Apri"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mancante"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Reinserisci il dispositivo"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Spostamento di <xliff:g id="NAME">%s</xliff:g> in corso"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Spostamento dei dati in corso"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Trasferimento contenuti completo"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Contenuti spostati su <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Impossibile spostare i contenuti"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Riprova a spostare i contenuti"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Rimosso"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Espulso"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Verifica…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM non predisposta per la voce"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM non consentita per la voce"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefono non consentito per la voce"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non consentita"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Provisioning della SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non eseguito"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non consentita"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> non consentita"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra popup"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"È stato eseguito il downgrade della versione dell\'app oppure la versione non è compatibile con questa scorciatoia"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 51df253..59acacd 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -84,8 +84,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ŚŚ™ŚŸ ŚŚ€Ś©ŚšŚ•ŚȘ ŚœŚ‘ŚŠŚą Ś©Ś™Ś—Ś•ŚȘ ŚšŚ’Ś™ŚœŚ•ŚȘ"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ŚŚ™ŚŸ Ś©Ś™ŚšŚ•ŚȘ Ś§Ś•ŚœŚ™ ŚŚ• Ś©Ś™Ś—Ś•ŚȘ Ś—Ś™ŚšŚ•Ś"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Ś”Ś•Ś©Ś‘ŚȘ Ś‘ŚŚ•Ś€ŚŸ Ś–ŚžŚ Ś™ ŚąŚœ Ś™Ś“Ś™ Ś”ŚĄŚ€Ś§"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"‏Ś”Ś•Ś©Ś‘ŚȘ Ś‘ŚŚ•Ś€ŚŸ Ś–ŚžŚ Ś™ ŚąŚœ Ś™Ś“Ś™ Ś”ŚĄŚ€Ś§ ŚąŚ‘Ś•Śš SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ŚœŚ Ś Ś™ŚȘŚŸ ŚœŚ”ŚȘŚ—Ś‘Śš ŚœŚšŚ©ŚȘ Ś”ŚĄŚœŚ•ŚœŚšŚ™ŚȘ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Ś™Ś© ŚœŚ ŚĄŚ•ŚȘ ŚœŚ©Ś Ś•ŚȘ ŚŚȘ Ś”ŚšŚ©ŚȘ Ś”ŚžŚ•ŚąŚ“Ś€ŚȘ. Ś Ś™ŚȘŚŸ ŚœŚ”Ś§Ś™Ś© Ś›Ś“Ś™ ŚœŚ©Ś Ś•ŚȘ."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Ś©Ś™Ś—Ś•ŚȘ Ś—Ś™ŚšŚ•Ś ŚœŚ Ś–ŚžŚ™Ś Ś•ŚȘ"</string>
@@ -490,10 +489,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"ŚžŚŚ€Ś©Śš ŚœŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” Ś Ś”Śœ ŚȘŚ§Ś©Ś•ŚšŚȘ ŚąŚ ŚȘŚ’Ś™Ś, Ś›ŚšŚ˜Ś™ŚĄŚ™Ś Ś•Ś§Ś•ŚšŚŚ™Ś ŚžŚĄŚ•Ś’ \'ŚȘŚ§Ś©Ś•ŚšŚȘ ŚžŚ˜Ś•Ś•Ś— Ś§ŚŠŚš\'."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ś‘Ś™Ś˜Ś•Śœ Ś ŚąŚ™ŚœŚȘ Ś”ŚžŚĄŚš Ś©ŚœŚš"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ŚžŚŚ€Ś©Śš ŚœŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” ŚœŚ”Ś©Ś‘Ś™ŚȘ ŚŚȘ Ś ŚąŚ™ŚœŚȘ Ś”ŚžŚ§Ś©Ś™Ś Ś•Ś›Śœ ŚŚžŚŠŚąŚ™ ŚŚ‘Ś˜Ś—Ś” ŚžŚ©Ś•Ś™Śš Ś”ŚžŚ‘Ś•ŚĄŚĄ ŚąŚœ ŚĄŚ™ŚĄŚžŚ”. ŚœŚ“Ś•Ś’ŚžŚ”, Ś”Ś˜ŚœŚ€Ś•ŚŸ ŚžŚ©Ś‘Ś™ŚȘ ŚŚȘ Ś ŚąŚ™ŚœŚȘ Ś”ŚžŚ§Ś©Ś™Ś Ś‘ŚąŚȘ Ś§Ś‘ŚœŚ” Ś©Śœ Ś©Ś™Ś—ŚȘ Ś˜ŚœŚ€Ś•ŚŸ Ś Ś›Ś ŚĄŚȘ, Ś•ŚœŚŚ—Śš ŚžŚ›ŚŸ ŚžŚ€ŚąŚ™Śœ ŚžŚ—Ś“Ś© ŚŚȘ Ś ŚąŚ™ŚœŚȘ Ś”ŚžŚ§Ś©Ś™Ś ŚąŚ ŚĄŚ™Ś•Ś Ś”Ś©Ś™Ś—Ś”."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"Ś©Ś™ŚžŚ•Ś© Ś‘Ś—Ś•ŚžŚšŚ” Ś‘Ś™Ś•ŚžŚ˜ŚšŚ™ŚȘ"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"ŚžŚŚ€Ś©ŚšŚȘ ŚœŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” ŚœŚ”Ś©ŚȘŚžŚ© Ś‘Ś—Ś•ŚžŚšŚ” Ś‘Ś™Ś•ŚžŚ˜ŚšŚ™ŚȘ ŚœŚŠŚ•ŚšŚš ŚŚ™ŚžŚ•ŚȘ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"Ś Ś™Ś”Ś•Śœ Ś—Ś•ŚžŚšŚ” Ś©Śœ Ś˜Ś‘Ś™ŚąŚ•ŚȘ ŚŚŠŚ‘ŚąŚ•ŚȘ"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"ŚžŚŚ€Ś©Śš ŚœŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” ŚœŚ”Ś€ŚąŚ™Śœ Ś©Ś™Ś˜Ś•ŚȘ ŚœŚ”Ś•ŚĄŚ€Ś” Ś•ŚžŚ—Ś™Ś§Ś” Ś©Śœ ŚȘŚ‘Ś Ś™Ś•ŚȘ Ś˜Ś‘Ś™ŚąŚ•ŚȘ ŚŚŠŚ‘ŚąŚ•ŚȘ Ś©Ś‘Ś”ŚŸ Ś™Ś™ŚąŚ©Ś” Ś©Ś™ŚžŚ•Ś©."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"Ś—Ś•ŚžŚšŚ” Ś©Śœ Ś˜Ś‘Ś™ŚąŚ•ŚȘ ŚŚŠŚ‘ŚąŚ•ŚȘ"</string>
@@ -506,8 +503,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ŚœŚ Ś–Ś•Ś”ŚȘŚ”"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Ś˜Ś‘Ś™ŚąŚȘ Ś”ŚŚŠŚ‘Śą ŚŚ•ŚžŚȘŚ”"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ś”Ś—Ś•ŚžŚšŚ” Ś‘Ś©Ś‘Ś™Śœ Ś˜Ś‘Ś™ŚąŚȘ ŚŚŠŚ‘Śą ŚŚ™Ś Ś” Ś–ŚžŚ™Ś Ś”."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ŚœŚ Ś Ś™ŚȘŚŸ ŚœŚŚ—ŚĄŚŸ Ś˜Ś‘Ś™ŚąŚȘ ŚŚŠŚ‘Śą. Ś”ŚĄŚš Ś˜Ś‘Ś™ŚąŚȘ ŚŚŠŚ‘Śą Ś§Ś™Ś™ŚžŚȘ."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Ś—ŚœŚŁ Ś”Ś–ŚžŚŸ Ś”Ś§ŚŠŚ•Ś‘ ŚœŚ˜Ś‘Ś™ŚąŚȘ ŚŚŠŚ‘Śą. Ś ŚĄŚ” Ś©Ś•Ś‘."</string>
@@ -1054,32 +1050,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"Ś©Ś™Ś˜ŚȘ Ś§ŚœŚ˜"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"Ś€ŚąŚ•ŚœŚ•ŚȘ Ś˜Ś§ŚĄŚ˜"</string>
     <string name="email" msgid="4560673117055050403">"ŚŚ™ŚžŚ™Ś™Śœ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"Ś©ŚœŚ™Ś—ŚȘ ŚŚ™ŚžŚ™Ś™Śœ ŚœŚ›ŚȘŚ•Ś‘ŚȘ Ś©Ś Ś‘Ś—ŚšŚ”"</string>
     <string name="dial" msgid="1253998302767701559">"Ś©Ś™Ś—Ś”"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"ŚŚ™ŚȘŚ•Śš"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"Ś”ŚȘŚ§Ś©ŚšŚ•ŚȘ ŚœŚžŚĄŚ€Śš Ś”Ś˜ŚœŚ€Ś•ŚŸ Ś©Ś Ś‘Ś—Śš"</string>
+    <string name="map" msgid="5441053548030107189">"ŚžŚ€Ś”"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"Ś€ŚȘŚ™Ś—Ś”"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"Ś€ŚȘŚ™Ś—Ś” Ś©Śœ Ś›ŚȘŚ•Ś‘ŚȘ Ś”ŚŚȘŚš Ś©Ś Ś‘Ś—ŚšŚ”"</string>
     <string name="sms" msgid="4560537514610063430">"Ś”Ś•Ś“ŚąŚ”"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"Ś©ŚœŚ™Ś—ŚȘ Ś”Ś•Ś“ŚąŚ” ŚœŚžŚĄŚ€Śš Ś”Ś˜ŚœŚ€Ś•ŚŸ Ś©Ś Ś‘Ś—Śš"</string>
     <string name="add_contact" msgid="7867066569670597203">"Ś”Ś•ŚĄŚ€Ś”"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"Ś”Ś•ŚĄŚ€Ś” ŚœŚŚ Ś©Ś™ Ś”Ś§Ś©Śš"</string>
     <string name="view_calendar" msgid="979609872939597838">"ŚȘŚŠŚ•Ś’Ś”"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"Ś”ŚŠŚ’ŚȘ Ś”Ś–ŚžŚŸ Ś©Ś Ś‘Ś—Śš Ś‘Ś™Ś•ŚžŚŸ"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"ŚœŚ•Ś— Ś–ŚžŚ Ś™Ś"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"ŚȘŚ–ŚžŚ•ŚŸ ŚŚ™ŚšŚ•Śą ŚœŚ–ŚžŚŸ Ś©Ś Ś‘Ś—Śš"</string>
     <string name="view_flight" msgid="7691640491425680214">"ŚžŚąŚ§Ś‘"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"Ś Ś™Ś”Ś•Śœ ŚžŚąŚ§Ś‘ ŚŚ—Śš Ś”Ś˜Ś™ŚĄŚ” Ś©Ś Ś‘Ś—ŚšŚ”"</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>
@@ -1328,49 +1316,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ŚžŚ•ŚŠŚ’ŚȘ ŚžŚąŚœ ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś•ŚȘ ŚŚ—ŚšŚ•ŚȘ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"ŚŚ ŚŚ™Ś Śš ŚšŚ•ŚŠŚ” Ś©-<xliff:g id="NAME">%s</xliff:g> ŚȘŚ©ŚȘŚžŚ© Ś‘ŚȘŚ›Ś•Ś Ś” Ś”Ś–Ś•, Ś”Ś§Ś© Ś›Ś“Ś™ ŚœŚ€ŚȘŚ•Ś— ŚŚȘ Ś”Ś”Ś’Ś“ŚšŚ•ŚȘ Ś•ŚœŚ›Ś‘Ś•ŚȘ ŚŚ•ŚȘŚ”."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Ś›Ś™Ś‘Ś•Ś™"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Ś‘ŚȘŚ”ŚœŚ™Śš Ś‘Ś“Ś™Ś§Ś” Ś©Śœ <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ŚžŚȘŚ‘ŚŠŚąŚȘ Ś‘Ś“Ś™Ś§Ś” Ś©Śœ Ś”ŚȘŚ•Ś›ŚŸ Ś”Ś Ś•Ś›Ś—Ś™"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> Ś—Ś“Ś©"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ŚŠŚšŚ™Śš ŚœŚ”Ś§Ś™Ś© Ś›Ś“Ś™ ŚœŚ”Ś’Ś“Ś™Śš"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ŚœŚ”ŚąŚ‘ŚšŚȘ ŚȘŚžŚ•Ś Ś•ŚȘ Ś•ŚžŚ“Ś™Ś”"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Ś‘ŚąŚ™Ś” ŚąŚ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Ś™Ś© ŚœŚ”Ś§Ś™Ś© Ś›Ś“Ś™ ŚœŚȘŚ§ŚŸ ŚŚȘ Ś”Ś‘ŚąŚ™Ś”"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> Ś€Ś’Ś•Ś. Ś‘Ś—Śš Ś›Ś“Ś™ ŚœŚ˜Ś€Śœ Ś‘Ś‘ŚąŚ™Ś”."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> ŚœŚ Ś ŚȘŚžŚš"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ŚžŚ›Ś©Ś™Śš Ś–Ś” ŚŚ™Ś Ś• ŚȘŚ•ŚžŚš Ś‘-<xliff:g id="NAME">%s</xliff:g> Ś–Ś”. Ś”Ś§Ś© Ś›Ś“Ś™ ŚœŚ”Ś’Ś“Ś™Śš Ś‘Ś€Ś•ŚšŚžŚ˜ Ś ŚȘŚžŚš."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"<xliff:g id="NAME">%s</xliff:g> ŚœŚ Ś ŚȘŚžŚš Ś‘ŚžŚ›Ś©Ś™Śš Ś”Ś–Ś”. Ś‘Ś—Śš Ś›Ś“Ś™ ŚœŚ”Ś’Ś“Ś™Śš Ś‘Ś€Ś•ŚšŚžŚ˜ Ś©Ś ŚȘŚžŚš."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> Ś”Ś•ŚĄŚš Ś‘ŚŚ•Ś€ŚŸ Ś‘ŚœŚȘŚ™ ŚŠŚ€Ś•Ś™"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ś™Ś© ŚœŚ‘Ś—Ś•Śš Ś‘ŚŚ€Ś©ŚšŚ•ŚȘ ŚœŚ”Ś•ŚŠŚŚȘ ŚžŚ“Ś™Ś” ŚœŚ€Ś Ś™ Ś”Ś”ŚĄŚšŚ”, Ś›Ś“Ś™ ŚœŚ ŚœŚŚ‘Ś“ ŚȘŚ•Ś›ŚŸ"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> Ś”Ś•ŚĄŚš"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ś™Ś™ŚȘŚ›ŚŸ Ś©Ś€Ś•Ś Ś§ŚŠŚ™Ś•Ś ŚœŚ™Ś•ŚȘ ŚžŚĄŚ•Ś™ŚžŚȘ ŚœŚ ŚȘŚ€ŚąŚœ Ś›ŚšŚŚ•Ś™. Ś™Ś© ŚœŚ”Ś›Ś Ś™ŚĄ ŚŚžŚŠŚąŚ™ ŚŚ—ŚĄŚ•ŚŸ Ś—Ś“Ś©."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Ś”Ś•ŚŠŚŚ” Ś©Śœ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ŚŚ™ŚŸ ŚœŚ”ŚĄŚ™Śš"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Ś”Ś’Ś“Śš"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ś”Ś•ŚŠŚ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Ś’ŚœŚ”"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> Ś—ŚĄŚš"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Ś™Ś© ŚœŚ”Ś›Ś Ś™ŚĄ Ś©Ś•Ś‘ ŚŚȘ Ś”Ś”ŚȘŚ§ŚŸ"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"ŚžŚąŚ‘Ś™Śš ŚŚȘ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ŚžŚąŚ‘Ś™Śš Ś ŚȘŚ•Ś Ś™Ś"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Ś”ŚąŚ‘ŚšŚȘ Ś”ŚȘŚ•Ś›ŚŸ Ś”ŚĄŚȘŚ™Ś™ŚžŚ”"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Ś”ŚȘŚ•Ś›ŚŸ Ś”Ś•ŚąŚ‘Śš ŚŚœ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ŚœŚ Ś Ś™ŚȘŚŸ Ś”Ś™Ś” ŚœŚ”ŚąŚ‘Ś™Śš ŚȘŚ•Ś›ŚŸ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Ś™Ś© ŚœŚ ŚĄŚ•ŚȘ Ś©Ś•Ś‘ ŚœŚ”ŚąŚ‘Ś™Śš ŚŚȘ Ś”ŚȘŚ•Ś›ŚŸ"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Ś”Ś•ŚĄŚš"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Ś”Ś•ŚŠŚ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Ś‘Ś•Ś“Ś§…"</string>
@@ -1944,14 +1917,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"‏Ś Ś™Ś”Ś•Śœ Ś”ŚȘŚŠŚ•ŚšŚ” Ś©Śœ Ś›ŚšŚ˜Ś™ŚĄ Ś”-SIM ŚœŚ ŚžŚȘŚŚ™Ś ŚœŚ–Ś™Ś”Ś•Ś™ Ś§Ś•ŚœŚ™"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"‏Ś›ŚšŚ˜Ś™ŚĄ Ś”-SIM ŚœŚ ŚžŚ•ŚšŚ©Ś” ŚœŚ–Ś™Ś”Ś•Ś™ Ś§Ś•ŚœŚ™"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ś”Ś˜ŚœŚ€Ś•ŚŸ ŚœŚ ŚžŚ•ŚšŚ©Ś” ŚœŚ–Ś™Ś”Ś•Ś™ Ś§Ś•ŚœŚ™"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ŚŚ™Ś Ś• ŚžŚŚ•Ś©Śš ŚœŚ©Ś™ŚžŚ•Ś© Ś‘ŚšŚ©ŚȘ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"‏ŚŚ™ŚŸ Ś Ś™Ś”Ś•Śœ ŚȘŚŠŚ•ŚšŚ” ŚąŚ‘Ś•Śš SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ŚŚ™Ś Ś• ŚžŚŚ•Ś©Śš ŚœŚ©Ś™ŚžŚ•Ś© Ś‘ŚšŚ©ŚȘ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ŚŚ™Ś Ś• ŚžŚŚ•Ś©Śš ŚœŚ©Ś™ŚžŚ•Ś© Ś‘ŚšŚ©ŚȘ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Ś—ŚœŚ•ŚŸ Ś§Ś•Ś€Ś„"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ś’ŚšŚĄŚȘ Ś”ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” Ś©Ś•Ś“ŚšŚ’Ś” ŚœŚŚ—Ś•Śš ŚŚ• Ś©ŚŚ™Ś Ś” ŚȘŚ•ŚŚžŚȘ ŚœŚ§Ś™ŚŠŚ•Śš Ś“ŚšŚš Ś–Ś”"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 485793b..6f7d40e 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"éŸłćŁ°é€šè©±ă‚”ăƒŒăƒ“ă‚čćœæ­ą"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"éŸłćŁ°ă‚”ăƒŒăƒ“ă‚čăšç·Šæ€„é€šć ±ăźăƒ–ăƒ­ăƒƒă‚Ż"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"æșćžŻé€šäżĄäŒšç€Ÿă«ă‚ˆăŁăŠäž€æ™‚çš„ă« OFF ă«ă•ă‚ŒăŠă„ăŸă™"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> はæșćžŻé€šäżĄäŒšç€Ÿă«ă‚ˆăŁăŠäž€æ™‚çš„ă« OFF にăȘăŁăŠă„ăŸă™"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ăƒąăƒă‚€ăƒ« ăƒăƒƒăƒˆăƒŻăƒŒă‚Żă«ă‚ąă‚Żă‚»ă‚čă§ăăŸă›ă‚“"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"タップしど、ć„Șć…ˆăƒăƒƒăƒˆăƒŻăƒŒă‚Żă‚’ć€‰æ›Žă—ăŠăă ă•ă„ă€‚"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ç·Šæ€„é€šć ±ăŻćˆ©ç”šă§ăăŸă›ă‚“"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"èȘè­˜ă•ă‚ŒăŸă›ă‚“ă§ă—ăŸ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"指王èȘèšŒă‚’ćźŒäș†ă—ăŸă—ăŸ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"æŒ‡çŽ‹ăƒăƒŒăƒ‰ă‚Šă‚§ă‚ąăŻäœżç”šă§ăăŸă›ă‚“ă€‚"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"æŒ‡çŽ‹ă‚’äżć­˜ă§ăăŸă›ă‚“ă€‚æ—ąć­˜ăźæŒ‡çŽ‹ă‚’ć‰Šé™€ă—ăŠăă ă•ă„ă€‚"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"æŒ‡çŽ‹ăźèȘ­ăżć–ă‚ŠăŒă‚żă‚€ăƒ ă‚ąă‚Šăƒˆă«ăȘă‚ŠăŸă—ăŸă€‚ă‚‚ă†äž€ćșŠăŠè©Šă—ăă ă•ă„ă€‚"</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"éžæŠžă—ăŸăƒĄăƒŒăƒ«ă‚ąăƒ‰ăƒŹă‚čă«ăƒĄăƒŒăƒ«ă‚’é€äżĄă—ăŸă™"</string>
     <string name="dial" msgid="1253998302767701559">"電話"</string>
     <string name="dial_desc" msgid="6573723404985517250">"éžæŠžă—ăŸé›»è©±ç•Șć·ă«é›»è©±ă‚’ă‹ă‘ăŸă™"</string>
-    <string name="map" msgid="6521159124535543457">"æŽąă™"</string>
-    <string name="map_desc" msgid="9036645769910215302">"éžæŠžă—ăŸäœæ‰€ă‚’æŽąă—ăŸă™"</string>
+    <string name="map" msgid="5441053548030107189">"朰曳"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"開く"</string>
     <string name="browse_desc" msgid="8220976549618935044">"éžæŠžă—ăŸ URL ă‚’é–‹ăăŸă™"</string>
     <string name="sms" msgid="4560537514610063430">"ăƒĄăƒƒă‚»ăƒŒă‚ž"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>ăŒä»–ăźă‚ąăƒ—ăƒȘăźäžŠă«èĄšç€șă•ă‚ŒăŠă„ăŸă™"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>ă§ă“ăźæ©Ÿèƒœă‚’äœżç”šă—ăȘă„ć ŽćˆăŻă€ă‚żăƒƒăƒ—ă—ăŠèš­ćźšă‚’é–‹ă„ăŠ OFF ă«ă—ăŠăă ă•ă„ă€‚"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"OFF にする"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>をçąșèȘă—ăŠă„ăŸă™…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"çŸćœšăźă‚łăƒłăƒ†ăƒłăƒ„ă‚’çąșèȘă—ăŠă„ăŸă™"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"æ–°ă—ă„ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ă‚żăƒƒăƒ—ă—ăŠèš­ćźšă—ăŠăă ă•ă„"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"憙真ăȘă©ăźăƒĄăƒ‡ă‚Łă‚ąè»ąé€ç”š"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>ă«é–ąă™ă‚‹ć•éĄŒ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ă‚żăƒƒăƒ—ă—ăŠäżźæ­Łă—ăŠăă ă•ă„"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>ăŒç Žæă—ăŠă„ăŸă™ă€‚äżźæ­Łă™ă‚‹ă«ăŻéžæŠžă—ăŠăă ă•ă„ă€‚"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ćŻŸćżœă—ăŠă„ăȘい<xliff:g id="NAME">%s</xliff:g>です"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ă“ăźç«Żæœ«ăŻă“ăź <xliff:g id="NAME">%s</xliff:g>ă«ćŻŸćżœă—ăŠă„ăŸă›ă‚“ă€‚ă‚żăƒƒăƒ—ă—ăŠă€ćŻŸćżœă—ăŠă„ă‚‹ćœąćŒă§ă‚»ăƒƒăƒˆă‚ąăƒƒăƒ—ă—ăŠăă ă•ă„ă€‚"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ă“ăźç«Żæœ«ăŻă“ăź <xliff:g id="NAME">%s</xliff:g>ă«ćŻŸćżœă—ăŠă„ăŸă›ă‚“ă€‚ă‚”ăƒăƒŒăƒˆă•ă‚Œă‚‹ăƒ•ă‚©ăƒŒăƒžăƒƒăƒˆă§èš­ćźšă™ă‚‹ă«ăŻéžæŠžă—ăŠăă ă•ă„ă€‚"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>ăŒäžé©ćˆ‡ă«ć–ă‚Šć€–ă•ă‚ŒăŸă—ăŸ"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"コンテンツぼć–Ș怱をé˜Čぐため、メディケを揖りć‡șă—ăŠă‹ă‚‰ć–ă‚Šć€–ă—ăŠăă ă•ă„"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>ăźć–ă‚Šć€–ă—"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"äž€éƒšăźæ©ŸèƒœăŒæ­Łă—ăć‹•äœœă—ăȘă„ćŻèƒœæ€§ăŒă‚ă‚ŠăŸă™ă€‚æ–°ă—ă„ă‚čăƒˆăƒŹăƒŒă‚žă‚’æŒżć…„ă—ăŠăă ă•ă„ă€‚"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>を揖りć‡șă—ăŠă„ăŸă™"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ć–ă‚Šć€–ă•ăȘいでください"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ă‚»ăƒƒăƒˆă‚ąăƒƒăƒ—"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ć–ă‚Šć€–ă—"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ć€–éƒšăƒĄăƒ‡ă‚Łă‚ą"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g>ăŒèŠ‹ă€ă‹ă‚ŠăŸă›ă‚“"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ăƒ‡ăƒă‚€ă‚čă‚’æŒżć…„ă—ç›Žă—ăŠăă ă•ă„"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>ă‚’ç§»ć‹•ă—ăŠă„ăŸă™"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ăƒ‡ăƒŒă‚żă‚’ç§»ć‹•ă—ăŠă„ăŸă™"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ă‚łăƒłăƒ†ăƒłăƒ„ă‚’è»ąé€äž­"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"コンテンツを <xliff:g id="NAME">%s</xliff:g>ぞ移拕"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ă‚łăƒłăƒ†ăƒłăƒ„ç§»ć‹•ă‚šăƒ©ăƒŒ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ă‚łăƒłăƒ†ăƒłăƒ„ăźç§»ć‹•ă‚’ă‚‚ă†äž€ćșŠèĄŒăŁăŠăă ă•ă„"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ć–ă‚Šć€–ă—ăŸă—ăŸ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ć–ă‚Šć€–ă—ăŸă—ăŸ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"çąșèȘă—ăŠă„ăŸă™…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"éŸłćŁ°ă«ćŻŸćżœă—ăŠă„ăȘい SIM です"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"éŸłćŁ°ă‚’äœżç”šă§ăăȘい SIM です"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"éŸłćŁ°ă‚’äœżç”šă§ăăȘいă‚čăƒžăƒŒăƒˆăƒ•ă‚©ăƒłă§ă™"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ă‚’ćˆ©ç”šă§ăăŸă›ă‚“"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ăŒăƒ—ăƒ­ăƒ“ă‚žăƒ§ăƒ‹ăƒłă‚°ă•ă‚ŒăŠă„ăŸă›ă‚“"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ă‚’ćˆ©ç”šă§ăăŸă›ă‚“"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ă‚’ćˆ©ç”šă§ăăŸă›ă‚“"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ポップケップ ォィンドォ"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"他 <xliff:g id="NUMBER">%1$d</xliff:g> 件"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ケプăƒȘăźăƒăƒŒă‚žăƒ§ăƒłăŒăƒ€ă‚Šăƒłă‚°ăƒŹăƒŒăƒ‰ă•ă‚ŒăŠă„ă‚‹ă‹ă€ă“ăźă‚·ăƒ§ăƒŒăƒˆă‚«ăƒƒăƒˆă«ćŻŸćżœă—ăŠă„ăŸă›ă‚“"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 0b5f1e1..05f1687 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ჼმოვანი ზარების სერვისი არ არის"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ჼმოვანი სერვისები და გადაუდებელი ზარი მიუწვდომელია"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"დროებით გამორთულია თჄვენი ოპერაჱორის მიერ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"დროებით გამორთულია თჄვენი ოპერაჱორის მიერ SIM-ისთვის (<xliff:g id="SIMNUMBER">%d</xliff:g>)"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"მობილურ áƒ„áƒĄáƒ”áƒšáƒ—áƒáƒœ დაკავჹირება ვერ ჼერჼდება"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"áƒȘადეთ უპირაჱესი áƒ„áƒĄáƒ”áƒšáƒ˜áƒĄ ჹეáƒȘვლა. ჹეეჼეთ ჹესაáƒȘვლელად."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"გადაუდებელი ზარი მიუწვდომელია"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"არ არიქ ამოáƒȘნობილი"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"თითის ანაბეჭდი ავჱორიზებულია"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"თითის ანაბეჭდის აპარაჱურა არ არის ჼელმისაწვდომი."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის ჹენაჼვა ვერ ჼერჼდება. გთჼოვთ, ამოჹალოთ არსებული თითის ანაბეჭდი."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. ქáƒȘადეთ ჼელაჼლა."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"áƒáƒ áƒ©áƒ”áƒŁáƒš მისამართზე áƒ”áƒšáƒ€áƒáƒĄáƒąáƒ˜áƒĄ გაგზავნა"</string>
     <string name="dial" msgid="1253998302767701559">"ზარი"</string>
     <string name="dial_desc" msgid="6573723404985517250">"áƒáƒ áƒ©áƒ”áƒŁáƒš áƒąáƒ”áƒšáƒ”áƒ€áƒáƒœáƒ˜áƒĄ ნომერზე დარეკვა"</string>
-    <string name="map" msgid="6521159124535543457">"მიკვლევა"</string>
-    <string name="map_desc" msgid="9036645769910215302">"áƒáƒ áƒ©áƒ”áƒŁáƒšáƒ˜ მისამართის მდებარეობის დადგენა"</string>
+    <string name="map" msgid="5441053548030107189">"რუკა"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"გაჼსნა"</string>
     <string name="browse_desc" msgid="8220976549618935044">"áƒáƒ áƒ©áƒ”áƒŁáƒšáƒ˜ URL-იქ გაჼსნა"</string>
     <string name="sms" msgid="4560537514610063430">"ჹეჱყობინება"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სჼვა აპების áƒ˜áƒœáƒąáƒ”áƒ áƒ€áƒ”áƒ˜áƒĄáƒ˜áƒĄ გადაჀარვით"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"თუ არ გსურთ <xliff:g id="NAME">%s</xliff:g>-იქ მიერ ამ áƒ€áƒŁáƒœáƒ„áƒȘიიქ გამოყენება, ჹეეჼეთ პარამეჱრების გასაჼსნელად და გამორთეთ."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"გამორთვა"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"მიმდინარეობს <xliff:g id="NAME">%s</xliff:g>-იქ ჹემოწმება…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"მიმდინარეობს ამჟამინდელი კონჱენჱის ჹემოწმება"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"აჼალი <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ჹეეჼეთ დასაყენებლად"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"áƒ€áƒáƒąáƒáƒ”áƒ‘áƒ˜áƒĄáƒ და მედიის გადასაჱანად"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"პრობლემა <xliff:g id="NAME">%s</xliff:g>-თან მიმართებით"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ჹეეჼეთ გამოსასწორებლად"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> დაზიანებულია. ჹეეჼეთ გასასწორებლად."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"მჼარდაუჭერელი <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ეს <xliff:g id="NAME">%s</xliff:g> მჼარდაუჭერელია არ მოწყობილობაზე. ჹეეჼეთ მჼარდაჭერილ áƒ€áƒáƒ áƒ›áƒáƒąáƒšáƒ˜ დასაყენებლად."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ეს <xliff:g id="NAME">%s</xliff:g> მჼარდაუჭერელია ამ მოწყობილობაზე. ჹეეჼეთ მჼარდაჭერილ áƒ€áƒáƒ áƒ›áƒáƒąáƒšáƒ˜ დასაყენებლად."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"მოულოდნელად მოჼდა <xliff:g id="NAME">%s</xliff:g>-ის ამოჩება"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"გაწყვიჱეთ მედია-მოწყობილობასთან კავჹირი მის ამოჹლამდე, კონჱენჱის დაკარგვის აქაáƒȘილებლად"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>-თან კავჹირი გაწყვეჱილია"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ზოგიერთმა áƒ€áƒŁáƒœáƒ„áƒȘიამ áƒšáƒ”áƒĄáƒáƒ«áƒšáƒáƒ გამართულად არ იმუჹაოს. მიუერთეთ მეჼსიერების აჼალი მოწყობილობა."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"მიმდინარეობს <xliff:g id="NAME">%s</xliff:g>-თან კავჹირის გაწყვეჱა"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"არ ამოიჩოთ"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"დაყენება"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"გამოჩება"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"დათვალიერება"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> აკლია"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ისევ მიუერთეთ მოწყობილობა"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"მიმდინარეობს <xliff:g id="NAME">%s</xliff:g>-ის გადაჱანა"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"მიმდინარეობს მონაáƒȘემთა გადაჱანა"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"კონჱენჱის გადაჱანა დასრულებულია"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"კონჱენჱი გადაჱანილია <xliff:g id="NAME">%s</xliff:g>-ზე"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"კონჱენჱის გადაჱანა ვერ მოჼერჼდა"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"áƒȘადეთ კონჱენჱის ჼელაჼლა გადაჱანა"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ამოჩებულია"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"áƒ©áƒáƒźáƒĄáƒœáƒ˜áƒšáƒ˜áƒ სისჱემიდან"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"ჹემოწმება..."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM ბარათი ამ ჼმისთვის áƒŁáƒ–áƒ áƒŁáƒœáƒ•áƒ”áƒšáƒ§áƒáƒ€áƒ˜áƒšáƒ˜ არაა"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM ბარათი ამ ჼმისთვის დაუჹვებელია"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"áƒąáƒ”áƒšáƒ”áƒ€áƒáƒœáƒ˜ ამ ჼმისთვის დაუჹვებელია"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM ბარათი (<xliff:g id="SIMNUMBER">%d</xliff:g>) დაჹვებული არ არის"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM ბარათი (<xliff:g id="SIMNUMBER">%d</xliff:g>) áƒŁáƒ–áƒ áƒŁáƒœáƒ•áƒ”áƒšáƒ§áƒáƒ€áƒ˜áƒšáƒ˜ არ არიქ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM ბარათი (<xliff:g id="SIMNUMBER">%d</xliff:g>) დაჹვებული არ არის"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM ბარათი (<xliff:g id="SIMNUMBER">%d</xliff:g>) დაჹვებული არ არის"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ამომჼჱარი áƒ€áƒáƒœáƒŻáƒáƒ áƒ"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"აპის ვერსია áƒ“áƒáƒ„áƒ•áƒ”áƒ˜áƒ—áƒ”áƒ‘áƒŁáƒšáƒ˜áƒ ან არაა თავსებადი ამ მალსაჼმობთან"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index d250640..0cf43e2 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Đ”Đ°ŃƒŃ‹ŃŃ‚Ń‹Ò› Ò›ĐŸÒŁŃ‹Ń€Đ°ŃƒĐ»Đ°Ń€ Ò›Ń‹Đ·ĐŒĐ”Ń‚Ń– Đ¶ĐŸÒ›"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дауыс Ò›Ń‹Đ·ĐŒĐ”Ń‚Ń– ĐœĐ”ĐŒĐ”ŃĐ” жДЎДл Ò›Ń‹Đ·ĐŒĐ”Ń‚ĐșĐ” Ò›ĐŸÒŁŃ‹Ń€Đ°Ńƒ шалу ĐŒÒŻĐŒĐșŃ–ĐœĐŽŃ–ĐłŃ– Đ¶ĐŸÒ›"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ĐžĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ ŃƒĐ°Ò›Ń‹Ń‚ŃˆĐ° Ó©ŃˆŃ–Ń€ĐłĐ”Đœ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ĐžĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Đșартасы ÒŻŃˆŃ–Đœ ŃƒĐ°Ò›Ń‹Ń‚ŃˆĐ° Ó©ŃˆŃ–Ń€ĐŽŃ–"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ĐœĐŸĐ±ĐžĐ»ŃŒĐŽŃ–Đș жДлігД Ò›ĐŸŃŃ‹Đ»Ńƒ ĐŒÒŻĐŒĐșŃ–Đœ Đ”ĐŒĐ”Ń"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ĐąĐ°ÒŁĐŽĐ°ŃƒĐ»Ń‹ Đ¶Đ”Đ»Ń–ĐœŃ– өзгДртіп ĐșÓ©Ń€Ń–ÒŁŃ–Đ·. ÓšĐ·ĐłĐ”Ń€Ń‚Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ЖДЎДл Ò›Ń‹Đ·ĐŒĐ”Ń‚ĐșĐ” Ò›ĐŸÒŁŃ‹Ń€Đ°Ńƒ шалу ĐŒÒŻĐŒĐșŃ–Đœ Đ”ĐŒĐ”Ń"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ĐĐœŃ‹Ò›Ń‚Đ°Đ»ĐŒĐ°Ò“Đ°Đœ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ĐĄĐ°ŃƒŃĐ°Ò› Ń–Đ·Ń– Đ°ŃƒŃ‚Đ”ĐœŃ‚ĐžŃ„ĐžĐșĐ°Ń†ĐžŃĐ»Đ°ĐœĐŽŃ‹"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ĐĄĐ°ŃƒŃĐ°Ò› Ń–Đ·Ń– Đ¶Đ°Đ±ĐŽŃ‹Ò“Ń‹ Ò›ĐŸĐ»Đ¶Đ”Ń‚Ń–ĐŒĐŽŃ– Đ”ĐŒĐ”Ń."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ĐĄĐ°ŃƒŃĐ°Ò› Ń–Đ·Ń–Đœ ŃĐ°Ò›Ń‚Đ°Ńƒ ĐŒÒŻĐŒĐșŃ–Đœ Đ”ĐŒĐ”Ń. Бар ŃĐ°ŃƒŃĐ°Ò› Ń–Đ·Ń–Đœ Đ¶ĐŸĐčŃ‹ÒŁŃ‹Đ·."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ĐĄĐ°ŃƒŃĐ°Ò› Ń–Đ·Ń–Đœ ĐșÒŻŃ‚Ńƒ ŃƒĐ°Ò›Ń‹Ń‚Ń‹ бітті. Ó˜Ń€Đ”ĐșДтті Ò›Đ°ĐčŃ‚Đ°Đ»Đ°ÒŁŃ‹Đ·."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ĐąĐ°ÒŁĐŽĐ°Đ»Ò“Đ°Đœ ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐŽŃ‹Ò› ĐżĐŸŃˆŃ‚Đ° ĐŒĐ”ĐșĐ”ĐœĐ¶Đ°ĐčŃ‹ĐœĐ° хабар Đ¶Ń–Đ±Đ”Ń€Ńƒ"</string>
     <string name="dial" msgid="1253998302767701559">"ÒšĐŸÒŁŃ‹Ń€Đ°Ńƒ шалу"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐąĐ°ÒŁĐŽĐ°Đ»Ò“Đ°Đœ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœ ĐœÓ©ĐŒŃ–Ń€Ń–ĐœĐ” Ò›ĐŸÒŁŃ‹Ń€Đ°Ńƒ шалу"</string>
-    <string name="map" msgid="6521159124535543457">"ĐžŃ€Ń‹ĐœĐŽŃ‹ Đ°ĐœŃ‹Ò›Ń‚Đ°Ńƒ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐąĐ°ÒŁĐŽĐ°Đ»Ò“Đ°Đœ ĐŒĐ”ĐșĐ”ĐœĐ¶Đ°ĐčĐŽŃ‹ÒŁ ĐŸŃ€ĐœĐ°Đ»Đ°ŃÒ›Đ°Đœ Đ¶Đ”Ń€Ń–Đœ Đ°ĐœŃ‹Ò›Ń‚Đ°Ńƒ"</string>
+    <string name="map" msgid="5441053548030107189">"Map"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ашу"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ĐąĐ°ÒŁĐŽĐ°Đ»Ò“Đ°Đœ URL ĐŒĐ”ĐșĐ”ĐœĐ¶Đ°ĐčŃ‹Đœ ашу"</string>
     <string name="sms" msgid="4560537514610063430">"Єабар"</string>
@@ -1274,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> Đ±Đ°ŃÒ›Đ° Ò›ĐŸĐ»ĐŽĐ°ĐœĐ±Đ°Đ»Đ°Ń€ĐŽŃ‹ÒŁ ÒŻŃŃ‚Ń–ĐœĐ”Đœ ĐșөрсДтілДЎі"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ĐŽĐ”ĐłĐ”Đœ паĐčĐŽĐ°Đ»Đ°ĐœŃƒŃˆŃ‹ĐœŃ‹ÒŁ Đ±Ò±Đ» Ń„ŃƒĐœĐșŃ†ĐžŃĐœŃ‹ паĐčĐŽĐ°Đ»Đ°ĐœŃƒŃ‹ĐœĐ° Đ¶ĐŸĐ» Đ±Đ”Ń€ĐŒĐ”Ńƒ ÒŻŃˆŃ–Đœ ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Đ»Đ”Ń€ĐŽŃ– Ń‚ÒŻŃ€Ń‚Ń–Đż Đ°ŃˆŃ‹ÒŁŃ‹Đ· ĐŽĐ°, ĐŸĐ»Đ°Ń€ĐŽŃ‹ Ó©ŃˆŃ–Ń€Ń–ÒŁŃ–Đ·."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ӹшіру"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> Ń‚Đ”ĐșсДріліп жатыр…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ĐÒ“Ń‹ĐŒĐŽĐ°Ò“Ń‹ ĐŒĐ°Đ·ĐŒÒ±Đœ Ń‚Đ”ĐșŃĐ”Ń€Ń–Đ»ŃƒĐŽĐ”"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Đ–Đ°ÒŁĐ° <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Đ Đ”Ń‚Ń‚Đ”Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Đ€ĐŸŃ‚ĐŸŃŃƒŃ€Đ”Ń‚Ń‚Đ”Ń€ ĐŒĐ”Đœ ĐŒĐ”ĐŽĐžĐ° фаĐčĐ»ĐŽĐ°Ń€Ń‹Đœ Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°Ńƒ ÒŻŃˆŃ–Đœ"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> Đ°Ò›Đ°ŃƒĐ»Ń‹"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ĐąÒŻĐ·Đ”Ń‚Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> Đ±ÒŻĐ»Ń–ĐœĐłĐ”Đœ. ĐąÒŻĐ·Đ”Ń‚Ńƒ ÒŻŃˆŃ–Đœ ĐŸĐœŃ‹ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ÒšĐŸĐ»ĐŽĐ°ĐœŃ‹Đ»ĐŒĐ°ĐčŃ‚Ń‹Đœ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Đ‘Ò±Đ» Ò›Ò±Ń€Ń‹Đ»Ò“Ń‹ <xliff:g id="NAME">%s</xliff:g> ĐșĐ°Ń€Ń‚Đ°ŃŃ‹ĐœĐ° Ò›ĐŸĐ»ĐŽĐ°Ńƒ ĐșөрсДтДЎі. ÒšĐŸĐ»ĐŽĐ°Ńƒ ĐșÓ©Ń€ŃĐ”Ń‚Ń–Đ»Đ”Ń‚Ń–Đœ ĐżŃ–ŃˆŃ–ĐŒĐŽĐ” ĐŸŃ€ĐœĐ°Ń‚Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Đ‘Ò±Đ» Ò›Ò±Ń€Ń‹Đ»Ò“Ń‹ĐŽĐ° <xliff:g id="NAME">%s</xliff:g> ĐșĐ°Ń€Ń‚Đ°ŃŃ‹ĐœĐ° Ò›ĐŸĐ»ĐŽĐ°Ńƒ ĐșÓ©Ń€ŃĐ”Ń‚Ń–Đ»ĐŒĐ”ĐčЮі. ÒšĐŸĐ»ĐŽĐ°Ńƒ ĐșÓ©Ń€ŃĐ”Ń‚Ń–Đ»Đ”Ń‚Ń–Đœ Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń‚Đ° Ń€Đ”Ń‚Ń‚Đ”ŃƒĐŽŃ– Ń‚Đ°ÒŁĐŽĐ°ÒŁŃ‹Đ·."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ĐșĐ”ĐœĐ”Ń‚Ń‚Đ”Đœ ŃˆŃ‹Ò“Đ°Ń€Ń‹Đ»ĐŽŃ‹"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ĐœĐ°Đ·ĐŒÒ±ĐœĐŽŃ‹ Đ¶ĐŸÒ“Đ°Đ»Ń‚Ń‹Đż Đ°Đ»ĐŒĐ°Ńƒ ÒŻŃˆŃ–Đœ Đ°Ò›ĐżĐ°Ń€Đ°Ń‚ Ń‚Đ°ŃŃ‹Ò“Ń‹ŃˆŃ‚Ń‹ Đ°Đ»ĐŽŃ‹ĐŒĐ”Đœ Đ°Đ¶Ń‹Ń€Đ°Ń‚Ń‹ÒŁŃ‹Đ·, ŃĐŸĐŽĐ°Đœ ĐșĐ”ĐčŃ–Đœ барып ŃˆŃ‹Ò“Đ°Ń€Ń‹ÒŁŃ‹Đ·."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> Đ¶ĐŸÒ›"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"КДĐčбір Ń„ŃƒĐœĐșŃ†ĐžŃĐ»Đ°Ń€ ĐŽÒ±Ń€Ń‹Ń Đ¶Ò±ĐŒŃ‹Ń Ń–ŃŃ‚Đ”ĐŒĐ”ŃƒŃ– ĐŒÒŻĐŒĐșŃ–Đœ. Đ–Đ°ÒŁĐ° жаЎ Ò›Ò±Ń€Ń‹Đ»Ò“Ń‹ŃŃ‹Đœ Đ”ĐœĐłŃ–Đ·Ń–ÒŁŃ–Đ·."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> Đ°Đ¶Ń‹Ń€Đ°Ń‚Ń‹Đ»ŃƒĐŽĐ°"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ĐšŃ‹Ò“Đ°Ń€ĐŒĐ°ÒŁŃ‹Đ·"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Đ Đ”Ń‚Ń‚Đ”Ńƒ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ĐšŃ‹Ò“Đ°Ń€Ńƒ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Đ—Đ”Ń€Ń‚Ń‚Đ”Ńƒ"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> Đ¶ĐŸÒ›"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ÒšÒ±Ń€Ń‹Đ»Ò“Ń‹ĐœŃ‹ Ò›Đ°Đčта ŃĐ°Đ»Ń‹ÒŁŃ‹Đ·"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°ĐœŃƒĐŽĐ°"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ДДрДĐșтДр Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°ĐœŃƒĐŽĐ°"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ĐœĐ°Đ·ĐŒÒ±Đœ жібДрілЎі"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"ĐœĐ°Đ·ĐŒÒ±Đœ <xliff:g id="NAME">%s</xliff:g> Đ¶Đ°ĐŽŃ‹ĐœĐ° Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°ĐœĐŽŃ‹"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ĐœĐ°Đ·ĐŒÒ±Đœ Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°ĐœĐ±Đ°ĐŽŃ‹"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ĐœĐ°Đ·ĐŒÒ±ĐœĐŽŃ‹ Ò›Đ°Đčта Ń‚Đ°ŃŃ‹ĐŒĐ°Đ»ĐŽĐ°Đż ĐșÓ©Ń€Ń–ÒŁŃ–Đ·"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ĐĐ»Ń‹ĐœĐŽŃ‹"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"АжыратылЎы"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"йДĐșŃĐ”Ń€Ń–Đ»ŃƒĐŽĐ”…"</string>
@@ -1864,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM Đșартасы ĐŽĐ°ŃƒŃ‹ŃÒ›Đ° паĐčĐŽĐ°Đ»Đ°ĐœŃƒÒ“Đ° Đ°Ń€ĐœĐ°Đ»ĐŒĐ°Ò“Đ°Đœ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM ĐșĐ°Ń€Ń‚Đ°ŃŃ‹Đœ ĐŽĐ°ŃƒŃ‹ŃÒ›Đ° паĐčĐŽĐ°Đ»Đ°ĐœŃƒÒ“Đ° тыĐčŃ‹ĐŒ ŃĐ°Đ»Ń‹ĐœÒ“Đ°Đœ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"ĐąĐ”Đ»Đ”Ń„ĐŸĐœĐŽŃ‹ ĐŽĐ°ŃƒŃ‹ŃÒ›Đ° паĐčĐŽĐ°Đ»Đ°ĐœŃƒÒ“Đ° тыĐčŃ‹ĐŒ ŃĐ°Đ»Ń‹ĐœÒ“Đ°Đœ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ÒŻŃˆŃ–Đœ Ń€Ò±Ò›ŃĐ°Ń‚ Đ”Ń‚Ń–Đ»ĐŒĐ”ĐčЮі"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Ò›Đ°Ń€Đ°ŃŃ‚Ń‹Ń€Ń‹Đ»ĐŒĐ°Ò“Đ°Đœ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ÒŻŃˆŃ–Đœ Ń€Ò±Ò›ŃĐ°Ń‚ Đ”Ń‚Ń–Đ»ĐŒĐ”ĐčЮі"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ÒŻŃˆŃ–Đœ Ń€Ò±Ò›ŃĐ°Ń‚ Đ”Ń‚Ń–Đ»ĐŒĐ”ĐčЮі"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ÒšĐ°Đ»Ò›Ń‹ĐŒĐ°Đ»Ń‹ тДрДзД"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ÒšĐŸĐ»ĐŽĐ°ĐœĐ±Đ°ĐœŃ‹ÒŁ ĐœÒ±ŃÒ›Đ°ŃŃ‹ ДсĐșі ĐœĐ”ĐŒĐ”ŃĐ” Đ±Ò±Đ» Ń‚Đ°ÒŁĐ±Đ°ŃˆĐ°ĐŒĐ”Đœ ÒŻĐčлДспДĐčЮі"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 25c9394..25d6287 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"áž•áŸ’áž‰ážŸâ€‹ážąáŸŠážžáž˜áŸ‚áž›â€‹áž‘áŸ…â€‹ážąáž¶ážŸáž™ážŠáŸ’áž‹áž¶áž“â€‹ážŠáŸ‚áž›â€‹áž”áž¶áž“â€‹áž‡áŸ’ážšážŸážŸážšážŸážŸ"</string>
     <string name="dial" msgid="1253998302767701559">"ហៅទឌរសព្ទ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ហៅ​ទឌរសព្ទ​ទៅ​លេខ​ដែល​បាន​ជ្រសសរសស"</string>
-    <string name="map" msgid="6521159124535543457">"កំណត់ទឞតាំង"</string>
-    <string name="map_desc" msgid="9036645769910215302">"áž€áŸ†ážŽážáŸ‹â€‹áž‘ážžážáž¶áŸ†áž„â€‹ážąáž¶ážŸáž™ážŠáŸ’áž‹áž¶áž“â€‹ážŠáŸ‚áž›â€‹áž”áž¶áž“â€‹áž‡áŸ’ážšážŸážŸážšážŸážŸ"</string>
+    <string name="map" msgid="5441053548030107189">"ផែនទើ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"បសក"</string>
     <string name="browse_desc" msgid="8220976549618935044">"បសក URL ដែល​បាន​ជ្រសសរសស"</string>
     <string name="sms" msgid="4560537514610063430">"សារ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 7dc5cd3..582a674 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -483,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àČžàČźàł€àČȘàČŠ àČ•àłàČ·àł‡àČ€àłàČ° àČžàȂàČ”àČčàČš (NFC) àČŸàłàČŻàČŸàČ—àł‌àȗàČłàł, àȕàČŸàČ°àłàČĄàł‌àȗàČłàł, àČźàČ€àłàČ€àł àȓàČŠàłàȗàČ°àČšàłàČšàł àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł‌ àȅàČšàłàČźàČ€àČżàČžàłàČ€àłàČ€àČŠàł†."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àČšàČżàČźàłàČź àČžàłàČ•àłàČ°àł€àČšàł àČČàČŸàČ•àł àȅàČšàłàČšàł àČšàČżàČ·àłàČ•àłàČ°àČżàČŻàČ—àłŠàČłàČżàČžàČż"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àČ•àł€àČČàČŸàČ•àł àČźàČ€àłàČ€àł àČŻàČŸàČ”àłàČŠàł‡ àČžàȂàČŹàȂàȧàČżàČ€ àČ­àČŠàłàČ°àČ€àČŸ àČȘàČŸàČžàł‍‍àČ”àČ°àłàČĄàł àČ­àČŠàłàČ°àČ€àł†àČŻàČšàłàČšàł àČšàČżàČ·àłàČ•àłàČ°àČżàČŻàČ—àłŠàČłàČżàČžàČČàł àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł‍‍àČ—àł† àȅàČšàłàČźàČ€àČż àČšàł€àČĄàłàČ€àłàČ€àČŠàł†. àȉàČŠàČŸàČčàČ°àČŁàł†àČ—àł†, àȒàČłàČŹàČ°àłàČ” àȕàČ°àł†àČŻàČšàłàČšàł àČžàłàČ”àł€àȕàČ°àČżàČžàłàČ”àČŸàȗ àČ•àł€àČČàČŸàČ•àł àȅàČšàłàČšàł àČ«àł‹àČšàł àČšàČżàČ·àłàČ•àłàČ°àČżàČŻàČ—àłŠàČłàČżàČžàłàČ€àłàČ€àČŠàł†, àČšàȂàČ€àČ° àȕàČ°àł†àČŻàł àȅàȂàČ€àłàČŻàČ—àłŠàȂàČĄàČŸàȗ àČ•àł€àČČàČŸàČ•àł àȅàČšàłàČšàł àČźàČ°àł àČžàČ•àłàČ°àČżàČŻàČ—àłŠàČłàČżàČžàłàČ€àłàČ€àČŠàł†."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àČŹàČŻàł‹àČźàł†àČŸàłàČ°àČżàČ•àł àČčàČŸàČ°àłàČĄàł‌àČ”àł‡àČ°àł‌ àČŹàČłàČžàČż"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àČȘàłàČ°àČźàČŸàČŁàł€àȕàČ°àČŁàČ•àłàȕàČŸàȗàČż àČŹàČŻàł‹àČźàł†àČŸàłàČ°àČżàČ•àł àČčàČŸàČ°àłàČĄàł‌àČ”àł‡àČ°àł àČŹàČłàČžàČČàł àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł‌àČ—àł† àȅàČšàłàČźàČ€àČżàČžàłàČ€àłàČ€àČŠàł†"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àČŹàł†àČ°àČłàČšàłàČšàł àČčàČŸàČ°àłàČĄàł‌àČ”àł‡àČ°àł àČšàČżàČ°àłàČ”àČčàČżàČžàČż"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àČŹàČłàČ•àł†àČ—àł† àČŹàł†àČ°àČłàČšàłàČšàł àČŸàł†àȂàČȘàłàČČàł‡àČŸàł‌àȗàČłàČšàłàČšàł àČžàł‡àČ°àČżàČžàČČàł àČźàČ€àłàČ€àł àȅàČłàČżàČžàČČàł àČ”àČżàȧàČŸàČšàȗàČłàČšàłàČšàł àČźàČšàČ”àČż àČźàČŸàČĄàČČàł àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł‌àČ—àł† àȅàČšàłàČźàČ€àČżàČžàłàČ€àłàČ€àČŠàł†."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àČŹàł†àČ°àČłàČšàłàČšàł àČčàČŸàČ°àłàČĄàł‌àČ”àł‡àČ°àł àČŹàČłàČžàČż"</string>
@@ -1012,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àȇàČšàł‌àČȘàłàČŸàł àČ”àČżàȧàČŸàČš"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àČȘàČ àłàČŻàČŠ àČ•àłàČ°àČźàȗàČłàł"</string>
     <string name="email" msgid="4560673117055050403">"àȇàČźàł‡àČČàł"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àȆàČŻàłàČ•àł†àČźàČŸàČĄàČżàČŠ àČ”àČżàČłàČŸàČžàČ•àłàČ•àł† àȇàČźàł‡àČČàł‌ àČźàČŸàČĄàČż"</string>
     <string name="dial" msgid="1253998302767701559">"àȕàČ°àł†"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àČ—àłàČ°àłàČ€àČżàČžàČż"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àȆàČŻàłàČ•àł†àČźàČŸàČĄàČżàČŠ àČ«àł‹àČšàł àČžàȂàČ–àłàČŻàł†àČ—àł† àȕàČ°àł† àČźàČŸàČĄàČż"</string>
+    <string name="map" msgid="5441053548030107189">"àČšàČ•àłàČ·àł†"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àČ€àł†àČ°àł†"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àȆàČŻàłàČ•àł† àČźàČŸàČĄàČżàČŠ URL àČ€àł†àČ°àł†àČŻàČżàČ°àČż"</string>
     <string name="sms" msgid="4560537514610063430">"àČžàȂàČŠàł‡àȶ"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àȆàČŻàłàČ•àł†àČźàČŸàČĄàČżàČŠ àČ«àł‹àČšàł àČžàȂàČ–àłàČŻàł†àČ—àł† àČžàȂàČŠàł‡àȶ àȕàČłàłàČčàČżàČžàČż"</string>
     <string name="add_contact" msgid="7867066569670597203">"àČžàł‡àČ°àČżàČžàČż"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àČžàȂàČȘàČ°àłàȕàȗàČłàČżàČ—àł† àČžàł‡àČ°àČżàČžàČż"</string>
     <string name="view_calendar" msgid="979609872939597838">"àČ”àł€àČ•àłàČ·àČżàČžàČż"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àČ•àłàČŻàČŸàČČàł†àȂàČĄàČ°àł‌àČšàČČàłàČČàČż àȆàČŻàłàČ•àł†àČźàČŸàČĄàČżàČŠ àČžàČźàČŻàČ”àČšàłàČšàł àČ”àł€àČ•àłàČ·àČżàČžàČż"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àȅàČ”àȧàČż"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àȆàČŻàłàČ•àł† àČźàČŸàČĄàČżàČŠ àČžàČźàČŻàČ•àłàČ•àł† àȈàČ”àł†àȂàČŸàł àČšàČżàȗàČŠàČżàČȘàČĄàČżàČžàČż"</string>
     <string name="view_flight" msgid="7691640491425680214">"àČŸàłàČ°àłàČŻàČŸàČ•àł"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àȆàČŻàłàČ•àł†àČźàČŸàČĄàČżàČŠ àČ”àČżàČźàČŸàČšàČ”àČšàłàČšàł àČŸàłàČ°àłàČŻàČŸàČ•àł‌ àČźàČŸàČĄàČż"</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>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 9fd88ab..457db54 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"음성 서ëč„슀넌 읎용할 수 없음"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"음성 서ëč„슀 및 ꞎ꞉ 전화가 찚닚됚"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ìŽë™í†”ì‹ ì‚Źì—ì„œ 서ëč„슀넌 ìŒì‹œì ìœŒëĄœ ì‚Źìš© 쀑지했슔니닀."</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"ìŽë™í†”ì‹ ì‚Źì—ì„œ SIM <xliff:g id="SIMNUMBER">%d</xliff:g>의 서ëč„슀넌 ìŒì‹œì ìœŒëĄœ ì‚Źìš© 쀑지했슔니닀."</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ëȘšë°”음 ë„€íŠžì›ŒíŹì— 연êȰ할 수 없슔니닀."</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"êž°ëłž ë„€íŠžì›ŒíŹë„Œ 변êČœí•Ž ëłŽì„žìš”. íƒ­í•˜ì—Ź 변êČœí•  수 있슔니닀."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ꞎ꞉ 전화넌 ì‚Źìš©í•  수 없슔니닀."</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"읞식할 수 없슔니닀."</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ì§€ëŹžìŽ 읞슝됚"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ì§€ëŹž 읞식 하드웚얎넌 ì‚Źìš©í•  수 없슔니닀."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ì§€ëŹžì„ 저임할 수 없슔니닀. êž°ìĄŽ ì§€ëŹžì„ 삭제하섞요."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ì§€ëŹž 읞식 시간읎 ìŽˆêłŒë˜ì—ˆìŠ”ë‹ˆë‹€. 닀시 시도하섞요."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"선택한 ìŁŒì†ŒëĄœ 읎메음 ëłŽë‚Žêž°"</string>
     <string name="dial" msgid="1253998302767701559">"전화"</string>
     <string name="dial_desc" msgid="6573723404985517250">"선택한 전화ëȈ혾로 전화 걞Ʞ"</string>
-    <string name="map" msgid="6521159124535543457">"위ìč˜ í™•ìž"</string>
-    <string name="map_desc" msgid="9036645769910215302">"선택한 ìŁŒì†Œ 위ìč˜ í™•ìž"</string>
+    <string name="map" msgid="5441053548030107189">"지도"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ì—Žêž°"</string>
     <string name="browse_desc" msgid="8220976549618935044">"선택한 URL ì—Žêž°"</string>
     <string name="sms" msgid="4560537514610063430">"메시지"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>읎(가) 닀넞 앱 위에 표시됚"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>에서 읎 Ʞ늄읎 ì‚Źìš©ë˜ëŠ” êČƒì„ 원하지 않는 êČœìš° íƒ­í•˜ì—Ź 섀정을 ì—Žêł  Ʞ늄을 ì‚Źìš© 쀑지하섞요."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ì‚Źìš© 쀑지"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> 확읞 쀑…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"í˜„ìžŹ 윘텐잠 êȀ토 쀑"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"ìƒˆëĄœìšŽ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"섀정하렀멎 탭하섞요."</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ì‚Źì§„ 및 ëŻžë””ì–Žë„Œ ì „ì†Ąí•˜ëŠ” 데 ì‚Źìš©í•©ë‹ˆë‹€."</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>에 ëŹžì œ 발생"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ëŹžì œë„Œ 핮êČ°í•˜ë €ë©Ž 탭하섞요."</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>읎(가) 손상되었슔니닀. ì„ íƒí•˜ì—Ź ëŹžì œë„Œ 핮êČ°í•˜ì„žìš”."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"지원되지 않는 <xliff:g id="NAME">%s</xliff:g>입니닀."</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"읎 ꞰꞰ는 <xliff:g id="NAME">%s</xliff:g>을(ë„Œ) 지원하지 않슔니닀. 지원하는 í˜•ì‹ìœŒëĄœ 섀정하렀멎 탭하섞요."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"읎 ꞰꞰ는 읎 <xliff:g id="NAME">%s</xliff:g>을(ë„Œ) 지원하지 않슔니닀. ì„ íƒí•˜ì—Ź 지원되는 í˜•ì‹ìœŒëĄœ 섀정하섞요."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>읎(가) 예Ʞìč˜ ì•ŠêȌ 삭제됚"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"윘텐잠 손싀을 플하렀멎 ëŻžë””ì–Žë„Œ 제거하Ʞ 전에 마욎튞 핎제하섞요."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> 제거됚"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"음부 Ʞ늄읎 ì œëŒ€ëĄœ 작동하지 않을 수 있슔니닀. ìƒˆëĄœìšŽ 저임소넌 삜입하섞요."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> 마욎튞 í•Žì œ 쀑"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"왞부 ëŻžë””ì–Žë„Œ 제거하지 마섞요."</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"섀정"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"마욎튞 í•Žì œ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ë‘˜ëŸŹëłŽêž°"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> 없음"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"êž°êž°ë„Œ 닀시 삜입하섞요."</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> 읎동 쀑"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"데읎터 읎동 쀑"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"윘텐잠 ì „ì†ĄìŽ ì™„ëŁŒëš"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"윘텐잠넌 <xliff:g id="NAME">%s</xliff:g>(윌)로 읎동핚"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"윘텐잠넌 읎동할 수 없음"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"윘텐잠넌 닀시 읎동핎 ëłŽì„žìš”"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"제거됚"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"êșŒëƒ„"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"확읞 쀑…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM읎 ìŒì„±ìœŒëĄœ 프로ëč„저닝되지 않음"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM에서 음성읎 허용되지 않음"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"휎대전화에서 음성읎 허용되지 않음"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>읎(가) 허용되지 않음"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>읎(가) 프로ëč„저닝되지 않음"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>읎(가) 허용되지 않음"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>읎(가) 허용되지 않음"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"팝업 ì°œ"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g>개 ë”ëłŽêž°"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"앱 ëČ„ì „ìŽ 닀욎귞레읎드되었거나 읎 닚축킀와 혞환되지 않슔니닀."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index bf365eb..c1fb9f8 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"ĐŃƒĐŽĐžĐŸ Ń‡Đ°Đ»ŃƒŃƒ ĐșŃ‹Đ·ĐŒĐ°Ń‚Ń‹ Đ±Ó©ĐłÓ©Ń‚Ń‚Ó©Đ»ĐłÓ©Đœ"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Чалуу Đ¶Đ°ĐœĐ° ŃˆĐ°ŃˆŃ‹Đ»Ń‹Ńˆ Ń‡Đ°Đ»ŃƒŃƒ ĐșŃ‹Đ·ĐŒĐ°Ń‚Ń‹ Đ±Ó©ĐłÓ©Ń‚Ń‚Ó©Đ»ĐłÓ©Đœ"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"БаĐčĐ»Đ°ĐœŃ‹Ńˆ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€Ńƒ убаĐșŃ‚Ń‹Đ»ŃƒŃƒ бөгөттөп ĐșĐŸĐčĐłĐŸĐœ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ÒŻŃ‡ÒŻĐœ баĐčĐ»Đ°ĐœŃ‹Ńˆ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€Ńƒ Ń‚Đ°Ń€Đ°Đ±Ń‹ĐœĐ°Đœ убаĐșŃ‚Ń‹Đ»ŃƒŃƒ Đ±Ó©ĐłÓ©Ń‚Ń‚Ó©Đ»ĐłÓ©Đœ"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ĐœĐŸĐ±ĐžĐ»ĐŽĐžĐș Ń‚Đ°Ń€ĐŒĐ°ĐșĐșĐ° туташпаĐč жатат"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ĐąĐ°ĐœĐŽĐ°Đ»ĐłĐ°Đœ Ń‚Đ°Ń€ĐŒĐ°Đșты Ó©Đ·ĐłÓ©Ń€Ń‚ÒŻĐż ĐșÓ©Ń€ÒŻÒŁÒŻĐ·. ÓšĐ·ĐłÓ©Ń€Ń‚ÒŻÒŻ ÒŻŃ‡ÒŻĐœ Ń‚Đ°ĐżŃ‚Đ°ÒŁŃ‹Đ·."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ĐšĐ°ŃˆŃ‹Đ»Ń‹Ńˆ Ń‡Đ°Đ»ŃƒŃƒ жДтĐșОлОĐșсОз"</string>
@@ -285,7 +284,7 @@
     <string name="permgrouprequest_sms" msgid="7168124215838204719">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸŃŃƒĐœĐ° SMS Đ±ĐžĐ»ĐŽĐžŃ€ÒŻÒŻĐ»Ó©Ń€ĐŽÒŻ Đ¶Ó©ĐœÓ©Ń‚ÒŻÒŻĐłÓ© Đ¶Đ°ĐœĐ° ĐŸĐșууга уруĐșсат Đ±Đ”Ń€ĐžĐ»ŃĐžĐœĐ±Đž?"</string>
     <string name="permgrouplab_storage" msgid="1971118770546336966">"ĐĄĐ°Đșтагыч"</string>
     <string name="permgroupdesc_storage" msgid="637758554581589203">"Ń‚ÒŻĐ·ĐŒÓ©ĐłÒŻÒŁÒŻĐ·ĐŽÓ©ĐłÒŻ ŃÒŻŃ€Ó©Ń‚Ń‚Ó©Ń€ĐŽÒŻ Đ¶Đ°ĐœĐ° башĐșĐ° ĐŒŃƒĐ»ŃŒŃ‚ĐžĐŒĐ”ĐŽĐžĐ° фаĐčĐ»ĐŽĐ°Ń€Ń‹Đœ паĐčĐŽĐ°Đ»Đ°ĐœŃƒŃƒĐłĐ°"</string>
-    <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸŃŃƒĐœĐ° Ń‚ÒŻĐ·ĐŒÓ©ĐłÒŻÒŁÒŻĐ·ĐŽÓ©ĐłÒŻ ŃÒŻŃ€Ó©Ń‚Ń‚Ó©Ń€ĐŽÒŻ Đ¶Đ°ĐœĐ° башĐșĐ° ĐŒŃƒĐ»ŃŒŃ‚ĐžĐŒĐ”ĐŽĐžĐ° фаĐčĐ»ĐŽĐ°Ń€Ń‹Đœ паĐčĐŽĐ°Đ»Đ°ĐœŃƒŃƒĐłĐ° уруĐșсат Đ±Đ”Ń€ĐžĐ»ŃĐžĐœĐ±Đž?"</string>
+    <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸŃŃƒĐœĐ° Ń‚ÒŻĐ·ĐŒÓ©ĐłÒŻÒŁÒŻĐ·ĐŽÓ©ĐłÒŻ ŃÒŻŃ€Ó©Ń‚Ń‚Ó©Ń€ĐŽÒŻ Đ¶Đ°ĐœĐ° башĐșĐ° ĐŒŃƒĐ»ŃŒŃ‚ĐžĐŒĐ”ĐŽĐžĐ° фаĐčĐ»ĐŽĐ°Ń€Ń‹Đœ паĐčĐŽĐ°Đ»Đ°ĐœŃƒŃƒĐłĐ° уруĐșсат бДрДсОзбО?"</string>
     <string name="permgrouplab_microphone" msgid="171539900250043464">"МоĐșŃ€ĐŸŃ„ĐŸĐœ"</string>
     <string name="permgroupdesc_microphone" msgid="4988812113943554584">"Đ°ŃƒĐŽĐžĐŸ Đ¶Đ°Đ·ĐŽŃ‹Ń€ŃƒŃƒ"</string>
     <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸŃŃƒĐœĐ° Đ°ŃƒĐŽĐžĐŸ фаĐčлЎарЎы Đ¶Đ°Đ·ĐŽŃ‹Ń€ŃƒŃƒĐłĐ° уруĐșсат Đ±Đ”Ń€ĐžĐ»ŃĐžĐœĐ±Đž?"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ĐąĐ°Đ°ĐœŃ‹Đ»ĐłĐ°Đœ Đ¶ĐŸĐș"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ĐœĐ°ĐœĐ¶Đ° ĐžĐ·ĐžĐœĐžĐœ Đ°ĐœŃ‹Đșтыгы Ń‚Đ”ĐșŃˆĐ”Ń€ĐžĐ»ĐŽĐž"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ĐœĐ°ĐœĐ¶Đ° ĐžĐ·ĐžĐœĐžĐœ аппараттыĐș ĐșĐ°ĐŒŃŃ‹Đ·ĐŽĐŸĐŸŃŃƒ жДтĐșОлОĐșŃ‚ÒŻÒŻ ŃĐŒĐ”Ń."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ĐœĐ°ĐœĐ¶Đ° ĐžĐ·ĐžĐœ саĐșŃ‚ĐŸĐŸ ĐŒÒŻĐŒĐșÒŻĐœ ŃĐŒĐ”Ń. УчурЮагы ĐŒĐ°ĐœĐ¶Đ° ĐžĐ·ĐžĐœ алып ŃĐ°Đ»Ń‹ÒŁŃ‹Đ·."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ĐœĐ°ĐœĐ¶Đ° ĐžĐ·ĐžĐœ ĐșÒŻŃ‚ÒŻÒŻ ĐŒÓ©Ó©ĐœÓ©Ń‚ÒŻ Đ±ÒŻŃ‚Ń‚ÒŻ. КаĐčра араĐșДт ĐșŃ‹Đ»Ń‹ÒŁŃ‹Đ·."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ĐąĐ°ĐœĐŽĐ°Đ»ĐłĐ°Đœ ЎарДĐșĐșĐ” ŃĐ»Đ”ĐșŃ‚Ń€ĐŸĐœĐŽŃƒĐș Đșат Đ¶Ó©ĐœÓ©Ń‚ÒŻÒŻ"</string>
     <string name="dial" msgid="1253998302767701559">"Чалуу"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐąĐ°ĐœĐŽĐ°Đ»ĐłĐ°Đœ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœ ĐœĐŸĐŒĐ”Ń€ĐžĐœĐ” Ń‡Đ°Đ»ŃƒŃƒ"</string>
-    <string name="map" msgid="6521159124535543457">"ЖаĐčгашĐșĐ°Đœ жДр"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐąĐ°ĐœĐŽĐ°Đ»ĐłĐ°Đœ ЎарДĐșто ĐșартаЮа Ń‚Đ°Đ±ŃƒŃƒ"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ачуу"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ĐąĐ°ĐœĐŽĐ°Đ»ĐłĐ°Đœ URL\'ĐŽĐž ачуу"</string>
     <string name="sms" msgid="4560537514610063430">"Đ‘ĐžĐ»ĐŽĐžŃ€ÒŻÒŻ"</string>
@@ -1275,49 +1274,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: башĐșĐ° ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸĐ»ĐŸŃ€ĐŽŃƒĐœ ÒŻŃŃ‚ÒŻĐœÓ©Đœ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"ЭгДр <xliff:g id="NAME">%s</xliff:g> ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸŃŃƒ бул Ń„ŃƒĐœĐșŃ†ĐžŃĐœŃ‹ паĐčĐŽĐ°Đ»Đ°ĐœĐ±Đ°ŃŃ‹Đœ ĐŽĐ”ŃĐ”ÒŁĐžĐ·, Đ¶Ó©ĐœĐŽÓ©Ó©Đ»Ó©Ń€ĐŽÒŻ ачып туруп, Đ°ĐœŃ‹ Ó©Ń‡ÒŻŃ€ÒŻĐż ĐșĐŸŃŽÒŁŃƒĐ·."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ÓšŃ‡ÒŻŃ€ÒŻÒŻ"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> Ń‚Đ”ĐșŃˆĐ”Ń€ĐžĐ»ÒŻÒŻĐŽÓ©…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"УчурЮагы ĐŒĐ°Đ·ĐŒŃƒĐœ Đșаралып жатат"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Đ–Đ°ÒŁŃ‹ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Đ–Ó©ĐœĐŽÓ©Ó© ÒŻŃ‡ÒŻĐœ Ń‚Đ°ĐżŃ‚Đ°ÒŁŃ‹Đ·"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ĐĄÒŻŃ€Ó©Ń‚Ń‚Ó©Ń€ĐŽÒŻ Đ¶Đ°ĐœĐ° ĐŒĐ”ĐŽĐžĐ° Ó©Ń‚ĐșÓ©Ń€ÒŻÒŻ ÒŻŃ‡ÒŻĐœ"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> Ń‚ÒŻĐ·ĐŒÓ©ĐłÒŻĐœĐŽÓ© бОр ĐŒĐ°ŃĐ”Đ»Đ” бар"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ĐžÒŁĐŽĐŸĐŸ ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> – бузуĐș. ĐžÒŁĐŽĐŸĐŸ ÒŻŃ‡ÒŻĐœ Ń‚Đ°ĐœĐŽĐ°ÒŁŃ‹Đ·."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> ĐșĐŸĐ»ĐŽĐŸĐŸĐłĐŸ Đ°Đ»Ń‹ĐœĐ±Đ°Đčт"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Đ‘ŃƒĐ» Ń‚ÒŻĐ·ĐŒÓ©ĐșŃ‚Ó© <xliff:g id="NAME">%s</xliff:g> ĐșĐŸĐ»ĐŽĐŸĐŸĐłĐŸ Đ°Đ»Ń‹ĐœĐ±Đ°Đčт. ĐšĐŸĐ»ĐŽĐŸĐŸĐłĐŸ Đ°Đ»Ń‹ĐœŃƒŃƒŃ‡Ńƒ Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń‚Đ° ĐŸŃ€ĐœĐŸŃ‚ŃƒŃƒ ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Đ‘ŃƒĐ» Ń‚ÒŻĐ·ĐŒÓ©ĐșŃ‚Ó© <xliff:g id="NAME">%s</xliff:g> ĐșĐŸĐ»ĐŽĐŸĐŸĐłĐŸ Đ°Đ»Ń‹ĐœĐ±Đ°Đčт. ĐšĐŸĐ»ĐŽĐŸĐŸĐłĐŸ Đ°Đ»Ń‹ĐœŃƒŃƒŃ‡Ńƒ Ń„ĐŸŃ€ĐŒĐ°Ń‚Ń‚Đ° ĐŸŃ€ĐœĐŸŃ‚ŃƒŃƒ ÒŻŃ‡ÒŻĐœ Ń‚Đ°ĐœĐŽĐ°ÒŁŃ‹Đ·."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ĐșÒŻŃ‚ÒŻÒŻŃÒŻĐ·ĐŽÓ©Đœ Đ°Đ»Ń‹ĐœŃ‹Đż ŃĐ°Đ»Ń‹ĐœĐŽŃ‹"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ĐœĐ°Đ·ĐŒŃƒĐœĐŽŃƒ Đ¶ĐŸĐłĐŸŃ‚ŃƒĐż албаш ÒŻŃ‡ÒŻĐœ алып ŃĐ°Đ»ŃƒŃƒĐŽĐ°Đœ ĐŒŃƒŃ€ĐŽĐ° ĐŒĐ”ĐŽĐžĐ°ĐœŃ‹ Ó©Ń‡ÒŻŃ€ÒŻÒŁÒŻĐ·"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> чыгарылЎы"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"АĐčŃ€Ń‹ĐŒ Ń„ŃƒĐœĐșŃ†ĐžŃĐ»Đ°Ń€ талаптагыЎаĐč ĐžŃˆŃ‚Đ”Đ±Đ”Đč ĐșĐ°Đ»Ń‹ŃˆŃ‹ ĐŒÒŻĐŒĐșÒŻĐœ. Đ–Đ°ÒŁŃ‹ саĐșтагычты ŃĐ°Đ»Ń‹ÒŁŃ‹Đ·."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> Ó©Ń‡ÒŻŃ€ÒŻĐ»ÒŻÒŻĐŽÓ©"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Đ§Ń‹ĐłĐ°Ń€Đ±Đ°ÒŁŃ‹Đ·"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ĐžŃ€ĐœĐŸŃ‚ŃƒŃƒ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Чыгаруу"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ИзОлЎөө"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> табылбаĐč жатат"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ĐąÒŻĐ·ĐŒÓ©ĐșŃ‚ÒŻ ĐșĐ°Đčра ŃĐ°Đ»Ń‹ÒŁŃ‹Đ·"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> саĐșŃ‚Đ°ĐłŃ‹Ń‡Ń‹ĐœĐ° ĐŸĐŸŃˆŃ‚ŃƒŃ€ŃƒĐ»ŃƒŃƒĐŽĐ°"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ДаĐčŃ‹ĐœĐŽĐ°Ń€ ĐŸĐŸŃˆŃ‚ŃƒŃ€ŃƒĐ»ŃƒŃƒĐŽĐ°…"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ĐœĐ°Đ·ĐŒŃƒĐœĐŽŃƒ Ó©Ń‚ĐșÓ©Ń€ÒŻÒŻ Đ°ŃĐłŃ‹ĐœĐ° чыĐșты"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"ĐœĐ°Đ·ĐŒŃƒĐœ <xliff:g id="NAME">%s</xliff:g> саĐșŃ‚Đ°ĐłŃ‹Ń‡Ń‹ĐœĐ° жылЎырылЎы"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ĐœĐ°Đ·ĐŒŃƒĐœ жылЎырылбаĐč ĐșĐŸĐčЎу"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ĐœĐ°Đ·ĐŒŃƒĐœĐŽŃƒ ĐșĐ°Đčра жылЎырып ĐșÓ©Ń€ÒŻÒŁÒŻĐ·"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ÓšŃ‡ÒŻŃ€ÒŻĐ»ĐŽÒŻ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Đ§Ń‹ĐłĐ°Ń€Ń‹Đ»ĐłĐ°Đœ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"йДĐșŃˆĐ”Ń€ĐžĐ»ÒŻÒŻĐŽÓ©…"</string>
@@ -1865,14 +1849,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-Đșарта ŃÒŻĐčĐ»Ó©ŃˆÒŻÒŻ ÒŻŃ‡ÒŻĐœ Ń‚Đ°Đ°ĐœŃ‹Đ»ĐłĐ°Đœ Đ¶ĐŸĐș"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-ĐșĐ°Ń€Ń‚Đ°ĐœŃ‹ ŃÒŻĐčĐ»Ó©ŃˆÒŻÒŻ ÒŻŃ‡ÒŻĐœ ĐșĐŸĐ»ĐŽĐŸĐœŃƒŃƒĐłĐ° тыюу ŃĐ°Đ»Ń‹ĐœĐłĐ°Đœ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"ĐąĐ”Đ»Đ”Ń„ĐŸĐœĐŽŃƒ ŃÒŻĐčĐ»Ó©ŃˆÒŻÒŻ ÒŻŃ‡ÒŻĐœ ĐșĐŸĐ»ĐŽĐŸĐœŃƒŃƒĐłĐ° тыюу ŃĐ°Đ»Ń‹ĐœĐłĐ°Đœ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐșĐ°Ń€Ń‚Đ°ŃŃ‹ĐœĐ° уруĐșсат Đ±Đ”Ń€ĐžĐ»ĐłĐ”Đœ Đ¶ĐŸĐș"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> Đșартасы Ń‚Đ°Đ°ĐœŃ‹Đ»ĐłĐ°Đœ Đ¶ĐŸĐș"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐșĐ°Ń€Ń‚Đ°ŃŃ‹ĐœĐ° уруĐșсат Đ±Đ”Ń€ĐžĐ»ĐłĐ”Đœ Đ¶ĐŸĐș"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ĐșĐ°Ń€Ń‚Đ°ŃŃ‹ĐœĐ° уруĐșсат Đ±Đ”Ń€ĐžĐ»ĐłĐ”Đœ Đ¶ĐŸĐș"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"КалĐșып чыĐșĐŒĐ° тДрДзД"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ĐšĐŸĐ»ĐŽĐŸĐœĐŒĐŸĐœŃƒĐœ ĐŒŃƒŃ€ŃƒĐœĐșу ĐČĐ”Ń€ŃĐžŃŃŃ‹Đœ ĐžŃˆŃ‚Đ”Ń‚ĐžĐż жатасыз жД Đ°Đ» бул ŃˆĐžĐ»Ń‚Đ”ĐŒĐ”ĐłĐ” шаĐčĐșДш ŃĐŒĐ”Ń"</string>
diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml
index 265eaaf..351bd81 100644
--- a/core/res/res/values-land/dimens.xml
+++ b/core/res/res/values-land/dimens.xml
@@ -29,7 +29,10 @@
 
     <!-- Height of the status bar -->
     <dimen name="status_bar_height">@dimen/status_bar_height_landscape</dimen>
-
+    <!-- Height of area above QQS where battery/time go -->
+    <dimen name="quick_qs_offset_height">@dimen/status_bar_height_landscape</dimen>
+    <!-- Total height of QQS in landscape, this is effectively status_bar_height_landscape + 128 -->
+    <dimen name="quick_qs_total_height">152dp</dimen>
     <!-- Default height of an action bar. -->
     <dimen name="action_bar_default_height">40dip</dimen>
     <!-- Vertical padding around action bar icons. -->
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 164b278..e08e50a 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àșšà»à»ˆàșĄàș”àșšà»àș„àșŽàșàșČàș™à»‚àș—àșȘàșœàș‡"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àșšà»à»ˆàșĄàș”àșšà»àș„àșŽàșàșČàș™àșȘàșœàș‡ àș«àșŒàș· àșàșČàș™à»‚àș—àșȘàșžàșà»€àșȘàș”àș™"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àș–àș·àșàș›àșŽàș”ໄàș§à»‰àșŠàș»à»ˆàș§àș„àșČàș§à»‚àș”àșàșœàșč້ໃàș«à»‰àșšà»àș„àșŽàșàșČàș™àș‚àș­àș‡àș—່àșČàș™"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"àșœàșč້ເàșšàșŽà»ˆàș‡à»àșàș‡àș„àș°àșšàș»àșšàș‚àș­àș‡àș—່àșČàș™àș›àșŽàș”ໄàș§à»‰àșȘàșłàș„àș±àșšàșŠàșŽàșĄ <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àșšà»à»ˆàșȘàșČàșĄàșČàș”àș•àșŽàș”àș•à»à»ˆà»€àș„àș·àș­àș‚່àșČàșàșĄàș·àș–àș·à»„àș”້"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ໃàș«à»‰àș„àș­àș‡àș›à»ˆàșœàș™à»€àș„àș·àș­àș‚່àșČàșàș—àș”່àș•à»‰àș­àș‡àșàșČàș™. ແàș•àș°à»€àșžàș·à»ˆàș­àș›à»ˆàșœàș™."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àșšà»à»ˆàșȘàșČàșĄàșČàș”ໃàșŠà»‰àșàșČàș™à»‚àș—àșȘàșžàșà»€àșȘàș”àș™à»„àș”້"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»àș­àș±àșšàșŻàș•àșŽàș”àș•à»à»ˆàșȘàș·à»ˆàșȘàșČàș™àșàș±àșšàș›à»‰àșČàșàșàșłàșàș±àșš, àșšàș±àș” ແàș„àș°à»‚àș•àș­à»ˆàșČàș™àș‚àș­àș‡àșàșČàș™àșȘàș·à»ˆàșȘàșČàș™à»„àș„àșàș°àșȘàș±à»‰àș™ (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àș›àșŽàș”àșàșČàș™àș„àș±àș­àșà»œà»‰àșČàșˆà»"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»àș­àș±àșšàșŻàș›àșŽàș”àșàșČàș™à»€àșźàș±àș”àș§àșœàșàș‚àș­àș‡àș›àșžà»ˆàșĄàș„àș±àș­àș ແàș„àș°àș„àș°àșšàș»àșšàș„àș§àșČàșĄàș›àș­àș”ໄàșžàș‚àș­àș‡àș„àș°àș«àș±àș”àșœà»ˆàșČàș™àș—àș”່ເàșŠàș·à»ˆàș­àșĄà»‚àșàș‡àșàș±àș™. ໂàș•àșąà»ˆàșČàș‡: ໂàș—àș„àș°àșȘàș±àșšàșˆàș°àș›àșŽàș”àșàșČàș™à»€àșźàș±àș”àș§àșœàșàș‚àș­àș‡àș›àșžà»ˆàșĄàș„àș±àș­àșà»€àșĄàș·à»ˆàș­àșĄàș”àșȘàșČàșà»‚àș—ເàș‚àș»à»‰àșČ àșˆàșČàșàș™àș±à»‰àș™àșˆàș¶à»ˆàș‡à»€àș›àș”àș”ໃàșŠà»‰à»„àș”້àș­àș”àșà»€àșĄàș·à»ˆàș­àș§àșČàș‡àșȘàșČàșà»àș„້àș§."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"ໃàșŠà»‰àșźàșČàș”ແàș§àșŠàș”àș§àș°àșĄàșŽàș•àșŽ"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»àș­àș±àșšàș™àșłà»ƒàșŠà»‰àșźàșČàș”ແàș§àșŠàș”àș§àș°àșĄàșŽàș•àșŽàșȘàșłàș„àș±àșšàșàșČàș™àșžàșŽàșȘàșčàș”àșąàș·àș™àșąàș±àș™"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àșˆàș±àș”​àșàșČàș™â€‹àșźàșČàș”​ແàș§â€‹àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àș­àș°â€‹àș™àșžâ€‹àșàșČàș”​ໃàș«à»‰â€‹à»àș­àș±àșšâ€‹à»€àșźàș±àș”​ໃàș«à»‰â€‹àș§àșŽâ€‹àș—àș”​àșàșČàș™â€‹àș•à»ˆàșČàș‡à»†â€‹à»€àșžàș”່àșĄ ແàș„àș°â€‹àș„àș¶àșšâ€‹à»àșĄà»ˆâ€‹à»àșšàșšâ€‹àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·â€‹àșȘàșłâ€‹àș„àș±àșšâ€‹àșàșČàș™â€‹à»ƒàșŠà»‰."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"ໃàșŠà»‰â€‹àșźàșČàș”​ແàș§â€‹àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àșšà»à»ˆâ€‹àșˆàș»àș”​àșˆàșłâ€‹à»„àș”້"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àșžàșŽàșȘàșčàș”àșąàș·àș™àșąàș±àș™àș„àșČàșàș™àșŽà»‰àș§àșĄàș·à»àș„້àș§"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àșšà»à»ˆâ€‹àșĄàș”​àșźàșČàș”​ແàș§àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·â€‹à»ƒàș«à»‰â€‹àșąàșč່."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àșšà»à»ˆâ€‹àșȘàșČ​àșĄàșČàș”​ເàșàș±àșšâ€‹àșźàș±àșâ€‹àșȘàșČ​àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·â€‹à»„àș§à»‰â€‹à»„àș”້. àșàș°â€‹àș„àșžâ€‹àș™àșČ​ເàș­àș»àșČ​àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·â€‹àș—àș”່​àșĄàș”​àșąàșč່​àș­àș­àșâ€‹à»„àș›."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເàș§â€‹àș„àșČ​àș„àșČàșâ€‹àș™àș”້àș§â€‹àșĄàș·â€‹àșšà»à»ˆâ€‹à»€àș‚àș»à»‰àșČ​ເàș–àșŽàș‡â€‹à»„àș”້. àș„àș­àș‡â€‹à»ƒà»à»ˆâ€‹àș­àș”àș."</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àșźàșčàșšà»àșšàșšàșàșČàș™àș›à»‰àș­àș™àș‚ໍ້àșĄàșčàș™"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àșàșČàș™à»€àșźàș±àș”àș§àșœàșàș‚àș­àș‡àș‚ໍ້àș„àș§àșČàșĄ"</string>
     <string name="email" msgid="4560673117055050403">"àș­àș”ເàșĄàș§"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àșȘàș»à»ˆàș‡àș­àș”ເàșĄàș§àș«àșČàș—àș”່àșąàșč່àș—àș”່ເàș„àș·àș­àș"</string>
     <string name="dial" msgid="1253998302767701559">"ໂàș—"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"​àș„àș°â€‹àșšàșžâ€‹àșšà»ˆàș­àș™â€‹àșąàșč່"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"ໂàș—àș«àșČເàșšàș”ໂàș—àș„àș°àșȘàș±àșšàș—àș”່ເàș„àș·àș­àș"</string>
+    <string name="map" msgid="5441053548030107189">"ແàșœàș™àș—àș”່"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"ເàș›àș”àș”"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"ເàș›àș”àș” URL àș—àș”່ເàș„àș·àș­àș"</string>
     <string name="sms" msgid="4560537514610063430">"àș‚ໍ້àș„àș§àșČàșĄ"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àșȘàș»à»ˆàș‡àș‚ໍ້àș„àș§àșČàșĄàș«àșČເàșšàș”ໂàș—àș„àș°àșȘàș±àșšàș—àș”່ເàș„àș·àș­àș"</string>
     <string name="add_contact" msgid="7867066569670597203">"ເàșžàș”່àșĄ"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"ເàșžàș”່àșĄà»ƒàșȘ່àș„àșČàșàșŠàș·à»ˆàșœàșč້àș•àșŽàș”àș•à»à»ˆ"</string>
     <string name="view_calendar" msgid="979609872939597838">"ເàșšàșŽà»ˆàș‡"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"ເàșšàșŽà»ˆàș‡à»€àș§àș„àșČàș—àș”່ເàș„àș·àș­àșà»ƒàș™àș›àș°àș•àșŽàș—àșŽàș™"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àș•àș±à»‰àș‡à»€àș§àș„àșČ"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àșàșłàș™àș»àș”ເàș§àș„àșČàșȘàșłàș„àș±àșšà»€àș§àș„àșČàș—àș”່ເàș„àș·àș­àș"</string>
     <string name="view_flight" msgid="7691640491425680214">"ແàș—àșŁàș±àș"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àș•àșŽàș”àș•àșČàșĄàș–້àșœàș§àșšàșŽàș™àș—àș”່ເàș„àș·àș­àș"</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>
@@ -1284,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> àșàșłàș„àș±àș‡àșȘàș°à»àș”àș‡àșœàș»àș™àșšàș±àș‡à»àș­àș±àșšàș­àș·à»ˆàș™àșąàșč່"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"àș«àșČàșàș—່àșČàș™àșšà»à»ˆàș•à»‰àș­àș‡àșàșČàș™ <xliff:g id="NAME">%s</xliff:g> ໃàș«à»‰à»ƒàșŠà»‰àș„àșžàș™àșȘàș»àșĄàșšàș±àș”àș™àș”້, ໃàș«à»‰à»àș•àș°à»€àșžàș·à»ˆàș­à»€àș›àș”àș”àșàșČàș™àș•àș±à»‰àș‡àș„່àșČ à»àș„້àș§àș›àșŽàș”àșĄàș±àș™à»„àș§à»‰."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àș›àșŽàș”"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"àșàșłàș„àș±àș‡àșàș§àș”àșȘàș­àșš <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àșàșłàș„àș±àș‡àș•à»à»ˆàș­àșČàșàșžà»€àș™àș·à»‰àș­àș«àșČàș›àș±àș”àșˆàșžàșšàș±àș™"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> ໃໝ່"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ແàș•àș°à»€àșžàș·à»ˆàș­àș•àș±à»‰àș‡àș„່àșČ"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àșȘàșłâ€‹àș„àș±àșšâ€‹àșàșČàș™â€‹à»‚àș­àș™â€‹àșźàșčàșšàș–່àșČàș ແàș„àș°â€‹àșĄàș”​ເàș”àș"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"ເàșàș”àș”àșšàș±àș™àș«àșČàșàș±àșš <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ແàș•àș°à»€àșžàș·à»ˆàș­à»àșà»‰à»„àș‚"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ເàșȘàșàș«àșČàș. ແàș•àș°à»€àșžàș·à»ˆàș­àșȘ້àș­àșĄà»àș›àș‡."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"àșšà»à»ˆâ€‹àșźàș­àș‡â€‹àșźàș±àșš <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àș­àșžàș›àș°àșàș­àș™àș™àș”້àșšà»à»ˆàșźàș­àș‡àșźàș±àșš <xliff:g id="NAME">%s</xliff:g> àș™àș”້. ແàș•àș°à»€àșžàș·à»ˆàș­àș•àș±à»‰àș‡àș„່àșČໃàș™àșźàșčàșšà»àșšàșšàș—àș”່àșźàș­àș‡àșźàș±àșš."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àș­àșžàș›àș°àșàș­àș™àș™àș”້àșšà»à»ˆàșźàș­àș‡àșźàș±àșš <xliff:g id="NAME">%s</xliff:g> àș™àș”້. ແàș•àș°à»€àșžàș·à»ˆàș­àș•àș±à»‰àș‡àș„່àșČໃàș™àșźàșčàșšà»àșšàșšàș—àș”່àșźàș­àș‡àșźàș±àșš."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àș–àș·àșâ€‹àș–àș­àș”​àș­àș­àșâ€‹à»„àș›â€‹à»àșšàșšâ€‹àșšà»à»ˆâ€‹àș„àșČàș”​àș„àșŽàș”"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àșàș°àș„àșžàș™àșČàș”àș”àș”àșĄàș”ເàș”àșàș­àș­àșàșà»ˆàș­àș™àșàșČàș™àș–àș­àș”ເàșžàș·à»ˆàș­àș«àșŒàș”àșà»€àș§àș±à»‰àș™àșàșČàș™àșȘàșčàș™à»€àșȘàșàș‚ໍ້àșĄàșčàș™"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"àș–àș­àș” <xliff:g id="NAME">%s</xliff:g> àș­àș­àșà»àș„້àș§"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àș„àșžàș™àșȘàș»àșĄàșšàș±àș”àșšàșČàș‡àșąà»ˆàșČàș‡àș­àșČàș”ເàșźàș±àș”àș§àșœàșà»„àș”້àșšà»à»ˆàș›àș»àșàșàș°àș•àșŽ. àșàș°àș„àșžàș™àșČໃàșȘ່àșšà»ˆàș­àș™àșˆàș±àș”ເàșàș±àșšàș‚ໍ້àșĄàșčàș™à»ƒà»à»ˆ."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"àșàșłàș„àș±àș‡àș”àș”àș” <xliff:g id="NAME">%s</xliff:g> àș­àș­àș"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àșąà»ˆàșČàș–àș­àș”àș­àș­àș"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àș•àșŽàș”​àș•àș±à»‰àș‡"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ເàș­àș»àșČàș­àș­àș"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àș„àș»à»‰àș™àș«àșČ"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àș‚àșČàș”​ໄàș›"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ໃàșȘ່àș­àșžàș›àș°àșàș­àș™àș­àș”àșàș„àș±à»‰àș‡"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"àșàșłâ€‹àș„àș±àș‡â€‹àșà»‰àșČàș <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"àșàșłâ€‹àș„àș±àș‡â€‹àșà»‰àșČàșâ€‹àș‚ໍ້​àșĄàșčàș™"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àșà»‰àșČàșà»€àș™àș·à»‰àș­àș«àșČàșȘàșłà»€àș„àș±àș”ແàș„້àș§"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"àșà»‰àșČàșà»€àș™àș·à»‰àș­àș«àșČໄàș› <xliff:g id="NAME">%s</xliff:g> ແàș„້àș§"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àșšà»à»ˆàșȘàșČàșĄàșČàș”àșà»‰àșČàșà»€àș™àș·à»‰àș­àș«àșČໄàș”້"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ໃàș«à»‰àș„àș­àș‡àșà»‰àșČàșà»€àș™àș·à»‰àș­àș«àșČàș­àș”àșàș„àș±à»‰àș‡"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ເàș­àș»àșČàș­àș­àș"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ເàș­àș»àșČàș­àș­àșà»àș„້àș§"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àșàșłàș„àș±àș‡àșàș§àș”àșȘàș­àșš..."</string>
@@ -1874,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"àșšà»à»ˆà»„àș”້àșˆàș±àș”àșàșœàșĄàșŠàșŽàșĄà»„àș§à»‰àșȘàșłàș„àș±àșšàșàșČàș™à»‚àș—àșȘàșœàș‡"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»ƒàșŠà»‰àșŠàșŽàșĄàșȘàșłàș„àș±àșšàșàșČàș™à»‚àș—àșȘàșœàș‡"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»ƒàșŠà»‰à»‚àș—àș„àș°àșȘàș±àșšàșȘàșłàș„àș±àșšàșàșČàș™à»‚àș—àșȘàșœàș‡"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»ƒàșŠà»‰àșŠàșŽàșĄ <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"àșšà»à»ˆà»„àș”້àșˆàș±àș”àș«àșČàșŠàșŽàșĄ <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»ƒàșŠà»‰àșŠàșŽàșĄ <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰à»ƒàșŠà»‰àșŠàșŽàșĄ <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ໜ້àșČàșˆà»àș›àș±àș­àșšàș­àș±àșš"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àș”àșČàș§à»€àșàșŁàș”ເàș§àș”àșŠàș±àș™à»àș­àș±àșšà»àș„້àș§ àș«àșŒàș· àșšà»à»ˆàșȘàșČàșĄàșČàș”ໃàșŠà»‰àșźà»ˆàș§àșĄàșàș±àșšàș—àșČàș‡àș„àș±àș”àș™àș”້ໄàș”້"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index de0fe71..9e5a705 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -489,10 +489,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"LeidĆŸiama programai perduoti artimojo lauko ryšiĆł technologijos (ALR) ĆŸymas, korteles ir skaitymo programas."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"išjungti ekrano uĆŸraktą"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"LeidĆŸiama programai neleisti klavišo uĆŸrakto ir visos susijusios slaptaĆŸodĆŸio apsaugos. Pvz., telefonas neleidĆŸia klavišo uĆŸrakto priimant gaunamąjÄŻ skambutÄŻ ir pakartotinai jÄŻ ÄŻgalina, kai skambutis baigiamas."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"naudoti biometrinę aparatinę įrangą"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"LeidĆŸiama programai naudoti biometrinę aparatinę ÄŻrangą tapatybei nustatyti"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"tvarkyti kontrolinio kodo aparatinę įrangą"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"LeidĆŸiama programai aktyvinti metodus, norint pridėti ir ištrinti naudojamus kontroliniĆł kodĆł šablonus."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"naudoti kontrolinio kodo aparatinę įrangą"</string>
@@ -1052,32 +1050,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"ğvesties bƫdas"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"Teksto veiksmai"</string>
     <string name="email" msgid="4560673117055050403">"SiĆłsti el. laišką"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"SiĆłsti el. laišką pasirinktu adresu"</string>
     <string name="dial" msgid="1253998302767701559">"Skambinti"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"Rasti"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"Skambinti pasirinktu telefono numeriu"</string>
+    <string name="map" msgid="5441053548030107189">"Ćœemėlapis"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"Atidaryti"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"Atidaryti pasirinktą URL"</string>
     <string name="sms" msgid="4560537514610063430">"Pranešimas"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"SiĆłsti pranešimą pasirinktu telefono numeriu"</string>
     <string name="add_contact" msgid="7867066569670597203">"Pridėti"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"Pridėti prie kontaktƳ"</string>
     <string name="view_calendar" msgid="979609872939597838">"PerĆŸiĆ«rėti"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"PerĆŸiĆ«rėti kalendoriuje pasirinktą laiką"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"Tvarkaraštis"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"Planuoti ÄŻvykÄŻ pasirinktam laikui"</string>
     <string name="view_flight" msgid="7691640491425680214">"Stebėti"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"Stebėti pasirinktą skrydį"</string>
     <string name="low_internal_storage_view_title" msgid="5576272496365684834">"MaĆŸÄ—ja laisvos saugyklos vietos"</string>
     <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Kai kurios sistemos funkcijos gali neveikti"</string>
     <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistemos saugykloje nepakanka vietos. Äźsitikinkite, kad yra 250 MB laisvos vietos, ir paleiskite iš naujo."</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 51d32e5..667a65e 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"NosĆ«tÄ«t e-pasta ziƆojumu uz atlasÄ«to adresi"</string>
     <string name="dial" msgid="1253998302767701559">"Zvanīt"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ZvanÄ«t uz atlasÄ«to tālruƆa numuru"</string>
-    <string name="map" msgid="6521159124535543457">"Atrast"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Atrast atlasīto adresi"</string>
+    <string name="map" msgid="5441053548030107189">"Maps"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Atvērt"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Atvērt atlasÄ«to URL"</string>
     <string name="sms" msgid="4560537514610063430">"ÄȘsziƆa"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index c5e0a44..de6d37b 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Испраќа Đ”-ĐżĐŸŃ€Đ°ĐșĐ° ĐœĐ° ĐžĐ·Đ±Ń€Đ°ĐœĐ°Ń‚Đ° аЎрДса"</string>
     <string name="dial" msgid="1253998302767701559">"ĐŸĐŸĐČĐžĐșај"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Đ“ĐŸ ĐżĐŸĐČĐžĐșуĐČĐ° ĐžĐ·Đ±Ń€Đ°ĐœĐžĐŸŃ‚ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœŃĐșĐž Đ±Ń€ĐŸŃ˜"</string>
-    <string name="map" msgid="6521159124535543457">"Đ›ĐŸŃ†ĐžŃ€Đ°Ń˜"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Ја Đ»ĐŸŃ†ĐžŃ€Đ° ĐžĐ·Đ±Ń€Đ°ĐœĐ°Ń‚Đ° аЎрДса"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ОтĐČĐŸŃ€Đž"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Ја ĐŸŃ‚ĐČĐŸŃ€Đ° ĐžĐ·Đ±Ń€Đ°ĐœĐ°Ń‚Đ° URL"</string>
     <string name="sms" msgid="4560537514610063430">"ĐŸĐŸŃ€Đ°ĐșĐ°"</string>
@@ -1284,10 +1285,10 @@
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ĐŁŃ€Đ”ĐŽĐŸŃ‚ ĐœĐ” ја ĐżĐŸĐŽĐŽŃ€Đ¶ŃƒĐČĐ° ĐŸĐČĐ°Đ° <xliff:g id="NAME">%s</xliff:g>. Đ”ĐŸĐżŃ€Đ”Ń‚Đ” Đ·Đ° ĐżĐŸŃŃ‚Đ°ĐČуĐČањД ĐČĐŸ ĐżĐŸĐŽĐŽŃ€Đ¶Đ°Đœ Ń„ĐŸŃ€ĐŒĐ°Ń‚."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ĐŁŃ€Đ”ĐŽĐŸĐČ ĐœĐ” ја ĐżĐŸĐŽĐŽŃ€Đ¶ŃƒĐČĐ° ĐŸĐČĐ°Đ° <xliff:g id="NAME">%s</xliff:g>. Đ˜Đ·Đ±Đ”Ń€Đ”Ń‚Đ” Đ·Đ° ĐżĐŸŃŃ‚Đ°ĐČуĐČањД ĐČĐŸ ĐżĐŸĐŽĐŽŃ€Đ¶Đ°Đœ Ń„ĐŸŃ€ĐŒĐ°Ń‚."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ĐœĐ”ĐŸŃ‡Đ”ĐșуĐČĐ°ĐœĐŸ Đ” ĐŸŃ‚ŃŃ‚Ń€Đ°ĐœĐ”Ń‚Đ°"</string>
-    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ОтĐșачДтД ја ĐœĐ°ĐŽĐČĐŸŃ€Đ”ŃˆĐœĐ°Ń‚Đ° ĐŒĐ”ĐŒĐŸŃ€ĐžŃ˜Đ° прДЎ ĐŽĐ° ја ĐŸŃ‚ŃŃ‚Ń€Đ°ĐœĐžŃ‚Đ” Đ·Đ° ĐŽĐ° ĐžĐ·Đ±Đ”ĐłĐœĐ”Ń‚Đ” ĐłŃƒĐ±Đ”ŃšĐ” ŃĐŸĐŽŃ€Đ¶ĐžĐœĐž"</string>
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"ИсĐșĐ»ŃƒŃ‡Đ”Ń‚Đ”  ја ĐœĐ°ĐŽĐČĐŸŃ€Đ”ŃˆĐœĐ°Ń‚Đ° ĐŒĐ”ĐŒĐŸŃ€ĐžŃ˜Đ° прДЎ ĐŽĐ° ја ĐŸŃ‚ŃŃ‚Ń€Đ°ĐœĐžŃ‚Đ” Đ·Đ° ĐŽĐ° ĐžĐ·Đ±Đ”ĐłĐœĐ”Ń‚Đ” ĐłŃƒĐ±Đ”ŃšĐ” ŃĐŸĐŽŃ€Đ¶ĐžĐœĐž"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> Đ” ĐŸŃ‚ŃŃ‚Ń€Đ°ĐœĐ”Ń‚Đ°"</string>
     <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ĐĐ”ĐșĐŸĐž Ń„ŃƒĐœĐșцоо ĐŒĐŸĐ¶Đ”Đ±Đž ĐœĐ”ĐŒĐ° ĐŽĐ° Ń€Đ°Đ±ĐŸŃ‚Đ°Ń‚ праĐČĐžĐ»ĐœĐŸ. Đ’ĐŒĐ”Ń‚ĐœĐ”Ń‚Đ” ĐœĐŸĐČĐ° ĐœĐ°ĐŽĐČĐŸŃ€Đ”ŃˆĐœĐ° ĐŒĐ”ĐŒĐŸŃ€ĐžŃ˜Đ°."</string>
-    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"ĐĄĐ” ĐŸŃ‚ĐșачуĐČĐ° <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"ĐĄĐ” ОсĐșĐ»ŃƒŃ‡ŃƒĐČĐ° <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ĐĐ” ĐŸŃ‚ŃŃ‚Ń€Đ°ĐœŃƒĐČĐ°Ń˜Ń‚Đ”"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ĐŸĐŸŃŃ‚Đ°ĐČĐž"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ИзĐČĐ°ĐŽĐž"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 662bbad..62061f1 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -483,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àŽšàŽżàŽŻà”Œ àŽ«à”€à”œàŽĄà” àŽ•àŽźà”àŽźà”àŽŻà”‚àŽŁàŽżàŽ•à”àŽ•à”‡àŽ·à”» (NFC) àŽŸàŽŸàŽ—à”àŽ•àŽłà”àŽźàŽŸàŽŻà”àŽ‚ àŽ•àŽŸà”ŒàŽĄà”àŽ•àŽłà”àŽźàŽŸàŽŻà”àŽ‚ àŽ±à”€àŽĄàŽ±à”àŽ•àŽłà”àŽźàŽŸàŽŻà”àŽłà”àŽł àŽ†àŽ¶àŽŻàŽ”àŽżàŽšàŽżàŽźàŽŻàŽ€à”àŽ€àŽżàŽšà” àŽ…àŽȘà”àŽČàŽżàŽ•à”àŽ•à”‡àŽ·àŽšà”àŽ•àŽłà”† àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽšà”àŽšà”."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àŽšàŽżàŽ™à”àŽ™àŽłà”àŽŸà”† àŽžà”‌àŽ•à”àŽ°à”€à”» àŽČà”‹àŽ•à”àŽ•à” àŽȘà”àŽ°àŽ”à”ŒàŽ€à”àŽ€àŽšàŽ°àŽčàŽżàŽ€àŽźàŽŸàŽ•à”àŽ•à”àŽ•"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àŽ•à”€àŽČà”‹àŽ•à”àŽ•à”àŽ‚ àŽàŽ€à”†àŽ™à”àŽ•àŽżàŽČà”àŽ‚ àŽ…àŽšà”àŽŹàŽšà”àŽ§ àŽȘàŽŸàŽžà”‌àŽ”à”‡àŽĄà” àŽžà”àŽ°àŽ•à”àŽ·àŽŻà”àŽ‚ àŽȘà”àŽ°àŽ”à”ŒàŽ€à”àŽ€àŽšàŽ°àŽčàŽżàŽ€àŽźàŽŸàŽ•à”àŽ•àŽŸà”» àŽ…àŽȘà”àŽČàŽżàŽ•à”àŽ•à”‡àŽ·àŽšà”† àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽšà”àŽšà”. àŽ‰àŽŠàŽŸàŽčàŽ°àŽŁàŽ€à”àŽ€àŽżàŽšà”, àŽ’àŽ°à” àŽ‡à”»àŽ•àŽźàŽżàŽ‚àŽ—à” àŽ•à”‹à”Ÿ àŽžà”àŽ”à”€àŽ•àŽ°àŽżàŽ•à”àŽ•à”àŽźà”àŽȘà”‹à”Ÿ àŽ«à”‹à”ș àŽ•à”€àŽČà”‹àŽ•à”àŽ•à” àŽȘà”àŽ°àŽ”à”ŒàŽ€à”àŽ€àŽšàŽ°àŽčàŽżàŽ€àŽźàŽŸàŽ•à”àŽ•à”àŽšà”àŽšà”, àŽ•à”‹à”Ÿ àŽ…àŽ”àŽžàŽŸàŽšàŽżàŽ•à”àŽ•à”àŽźà”àŽȘà”‹à”Ÿ àŽ•à”€àŽČà”‹àŽ•à”àŽ•à” àŽ”à”€àŽŁà”àŽŸà”àŽ‚ àŽȘà”àŽ°àŽ”à”ŒàŽ€à”àŽ€àŽšàŽ•à”àŽ·àŽźàŽźàŽŸàŽ•à”àŽšà”àŽšà”."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àŽŹàŽŻà”‹àŽźà”†àŽŸà”àŽ°àŽżàŽ•à” àŽčàŽŸà”Œ‌àŽĄà”‌àŽ”à”†àŽŻà”Œ àŽ‰àŽȘàŽŻà”‹àŽ—àŽżàŽ•à”àŽ•à”àŽ•"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àŽȘàŽ°àŽżàŽ¶à”‹àŽ§àŽżàŽšà”àŽšà”àŽ±àŽȘà”àŽȘàŽżàŽ•à”àŽ•à”àŽšà”àŽšàŽ€àŽżàŽšàŽŸàŽŻàŽż, àŽŹàŽŻà”‹àŽźà”†àŽŸà”àŽ°àŽżàŽ•à” àŽčàŽŸà”ŒàŽĄà”‌àŽ”à”†àŽŻà”Œ àŽ‰àŽȘàŽŻà”‹àŽ—àŽżàŽ•à”àŽ•àŽŸà”» àŽ†àŽȘà”àŽȘàŽżàŽšà”† àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àŽ«àŽżàŽ‚àŽ—à”ŒàŽȘà”àŽ°àŽżàŽšà”àŽ±à” àŽčàŽŸà”ŒàŽĄà”‌àŽ”à”†àŽŻà”Œ àŽšàŽżàŽŻàŽšà”àŽ€à”àŽ°àŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àŽ‰àŽȘàŽŻà”‹àŽ—àŽżàŽ•à”àŽ•àŽŸàŽšàŽŸàŽŻàŽż àŽ”àŽżàŽ°àŽČàŽŸàŽŻàŽŸàŽł àŽŸà”†àŽ‚àŽȘà”àŽČà”‡àŽ±à”àŽ±à”àŽ•à”Ÿ àŽšà”‡à”ŒàŽ•à”àŽ•àŽŸàŽšà”àŽ‚ àŽ‡àŽČà”àŽČàŽŸàŽ€àŽŸàŽ•à”àŽ•àŽŸàŽšà”àŽźà”àŽłà”àŽł àŽ°à”€àŽ€àŽżàŽ•à”Ÿ àŽ…àŽ­à”àŽŻà”ŒàŽ€à”àŽ„àŽżàŽ•à”àŽ•àŽŸà”» àŽ…àŽȘà”àŽČàŽżàŽ•à”àŽ•à”‡àŽ·àŽšà”† àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽšà”àŽšà”."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àŽ«àŽżàŽ‚àŽ—à”ŒàŽȘà”àŽ°àŽżàŽšà”àŽ±à” àŽčàŽŸà”ŒàŽĄà”‌àŽ”à”†àŽŻà”Œ àŽ‰àŽȘàŽŻà”‹àŽ—àŽżàŽ•à”àŽ•à”àŽ•"</string>
@@ -1012,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àŽŸà”ˆàŽȘà”àŽȘà”àŽšà”†àŽŻà”àŽŻà”œ àŽ°à”€àŽ€àŽż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àŽŸà”†àŽ•à”‌àŽžà”‌àŽ±à”àŽ±à” àŽȘà”àŽ°àŽ”à”ŒàŽ€à”àŽ€àŽšàŽ™à”àŽ™à”Ÿ"</string>
     <string name="email" msgid="4560673117055050403">"àŽ‡àŽźà”†àŽŻàŽżà”œ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽ”àŽżàŽČàŽŸàŽžàŽ€à”àŽ€àŽżàŽČà”‡àŽ•à”àŽ•à” àŽ‡àŽźà”†àŽŻàŽżà”œ àŽ…àŽŻàŽŻà”àŽ•à”àŽ•à”àŽ•"</string>
     <string name="dial" msgid="1253998302767701559">"àŽ”àŽżàŽłàŽżàŽ•à”àŽ•à”àŽ•"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àŽ•àŽŁà”àŽŸà”†àŽ€à”àŽ€à”àŽ•"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽšàŽźà”àŽȘàŽ±àŽżàŽČà”‡àŽ•à”àŽ•à” àŽ•à”‹à”Ÿ àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
+    <string name="map" msgid="5441053548030107189">"àŽźàŽŸàŽȘà”àŽȘà”"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àŽ€à”àŽ±àŽ•à”àŽ•à”àŽ•"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ URL àŽ“àŽȘà”àŽȘà”ș àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
     <string name="sms" msgid="4560537514610063430">"àŽžàŽšà”àŽŠà”‡àŽ¶àŽ‚"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽšàŽźà”àŽȘàŽ±àŽżàŽČà”‡àŽ•à”àŽ•à” àŽžàŽšà”àŽŠà”‡àŽ¶àŽ‚ àŽ…àŽŻàŽŻà”àŽ•à”àŽ•à”àŽ•"</string>
     <string name="add_contact" msgid="7867066569670597203">"àŽšà”‡à”ŒàŽ•à”àŽ•à”àŽ•"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àŽ•à”‹à”șàŽŸàŽŸàŽ•à”‌àŽ±à”àŽ±à”àŽ•àŽłàŽżàŽČà”‡àŽ•à”àŽ•à” àŽšà”‡à”ŒàŽ•à”àŽ•à”àŽ•"</string>
     <string name="view_calendar" msgid="979609872939597838">"àŽ•àŽŸàŽŁà”àŽ•"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àŽ•àŽČàŽŁà”àŽŸàŽ±àŽżà”œ àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽžàŽźàŽŻàŽ‚ àŽ•àŽŸàŽŁà”àŽ•"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àŽ·à”†àŽĄà”àŽŻà”‚àŽłà”‍‌"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽžàŽźàŽŻàŽ€à”àŽ€à”‡àŽ•à”àŽ•à” àŽ‡àŽ”àŽšà”àŽ±à” àŽ·à”†àŽĄà”àŽŻà”‚à”Ÿ àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
     <string name="view_flight" msgid="7691640491425680214">"àŽŸà”àŽ°àŽŸàŽ•à”àŽ•à”"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àŽ€àŽżàŽ°àŽžà”àŽžà”†àŽŸà”àŽ€à”àŽ€ àŽ«à”àŽČà”ˆàŽ±à”àŽ±à” àŽŸà”àŽ°àŽŸàŽ•à”àŽ•à” àŽšà”†àŽŻà”àŽŻà”àŽ•"</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>
@@ -1310,7 +1300,7 @@
     <string name="ext_media_move_success_title" msgid="7863652232242276066">"àŽ‰àŽłà”àŽłàŽŸàŽ•à”àŽ• àŽ•à”ˆàŽźàŽŸàŽ±à”àŽ±àŽ‚ àŽȘà”‚à”ŒàŽ€à”àŽ€àŽżàŽŻàŽŸàŽŻàŽż"</string>
     <string name="ext_media_move_success_message" msgid="8939137931961728009">"àŽ‰àŽłà”àŽłàŽŸàŽ•à”àŽ•àŽ‚ <xliff:g id="NAME">%s</xliff:g>-àŽČà”‡àŽ•à”àŽ•à” àŽšà”€àŽ•à”àŽ•àŽż"</string>
     <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àŽ‰àŽłà”àŽłàŽŸàŽ•à”àŽ•àŽ‚ àŽšà”€àŽ•à”àŽ•àŽŸàŽšàŽŸàŽŻàŽżàŽČà”àŽČ"</string>
-    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àŽ‰àŽłà”àŽłàŽŸàŽ•à”àŽ•àŽ‚ àŽšà”€àŽ•à”àŽ•à”àŽšà”àŽšàŽ€àŽżàŽšà” àŽ”à”€àŽŁà”àŽŸà”àŽ‚ àŽ¶à”àŽ°àŽźàŽżàŽ•à”àŽ•à”àŽ•"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àŽ‰àŽłà”àŽłàŽŸàŽ•à”àŽ•àŽ‚ àŽšà”€àŽ•à”àŽ•àŽŸà”» àŽ”à”€àŽŁà”àŽŸà”àŽ‚ àŽ¶à”àŽ°àŽźàŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àŽšà”€àŽ•à”àŽ•àŽ‚àŽšà”†àŽŻà”‌àŽ€à”"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àŽ‡àŽœàŽ•à”àŽ±à”àŽ±à”àŽšà”†àŽŻà”àŽ€à”"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àŽȘàŽ°àŽżàŽ¶à”‹àŽ§àŽżàŽ•à”àŽ•à”àŽšà”àŽšà”…"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index c539d44..dff7e8b 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Дуу Ń…ĐŸĐŸĐ»ĐŸĐčĐœŃ‹ ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃ алга"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Дуут ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃ эсĐČŃĐ» ŃĐ°Ń€Đ°Đ»Ń‚Đ°Đč ЎууЎлага алга"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ÒźĐčĐ»Ń‡ĐžĐ»ĐłŃŃĐł Ń‚Đ°ĐœŃ‹ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ ĐșĐŸĐŒĐżĐ°ĐœĐž Ń‚ÒŻŃ€ Ń…ŃƒĐłĐ°Ń†Đ°Đ°ĐœĐŽ ŃƒĐœŃ‚Ń€Đ°Đ°ŃĐ°Đœ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-Đœ ĐŸĐżĐ”Ń€Đ°Ń‚ĐŸŃ€ ĐșĐŸĐŒĐżĐ°ĐœĐžĐ°Ń Ń‚ÒŻŃ€ ŃƒĐœŃ‚Ń€Đ°Đ°ŃĐ°Đœ"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ĐœĐŸĐ±Đ°ĐčĐ» ŃÒŻĐ»Đ¶ŃŃĐœĐŽ Ń…ĐŸĐ»Đ±ĐŸĐłĐŽĐŸŃ… Đ±ĐŸĐ»ĐŸĐŒĐ¶ĐłÒŻĐč баĐčĐœĐ°"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ĐĄĐŸĐœĐłĐŸŃĐŸĐœ ŃÒŻĐ»Đ¶ŃŃĐł өөрчлөхөөр ĐŸŃ€ĐŸĐ»ĐŽĐŸĐœĐŸ уу. ӚөрчлөхОĐčĐœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ЯаралтаĐč ЎууЎлага хоĐčх Đ±ĐŸĐ»ĐŸĐŒĐ¶ĐłÒŻĐč"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ĐąĐ°ĐœĐžĐłĐŽĐ°Ń…ĐłÒŻĐč баĐčĐœĐ°"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Đ„ŃƒŃ€ŃƒŃƒĐœŃ‹ хээг ĐœĐŸŃ‚ĐŸĐ»ŃĐŸĐœ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Đ„ŃƒŃ€ŃƒŃƒĐœŃ‹ Ń…ŃŃĐœĐžĐč Ń‚ĐŸĐœĐŸĐł Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ Đ±ŃĐ»ŃĐœ бус баĐčĐœĐ°."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Đ„ŃƒŃ€ŃƒŃƒĐœŃ‹ хээг хаЎгалах Đ±ĐŸĐ»ĐŸĐŒĐ¶ĐłÒŻĐč баĐčĐœĐ°. ĐžĐŽĐŸĐŸ баĐčгаа Ń…ŃƒŃ€ŃƒŃƒĐœŃ‹ хээг Đ°Ń€ĐžĐ»ĐłĐ°ĐœĐ° уу."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đ„ŃƒŃ€ŃƒŃƒĐœŃ‹ хээ ĐŸŃ€ŃƒŃƒĐ»Đ°Ń… хугацаа Ó©ĐœĐłÓ©Ń€ŃÓ©Đœ баĐčĐœĐ°. Đ”Đ°Ń…ĐžĐœ ĐŸŃ€ŃƒŃƒĐ»ĐœĐ° уу."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ĐĄĐŸĐœĐłĐŸŃĐŸĐœ хаяг руу ĐžĐŒŃĐčĐ» ĐžĐ»ĐłŃŃŃ…"</string>
     <string name="dial" msgid="1253998302767701559">"Залгах"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐĄĐŸĐœĐłĐŸŃĐŸĐœ ŃƒŃ‚Đ°ŃĐœŃ‹ Юугаар руу залгах"</string>
-    <string name="map" msgid="6521159124535543457">"БаĐčршох"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐĄĐŸĐœĐłĐŸŃĐŸĐœ хаягоĐčĐœ баĐčŃ€ŃˆĐ»Ń‹Đł Ń‚ĐŸĐłŃ‚ĐŸĐŸŃ…"</string>
+    <string name="map" msgid="5441053548030107189">"Đ“Đ°Đ·Ń€Ń‹Đœ Đ·ŃƒŃ€Đ°Đł"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Нээх"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ĐĄĐŸĐœĐłĐŸŃĐŸĐœ URL-Đł ĐœŃŃŃ…"</string>
     <string name="sms" msgid="4560537514610063430">"ЗурĐČас"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>-Đł бусаЎ апп Юээр Ń…Đ°Ń€ŃƒŃƒĐ»Đ¶ баĐčĐœĐ°"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"йа <xliff:g id="NAME">%s</xliff:g>-ĐŽ ŃĐœŃ ĐŸĐœŃ†Đ»ĐŸĐłĐžĐčĐł Đ°ŃˆĐžĐłĐ»Đ°Ń…Ń‹Đł Ń…ÒŻŃŃŃ…ĐłÒŻĐč баĐčгаа Đ±ĐŸĐ» Ń‚ĐŸŃ…ĐžŃ€ĐłĐŸĐŸĐł ĐœŃŃĐłŃŃĐŽ, ŃƒĐœŃ‚Ń€Đ°Đ°ĐœĐ° уу."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ĐŁĐœŃ‚Ń€Đ°Đ°Ń…"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>-Đł шалгаж баĐčĐœĐ°…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"ĐžĐŽĐŸĐŸĐłĐžĐčĐœ Đ°ĐłŃƒŃƒĐ»ĐłŃ‹Đł Ń…ŃĐœĐ°Đ¶ баĐčĐœĐ°"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"ĐšĐžĐœŃ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ĐąĐŸŃ…ĐžŃ€ŃƒŃƒĐ»Đ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Зураг, ĐŒĐ”ĐŽĐžĐ° ŃˆĐžĐ»Đ¶ÒŻÒŻĐ»ŃŃ…ŃĐŽ Đ·ĐŸŃ€ĐžŃƒĐ»ŃĐ°Đœ"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> алЎаатаĐč баĐčĐœĐ°"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Đ—Đ°ŃĐ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> эĐČĐŽŃŃ€ŃŃĐœ баĐčĐœĐ°. Đ—Đ°ŃĐ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ ŃĐŸĐœĐłĐŸĐœĐŸ уу."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Đ”ŃĐŒĐ¶ŃŃĐłÒŻĐč <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Đ­ĐœŃ Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ ĐœŃŒ <xliff:g id="NAME">%s</xliff:g>-Đł ĐŽŃĐŒĐ¶ĐŽŃĐłĐłÒŻĐč. Đ”ŃĐŒĐ¶ĐžĐłĐŽŃŃĐœ Ń…ŃĐ»Đ±ŃŃ€ŃˆÒŻÒŻĐ»ŃĐ»Ń‚ŃĐŽ Ń‚ĐŸŃ…ĐžŃ€ŃƒŃƒĐ»Đ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Đ­ĐœŃ Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ <xliff:g id="NAME">%s</xliff:g>-Đł ĐŽŃĐŒĐ¶ĐŽŃĐłĐłÒŻĐč. Đ”ŃĐŒĐ¶ŃŃĐœ Ń…ŃĐ»Đ±ŃŃ€ŃˆÒŻÒŻĐ»ŃĐ»Ń‚ŃĐŽ Ń‚ĐŸŃ…ĐžŃ€ŃƒŃƒĐ»Đ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ ŃĐŸĐœĐłĐŸĐœĐŸ уу."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>-ыг ĐłŃĐœŃŃ‚ ĐłĐ°Ń€ĐłĐ°ŃĐ°Đœ баĐčĐœĐ°"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Агуулга алЎахаас сэргоĐčĐ»ŃŃ…ĐžĐčĐœ Ń‚ŃƒĐ»ĐŽ ĐŒĐ”ĐŽĐžĐ°Đł Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶Ó©Ó©Ń салгахаасаа Ó©ĐŒĐœÓ© Ń…ĐŸĐ»Đ±ĐŸĐ»Ń‚Ń‹Đł ŃĐ°Đ»ĐłĐ°ĐœĐ° уу"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>-Đł ŃƒŃŃ‚ĐłĐ°ŃĐ°Đœ"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Đ—Đ°Ń€ĐžĐŒ Ń„ŃƒĐœĐșц Đ·Ó©ĐČ Đ°Đ¶ĐžĐ»Đ»Đ°Ń…ĐłÒŻĐč баĐčж Đ±ĐŸĐ»Đ·ĐŸŃˆĐłÒŻĐč. ĐšĐžĐœŃ хаЎгалах ŃĐ°Đœ ĐŸŃ€ŃƒŃƒĐ»ĐœĐ° уу."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>-Đł салгаж баĐčĐœĐ°"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Đ‘ÒŻÒŻ салга"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ĐąĐŸŃ…ĐžŃ€ŃƒŃƒĐ»Đ°Ń…"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Халгах"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ĐĄŃƒĐŽĐ»Đ°Ń…"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> баĐčŃ…ĐłÒŻĐč баĐčĐœĐ°"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"TÓ©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ĐžĐčĐł ĐŽĐ°Ń…ĐžĐœ ĐŸŃ€ŃƒŃƒĐ»ĐœĐ° уу"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g>-ыг зөөж баĐčĐœĐ°"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ӚгөгЎөл Đ·Ó©Ó©ĐČөрлөж баĐčĐœĐ°..."</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ĐĐłŃƒŃƒĐ»ĐłŃ‹Đł ŃˆĐžĐ»Đ¶ÒŻÒŻĐ»Đ¶ ĐŽŃƒŃƒŃŃĐ°Đœ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"ĐĐłŃƒŃƒĐ»ĐłŃ‹Đł <xliff:g id="NAME">%s</xliff:g>-ĐŽ Đ·Ó©Ó©ŃÓ©Đœ"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ĐĐłŃƒŃƒĐ»ĐłŃ‹Đł зөөж Ń‡Đ°ĐŽŃĐ°ĐœĐłÒŻĐč"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ĐĐłŃƒŃƒĐ»ĐłŃ‹Đł ĐŽĐ°Ń…ĐžĐœ зөөж ÒŻĐ·ĐœŃ ÒŻÒŻ"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Đ„Đ°ŃŃĐ°Đœ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ĐĄĐ°Đ»ĐłĐ°ŃĐ°Đœ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Калгаж баĐčĐœĐ°..."</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-Đł Ўуу Ń…ĐŸĐŸĐ»ĐŸĐčĐŽ оЮэĐČŃ…Đ¶ÒŻÒŻĐ»ĐŽŃĐłĐłÒŻĐč"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-Đł Ўуу Ń…ĐŸĐŸĐ»ĐŸĐčĐŽ Đ·Ó©ĐČŃˆÓ©Ó©Ń€ĐŽÓ©ĐłĐłÒŻĐč"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Утсыг Ўуу Ń…ĐŸĐŸĐ»ĐŸĐčĐŽ Đ·Ó©ĐČŃˆÓ©Ó©Ń€ĐŽÓ©ĐłĐłÒŻĐč"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-Đł Đ·Ó©ĐČŃˆÓ©Ó©Ń€Ó©Ó©ĐłÒŻĐč"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-Đł оЮэĐČŃ…Đ¶ÒŻÒŻĐ»ŃŃĐłÒŻĐč"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-Đł Đ·Ó©ĐČŃˆÓ©Ó©Ń€Ó©Ó©ĐłÒŻĐč"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> SIM-Đł Đ·Ó©ĐČŃˆÓ©Ó©Ń€Ó©Ó©ĐłÒŻĐč"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ĐłŃĐœŃŃ‚ гарч орэх Ń†ĐŸĐœŃ…"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ĐĐżĐżŃ‹Đœ хуĐČОлбарыг Đ±ŃƒŃƒŃ€ŃƒŃƒĐ»ŃĐ°Đœ эсĐČŃĐ» ŃĐœŃ Ń‚ĐŸĐČŃ‡Đ»ĐŸĐ»Ń‚ĐŸĐč Ń‚ĐŸŃ…ĐžŃ€ĐŸŃ…ĐłÒŻĐč баĐčĐœĐ°"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index bc60761..7ebb087 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"à€”à„à€čà„‰à€‡à€ž à€žà„‡à€”à€Ÿ à€šà€Ÿà€čà„€"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"à€”à„‍à€čà„‰à€‡à€ž à€žà„‡à€”à€Ÿ à€•à€żà€‚à€”à€Ÿ à€†à€Łà„€à€Źà€Ÿà€Łà„€ à€•à„‰à€Čà€żà€‚à€— à€šà€Ÿà€čà„€"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"à€€à„à€źà€šà„‍à€Żà€Ÿ à€”à€Ÿà€čà€•à€Ÿà€šà„‡ à€€à€Ÿà€€à„‍à€Șà„à€°à€€à„‡ à€Źà€‚à€Š à€•à„‡à€Čà„‡ à€†à€čà„‡"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g> à€žà€żà€źà€žà€Ÿà€ à„€ à€€à„à€źà€šà„à€Żà€Ÿ à€”à€Ÿà€čà€•à€Ÿà€šà„‡ à€€à€Ÿà€€à„à€Șà„à€°à€€à„‡ à€Źà€‚à€Š à€•à„‡à€Čà„‡ à€†à€čà„‡"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"à€źà„‹à€Źà€Ÿà€‡à€Č à€šà„‡à€Ÿà€”à€°à„à€• à€‰à€Șà€Čà€Źà„à€§ à€šà€Ÿà€čà„€"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"à€Șà„à€°à€Ÿà€§à€Ÿà€šà„à€Ż à€Šà€żà€Čà„‡à€Čà„‡ à€šà„‡à€Ÿà€”à€°à„à€• à€Źà€Šà€Čà€Łà„à€Żà€Ÿà€šà€Ÿ à€Șà„à€°à€Żà€€à„à€š à€•à€°à€Ÿ. à€Źà€Šà€Čà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"à€†à€Łà„€à€Źà€Ÿà€Łà„€ à€•à„‰à€Čà€żà€‚à€— à€…à€šà„à€Șà€Čà€Źà„à€§"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"à€«à„€à€Čà„à€Ą à€œà€”à€łà„€à€Č à€•à€źà„à€Żà„à€šà€żà€•à„‡à€¶à€š (NFC) à€Ÿà„…à€—, à€•à€Ÿà€°à„à€Ąà„‡ à€†à€Łà€ż à€”à€Ÿà€šà€• à€Żà€Ÿà€‚à€šà„à€Żà€Ÿà€žà€č à€žà€‚à€”à€Ÿà€Š à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€…à„…à€Șà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€Šà„‡à€€à„‡."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"à€†à€Șà€Čà„‡ à€žà„à€•à„à€°à„€à€š à€Čà„‰à€• à€…à€•à„à€·à€ź à€•à€°à€Ÿ"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"à€•à„€à€Čà„‰à€• à€†à€Łà€ż à€•à„‹à€Łà€€à„€à€čà„€ à€žà€‚à€Źà€Šà„à€§ à€Șà€Ÿà€žà€”à€°à„à€Ą à€žà„à€°à€•à„à€·à€żà€€à€€à€Ÿ à€…à€•à„à€·à€ź à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€…à„…à€Ș à€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€Šà„‡à€€à„‡. à€‰à€Šà€Ÿà€čà€°à€Łà€Ÿà€°à„à€„, à€Żà„‡à€Łà€Ÿà€°à€Ÿ à€«à„‹à€š à€•à„‰à€Č à€Șà„à€°à€Ÿà€Șà„à€€ à€•à€°à€€à€Ÿà€šà€Ÿ à€«à„‹à€š à€•à„€à€Čà„‰à€• à€…à€•à„à€·à€ź à€•à€°à€€à„‹, à€šà€‚à€€à€° à€œà„‡à€”à„à€čà€Ÿ à€•à„‰à€Č à€žà€źà€Ÿà€Șà„à€€ à€čà„‹à€€à„‹ à€€à„‡à€”à„à€čà€Ÿ à€€à„‹ à€•à„€à€Čà„‰à€• à€Șà„à€šà„à€čà€Ÿ-à€žà€•à„à€·à€ź à€•à€°à€€à„‹."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"à€Źà€Ÿà€Żà„‹à€źà„‡à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€…à€° à€”à€Ÿà€Șà€°à€Ÿ"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"à€‘à€„à„‡à€‚à€Ÿà€żà€•à„‡à€¶à€šà€žà€Ÿà€ à„€ à€Źà€Ÿà€Żà„‹à€źà„‡à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€…à€°à€šà€Ÿ à€”à€Ÿà€Șà€° à€•à€°à€Łà„à€Żà€Ÿà€šà„€ à€…à„…à€Șà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€Šà„‡à€€à„‡"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€čà€Ÿà€°à„à€Ąà€”à„‡à€…à€° à€”à„à€Żà€”à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à€Ÿ"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"à€”à€Ÿà€Șà€° à€•à€°à€Łà„à€Żà€Ÿà€•à€°à€żà€€à€Ÿ à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€Ÿà„‡à€źà„à€Șà€Čà„‡à€Ÿ à€œà„‹à€Ąà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€†à€Łà€ż à€čà€Ÿà€”à€żà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Șà€Šà„à€§à€€à„€ à€°à€Šà„à€Š à€•à€°à€Łà„à€Żà€Ÿà€ž à€…à„…à€Șà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€Šà„‡à€€à„‡."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€čà€Ÿà€°à„à€Ąà€”à„‡à€…à€° à€”à€Ÿà€Șà€°à€Ÿ"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"à€“à€łà€–à€Čà„‡ à€šà€Ÿà€čà„€"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€‘à€„à„‡à€‚à€Ÿà€żà€•à„‡à€Ÿ à€•à„‡à€Čà„€ à€†à€čà„‡"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€čà€Ÿà€°à„à€Ąà€”à„‡à€…à€° à€‰à€Șà€Čà€Źà„‍à€§ à€šà€Ÿà€čà„€."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€žà„à€Ÿà„‹à€…à€° à€•à„‡à€Čà„‡ à€œà€Ÿà€Š à€¶à€•à€€ à€šà€Ÿà€čà„€. à€•à„ƒà€Șà€Żà€Ÿ à€”à€żà€Šà„à€Żà€źà€Ÿà€š à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€•à€Ÿà€ąà€Ÿ."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"à€«à€żà€‚à€—à€°à€Șà„à€°à€żà€‚à€Ÿ à€Ÿà€Ÿà€‡à€źà€†à€‰à€Ÿ à€à€Ÿà€Čà„‡. à€Șà„à€šà„à€čà€Ÿ à€Șà„à€°à€Żà€€à„à€š à€•à€°à€Ÿ."</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"à€‡à€šà€Șà„à€Ÿ à€Șà€Šà„à€§à€€"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"à€źà€œà€•à„‚à€° à€•à„à€°à€żà€Żà€Ÿ"</string>
     <string name="email" msgid="4560673117055050403">"à€ˆà€źà„‡à€Č"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„à€Żà€Ÿ à€…à„…à€Ąà„à€°à„‡à€žà€”à€° à€ˆà€źà„‡à€Č à€•à€°à€Ÿ"</string>
     <string name="dial" msgid="1253998302767701559">"à€•à„‰à€Č à€•à€°à€Ÿ"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"à€¶à„‹à€§à€Ÿ"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„à€Żà€Ÿ à€«à„‹à€š à€šà€‚à€Źà€°à€”à€° à€•à„‰à€Č à€•à€°à€Ÿ"</string>
+    <string name="map" msgid="5441053548030107189">"à€šà€•à€Ÿà€¶à€Ÿ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"à€‰à€˜à€Ąà€Ÿ"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„€ URL à€‰à€˜à€Ąà€Ÿ"</string>
     <string name="sms" msgid="4560537514610063430">"à€žà€‚à€Šà„‡à€¶"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„à€Żà€Ÿ à€«à„‹à€š à€šà€‚à€Źà€°à€”à€° à€à€žà€à€źà€à€ž à€•à€°à€Ÿ"</string>
     <string name="add_contact" msgid="7867066569670597203">"à€œà„‹à€Ąà€Ÿ"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"à€žà€‚à€Șà€°à„à€•à€Ÿà€‚à€źà€§à„à€Żà„‡ à€œà„‹à€Ąà€Ÿ"</string>
     <string name="view_calendar" msgid="979609872939597838">"à€Șà€čà€Ÿ"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„€ à€”à„‡à€ł à€•à„…à€Čà„‡à€‚à€Ąà€°à€źà€§à„à€Żà„‡ à€Șà€Ÿà€čà€Ÿ"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"à€¶à„‡à€Ąà„à€Żà„‚à€Č"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„à€Żà€Ÿ à€”à„‡à€łà„‡à€žà€Ÿà€ à„€ à€‡à€”à„à€čà„‡à€‚à€Ÿ à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€°à€Ÿ"</string>
     <string name="view_flight" msgid="7691640491425680214">"à€Ÿà„à€°à„…à€•"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"à€šà€żà€”à€Ąà€Čà„‡à€Čà„‡ à€”à€żà€źà€Ÿà€š à€Ÿà„à€°à„…à€• à€•à€°à€Ÿ"</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>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> à€…à€šà„‍à€Ż à€…à„…à€Șà„à€žà€”à€° à€Șà„à€°à€Šà€°à„à€¶à€żà€€ à€•à€°à€€ à€†à€čà„‡"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> à€šà„‡ à€čà„‡ à€”à„ˆà€¶à€żà€·à„à€Ÿà„à€Ż à€”à€Ÿà€Șà€°à„‚ à€šà€Żà„‡ à€…à€žà„‡ à€†à€Șà€Ł à€‡à€šà„à€›à€żà€€ à€…à€žà€Čà„à€Żà€Ÿà€ž, à€žà„‡à€Ÿà€żà€‚à€—à„à€œ à€‰à€˜à€Ąà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ à€†à€Łà€ż à€€à„‡ à€Źà€‚à€Š à€•à€°à€Ÿ."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"à€Źà€‚à€Š à€•à€°à€Ÿ"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> à€€à€Șà€Ÿà€žà€€ à€†à€čà„‡…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"à€žà€§à„à€Żà€Ÿà€šà„à€Żà€Ÿ à€†à€¶à€Żà€Ÿà€šà„‡ à€Șà„à€šà€°à€Ÿà€”à€Čà„‹à€•à€š à€•à€°à€€ à€†à€čà„‡"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"à€šà€”à„€à€š <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"à€žà„‡à€Ÿ à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"à€«à„‹à€Ÿà„‹ à€†à€Łà€ż à€źà„€à€Ąà€żà€Żà€Ÿ à€žà„à€„à€Ÿà€šà€Ÿà€‚à€€à€°à€żà€€ à€•à€°à€Łà„‍à€Żà€Ÿà€žà€Ÿà€ à„€"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> à€žà€č à€žà€źà€žà„à€Żà€Ÿ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"à€Šà„à€°à„à€žà„à€€ à€•à€°à€Łà„‍à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> à€Šà„‚à€·à€żà€€ à€†à€čà„‡. à€šà€żà€¶à„à€šà€żà€€ à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€šà€żà€”à€Ąà€Ÿ."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> à€…à€žà€źà€°à„à€„à€żà€€"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"à€čà„‡ à€Ąà€żà€”à„à€čà€Ÿà€‡à€ž <xliff:g id="NAME">%s</xliff:g> à€Čà€Ÿ à€žà€Șà„‹à€°à„à€Ÿ à€•à€°à€€ à€šà€Ÿà€čà„€. à€žà€Șà„‹à€°à„à€Ÿ à€…à€žà€Čà„‡à€Čà„à€Żà€Ÿ à€«à„‰à€°à€źà„…à€Ÿà€źà€§à„à€Żà„‡ à€žà„‡à€Ÿ à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"à€čà„‡ à€Ąà€żà€”à„à€čà€Ÿà€‡à€ž <xliff:g id="NAME">%s</xliff:g> à€Čà€Ÿ à€žà€Șà„‹à€°à„à€Ÿ à€•à€°à€€ à€šà€Ÿà€čà„€. à€žà€Șà„‹à€°à„à€Ÿ à€…à€žà€Čà„‡à€Čà„à€Żà€Ÿ à€«à„‰à€°à€źà„…à€Ÿà€źà€§à„à€Żà„‡ à€žà„‡à€Ÿ à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€šà€żà€”à€Ąà€Ÿ."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> à€…à€šà€Șà„‡à€•à„à€·à€żà€€à€°à€żà€€à„à€Żà€Ÿ à€•à€Ÿà€ąà€Čà„‡"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"à€†à€¶à€Ż à€—à€źà€Ÿà€”à€Łà„‡ à€Ÿà€Ÿà€łà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€•à€Ÿà€ąà„‚à€š à€Ÿà€Ÿà€•à€Łà„à€Żà€Ÿà€Șà„‚à€°à„à€”à„€ à€źà„€à€Ąà€żà€Żà€Ÿ à€‡à€œà„‡à€•à„à€Ÿ à€•à€°à€Ÿ"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> à€•à€Ÿà€ąà„‚à€š à€Ÿà€Ÿà€•à€Čà„‡ à€†à€čà„‡."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"à€•à€Ÿà€čà„€ à€•à€Ÿà€°à„à€Żà€•à„à€·à€źà€€à€Ÿ à€•à€Šà€Ÿà€šà„€à€€ à€Żà„‹à€—à„à€Żà€°à€żà€€à„à€Żà€Ÿ à€•à€Ÿà€°à„à€Ż à€•à€°à„‚ à€•à€°à€Łà€Ÿà€° à€šà€Ÿà€čà„€à€€. à€šà€”à„€à€š à€žà„à€Ÿà„‹à€°à„‡à€œ à€˜à€Ÿà€Čà€Ÿ."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> à€Źà€Ÿà€čà„‡à€° à€•à€Ÿà€ąà€€ à€†à€čà„‡"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"à€•à€Ÿà€ąà„‚ à€šà€•à€Ÿ"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"à€žà„‡à€Ÿ à€•à€°à€Ÿ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"à€Źà€Ÿà€čà„‡à€° à€•à€Ÿà€ąà€Ÿ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"à€à€•à„à€žà€Șà„à€Čà„‹à€° à€•à€°à€Ÿ"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> à€—à€čà€Ÿà€ł à€†à€čà„‡"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"à€Ąà€żà€”à„à€čà€Ÿà€‡à€ž à€Șà„à€šà„à€čà€Ÿ à€˜à€Ÿà€Čà€Ÿ"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> à€čà€Čà€”à€żà€€ à€†à€čà„‡"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"à€Ąà„‡à€Ÿà€Ÿ à€čà€Čà€”à€żà€€ à€†à€čà„‡"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"à€†à€¶à€Ż à€Ÿà„à€°à€Ÿà€‚à€žà€«à€° à€à€Ÿà€Čà€Ÿ à€†à€čà„‡"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"<xliff:g id="NAME">%s</xliff:g> à€”à€° à€†à€¶à€Ż à€čà€Čà€”à€Čà€Ÿ à€†à€čà„‡"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"à€†à€¶à€Ż à€čà€Čà€”à„‚ à€¶à€•à€Čà„‹ à€šà€Ÿà€čà„€"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"à€Șà„à€šà„à€čà€Ÿ à€†à€¶à€Ż à€čà€Čà€”à„‚à€š à€Șà€čà€Ÿ"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"à€•à€Ÿà€ąà€Čà„‡"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"à€Źà€Ÿà€čà„‡à€° à€•à€Ÿà€ąà€Čà„‡"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"à€€à€Șà€Ÿà€žà€€ à€†à€čà„‡..."</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"à€žà€żà€źà€źà€§à„‍à€Żà„‡ à€”à„‍à€čà„‰à€‡à€žà€šà„€ à€€à€°à€€à„‚à€Š à€šà€Ÿà€čà„€"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"à€”à„‍à€čà„‰à€‡à€žà€šà„€ à€žà€żà€źà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"à€”à„‍à€čà„‰à€‡à€žà€šà„€ à€«à„‹à€šà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g> à€žà€żà€źà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g> à€žà€żà€źà€šà„€ à€€à€°à€€à„‚à€Š à€•à„‡à€Čà„‡à€Čà„€ à€šà€Ÿà€čà„€"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g> à€žà€żà€źà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g> à€žà€żà€źà€Čà€Ÿ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"à€Șà„‰à€Șà€…à€Ș à€”à€żà€‚à€Ąà„‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"à€…‍à„…à€Șà€šà„€ à€†à€”à„ƒà€€à„à€€à„€ à€Ąà€Ÿà€‰à€šà€—à„à€°à„‡à€Ą à€•à„‡à€Čà„€, à€•à€żà€‚à€”à€Ÿ à€€à„€ à€Żà€Ÿ à€¶à„‰à€°à„à€Ÿà€•à€Ÿà€¶à„€ à€•à€‚à€Șà„…à€Ÿà€żà€Źà€Č à€šà€Ÿà€čà„€"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 3710b77..e015daf 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tiada perkhidmatan suara"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Tiada perkhidmatan suara atau panggilan kecemasan"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Dimatikan untuk sementara waktu oleh pembawa anda"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Dimatikan untuk sementara waktu oleh pembawa anda untuk SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Tidak dapat mencapai rangkaian mudah alih"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Cuba tukar rangkaian pilihan. Ketik untuk menukar."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Panggilan kecemasan tidak tersedia"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tidak dicam"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Cap jari disahkan"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perkakasan cap jari tidak tersedia."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Hantar e-mel ke alamat yang dipilih"</string>
     <string name="dial" msgid="1253998302767701559">"Panggil"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Panggil nombor telefon yang dipilih"</string>
-    <string name="map" msgid="6521159124535543457">"Cari"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Cari alamat yang dipilih"</string>
+    <string name="map" msgid="5441053548030107189">"Peta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Buka"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Buka URL yang dipilih"</string>
     <string name="sms" msgid="4560537514610063430">"Mesej"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikannya."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Matikan"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Menyemak <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Menyemak kandungan semasa"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> baharu"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Ketik untuk menyediakan"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Untuk memindahkan foto dan media"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Isu dengan <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Ketik untuk menyelesaikan masalah"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> rosak. Pilih untuk baiki."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> tidak disokong"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Peranti ini tidak menyokong <xliff:g id="NAME">%s</xliff:g> ini. Ketik untuk menyediakannya dalam format yang disokong."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Peranti ini tidak menyokong <xliff:g id="NAME">%s</xliff:g> ini. Pilih untuk menyediakan media dalam format yang disokong."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ditanggalkan tanpa dijangka"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Keluarkan media sebelum menanggalkan media itu untuk mengelakkan kehilangan kandungan"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> dialih keluar"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Sesetengah fungsi mungkin tidak berjalan dengan betul. Masukkan storan baharu."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Mengeluarkan <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Jangan tanggalkan"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Sediakan"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Tanggalkan"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Teroka"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> tiada"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Masukkan peranti sekali lagi"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Mengalihkan <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Mengalihkan data"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Pemindahan kandungan selesai"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Kandungan dialihkan ke <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Tidak dpt mengalihkan kandungan"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Cuba alihkan kandungan sekali lagi"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Dialih keluar"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Dikeluarkan"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Menyemak…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM tidak diperuntukkan untuk suara"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM tidak dibenarkan untuk suara"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tidak dibenarkan untuk suara"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak dibenarkan"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak diperuntukkan"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak dibenarkan"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tidak dibenarkan"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Tetingkap Timbul"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi apl diturunkan taraf atau tidak serasi dengan pintasan ini"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index adb29f3..5a30d2e 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -483,7 +483,7 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"အကá€șပá€șအာှ တာတို စကá€șကလငá€șှ ဆကá€șသလယá€șရေသ (NFC) တá€Čဂá€șမျဏသ၊ ကဒá€șမျဏသ နဟင့á€ș ဖတá€șá€€á€Œá€žá€°á€á€­á€Żá€·á€”á€Ÿá€„á€·á€ș ဆကá€șသလယá€șá€•á€Œá€±á€Źá€†á€­á€Żá€á€œá€„á€·á€ș á€•á€Œá€Żá€žá€Šá€ș။"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ဖနá€șá€žá€Źá€žá€•á€Œá€„á€ș á€žá€±á€Źá€·á€á€»á€á€Œá€„á€șှအာှ မလုပá€șနိုငá€șဥေဏငá€ș ပိတá€șရနá€ș"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"á€Ąá€•á€œá€źá€€á€±á€žá€›á€Ÿá€„á€șှအာှ á€žá€±á€Źá€·á€á€»á€á€Œá€„á€șသနဟင့á€ș သကá€șဆိုငá€șရာ á€…á€€á€Źá€žá€á€Ÿá€€á€șသတá€șမဟတá€șခဌငá€șသမျဏသဥဏသ မသုံသနိုငá€șဥေဏငá€ș ပိတá€șခဌငá€șှကို ခလင့á€șá€•á€Œá€Żá€›á€”á€ș။ ငပမဏ ဖုနá€șá€žá€œá€Źá€œá€»á€Ÿá€„á€ș သေဏ့ပိတá€șခဌငá€șှ ပယá€șဖျကá€șခဌငá€șှ၊ ဖုနá€șá€žá€•á€Œá€±á€Źá€•á€Œá€źá€žá€œá€»á€Ÿá€„á€ș သေဏ့ကို á€Ąá€œá€­á€Żá€Ąá€œá€»á€±á€Źá€€á€ș ပဌနá€șပိတá€șခဌငá€șှ"</string>
-    <string name="permlab_useBiometric" msgid="8837753668509919318">"á€‡á€źá€á€—á€±á€’á€†á€­á€Żá€„á€șရာ သတငá€șသဥချကá€șအလကá€șမျဏသသုံသသည့á€ș ကလနá€șပျူတဏဆိုငá€șရာ စကá€șပစá€čစညá€șှကို á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€›á€”á€ș"</string>
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"á€‡á€źá€á€—á€±á€’á€†á€­á€Żá€„á€șရာ ဥချကá€șအလကá€șသုံသ ကလနá€șပျူတဏဆိုငá€șရာ စကá€șပစá€čစညá€șှကို á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€›á€”á€ș"</string>
     <string name="permdesc_useBiometric" msgid="8389855232721612926">"ဥထေဏကá€șအထာှစိစစá€șခဌငá€șá€žá€Ąá€á€œá€€á€ș á€‡á€źá€á€—á€±á€’á€†á€­á€Żá€„á€șရာ သတငá€șသဥချကá€șအလကá€șမျဏသသုံသသည့á€ș ကလနá€șပျူတဏဆိုငá€șရာ စကá€șပစá€čစညá€șှကို á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€›á€”á€ș အကá€șပá€șကို ခလင့á€șá€•á€Œá€Żá€žá€Šá€ș"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"လကá€șá€—á€œá€±á€›á€Źá€•á€…á€čစညá€șှကို စဟမံမညá€ș"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€›á€”á€șá€Ąá€á€œá€€á€ș လကá€șá€—á€œá€±á€›á€Źá€•á€Żá€¶á€…á€¶á€™á€»á€Źá€žá€€á€­á€Ż ပေါငá€șသထည့á€șရနá€ș á€žá€­á€Żá€·á€™á€Ÿá€Żá€á€ș ဖျကá€șရနá€șနညá€șှလမá€șသမျဏသကို အပá€șဖá€șအာှ á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€á€œá€„á€·á€șá€•á€Œá€Żá€žá€Šá€ș။"</string>
@@ -497,7 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"á€Ąá€žá€­á€Ąá€™á€Ÿá€á€șá€™á€•á€Œá€Żá€•á€«"</string>
-    <string name="fingerprint_authenticated" msgid="5309333983002526448">"လကá€șá€—á€œá€±á€€á€­á€Ż ဥထေဏကá€șအထာှစိစစá€șá€•á€Œá€źá€žá€•á€«á€•á€Œá€ź"</string>
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"လကá€șá€—á€œá€±á€€á€­á€Ż ဥထေဏကá€șအထာှ စိစစá€șá€•á€Œá€źá€žá€•á€«á€•á€Œá€ź"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လကá€șá€—á€œá€±á€›á€Ź á€Ÿá€Źá€·á€’á€șဝá€Č မရနိုငá€șပါ။"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"လကá€șá€—á€œá€±á€›á€Ź á€žá€­á€Żá€œá€Ÿá€±á€Źá€„á€ș၍မရပါ။ á€€á€»á€±á€žá€‡á€°á€žá€•á€Œá€Żá á€›á€Ÿá€­á€•á€Œá€źá€žá€œá€€á€șá€—á€œá€±á€›á€Źá€Ąá€Źá€ž ဖယá€șá€›á€Ÿá€Źá€žá€•á€«á‹"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"လကá€șá€—á€œá€±á€›á€Źá€Ąá€á€»á€­á€”á€șကုနá€ș á€žá€œá€Źá€žá€•á€«á€žá€Šá€ș။ ထပá€șá€™á€¶á€€á€Œá€­á€Żá€žá€…á€Źá€žá€•á€«á‹"</string>
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"á€›á€œá€±á€žá€‘á€Źá€žá€žá€Šá€·á€ș လိပá€șစဏသို့ á€Ąá€źá€žá€™á€±á€žá€œá€șပို့ရနá€ș"</string>
     <string name="dial" msgid="1253998302767701559">"ခေါá€șဆိုရနá€ș"</string>
     <string name="dial_desc" msgid="6573723404985517250">"á€›á€œá€±á€žá€‘á€Źá€žá€žá€Šá€·á€ș ဖုနá€șသနံပါတá€șကို ခေါá€șရနá€ș"</string>
-    <string name="map" msgid="6521159124535543457">"တညá€șနေရဏ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"á€›á€œá€±á€žá€‘á€Źá€žá€žá€Šá€·á€ș လိပá€șစာကို á€›á€Ÿá€Źá€–á€œá€±á€›á€”á€ș"</string>
+    <string name="map" msgid="5441053548030107189">"á€™á€Œá€±á€•á€Żá€¶"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ဖလင့á€șရနá€ș"</string>
     <string name="browse_desc" msgid="8220976549618935044">"á€›á€œá€±á€žá€‘á€Źá€žá€žá€Šá€·á€ș URL ကို ဖလင့á€șရနá€ș"</string>
     <string name="sms" msgid="4560537514610063430">"SMS"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index d76cd8f..1bdcd73 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ingen taletjeneste"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ingen taletjeneste eller nødanrop"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Midlertidig deaktivert av operatøren din"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Midlertidig deaktivert av operatøren din for SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Får ikke kontakt med mobilnettverket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Prøv å endre foretrukket nettverk. Trykk for å endre."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Nødanrop er utilgjengelig"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke gjenkjent"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrykket er godkjent"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maskinvare for fingeravtrykk er ikke tilgjengelig."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Send e-post til den valgte adressen"</string>
     <string name="dial" msgid="1253998302767701559">"Ring"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ring det valgte telefonnummeret"</string>
-    <string name="map" msgid="6521159124535543457">"Finn"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Finn den valgte adressen"</string>
+    <string name="map" msgid="5441053548030107189">"Kart"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Åpne"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Åpne den valgte nettadressen"</string>
     <string name="sms" msgid="4560537514610063430">"Melding"</string>
@@ -1232,7 +1231,7 @@
     <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Last ned appen"</string>
     <string name="carrier_app_notification_title" msgid="8921767385872554621">"Et nytt SIM-kort er satt inn"</string>
     <string name="carrier_app_notification_text" msgid="1132487343346050225">"Trykk for å konfigurere"</string>
-    <string name="time_picker_dialog_title" msgid="8349362623068819295">"Oppgi tidspunkt"</string>
+    <string name="time_picker_dialog_title" msgid="8349362623068819295">"Angi tidspunkt"</string>
     <string name="date_picker_dialog_title" msgid="5879450659453782278">"Angi dato"</string>
     <string name="date_time_set" msgid="5777075614321087758">"Lagre"</string>
     <string name="date_time_done" msgid="2507683751759308828">"Ferdig"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Slå av"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Sjekker <xliff:g id="NAME">%s</xliff:g> …"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Gjennomgår nåværende innhold"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Ny <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Trykk for å konfigurere"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"For overføring av bilder og medier"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem med <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Trykk for å løse problemet"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> er skadet. Velg for å fikse."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> som ikke støttes"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Denne enheten støtter ikke <xliff:g id="NAME">%s</xliff:g>. Trykk for å konfigurere i et støttet format."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Denne enheten støtter ikke dette <xliff:g id="NAME">%s</xliff:g>. Velg for å konfigurere i et støttet format."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ble uventet fjernet"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Løs ut media før det tas ut for å unngå tap av innhold"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> er fjernet"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Noe funksjonalitet fungerer muligens ikke som den skal. Sett inn ny lagring."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Løser ut <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ikke fjern"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurer"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Løs ut"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Utforsk"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> mangler"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Sett inn enheten på nytt"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Flytter dataene"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Overføring av innhold fullført"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Innhold er flyttet til <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kunne ikke flytte innhold"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Prøv å flytte innhold igjen"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Fjernet"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Løst ut"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerer …"</string>
@@ -1829,9 +1813,9 @@
     <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-feilsøking"</string>
     <string name="time_picker_hour_label" msgid="2979075098868106450">"time"</string>
     <string name="time_picker_minute_label" msgid="5168864173796598399">"minutt"</string>
-    <string name="time_picker_header_text" msgid="143536825321922567">"Oppgi tidspunkt"</string>
+    <string name="time_picker_header_text" msgid="143536825321922567">"Angi tidspunkt"</string>
     <string name="time_picker_input_error" msgid="7574999942502513765">"Angi et gyldig klokkeslett"</string>
-    <string name="time_picker_prompt_label" msgid="7588093983899966783">"Skriv inn tidspunktet"</string>
+    <string name="time_picker_prompt_label" msgid="7588093983899966783">"Angi tidspunkt"</string>
     <string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Bytt til tekstinndatamodus for tidsinndata."</string>
     <string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Bytt til klokkemodus for tidsinndata."</string>
     <string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Alternativer for autofyll"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kortet er ikke klargjort for tale"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kortet har ikke tillatelse til tale"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonen har ikke tillatelse til tale"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tillatt"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke klargjort"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tillatt"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM-kortet <xliff:g id="SIMNUMBER">%d</xliff:g> er ikke tillatt"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Forgrunnsvindu"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Appversjonen er nedgradert eller ikke kompatibel med denne snarveien"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 1ab74ef..e4354dd 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -483,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€šà€Żà€Ÿà€ à€•à„à€·à„‡à€€à„à€° à€žà€‚à€šà€Ÿà€° (NFC) à€Ÿà„à€Żà€Ÿà€—à€čà€°à„‚, à€•à€Ÿà€°à„à€Ąà€čà€°à„‚ à€° à€Șà€Ÿà€ à€•à€čà€°à„‚à€žà€à€— à€…à€šà„à€€à€°à„à€•à„à€°à€żà€Żà€Ÿ à€—à€°à„à€š à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€›à„€"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"à€žà„à€•à„à€°à€żà€š à€Čà€• à€…à€žà€•à„à€·à€ź à€Șà€Ÿà€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"à€•à„à€šà„ˆ à€žà€źà„à€Źà€šà„à€§à€żà€€ à€Șà€Ÿà€žà€”à€°à„à€Ą à€žà„à€°à€•à„à€·à€Ÿ à€° à€•à€żà€Čà€•à€Čà€Ÿà€ˆ à€…à€žà€•à„à€·à€ź à€Șà€Ÿà€°à„à€š à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€›à„€ à€‰à€Šà€Ÿà€čà€°à€Łà€•à„‹ à€Čà€Ÿà€—à€ż, à€…à€šà„à€€à€°à„à€—à€źà€š à€«à„‹à€š à€•à€Č à€Șà„à€°à€Ÿà€Șà„à€€ à€—à€°à„à€Šà€Ÿ à€«à„‹à€šà€Čà„‡ à€•à€żà€Čà€•à€Čà€Ÿà€ˆ à€…à€žà€•à„à€·à€ź à€Șà€Ÿà€°à„à€›, à€€à„à€Żà€žà€Șà€›à€ż à€•à€Č à€žà€•à€żà€à€•à„‹ à€Źà„‡à€Čà€Ÿ à€•à€żà€Čà€• à€Șà„à€šà€ƒà€žà€•à„à€·à€ź à€Șà€Ÿà€°à„à€›à„€"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"à€Źà€Ÿà€Żà„‹à€źà„‡à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€šà„à€čà„‹à€žà„‌"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€Șà„à€°à€źà€Ÿà€Łà„€à€•à€°à€Łà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Źà€Ÿà€Żà„‹à€źà„‡à€Ÿà„à€°à€żà€• à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€š à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€›"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"à€”à€ à€Ÿà€›à€Ÿà€Ș à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€”à„à€Żà€”à€žà„à€„à€Ÿà€Șà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€Șà„à€°à€Żà„‹à€—à€•à„‹ à€Čà€Ÿà€—à€ż à€”à€ à€Ÿà€›à€Ÿà€Ș à€Ÿà„‡à€źà„à€Șà„à€Čà„‡à€Ÿ à€„à€Șà„à€š à€° à€źà„‡à€Ÿà€Ÿà€‰à€šà„‡ à€€à€°à€żà€•à€Ÿ à€†à€čà„à€”à€Ÿà€š à€—à€°à„à€š à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€›à„€"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"à€”à€ à€Ÿà€›à€Ÿà€Ș à€čà€Ÿà€°à„à€Ąà€”à„‡à€Żà€° à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
@@ -1012,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"à€šà€żà€”à„‡à€¶ à€”à€żà€§à€ż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"à€Șà€Ÿà€  à€•à€Ÿà€°à„à€Żà€čà€°à„‚"</string>
     <string name="email" msgid="4560673117055050403">"à€‡à€źà„‡à€Č"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€ à„‡à€—à€Ÿà€šà€Ÿà€źà€Ÿ à€‡à€źà„‡à€Č à€Șà€ à€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="dial" msgid="1253998302767701559">"à€•à€Č"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"à€Șà€€à„à€€à€Ÿ à€Čà€—à€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€«à„‹à€š à€šà€źà„à€Źà€°à€źà€Ÿ à€•à€Č à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="map" msgid="5441053548030107189">"à€šà€•à„à€žà€Ÿ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"à€–à„‹à€Čà„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ URL à€–à„‹à€Čà„à€šà„à€čà„‹à€žà„"</string>
     <string name="sms" msgid="4560537514610063430">"à€žà€šà„à€Šà„‡à€¶"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€«à„‹à€š à€šà€źà„à€Źà€°à€źà€Ÿ à€žà€šà„à€Šà„‡à€¶ à€Șà€ à€Ÿà€‰à€šà„à€čà„‹à€žà„‌"</string>
     <string name="add_contact" msgid="7867066569670597203">"à€„à€Șà„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"à€žà€źà„à€Șà€°à„à€• à€žà„‚à€šà„€à€źà€Ÿ à€„à€Șà„à€šà„à€čà„‹à€žà„"</string>
     <string name="view_calendar" msgid="979609872939597838">"à€čà„‡à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"à€Șà€Ÿà€€à„à€°à„‹à€źà€Ÿ à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€žà€źà€Ż à€čà„‡à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"à€žà€źà€Żà€€à€Ÿà€Čà€żà€•à€Ÿ"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€žà€źà€Żà€•à€Ÿ à€Čà€Ÿà€—à€ż à€•à€Ÿà€°à„à€Żà€•à„à€°à€źà€•à„‹ à€žà€źà€Żà€€à€Ÿà€Čà€żà€•à€Ÿ à€Źà€šà€Ÿà€‰à€šà„à€čà„‹à€žà„‌"</string>
     <string name="view_flight" msgid="7691640491425680214">"à€Ÿà„à€°à„à€Żà€Ÿà€• à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"à€šà€Żà€š à€—à€°à€żà€à€•à„‹ à€‰à€Ąà€Ÿà€š à€Ÿà„à€°à€Żà€Ÿà€• à€—à€°à„à€šà„à€čà„‹à€žà„"</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">"à€Șà„à€°à€Łà€Ÿà€Čà„€à€•à„‹ à€Čà€Ÿà€—à€ż à€Șà€°à„à€Żà€Ÿà€Șà„à€€ à€­à€Łà„à€Ąà€Ÿà€°à€Ł à€›à„ˆà€šà„€ à€€à€Șà€Ÿà€ˆà€à€žà€à€— à„šà„«à„Š à€źà„‡à€—à€Ÿ à€Źà€Ÿà€‡à€Ÿ à€ à€Ÿà€‰à€ à€–à€Ÿà€Čà„€ à€­à€à€•à„‹ à€šà€żà€¶à„à€šà€żà€€ à€—à€°à„à€šà„à€čà„‹à€žà„ à€° à€«à„‡à€°à€ż à€žà„à€°à„ à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
@@ -1273,7 +1263,7 @@
     <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>
-    <string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"à€€à€Șà€Ÿà€ˆà€‚à€•à€Ÿ à€Șà„à€°à€¶à€Ÿà€žà€•à€Čà„‡ à€Żà€ž à€Żà€šà„à€€à„à€°à€•à„‹ à€žà€źà€žà„à€Żà€Ÿ à€šà€żà€”à€Ÿà€°à€Ł à€—à€°à„à€šà€źà€Ÿ à€źà€Šà„à€Šà€€ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€à€‰à€Ÿà€Ÿ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€•à„‹ à€…à€šà„à€°à„‹à€§ à€—à€°à„à€šà„à€­à€à€•à„‹ à€›à„€ à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€čà€°à„‚ à€° à€Ąà„‡à€Ÿà€Ÿ à€†à€Šà€Ÿà€š à€Șà„à€°à€Šà€Ÿà€š à€—à€°à„à€š à€Șà€šà€ż à€žà€•à€żà€šà„à€›à„€"</string>
+    <string name="share_remote_bugreport_notification_message_finished" msgid="6029609949340992866">"à€€à€Șà€Ÿà€ˆà€‚à€•à€Ÿ à€Șà„à€°à€¶à€Ÿà€žà€•à€Čà„‡ à€Żà€ž à€Żà€šà„à€€à„à€°à€•à„‹ à€žà€źà€žà„à€Żà€Ÿ à€šà€żà€”à€Ÿà€°à€Ł à€—à€°à„à€šà€źà€Ÿ à€źà€Šà„à€Šà€€ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€à€‰à€Ÿà€Ÿ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€•à„‹ à€…à€šà„à€°à„‹à€§ à€—à€°à„à€šà„à€­à€à€•à„‹ à€›à„€ à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€čà€°à„‚ à€° à€Ąà„‡à€Ÿà€Ÿ à€†à€Šà€Ÿà€š à€Șà„à€°à€Šà€Ÿà€š à€—à€°à„à€š à€Șà€šà€ż à€žà€•à€żà€šà„à€›à„€"</string>
     <string name="share_remote_bugreport_action" msgid="6249476773913384948">"à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="decline_remote_bugreport_action" msgid="6230987241608770062">"à€…à€žà„à€”à„€à€•à€Ÿà€° à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="select_input_method" msgid="8547250819326693584">"à€•à„à€žà„à€œà„€à€Șà€Ÿà€Ÿà„€ à€Șà€°à€żà€”à€°à„à€€à€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
@@ -1337,7 +1327,7 @@
     <string name="permlab_requestDeletePackages" msgid="1703686454657781242">"à€Șà„à€Żà€Ÿà€•à„‡à€œà€čà€°à„‚ à€źà„‡à€Ÿà€Ÿà€‰à€šà„‡ à€…à€šà„à€°à„‹à€§ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€Șà„à€Żà€Ÿà€•à„‡à€œà€čà€°à„‚ à€źà„‡à€Ÿà€Ÿà€‰à€šà„‡ à€…à€šà„à€°à„‹à€§ à€—à€°à„à€š à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€›à„€"</string>
     <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà€źà„à€Źà€šà„à€§à„€ à€…à€šà„à€•à„‚à€Čà€šà€čà€°à„‚à€Čà€Ÿà€ˆ à€Źà„‡à€”à€Ÿà€žà„à€€à€Ÿ à€—à€°à„à€š à€žà„‹à€§à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"à€•à„à€šà„ˆ à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€€à„à€Żà€žà€•à€Ÿ à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà€źà„à€Źà€šà„à€§à„€ à€…à€šà„à€•à„‚à€Čà€šà€čà€°à„‚à€Čà€Ÿà€ˆ à€Źà„‡à€”à€Ÿà€žà„à€€à€Ÿ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€…à€šà„à€źà€€à€ż à€źà€Ÿà€—à„à€š à€Šà€żà€šà„à€›à„€"</string>
+    <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"à€•à„à€šà„ˆ à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Čà€Ÿà€ˆ à€€à„à€Żà€žà€•à€Ÿ à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà€źà„à€Źà€šà„à€§à„€ à€…à€šà„à€•à„‚à€Čà€šà€čà€°à„‚à€Čà€Ÿà€ˆ à€Źà„‡à€”à€Ÿà€žà„à€€à€Ÿ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€…à€šà„à€źà€€à€ż à€źà€Ÿà€—à„à€š à€Šà€żà€šà„à€›à„€"</string>
     <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"à€œà„à€ź à€šà€żà€Żà€šà„à€€à„à€°à€Łà€•à„‹ à€Čà€Ÿà€—à€ż à€Šà„à€ˆ à€šà„‹à€Ÿà€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="gadget_host_error_inflating" msgid="4882004314906466162">"à€”à€żà€œà„‡à€Ÿ à€„à€Ș à€—à€°à„à€š à€žà€•à€żà€à€Šà„ˆà€šà„€"</string>
     <string name="ime_action_go" msgid="8320845651737369027">"à€œà€Ÿà€šà„à€čà„‹à€žà„"</string>
@@ -1560,7 +1550,7 @@
     <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€—à€Čà€€ à€€à€°à€żà€•à€Ÿà€Čà„‡ TV à€…à€šà€Čà€• à€—à€°à„à€šà„‡ à€Șà„à€°à€Żà€Ÿà€ž à€—à€°à„à€šà„ à€­à€à€•à„‹ à€› <xliff:g id="NUMBER">%d</xliff:g> à€Șà€Ÿà€•à„€ TV à€…à€Ź à€•à€Ÿà€°à€–à€Ÿà€šà€Ÿà€•à„‹ à€Șà„‚à€°à„à€”à€šà€żà€°à„à€§à€Ÿà€°à€żà€€ à€žà„‡à€Ÿà€żà€™à€źà€Ÿ à€°à€żà€žà„‡à€Ÿ à€čà„à€šà„‡à€›à„€"</string>
     <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€—à€Čà€€ à€€à€°à€żà€•à€Ÿà€Čà„‡ à€«à„‹à€š <xliff:g id="NUMBER">%d</xliff:g> à€Șà€Ÿà€• à€…à€šà€Čà€• à€—à€°à„à€šà„‡ à€Șà„à€°à€Żà€€à„à€š à€—à€°à„à€šà„à€­à€Żà„‹à„€ à€…à€Ź à€«à„‹à€š à€«à„à€Żà€Ÿà€•à„à€Ÿà„à€°à€ż à€Șà„‚à€°à„à€”à€šà€żà€°à„à€§à€Ÿà€°à€żà€€à€źà€Ÿ à€Șà„à€šà€ƒà€žà„‡à€Ÿ à€čà„à€šà„‡ à€›à„€"</string>
     <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€—à€Čà€€ à€€à€°à€żà€•à€Ÿà€Čà„‡ à€†à€«à„à€šà„‹ à€…à€šà€Čà€• à€ąà€Ÿà€à€šà€Ÿ <xliff:g id="NUMBER_0">%1$d</xliff:g> à€Șà€Ÿà€• à€•à„‹à€°à„à€šà„à€­à€Żà„‹à„€ <xliff:g id="NUMBER_1">%2$d</xliff:g> à€”à€żà€«à€Č à€Șà„à€°à€Żà€€à„à€šà€čà€°à„‚ à€Șà€›à€ż, à€€à€Șà€Ÿà€ˆà€‚à€Čà€Ÿà€ˆ à€†à€«à„à€šà„‹ à€Ÿà„à€Żà€Ÿà€Źà„à€Čà„‡à€Ÿ à€‡à€źà„‡à€Č à€–à€Ÿà€€à€Ÿ à€Șà„à€°à€Żà„‹à€— à€—à€°à„‡à€° à€…à€šà€Čà€• à€—à€°à„à€š à€žà„‹à€§à€żà€šà„‡ à€›à„€\n\n à€«à„‡à€°à€ż à€Șà„à€°à€Żà€Ÿà€ž à€—à€°à„à€šà„à€čà„‹à€žà„ <xliff:g id="NUMBER_2">%3$d</xliff:g> à€žà„‡à€•à„‡à€šà„à€Ąà€čà€°à„‚à€źà€Ÿà„€"</string>
-    <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€—à€Čà€€ à€€à€°à€żà€•à€Ÿà€Čà„‡ à€†à€«à„à€šà„‹ à€…à€šà€Čà€• à€ąà€Ÿà€à€šà€Ÿà€Čà€Ÿà€ˆ à€à€żà€•à„à€šà„ à€­à€à€•à„‹ à€› <xliff:g id="NUMBER_0">%1$d</xliff:g> à€Șà€Ÿà€•à„€ <xliff:g id="NUMBER_1">%2$d</xliff:g> à€„à€Ș à€…à€žà€«à€Č à€Șà„à€°à€Żà€Ÿà€žà€čà€°à„‚ à€Șà€›à€ż à€€à€Șà€Ÿà€ˆà€à€Čà€Ÿà€ˆ à€‡à€źà„‡à€Č à€–à€Ÿà€€à€Ÿ à€–à„‹à€Čà„€ à€€à€Șà€Ÿà€ˆà€à€•à„‹  TV à€…à€šà€Čà€• à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€†à€—à„à€°à€č à€—à€°à€żà€šà„‡à€›à„€\n\n à€«à„‡à€°à€ż à€Șà„à€°à€Żà€Ÿà€ž à€—à€°à„à€šà„à€čà„‹à€žà„ <xliff:g id="NUMBER_2">%3$d</xliff:g> à€žà„‡à€•à„‡à€šà„à€Ąà€źà€Ÿà„€"</string>
+    <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€—à€Čà€€ à€€à€°à€żà€•à€Ÿà€Čà„‡ à€†à€«à„à€šà„‹ à€…à€šà€Čà€• à€ąà€Ÿà€à€šà€Ÿà€Čà€Ÿà€ˆ à€à€żà€•à„à€šà„ à€­à€à€•à„‹ à€› <xliff:g id="NUMBER_0">%1$d</xliff:g> à€Șà€Ÿà€•à„€ <xliff:g id="NUMBER_1">%2$d</xliff:g> à€„à€Ș à€…à€žà€«à€Č à€Șà„à€°à€Żà€Ÿà€žà€čà€°à„‚ à€Șà€›à€ż à€€à€Șà€Ÿà€ˆà€à€Čà€Ÿà€ˆ à€‡à€źà„‡à€Č à€–à€Ÿà€€à€Ÿ à€–à„‹à€Čà„€ à€€à€Șà€Ÿà€ˆà€à€•à„‹  TV à€…à€šà€Čà€• à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€†à€—à„à€°à€č à€—à€°à€żà€šà„‡à€›à„€\n\n à€«à„‡à€°à€ż à€Șà„à€°à€Żà€Ÿà€ž à€—à€°à„à€šà„à€čà„‹à€žà„ <xliff:g id="NUMBER_2">%3$d</xliff:g> à€žà„‡à€•à„‡à€šà„à€Ąà€źà€Ÿà„€"</string>
     <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"à€€à€Șà€Ÿà€ˆà€à€Čà„‡ à€†à€«à„à€šà„‹ à€…à€šà€Čà€• à€ąà€Ÿà€à€šà€Ÿ à€—à€Čà€€ à€°à„‚à€Șà€źà€Ÿ <xliff:g id="NUMBER_0">%1$d</xliff:g> à€Șà€Ÿà€• à€€à€Ÿà€šà„à€šà„ à€­à€à€•à„‹ à€›à„€ <xliff:g id="NUMBER_1">%2$d</xliff:g> à€§à„‡à€°à„ˆ à€…à€žà€«à€Č à€Șà„à€°à€Żà€Ÿà€žà€čà€°à„‚à€Șà€›à€ż, à€€à€Șà€Ÿà€ˆà€à€Čà€Ÿà€ˆ à€à€‰à€Ÿà€Ÿ à€‡à€źà„‡à€Č à€–à€Ÿà€€à€Ÿà€•à„‹ à€Șà„à€°à€Żà„‹à€— à€—à€°à„‡à€° à€€à€Șà€Ÿà€ˆà€à€•à„‹ à€«à„‹à€š à€…à€šà€Čà€• à€—à€°à„à€š à€žà„‹à€§à€żà€šà„‡ à€›à„€\n\n à€«à„‡à€°à€ż <xliff:g id="NUMBER_2">%3$d</xliff:g> à€žà„‡à€•à„‡à€šà„à€Ąà€źà€Ÿ à€Șà„à€°à€Żà€Ÿà€ž à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
     <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"à€čà€Ÿà€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
@@ -1883,7 +1873,7 @@
     <string name="volume_dialog_ringer_guidance_silent" msgid="2128975224280276122">"à€•à€Č à€€à€„à€Ÿ à€žà„‚à€šà€šà€Ÿà€čà€°à„‚à€Čà€Ÿà€ˆ à€źà„à€Żà„à€Ÿ à€—à€°à€żà€šà„‡ à€›"</string>
     <string name="notification_channel_system_changes" msgid="5072715579030948646">"à€Șà„à€°à€Łà€Ÿà€Čà„€à€žà€źà„à€Źà€šà„à€§à„€ à€Șà€°à€żà€”à€°à„à€€à€šà€čà€°à„‚"</string>
     <string name="notification_channel_do_not_disturb" msgid="6766940333105743037">"à€Źà€Ÿà€§à€Ÿ à€šà€Șà„à€±à„à€Żà€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
-    <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"à€€à€Șà€Ÿà€ˆà€‚à€Čà€Ÿà€ˆ à€§à„à€Żà€Ÿà€š à€•à„‡à€šà„à€Šà„à€°à€żà€€ à€—à€°à„à€šà€źà€Ÿ à€źà€Šà„à€Šà€€ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Źà€Ÿà€§à€Ÿ à€šà€Șà„à€°à„‍à€Żà€Ÿà€‰à€šà„à€čà„‹à€žà„ à€źà„‹à€Ąà€Čà„‡ à€žà„‚à€šà€šà€Ÿà€čà€°à„‚ à€Čà„à€•à€Ÿà€‡à€°à€čà„‡à€•à„‹ à€›"</string>
+    <string name="zen_upgrade_notification_visd_title" msgid="4168873821019741166">"à€€à€Șà€Ÿà€ˆà€‚à€Čà€Ÿà€ˆ à€§à„à€Żà€Ÿà€š à€•à„‡à€šà„à€Šà„à€°à€żà€€ à€—à€°à„à€šà€źà€Ÿ à€źà€Šà„à€Šà€€ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Źà€Ÿà€§à€Ÿ à€šà€Șà„à€°à„‍à€Żà€Ÿà€‰à€šà„à€čà„‹à€žà„ à€źà„‹à€Ąà€Čà„‡ à€žà„‚à€šà€šà€Ÿà€čà€°à„‚ à€Čà„à€•à€Ÿà€‡à€°à€čà„‡à€•à„‹ à€›"</string>
     <string name="zen_upgrade_notification_visd_content" msgid="6776377368195804354">"à€Żà„‹ à€šà€Żà€Ÿà€ à€”à„à€Żà€”à€čà€Ÿà€° à€čà„‹à„€ à€Șà€°à€żà€”à€°à„à€€à€š à€—à€°à„à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"à€Źà€Ÿà€§à€Ÿ à€šà€Șà„à€°à„‍à€Żà€Ÿà€‰à€šà„à€čà„‹à€žà„ à€źà„‹à€Ą à€Șà€°à€żà€”à€°à„à€€à€š à€­à€à€•à„‹ à€›"</string>
     <string name="zen_upgrade_notification_content" msgid="1794994264692424562">"à€°à„‹à€• à€Čà€—à€Ÿà€‡à€à€•à€Ÿ à€•à„à€°à€Ÿà€čà€°à„‚ à€œà€Ÿà€à€š à€—à€°à„à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„‌à„€"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1c4f243..3f64397 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen service voor spraakoproepen"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen spraakservice of noodoproepen"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Tijdelijk uitgeschakeld door je provider"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tijdelijk uitgeschakeld door je provider voor sim <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Kan mobiel netwerk niet bereiken"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Probeer een ander voorkeursnetwerk. Tik om te wijzigen."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Noodoproepen niet beschikbaar"</string>
@@ -288,7 +287,7 @@
     <string name="permgrouprequest_storage" msgid="7885942926944299560">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang geven tot foto\'s, media en bestanden op je apparaat?"</string>
     <string name="permgrouplab_microphone" msgid="171539900250043464">"Microfoon"</string>
     <string name="permgroupdesc_microphone" msgid="4988812113943554584">"audio opnemen"</string>
-    <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om audio op te nemen?"</string>
+    <string name="permgrouprequest_microphone" msgid="9167492350681916038">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; het volgende toestaan: audio opnemen."</string>
     <string name="permgrouplab_camera" msgid="4820372495894586615">"Camera"</string>
     <string name="permgroupdesc_camera" msgid="3250611594678347720">"foto\'s maken en video opnemen"</string>
     <string name="permgrouprequest_camera" msgid="1299833592069671756">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toestaan om foto\'s te maken en video op te nemen?"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Niet herkend"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk geverifieerd"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware voor vingerafdruk niet beschikbaar."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"E-mail sturen aan geselecteerd e-mailadres"</string>
     <string name="dial" msgid="1253998302767701559">"Bellen"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Geselecteerd telefoonnummer bellen"</string>
-    <string name="map" msgid="6521159124535543457">"Zoeken"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Geselecteerd adres tonen op kaart"</string>
+    <string name="map" msgid="5441053548030107189">"Kaart"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Openen"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Geselecteerde URL openen"</string>
     <string name="sms" msgid="4560537514610063430">"Bericht"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over apps"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Uitschakelen"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> controleren…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Huidige content controleren"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nieuwe <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tik om in te stellen"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Voor overzetten van foto\'s en media"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Probleem met <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tik om het probleem op te lossen"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> is beschadigd. Selecteer om te herstellen."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> niet ondersteund"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dit apparaat biedt geen ondersteuning voor deze <xliff:g id="NAME">%s</xliff:g>. Tik om te configureren in een ondersteunde indeling."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Dit apparaat biedt geen ondersteuning voor deze <xliff:g id="NAME">%s</xliff:g>. Selecteer om in te stellen in een ondersteunde indeling."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> is onverwacht verwijderd"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Werp media uit voordat je deze verwijdert om te voorkomen dat je content kwijtraakt"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> is verwijderd"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Sommige functies werken mogelijk niet correct. Plaats nieuw opslagapparaat."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> uitwerpen"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Niet verwijderen"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configureren"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Uitwerpen"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Verkennen"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> ontbreekt"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Voer apparaat opnieuw in"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> verplaatsen"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Gegevens verplaatsen"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Contentoverdracht is voltooid"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Content verplaatst naar <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kan content niet verplaatsen"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Probeer de content opnieuw te verplaatsen"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Verwijderd"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Uitgeworpen"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Controleren…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Sim niet geregistreerd voor spraak"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Simkaart niet toegestaan voor spraak"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoon niet toegestaan voor spraak"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Sim <xliff:g id="SIMNUMBER">%d</xliff:g> niet toegestaan"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"Sim <xliff:g id="SIMNUMBER">%d</xliff:g> niet geregistreerd"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Sim <xliff:g id="SIMNUMBER">%d</xliff:g> niet toegestaan"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Sim <xliff:g id="SIMNUMBER">%d</xliff:g> niet toegestaan"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-upvenster"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App-versie gedowngraded of niet geschikt voor deze snelkoppeling"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 3460628..b341cf4 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àŹ•à­ŒàŹŁàŹžàŹż àŹ­àŹàŹžà­‍ àŹžà­‡àŹŹàŹŸ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àŹ•à­ŒàŹŁàŹžàŹż àŹ­àŹàŹžà­ àŹžà­‡àŹŹàŹŸ àŹ•àŹżàŹźà­àŹŹàŹŸ àŹœàŹ°à­àŹ°à­€àŹ•àŹŸàŹłà­€àŹš àŹ•àŹČàŹżàŹ™à­àŹ— àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àŹ†àŹȘàŹŁàŹ™à­àŹ• àŹ•à­‡àŹ°àŹżàŹ…àŹ°à­‌àŹ™à­àŹ• àŹŠà­à­±àŹŸàŹ°àŹŸ àŹ…àŹžà­àŹ„àŹŸà­Ÿà­€ àŹ°à­‚àŹȘେ àŹŹàŹšà­àŹŠ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹ›àŹż"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> àŹȘàŹŸàŹ‡àŹ àŹ†àŹȘàŹŁàŹ™à­àŹ• àŹ•à­‡àŹ°àŹżàŹ…àŹ°à­ àŹŠà­à­±àŹŸàŹ°àŹŸ àŹ…àŹžà­àŹ„àŹŸà­Ÿà­€ àŹ°à­‚àŹȘେ àŹŹàŹšà­àŹŠ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹ›àŹż"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àŹźà­‹àŹŹàŹŸàŹ‡àŹČ୍‌ àŹšà­‡àŹŸà­‌à­±àŹ°à­àŹ• àŹźàŹżàŹłà­àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"àŹšàŹżàŹœ àŹȘàŹžàŹšà­àŹŠàŹ° àŹšà­‡àŹŸà­‌à­±àŹ°à­àŹ•àŹ•à­ àŹŻàŹżàŹŹàŹŸàŹȘàŹŸàŹ‡àŹ àŹšà­‡àŹ·à­àŹŸàŹŸ àŹ•àŹ°àŹšà­àŹ€à­à„€ àŹŹàŹŠàŹłàŹŸàŹ‡àŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹŸàŹŸàŹȘ୍ àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àŹœàŹ°à­àŹ°à­€àŹ•àŹŸàŹłà­€àŹš àŹ•àŹČ୍ àŹ‰àŹȘàŹČàŹŹà­àŹ§ àŹšàŹŸàŹčàŹżàŹ"</string>
@@ -176,8 +175,6 @@
     <string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"àŹ†àŹȘàŹŁàŹ™à­àŹ• à­±àŹ°à­àŹ• àŹȘà­àŹ°à­‹àŹ«àŹŸàŹ‡àŹČ୍‍ àŹ†àŹĄàŹźàŹżàŹšàŹ™à­àŹ• àŹŠà­à­±àŹŸàŹ°àŹŸ"</string>
     <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> àŹ…àŹšà­àŹŻàŹŸà­Ÿà­€"</string>
     <string name="work_profile_deleted" msgid="5005572078641980632">"à­±àŹŸàŹ°à­àŹ• àŹȘà­àŹ°à­‹àŹ«àŹŸàŹ‡àŹČ୍‍ àŹĄàŹżàŹČàŹżàŹŸà­ àŹčେàŹČàŹŸ"</string>
-    <!-- no translation found for work_profile_deleted_description (1100529432509639864) -->
-    <skip />
     <string name="work_profile_deleted_details" msgid="6307630639269092360">"àŹ†àŹĄàŹźàŹżàŹšà­‍ àŹ†àŹȘ୍‍ àŹšàŹŸàŹčàŹżàŹ àŹ•àŹżàŹźà­àŹŹàŹŸ àŹ­à­àŹČ àŹ…àŹ›àŹżà„€ àŹ«àŹłàŹžà­à­±àŹ°à­‚àŹȘ, àŹ†àŹȘàŹŁàŹ™à­àŹ• à­±àŹŸàŹ°à­àŹ• àŹȘà­àŹ°à­‹àŹ«àŹŸàŹ‡àŹČ୍‍ àŹàŹŹàŹ‚ àŹžàŹźà­àŹŹàŹšà­àŹ§à­€à­Ÿ àŹĄàŹŸàŹŸàŹŸ àŹĄàŹżàŹČàŹżàŹŸà­ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹ›àŹżà„€ àŹžàŹčàŹŸà­ŸàŹ€àŹŸ àŹȘàŹŸàŹ‡àŹ àŹ†àŹȘàŹŁàŹ™à­àŹ• àŹ†àŹĄàŹźàŹżàŹšàŹ™à­àŹ•à­ àŹŻà­‹àŹ—àŹŸàŹŻà­‹àŹ— àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"àŹàŹčàŹż àŹĄàŹżàŹ­àŹŸàŹ‡àŹžàŹ°à­‡ àŹ†àŹȘàŹŁàŹ™à­àŹ• à­±àŹ°à­àŹ• àŹȘà­àŹ°à­‹àŹ«àŹŸàŹ‡àŹČ୍‍ àŹ†àŹ‰ àŹ‰àŹȘàŹČàŹŹà­àŹ§ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"àŹŹàŹčà­àŹ€ àŹ„àŹ° àŹ­à­àŹČ àŹȘàŹŸàŹžà­‌à­±àŹ°à­àŹĄ àŹČà­‡àŹ–àŹżàŹ›àŹšà­àŹ€àŹż"</string>
@@ -486,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àŹšàŹżàŹ…àŹ°à­‍ àŹ«àŹżàŹČà­àŹĄ àŹ•àŹźà­à­Ÿà­àŹšàŹżàŹ•à­‡àŹžàŹšà­‍àŹš (NFC) àŹŸàŹŸàŹ—à­‍, àŹ•àŹŸàŹ°à­àŹĄ àŹ“ àŹ°àŹżàŹĄàŹ°àŹ—à­àŹĄàŹŒàŹżàŹ• àŹžàŹč àŹŻà­‹àŹ—àŹŸàŹŻà­‹àŹ— àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹ†àŹȘ୍‍àŹ•à­ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠà­‡àŹ‡àŹ„àŹŸàŹà„€"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àŹ†àŹȘàŹŁàŹ™à­àŹ• àŹžà­àŹ•à­àŹ°à­€àŹšà­‍ àŹČàŹ•à­‍ àŹ…àŹ•à­àŹ·àŹź àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àŹ†àŹȘ୍‌àŹ•à­ àŹ•à­€\'àŹČàŹ•à­ àŹ•àŹżàŹźà­àŹŹàŹŸ àŹžà­‡àŹ„àŹżàŹ°à­‡ àŹ„àŹżàŹŹàŹŸ àŹ•à­ŒàŹŁàŹžàŹż àŹȘàŹŸàŹžà­‌à­±àŹ°à­àŹĄ àŹžà­àŹ°àŹ•à­àŹ·àŹŸàŹ•à­ àŹ…àŹ•à­àŹ·àŹź àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ, àŹ‰àŹŠàŹŸàŹčàŹ°àŹŁàŹžà­à­±àŹ°à­‚àŹȘ, àŹ‡àŹšà­‌àŹ•àŹźàŹżàŹ™à­àŹ— àŹ«à­‹àŹšà­‌ àŹ•àŹČ୍ àŹȘà­àŹ°àŹŸàŹȘà­àŹ€ àŹ•àŹ°àŹżàŹŹàŹŸ àŹžàŹźà­ŸàŹ°à­‡ àŹ«à­‹àŹšà­‌àŹŸàŹż àŹ•à­€\'àŹČàŹ•à­‌àŹ•à­ àŹ…àŹ•à­àŹ·àŹź àŹ•àŹ°àŹżàŹŠàŹżàŹ, àŹ€àŹŸ’àŹȘàŹ°à­‡ àŹ•àŹČ୍ àŹžàŹźàŹŸàŹȘà­àŹ€ àŹčà­‡àŹŹàŹŸàŹȘàŹ°à­‡ àŹȘà­àŹŁàŹż àŹ•à­€\'àŹČàŹ•à­‌àŹ•à­ àŹžàŹ•à­àŹ·àŹź àŹ•àŹ°àŹżàŹ„àŹŸàŹà„€"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àŹŹàŹŸà­Ÿà­‹àŹźà­‡àŹŸà­àŹ°àŹżàŹ•à­‌ àŹčàŹŸàŹ°à­àŹĄà­±à­‡àŹ°à­‌ àŹŹà­à­ŸàŹŹàŹčàŹŸàŹ° àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àŹžà­à­±à­€àŹ•à­ƒàŹ€àŹż àŹȘàŹŸàŹ‡àŹ àŹŹàŹŸà­Ÿà­‹àŹźà­‡àŹŸà­àŹ°àŹżàŹ•à­‌ àŹčàŹŸàŹ°à­àŹĄà­±à­‡àŹ°à­‌ àŹŹà­à­ŸàŹŹàŹčàŹŸàŹ° àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹčàŹŸàŹ°à­àŹĄà­±à­‡àŹ°à­‍ àŹȘàŹ°àŹżàŹšàŹŸàŹłàŹšàŹŸ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àŹŹà­à­ŸàŹŹàŹčàŹŸàŹ° àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹŻà­‹àŹĄàŹŒàŹżàŹŹàŹŸàŹ•à­ àŹ“ àŹĄàŹżàŹČàŹżàŹŸà­‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹ†àŹȘàŹ•à­ àŹŹàŹżàŹ§àŹż àŹ†àŹ°àŹźà­àŹ­ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŠà­‡àŹ‡àŹ„àŹŸàŹà„€"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹčàŹŸàŹ°à­àŹĄà­±à­‡àŹ°à­‍ àŹŹà­à­ŸàŹŹàŹčàŹŸàŹ° àŹ•àŹ°àŹšà­àŹ€à­"</string>
@@ -502,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àŹšàŹżàŹčà­àŹšàŹŸ àŹčେàŹČàŹŸ àŹšàŹŸàŹčàŹżàŹ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹȘà­àŹ°àŹźàŹŸàŹŁà­€àŹ•à­ƒàŹ€ àŹčେàŹČàŹŸ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹčàŹŸàŹ°à­àŹĄà­±à­‡àŹ°à­‍ àŹ‰àŹȘàŹČàŹŹà­àŹ§ àŹšàŹŸàŹčàŹżàŹà„€"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹš àŹ·à­àŹŸà­‹àŹ°à­‍ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹȘàŹŸàŹ°àŹżàŹŹ àŹšàŹŸàŹčàŹżàŹà„€ àŹŠà­ŸàŹŸàŹ•àŹ°àŹż àŹȘà­‚àŹ°à­àŹŹàŹ°à­ àŹ„àŹżàŹŹàŹŸ àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹšàŹ•à­ àŹŹàŹŸàŹčàŹŸàŹ° àŹ•àŹ°àŹżàŹŠàŹżàŹ…àŹšà­àŹ€à­à„€"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"àŹ†àŹ™à­àŹ—à­àŹ àŹż àŹšàŹżàŹčà­àŹšàŹ° àŹžàŹźà­Ÿ àŹ¶à­‡àŹ· àŹčେàŹČàŹŸ à„€ àŹȘà­àŹŁàŹżàŹ„àŹ°à­‡ àŹšà­‡àŹ·à­àŹŸàŹŸ àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
@@ -1016,32 +1010,25 @@
     <string name="inputMethod" msgid="1653630062304567879">"àŹ‡àŹšàŹȘà­àŹŸà­ àŹȘàŹŠà­àŹ§àŹ€àŹż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àŹŸà­‡àŹ•à­àŹžàŹŸà­‌ àŹ•àŹŸàŹ°à­àŹŻà­à­Ÿ"</string>
     <string name="email" msgid="4560673117055050403">"àŹ‡àŹźà­‡àŹČ୍"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹ àŹżàŹ•àŹŁàŹŸàŹ°à­‡ àŹ‡àŹźà­‡àŹČ୍‌ àŹȘàŹ àŹŸàŹšà­àŹ€à­"</string>
     <string name="dial" msgid="1253998302767701559">"àŹ•àŹČ୍ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹ«à­‹àŹšà­‌ àŹšàŹźà­àŹŹàŹ°à­‌àŹ°à­‡ àŹ•àŹČ୍‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <!-- no translation found for map (5441053548030107189) -->
     <skip />
-    <string name="map" msgid="6521159124535543457">"àŹ àŹŸàŹŹ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àŹ–à­‹àŹČàŹšà­àŹ€à­"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ URL àŹ–à­‹àŹČàŹšà­àŹ€à­"</string>
     <string name="sms" msgid="4560537514610063430">"àŹźà­‡àŹžà­‡àŹœà­‌"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹ«à­‹àŹšà­‌ àŹšàŹźà­àŹŹàŹ°à­‌àŹ°à­‡ àŹźà­‡àŹžà­‡àŹœà­‌ àŹȘàŹ àŹŸàŹšà­àŹ€à­"</string>
     <string name="add_contact" msgid="7867066569670597203">"àŹŻà­‹àŹĄàŹŒàŹšà­àŹ€à­"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àŹŻà­‹àŹ—àŹŸàŹŻà­‹àŹ—àŹ°à­‡ àŹŻà­‹àŹĄàŹŒàŹšà­àŹ€à­"</string>
     <string name="view_calendar" msgid="979609872939597838">"àŹŠà­‡àŹ–àŹšà­àŹ€à­"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹžàŹźà­ŸàŹ•à­ àŹ•à­à­ŸàŹŸàŹČà­‡àŹŁà­àŹĄàŹ°à­‌àŹ°à­‡ àŹŠà­‡àŹ–àŹšà­àŹ€à­"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àŹšàŹżàŹ°à­àŹŠà­àŹ§àŹŸàŹ°àŹżàŹ€ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹžàŹźà­ŸàŹŸàŹżàŹ°à­‡ àŹ‡àŹ­à­‡àŹŁà­àŹŸ àŹžà­‡àŹŸà­‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="view_flight" msgid="7691640491425680214">"àŹŸà­àŹ°àŹŸàŹ•à­‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àŹŹàŹŸàŹ›àŹż àŹšà­‡àŹ‡àŹ„àŹżàŹŹàŹŸ àŹ«à­àŹČàŹŸàŹ‡àŹŸà­‌àŹ•à­ àŹŸà­àŹ°àŹŸàŹ•à­‌ àŹ•àŹ°àŹšà­àŹ€à­"</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>
@@ -1286,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> àŹ…àŹšà­à­Ÿ àŹ†àŹȘ୍‍ àŹ‰àŹȘàŹ°à­‡ àŹŠà­‡àŹ–àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"àŹàŹčàŹż àŹŹà­ˆàŹ¶àŹżàŹ·à­àŹŸà­à­Ÿ <xliff:g id="NAME">%s</xliff:g> àŹŹà­à­ŸàŹŹàŹčàŹŸàŹ° àŹšàŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŻàŹŠàŹż àŹ†àŹȘàŹŁ àŹšàŹŸàŹčàŹŸàŹàŹšà­àŹ€àŹż, àŹžà­‡àŹŸàŹżàŹ™à­àŹ— àŹ–à­‹àŹČàŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­ àŹàŹŹàŹ‚ àŹàŹčàŹŸ àŹ…àŹ«à­‍ àŹ•àŹ°àŹżàŹŠàŹżàŹ…àŹšà­àŹ€à­à„€"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àŹŹàŹšà­àŹŠ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g>àŹ° àŹŻàŹŸàŹžà­àŹš àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àŹžàŹŸàŹźà­àŹȘà­àŹ°àŹ€àŹżàŹ• àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹŸàŹ° àŹŻàŹŸàŹžà­àŹš àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"àŹšà­‚àŹ† <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àŹžà­‡àŹŸàŹ…àŹȘ୍‌ àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹŸàŹŸàŹȘ୍‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àŹ«àŹŸà­‹ àŹ“ àŹźàŹżàŹĄàŹżàŹ† àŹžà­àŹ„àŹŸàŹšàŹŸàŹšà­àŹ€àŹ° àŹ•àŹ°àŹŸàŹŻàŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> àŹžàŹč àŹžàŹźàŹžà­à­ŸàŹŸ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àŹ àŹżàŹ•à­‌ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àŹ–àŹ°àŹŸàŹȘ àŹčà­‹àŹ‡àŹŻàŹŸàŹ‡àŹ›àŹżà„€ àŹ àŹżàŹ•à­‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹšà­ŸàŹš àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> àŹžàŹȘà­‹àŹ°à­àŹŸ àŹ•àŹ°à­àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àŹàŹčàŹż àŹĄàŹżàŹ­àŹŸàŹ‡àŹžà­ àŹàŹčàŹż <xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹžàŹȘà­‹àŹ°à­àŹŸ àŹ•àŹ°à­‡àŹšàŹŸàŹčàŹżàŹà„€ àŹ—à­‹àŹŸàŹżàŹ àŹžàŹȘà­‹àŹ°à­àŹŸ àŹ•àŹ°à­àŹ„àŹżàŹŹàŹŸ àŹ«àŹ°à­àŹźàŹŸàŹŸà­‌àŹ°à­‡ àŹžà­‡àŹŸà­‍ àŹ…àŹȘ୍‍ àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àŹàŹčàŹż àŹĄàŹżàŹ­àŹŸàŹ‡àŹžà­ àŹàŹčàŹż <xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹžàŹȘà­‹àŹ°à­àŹŸ àŹ•àŹ°à­‡ àŹšàŹŸàŹčàŹżàŹà„€ àŹ—à­‹àŹŸàŹżàŹ àŹžàŹȘà­‹àŹ°à­àŹŸ àŹ•àŹ°à­àŹ„àŹżàŹŹàŹŸ àŹ«àŹ°à­àŹźàŹŸàŹŸàŹ°à­‡ àŹžà­‡àŹŸà­‍ àŹ…àŹȘ୍‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹčàŹ àŹŸàŹ€à­‌ àŹ•àŹŸàŹąàŹŒàŹżàŹŠàŹżàŹ†àŹ—àŹČàŹŸ"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹ€ àŹčàŹ°àŹŸàŹ‡àŹŹàŹŸàŹ•à­ àŹàŹĄàŹŒàŹŸàŹ‡àŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹ•àŹŸàŹąàŹŒàŹżàŹŹàŹŸ àŹȘà­‚àŹ°à­àŹŹàŹ°à­ àŹźàŹżàŹĄàŹżàŹ†àŹ•à­ àŹ‡àŹœà­‡àŹ•à­àŹŸ àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹ•àŹŸàŹąàŹŒàŹżàŹŠàŹżàŹ†àŹ—àŹČàŹŸ"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àŹ•àŹżàŹ›àŹż àŹ•àŹŸàŹ°à­àŹŻà­à­ŸàŹ•à­àŹ·àŹźàŹ€àŹŸ àŹ àŹżàŹ•à­ àŹ­àŹŸàŹŹà­‡ àŹ•àŹŸàŹź àŹšàŹ•àŹ°àŹżàŹȘàŹŸàŹ°à­‡à„€ àŹšà­‚àŹ† àŹ·à­àŹŸà­‹àŹ°à­‡àŹœà­ àŹ­àŹ°à­àŹ€à­àŹ€àŹż àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹ‡àŹœà­‡àŹ•à­àŹŸ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àŹ•àŹŸàŹąàŹŒàŹšà­àŹ€à­ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àŹžà­‡àŹŸà­ àŹ…àŹȘ୍ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àŹŹàŹŸàŹčàŹŸàŹ° àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àŹ–à­‹àŹœàŹšà­àŹ€à­"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àŹšàŹŸàŹčàŹżàŹ"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"àŹĄàŹżàŹ­àŹŸàŹ‡àŹžà­‌àŹ•à­ àŹȘà­àŹŁàŹż àŹ­àŹ°à­àŹ€à­àŹ€àŹż àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> àŹšàŹżàŹ†àŹŻàŹŸàŹ‰àŹ›àŹż"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"àŹĄàŹŸàŹŸàŹŸ àŹšàŹżàŹ†àŹŻàŹŸàŹ‰àŹ›àŹż"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹŸ àŹžà­àŹ„àŹŸàŹšàŹŸàŹšà­àŹ€àŹ° àŹčà­‹àŹ‡àŹ—àŹČàŹŸ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹŸàŹ•à­ <xliff:g id="NAME">%s</xliff:g>àŹ•à­ àŹšàŹżàŹ†àŹ—àŹČàŹŸ"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹŸàŹ•à­ àŹšà­‡àŹ‡àŹčà­‡àŹŹ àŹšàŹŸàŹčàŹżàŹ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àŹ•àŹŁà­àŹŸà­‡àŹŁà­àŹŸàŹ•à­ àŹȘà­àŹŁàŹżàŹ„àŹ°à­‡ àŹšà­‡àŹŹàŹŸàŹ•à­ àŹšà­‡àŹ·à­àŹŸàŹŸ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àŹŹàŹŸàŹčàŹŸàŹ° àŹ•àŹ°àŹżàŹŠàŹżàŹ†àŹ—àŹČàŹŸ"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àŹŹàŹŸàŹčàŹŸàŹ° àŹ•àŹ°àŹŸàŹ—àŹČàŹŸ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àŹŻàŹŸàŹžà­àŹš àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż…"</string>
@@ -1876,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM àŹ•àŹŸàŹ°à­àŹĄàŹ•à­ àŹ­àŹàŹžà­‍ àŹȘàŹŸàŹ‡àŹ àŹȘà­àŹ°àŹžà­àŹ€à­àŹ€ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM àŹ•àŹŸàŹ°à­àŹĄàŹ•à­ àŹ­àŹàŹžà­‍ àŹȘàŹŸàŹ‡àŹ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ†àŹŻàŹŸàŹ‡àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àŹ«à­‹àŹšàŹ•à­ àŹ­àŹàŹžà­‍ àŹȘàŹŸàŹ‡àŹ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ†àŹŻàŹŸàŹ‡àŹšàŹŸàŹčàŹżàŹ"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>àŹ° àŹ…àŹšà­àŹźàŹ€àŹż àŹšàŹŸàŹčàŹżàŹ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>àŹ° àŹȘà­àŹ°àŹŸàŹŹàŹ§àŹŸàŹš àŹšàŹŸàŹčàŹżàŹ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>àŹ° àŹ…àŹšà­àŹźàŹ€àŹż àŹšàŹŸàŹčàŹżàŹ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g>àŹ° àŹ…àŹšà­àŹźàŹ€àŹż àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"àŹȘàŹȘ-àŹ…àŹȘ୍ à­±àŹżàŹŁà­àŹĄà­‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àŹ†àŹȘ୍‌ àŹ­àŹ°à­àŹžàŹšà­ àŹȘà­àŹ°à­àŹŁàŹŸ àŹčà­‹àŹ‡àŹŻàŹŸàŹ‡àŹ›àŹż àŹ•àŹżàŹźà­àŹŹàŹŸ àŹàŹčàŹż àŹ¶àŹ°à­àŹŸàŹ•àŹŸà­ àŹžàŹčàŹżàŹ€ àŹ•àŹŸàŹź àŹ•àŹ°à­àŹšàŹŸàŹčàŹżàŹà„€"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index eb6b9d0..568b237 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"àš•à©‹àšˆ àš†àš”àšŸàšœàšŒà©€ àšžà©‡àš”àšŸ àššàščà©€àš‚"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"àš•à©‹àšˆ àš…àš”àšŸàšœàšŒà©€ àšžà©‡àš”àšŸ àšœàšŸàš‚ àšžà©°àš•àšŸàš•àšŸàšČà©€àšš àš•àšŸàšČàšżà©°àš— àššàščà©€àš‚"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"àš€à©àščàšŸàšĄà©‡ àš•à©ˆàš°à©€àš…àš° àš”à©±àšČà©‹àš‚ àš…àšžàš„àšŸàšˆ àš€à©Œàš° \'àš€à©‡ àšŹà©°àšŠ àščੈ"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"àšžàšżàšź <xliff:g id="SIMNUMBER">%d</xliff:g> àš€à©àščàšŸàšĄà©‡ àš•à©ˆàš°à©€àš…àš° àš”à©±àšČà©‹àš‚ àš…àšžàš„àšŸàšˆ àš€à©Œàš° \'àš€à©‡ àšŹà©°àšŠ àščੈ"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"àšźà©‹àšŹàšŸàšˆàšČ àššà©ˆà©±àšŸàš”àš°àš• àš€à©±àš• àšȘàščà©à©°àšš àššàščà©€àš‚ àš•à©€àš€à©€ àšœàšŸ àšžàš•àšŠà©€"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"àš€àš°àšœà©€àščੀ àššà©ˆà©±àšŸàš”àš°àš• àššà©‚à©° àšŹàšŠàšČ àš•à©‡ àšŠà©‡àš–à©‹à„€ àšŹàšŠàšČàšŁ àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹à„€"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"àšžà©°àš•àšŸàš•àšŸàšČà©€àšš àš•àšŸàšČàšżà©°àš— àš‰àšȘàšČàšŹàš§ àššàščà©€àš‚"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àšàšȘ àššà©‚à©° àššàšœàšŒàšŠà©€àš•à©€ àš–à©‡àš€àš° àšžà©°àššàšŸàš° (NFC) àšŸà©ˆàš—àšŸàš‚, àš•àšŸàš°àšĄàšŸàš‚ àš…àš€à©‡ àš°à©€àšĄàš°àšŸàš‚ àššàšŸàšČ àšžà©°àššàšŸàš° àš•àš°àšš àšŠà©€ àš†àš—àšżàš† àšŠàšżà©°àšŠàšŸ àščà©ˆà„€"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àš†àšȘàšŁàšŸ àšžàš•à©àš°à©€àšš  àšČàšŸàš•  àš…àšžàšźàš°à©±àš„ àšŹàšŁàšŸàš“"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àšàšȘ àššà©‚à©° àš•à©€àšČàšŸàš• àš…àš€à©‡ àš•àšżàšžà©‡ àš”à©€ àšžà©°àšŹà©°àš§àšżàš€ àšȘàšŸàšžàš”àš°àšĄ àšžà©àš°à©±àš–àšżàš† àššà©‚à©° àšŹà©°àšŠ àš•àš°àšš àšŠà©€ àš†àš—àšżàš† àšŠàšżà©°àšŠàšŸ àščà©ˆà„€ àš‰àšŠàšŸàščàš°àšš àšČàšˆ, àš«àšŒà©‹àšš àš‡à©±àš• àš‡àššàš•àšźàšżà©°àš— àš«àšŒà©‹àšš àš•àšŸàšČ àšȘà©àš°àšŸàšȘàš€ àš•àš°àšš àš”à©‡àšČੇ àšŹà©°àšŠ àš•àš°àšŠàšŸ àščੈ, àš«àšżàš° àšœàšŠà©‹àš‚ àš•àšŸàšČ àš–àš€àšź àščà©à©°àšŠà©€ àščੈ àš€àšŸàš‚ àš•à©€àšČàšŸàš• àššà©‚à©° àšźà©à©œ-àššàšŸàšČੂ àš•àš°àšŠàšŸ àščà©ˆà„€"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àšŹàšŸàš‡àš“àšźà©ˆàšŸà©àš°àšżàš• àščàšŸàš°àšĄàš”à©‡àš…àš° àš”àš°àš€à©‹"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àšàšȘ àššà©‚à©° àšȘà©àš°àšźàšŸàšŁà©€àš•àš°àšš àšČàšˆ àšŹàšŸàš‡àš“àšźà©ˆàšŸà©àš°àšżàš• àščàšŸàš°àšĄàš”à©‡àš…àš° àš”àš°àš€àšŁ àšŠàšżà©°àšŠàšŸ àščੈ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àščàšŸàš°àšĄàš”à©‡àš…àš° àš”àšżàš”àšžàš„àšżàš€ àš•àš°à©‹"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àšàšȘ àššà©‚à©° àš”àš°àš€à©‹àš‚ àšČàšˆ àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àšžàšŒàšŸàšźàšČ àš•àš°àšš àš…àš€à©‡ àšźàšżàšŸàšŸàš‰àšŁ àšŠà©€àš†àš‚ àš”àšżàš§à©€àš†àš‚ àšŠà©€ àšŹà©‡àššàš€à©€ àš•àš°àšš àšŠà©€ àš†àš—àšżàš† àšŠàšżà©°àšŠàšŸ àščà©ˆà„€"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àščàšŸàš°àšĄàš”à©‡àš…àš° àš”àš°àš€à©‹"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"àšȘàš›àšŸàšŁ àššàščà©€àš‚ àščà©‹àšˆ"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àšȘà©àš°àšźàšŸàšŁàšżàš€ àščà©‹àš‡àš†"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àščàšŸàš°àšĄàš”à©‡àš…àš° àš‰àšȘàšČàšŹàš§ àššàščà©€àš‚à„€"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àšžàšŸà©‹àš° àššàščà©€àš‚ àš•à©€àš€àšŸ àšžàš•àšŠàšŸà„€ àš•àšżàš°àšȘàšŸ àš•àš°àš•à©‡ àš‡à©±àš• àšźà©Œàšœà©‚àšŠàšŸ àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àščàšŸàšŸàš“à„€"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"àš«àšżà©°àš—àš°àšȘà©àš°àšżà©°àšŸ àšŠàšŸ àšžàšźàšŸàš‚ àšžàšźàšŸàšȘàš€ àščੋ àš—àšżàš† àščà©ˆà„€ àšŠà©àšŹàšŸàš°àšŸ àš•à©‹àšžàšŒàšżàšžàšŒ àš•àš°à©‹à„€"</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àš‡àššàšȘà©à©±àšŸ àš”àšżàš§à©€"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àšŸà©ˆàš•àšžàšŸ àš•àšżàš°àšżàš†àš”àšŸàš‚"</string>
     <string name="email" msgid="4560673117055050403">"àšˆàšźà©‡àšČ àš•àš°à©‹"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àššà©àšŁà©‡ àščà©‹àš àšȘàš€à©‡ \'àš€à©‡ àšˆàšźà©‡àšČ àš­à©‡àšœà©‹"</string>
     <string name="dial" msgid="1253998302767701559">"àš•àšŸàšČ àš•àš°à©‹"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àšŸàšżàš•àšŸàšŁàšŸ àšŠà©‡àš–à©‹"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àššà©àšŁà©‡ àš—àš àš«àšŒà©‹àšš àššà©°àšŹàš° \'àš€à©‡ àš•àšŸàšČ àš•àš°à©‹"</string>
+    <string name="map" msgid="5441053548030107189">"àššàš•àšžàšŒàšŸ àš–à©‹àšČ੍àščੋ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àš–à©‹àšČ੍àščੋ"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àššà©àšŁàšżàš† àš—àšżàš† URL àš–à©‹àšČ੍àščੋ"</string>
     <string name="sms" msgid="4560537514610063430">"àšžà©àššà©‡àščàšŸ àš­à©‡àšœà©‹"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àššà©àšŁà©‡ àš—àš àš«àšŒà©‹àšš àššà©°àšŹàš° \'àš€à©‡ àšžà©àššà©‡àščàšŸ àš­à©‡àšœà©‹"</string>
     <string name="add_contact" msgid="7867066569670597203">"àšžàšŒàšŸàšźàšČ àš•àš°à©‹"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àšžà©°àšȘàš°àš•àšŸàš‚ àš”àšżà©±àšš àšžàšŒàšŸàšźàšČ àš•àš°à©‹"</string>
     <string name="view_calendar" msgid="979609872939597838">"àšŠà©‡àš–à©‹"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àš•à©ˆàšČà©°àšĄàš° àš”àšżà©±àšš àššà©àšŁàšżàš† àš—àšżàš† àšžàšźàšŸàš‚ àšŠà©‡àš–à©‹"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àšžàšźàšŸàš‚-àšžà©‚àššà©€"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àššà©àšŁà©‡ àš—àš àšžàšźà©‡àš‚ àšČàšˆ àš‡àš”à©ˆàš‚àšŸ àšŠà©€ àšžàšźàšŸàš‚-àšžà©‚àššà©€ àšŹàšŁàšŸàš“"</string>
     <string name="view_flight" msgid="7691640491425680214">"àšŸàš°à©ˆàš• àš•àš°à©‹"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àššà©àšŁà©€ àš—àšˆ àš‰àšĄàšŸàšŁ àššà©‚à©° àšŸàš°à©ˆàš• àš•àš°à©‹"</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>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> àšàšȘ àščà©‹àš°àšŸàš‚ àšàšȘàšŸàš‚ àšŠà©‡ àš‰à©±àš€à©‡ àščà©ˆà„€"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"àšœà©‡àš•àš° àš€à©àšžà©€àš‚ àššàščà©€àš‚ àššàšŸàščà©à©°àšŠà©‡ àš•àšż <xliff:g id="NAME">%s</xliff:g> àšàšȘ àš‡àšž àš”àšżàšžàšŒà©‡àšžàšŒàš€àšŸ àšŠà©€ àš”àš°àš€à©‹àš‚ àš•àš°à©‡, àš€àšŸàš‚ àšžà©ˆàšŸàšżà©°àš—àšŸàš‚ àš–à©‹àšČ੍àščàšŁ àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹ àš…àš€à©‡ àš‡àšžàššà©‚à©° àšŹà©°àšŠ àš•àš°à©‹à„€"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"àšŹà©°àšŠ àš•àš°à©‹"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> àšŠà©€ àšœàšŸàš‚àšš àš•à©€àš€à©€ àšœàšŸ àš°àščੀ àščੈ…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"àš”àš°àš€àšźàšŸàšš àšžàšźà©±àš—àš°à©€ àšŠà©€ àšžàšźà©€àš–àšżàš† àš•à©€àš€à©€ àšœàšŸ àš°àščੀ àščੈ"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"àššàš”àšŸàš‚ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àšžà©ˆà©±àšŸàš…à©±àšȘ àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àš«àšŒà©‹àšŸà©‹àš†àš‚ àš…àš€à©‡ àšźà©€àšĄà©€àš† àššà©‚à©° àšŸà©àš°àšŸàš‚àšžàš«àšŒàš° àš•àš°àšš àšČàšˆ"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> àš”àšżà©±àšš àšžàšźà©±àšžàšżàš† àš†àšˆ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àš à©€àš• àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àš–àš°àšŸàšŹ àščà©ˆà„€ àš à©€àš• àš•àš°àšš àšČàšˆ àššà©àšŁà©‹à„€"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"àš…àšžàšźàš°àš„àšżàš€ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àš‡àšč àšĄà©€àš”àšŸàšˆàšž àš‡àšž <xliff:g id="NAME">%s</xliff:g> àššà©‚à©° àšžàšźàš°àš„àšš àššàščà©€àš‚ àš•àš°àšŠàšŸ àščà©ˆà„€ àš•àšżàšžà©‡ àšžàšźàš°àš„àšżàš€ àš«àšŸàš°àšźà©ˆàšŸ àš”àšżà©±àšš àšžàš„àšŸàšȘàš€ àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹à„€"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àš‡àšč àšĄà©€àš”àšŸàšˆàšž àš‡àšž <xliff:g id="NAME">%s</xliff:g> àšŠàšŸ àšžàšźàš°àš„àšš àššàščà©€àš‚ àš•àš°àšŠàšŸ àščà©ˆà„€ àš•àšżàšžà©‡ àšžàšźàš°àš„àšżàš€ àš«àšŸàš°àšźà©ˆàšŸ àš”àšżà©±àšš àšžàš„àšŸàšȘàš€ àš•àš°àšš àšČàšˆ àššà©àšŁà©‹à„€"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àššà©‚à©° àš…àššàššàššà©‡àš€ àščàšŸàšŸàš‡àš† àš—àšżàš†"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àšžàšźà©±àš—àš°à©€ àš—à©àš†àš‰àšŁ àš€à©‹àš‚ àšŹàššàšŁ àšČàšˆ àščàšŸàšŸàš‰àšŁ àš€à©‹àš‚ àšȘàščàšżàšČàšŸàš‚ àšźà©€àšĄà©€àš† àš•à©±àšąà©‹"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> àššà©‚à©° àščàšŸàšŸàš‡àš† àš—àšżàš†"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àšžàšŒàšŸàš‡àšŠ àš•à©àš àšȘà©àš°àš•àšŸàš°àšœàšŸàš€àšźàš•àš€àšŸ àšžàščੀ àšąà©°àš— àššàšŸàšČ àš•à©°àšź àššàšŸ àš•àš°à©‡à„€ àššàš”à©€àš‚ àšžàšŸà©‹àš°à©‡àšœ àšžàšŒàšŸàšźàšČ àš•àš°à©‹à„€"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> àššà©‚à©° àšŹàšŸàščàš° àš•à©±àšąàšżàš† àšœàšŸ àš°àšżàščàšŸ àščੈ"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àššàšŸ àščàšŸàšŸàš“"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àšžàš„àšŸàšȘàš€ àš•àš°à©‹"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àšŹàšŸàščàš° àš•à©±àšąà©‹"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"àšàš•àšžàšȘàšČà©‹àš° àš•àš°à©‹"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> àšČàšŸàšȘàš€àšŸ"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"àšŠà©àšŹàšŸàš°àšŸ àšĄà©€àš”àšŸàšˆàšž àšžàšŒàšŸàšźàšČ àš•àš°à©‹"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> àšźà©‚àš” àš•àš° àš°àšżàščàšŸ àščੈ"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">" àšĄàšŸàšŸàšŸ  àšźà©‚àš” àš•àš° àš°àšżàščàšŸ àščੈ"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"àšžàšźà©±àš—àš°à©€ àšŸà©àš°àšŸàš‚àšžàš«àšŒàš° àšȘà©‚àš°àšŸ àščà©‹àš‡àš†"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"àšžàšźà©±àš—àš°à©€ <xliff:g id="NAME">%s</xliff:g> àš”àšżà©±àšš àšČàšżàšœàšŸàšˆ àš—àšˆ"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"àšžàšźà©±àš—àš°à©€ àšČàšżàšœàšŸàšˆ àššàščà©€àš‚ àšœàšŸ àšžàš•à©€"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"àšŠà©àšŹàšŸàš°àšŸ àšžàšźà©±àš—àš°à©€ àšČàšżàšœàšŸ àš•à©‡ àšŠà©‡àš–à©‹"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"àščàšŸàšŸàš àš—àš"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"àščàšŸàšŸàš‡àš† àš—àšżàš†"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"àšœàšŸàš‚àšš àš•àš° àš°àšżàščàšŸ àščੈ..."</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"àšžàšżàšź àš°àšŸàščà©€àš‚ àš…àš”àšŸàšœàšŒà©€ àš•àšŸàšČ àš•àš°àšš àšŠà©€ àš”àšżàš”àšžàš„àšŸ àššàščà©€àš‚ àščੈ"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"àšžàšżàšź àš°àšŸàščà©€àš‚ àš…àš”àšŸàšœàšŒà©€ àš•àšŸàšČ àššàščà©€àš‚ àš•à©€àš€à©€ àšœàšŸ àšžàš•àšŠà©€"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"àš«àšŒà©‹àšš àš°àšŸàščà©€àš‚ àš…àš”àšŸàšœàšŒà©€ àš•àšŸàšČ àššàščà©€àš‚ àš•à©€àš€à©€ àšœàšŸ àšžàš•àšŠà©€"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"àšžàšżàšź <xliff:g id="SIMNUMBER">%d</xliff:g> àššà©‚à©° àš‡àšœàšŸàšœàšŒàš€ àššàščà©€àš‚ àščੈ"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"àšžàšżàšź <xliff:g id="SIMNUMBER">%d</xliff:g> àšŠà©€ àš”àšżàš”àšžàš„àšŸ àššàščà©€àš‚ àščੈ"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"àšžàšżàšź <xliff:g id="SIMNUMBER">%d</xliff:g> àššà©‚à©° àš‡àšœàšŸàšœàšŒàš€ àššàščà©€àš‚ àščੈ"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"àšžàšżàšź <xliff:g id="SIMNUMBER">%d</xliff:g> àššà©‚à©° àš‡àšœàšŸàšœàšŒàš€ àššàščà©€àš‚ àščੈ"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"àšȘੌàšȘàš…à©±àšȘ àš”àšżà©°àšĄà©‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"àšàšȘ àšŠàšŸ àš”àš°àšœàšš àšĄàšŸàšŠàššàš—à©àš°à©‡àšĄ àš•à©€àš€àšŸ àš—àšżàš†, àšœàšŸàš‚ àš‡àšž àšžàšŒàšŸàš°àšŸàš•à©±àšŸ àšŠà©‡ àš…àššà©àš•à©‚àšČ àššàščà©€àš‚ àščੈ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 92d7729..343d8b8 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -84,8 +84,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Brak usƂugi poƂączeƄ gƂosowych"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Brak usƂugi poƂączeƄ gƂosowych i alarmowych"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Tymczasowo wyƂączone przez operatora"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tymczasowo wyƂączone przez operatora karty SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Brak zasięgu sieci komórkowej"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Spróbuj zmienić preferowaną sieć. Kliknij, by zmienić."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"PoƂączenia alarmowe są niedostępne"</string>
@@ -504,8 +503,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie rozpoznano odcisku palca."</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Uwierzytelniono odciskiem palca"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie moĆŒna zapisać odcisku palca. UsuƄ istniejący odcisk palca."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string>
@@ -1055,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Wyƛlij e-maila na wybrany adres"</string>
     <string name="dial" msgid="1253998302767701559">"ZadzwoƄ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ZadzwoƄ pod wybrany numer telefonu"</string>
-    <string name="map" msgid="6521159124535543457">"Zlokalizuj"</string>
-    <string name="map_desc" msgid="9036645769910215302">"PokaĆŒ wybrany adres na mapie"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Otwórz"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Otwórz wybrany adres URL"</string>
     <string name="sms" msgid="4560537514610063430">"Wyƛlij SMS-a"</string>
@@ -1317,49 +1316,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jeƛli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystaƂa z tej funkcji, otwórz ustawienia i wyƂącz ją."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"WyƂącz"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Sprawdzam: <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Sprawdzam bieĆŒÄ…cą zawartoƛć"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nowy noƛnik: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Kliknij, by skonfigurować"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Do przenoszenia zdjęć i multimediów"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"WystąpiƂ problem z: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Kliknij, by naprawić"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"Noƛnik <xliff:g id="NAME">%s</xliff:g> jest uszkodzony. Wybierz, by rozwiązać problem."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"Noƛnik <xliff:g id="NAME">%s</xliff:g> nieobsƂugiwany"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"To urządzenie nie obsƂuguje <xliff:g id="NAME">%s</xliff:g>. Kliknij, by uĆŒyć obsƂugiwanego formatu."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"To urządzenie nie obsƂuguje noƛnika <xliff:g id="NAME">%s</xliff:g>. Wybierz, by skonfigurować obsƂugiwany format."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>: nieoczekiwane wyjęcie"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Zanim wyjmiesz noƛnik, odƂącz go, by uniknąć utraty danych"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> – odƂączono"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Niektóre funkcje mogą nie dziaƂać prawidƂowo. WƂóĆŒ nowy noƛnik."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"OdƂączam: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nie wyjmuj"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Skonfiguruj"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"OdƂącz"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Przeglądaj"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"Brak: <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"WƂóĆŒ noƛnik ponownie"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Przenoszę <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Przenoszę dane"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"ZakoƄczono przenoszenie danych"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Dane przeniesione na: <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Nie moĆŒna przenieƛć danych"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Spróbuj ponownie przenieƛć dane"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Usunięto"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"OdƂączone"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Sprawdzam…"</string>
@@ -1933,14 +1917,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Karta SIM nie jest obsƂugiwana w przypadku usƂug gƂosowych"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Karta SIM jest niedozwolona w przypadku usƂug gƂosowych"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon jest niedozwolony w przypadku usƂug gƂosowych"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Niedozwolona karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"NieobsƂugiwana karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Niedozwolona karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Niedozwolona karta SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Wyskakujące okienko"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Zmieniono wersję aplikacji na starszą lub aplikacja nie jest zgodna z tym skrótem"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 441ac9c..36ba740 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Enviar e-mail para endereço selecionado"</string>
     <string name="dial" msgid="1253998302767701559">"Ligar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
-    <string name="map" msgid="6521159124535543457">"Localizar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localizar endereço selecionado"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
     <string name="sms" msgid="4560537514610063430">"Mensagem"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index eccb4de..784d316 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Enviar um email para o endereço selecionado"</string>
     <string name="dial" msgid="1253998302767701559">"Telefonar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Telefonar para o número de telefone selecionado"</string>
-    <string name="map" msgid="6521159124535543457">"Localizar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localizar o endereço selecionado"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abrir o URL selecionado"</string>
     <string name="sms" msgid="4560537514610063430">"Mensagem"</string>
@@ -1285,7 +1286,7 @@
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> foi removido inesperadamente"</string>
     <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ejete o armazenamento multimédia antes de o remover para evitar a perda de conteúdos."</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> removido"</string>
-    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Algumas funcionalidades podem não funcionar corretamente. Insira um novo armazenamento."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Algumas funcionalidades podem não funcionar corretamente. Insira um novo dispositivo de armazenamento."</string>
     <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"A ejetar <xliff:g id="NAME">%s</xliff:g>…"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Não remova."</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurar"</string>
@@ -1847,7 +1848,7 @@
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM não permitido para voz"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telemóvel não permitido para voz"</string>
     <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
-    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não aprovisionado"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não fornecido"</string>
     <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
     <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> não autorizado"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 441ac9c..36ba740 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Enviar e-mail para endereço selecionado"</string>
     <string name="dial" msgid="1253998302767701559">"Ligar"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ligar para o número de telefone selecionado"</string>
-    <string name="map" msgid="6521159124535543457">"Localizar"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localizar endereço selecionado"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Abrir"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Abrir URL selecionado"</string>
     <string name="sms" msgid="4560537514610063430">"Mensagem"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b173057..3aa5d25 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Trimiteți e-mail la adresa selectată"</string>
     <string name="dial" msgid="1253998302767701559">"Apelați"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Apelați numărul de telefon selectat"</string>
-    <string name="map" msgid="6521159124535543457">"Localizați"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Localizați adresa selectată"</string>
+    <string name="map" msgid="5441053548030107189">"Hartă"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Deschideți"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Deschideți adresa URL selectată"</string>
     <string name="sms" msgid="4560537514610063430">"Mesaj"</string>
@@ -1305,10 +1306,10 @@
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Atingeți pentru configurare într-un format compatibil."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Dispozitivul nu este compatibil cu acest <xliff:g id="NAME">%s</xliff:g>. Selectați pentru configurare într-un format compatibil."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> scos pe neașteptate"</string>
-    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Îndepărtați dispozitivele media înainte de a le elimina pentru a evita pierderea conținutului"</string>
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Deconectați din setări dispozitivele media înainte de a le îndepărta, pentru a evita pierderea conținutului"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"S-a eliminat <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Este posibil ca unele funcții să nu funcționeze corespunzător. Introduceți un spațiu de stocare nou."</string>
-    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Se scoate <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Funcționarea ar putea fi necorespunzătoare. Introduceți un dispozitiv de stocare nou."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Se deconectează <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Nu scoateți"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Configurați"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Scoateți"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index db71ecd..dc23cba 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1053,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ОтпраĐČоть ĐżĐžŃŃŒĐŒĐŸ ĐČŃ‹Đ±Ń€Đ°ĐœĐœĐŸĐŒŃƒ Đ°ĐŽŃ€Đ”ŃĐ°Ń‚Ńƒ"</string>
     <string name="dial" msgid="1253998302767701559">"ĐŸĐŸĐ·ĐČĐŸĐœĐžŃ‚ŃŒ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐŸĐŸĐ·ĐČĐŸĐœĐžŃ‚ŃŒ ĐżĐŸ ĐČŃ‹Đ±Ń€Đ°ĐœĐœĐŸĐŒŃƒ ĐœĐŸĐŒĐ”Ń€Ńƒ"</string>
-    <string name="map" msgid="6521159124535543457">"НаĐčто ĐœĐ° ĐșартД"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐŸĐŸĐșĐ°Đ·Đ°Ń‚ŃŒ ĐœĐ° ĐșартД ĐČŃ‹Đ±Ń€Đ°ĐœĐœŃ‹Đč аЎрДс"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ОтĐșрыть"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ОтĐșрыть ĐČŃ‹Đ±Ń€Đ°ĐœĐœŃ‹Đč URL"</string>
     <string name="sms" msgid="4560537514610063430">"Напосать SMS"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index b5acece..5bdd5a8 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"à·„à¶Ź සේවාව නැත"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"à·„à¶Ź සේවා හෝ à·„à¶Żà·’à·ƒà·’ ඇඞතුඞ් නොඞැත"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ඔබේ වාහකà¶ș විසින් තාවකාගිකව ක්‍රිà¶șාවිරහිත කරන à¶œà¶Żà·“"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à·ƒà¶łà·„à· ඔබේ වාහකà¶ș විසින් තාවකාගිකව ක්‍රිà¶șාවිරහිත කරන à¶œà¶Żà·“"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"à¶ąà¶‚à¶œà¶ž à¶ąà·à¶œà¶ș වෙත ළඟා විà¶ș නොහැකිà¶ș"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"කැඞති à¶ąà·à¶œà¶ș වෙනස් කිරීඞට උත්සාහ කරන්න. වෙනස් කිරීඞට තට්ටු කරන්න."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"à·„à¶Żà·’à·ƒà·’ ඇඞතුඞ් ගබා ගත නොහැකිà¶ș"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"à¶…à¶łà·”à¶±à·à¶œà¶­ නොහැක"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ඇඟිගි සගකුණ සත්‍à¶șාඎනà¶ș කරන à¶œà¶Żà·“"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ඇඟිගි සගකුණු à¶Żà·˜à¶Șාංගà¶ș à¶œà¶Ż නොහැකිà¶ș."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ඇඟිගි සගකුණ ගබඩා කළ නොහැක. à¶Żà·à¶±à¶§ ඎවතින ඇඟිගි සගකුණක් ඉවත් කරන්න."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිගි සගකුණු කාග නිඞාව ළඟා විà¶ș. නැවත උත්සාහ කරන්න."</string>
@@ -1017,8 +1015,9 @@
     <string name="email_desc" msgid="3638665569546416795">"තෝරා ගත් ගිඎිනà¶șට ඊ-තැඎැග් කරන්න"</string>
     <string name="dial" msgid="1253998302767701559">"අඞතන්න"</string>
     <string name="dial_desc" msgid="6573723404985517250">"තෝරා ගත් à¶Żà·”à¶»à¶šà¶źà¶± අංකà¶ș අඞතන්න"</string>
-    <string name="map" msgid="6521159124535543457">"à·ƒà·Šà¶źà·à¶±à¶œà¶­ කරන්න"</string>
-    <string name="map_desc" msgid="9036645769910215302">"තෝරා ගත් ගිඎින à¶Žà·™à¶Żà·™à·ƒà·’à¶ș"</string>
+    <string name="map" msgid="5441053548030107189">"සිතිà¶șඞ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"විවෘත කරන්න"</string>
     <string name="browse_desc" msgid="8220976549618935044">"තෝරා ගත් URL විවෘත කරන්න"</string>
     <string name="sms" msgid="4560537514610063430">"ඎණිවිඩà¶ș"</string>
@@ -1275,49 +1274,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"අනෙක් à¶șà·™à¶Żà·”à¶žà·Šà·€à¶œà¶§ උඩින් <xliff:g id="NAME">%s</xliff:g> à¶Żà·’à·ƒà·Š වේ"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"ඔබට <xliff:g id="NAME">%s</xliff:g> ඞෙඞ විශේෂාංගà¶ș භාවිත කිරීඞට අවශ්‍à¶ș නැති නඞ්, සැකසීඞ් විවෘත කිරීඞට තට්ටු කර එà¶ș ක්‍රිà¶șාවිරහිත කරන්න."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ක්‍රිà¶șාවිරහිත කරන්න"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> ඎරීක්ෂා කරඞින්…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"වත්ඞන් අන්තර්ගතà¶ș සඞාගෝචනà¶ș කරඞින්"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"අගුත් <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ඎිහිටුවීඞට තට්ටු කරන්න"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"à¶Ąà·à¶șාරූඎ සහ ඞාධ්‍à¶ș හුවඞාරු කිරීඞ à·ƒà¶łà·„à·"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> සඞගින් වන ගැටගුව"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"à·€à·’à·ƒà¶łà·“à¶žà¶§ තට්ටු කරන්න"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> à¶Żà·–à·‚à·’à¶­à¶șි. à·€à·’à·ƒà¶łà·“à¶žà¶§ තට්ටු කරන්න."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"සහාà¶ș à¶±à·œà¶Żà¶šà·Šà·€à¶± <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"ඞෙඞ උඎාංගà¶ș ඞෙඞ <xliff:g id="NAME">%s</xliff:g> à·ƒà¶łà·„à· සහාà¶ș à¶±à·œà¶Żà¶šà·Šà·€à¶șි. සහාà¶ș à¶Żà¶šà·Šà·€à¶± ආකෘතිà¶șකින් ඎිහිටුවීඞට තට්ටු කරන්න."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"ඞෙඞ උඎාංගà¶ș ඞෙඞ <xliff:g id="NAME">%s</xliff:g> à·ƒà¶łà·„à· සහාà¶ș à¶±à·œà¶Żà¶šà·Šà·€à¶șි. සහාà¶ș à¶Żà¶šà·Šà·€à¶± ආකෘතිà¶șකින් ඎිහිටුවීඞට තෝරන්න."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> අනඎේක්ෂිතව ඉවත් කරන à¶œà¶Żà·’"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"අන්තර්ගතà¶ș නැති වීඞ වළක්වා ගැනීඞ à·ƒà¶łà·„à· ඉවත් කිරීඞට ඎෙර ඞාධ්‍à¶șà¶ș ඉවත් කරන්න"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> ඉවත් කරන à¶œà¶Żà·“"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"සඞහර ක්‍රිà¶șාකාරිත්ව නිසි ගෙස ක්‍රිà¶șා නොකළ හැකිà¶ș. නව ගබඩාව ඇතුළු කරන්න."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> ඉවතට ගනිඞින්"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"ඉවත් නොකරන්න"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ඎිහිටුවන්න"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ගැගවීඞ"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ගවේෂණà¶ș කරන්න"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> à¶…à·ƒà·Šà¶źà·à¶±à¶œà¶­à¶șි"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"නැවත උඎාංගà¶ș ඇතුළු කරන්න"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ගෙන à¶șඞින්"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"à¶Żà¶­à·Šà¶­ ගෙන à¶șඞින්"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"අන්තර්ගතà¶ș ඞාරු කිරීඞ නිඞà¶șි"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"අන්තර්ගතà¶ș <xliff:g id="NAME">%s</xliff:g> වෙත ගෙන à¶șන à¶œà¶Żà·“"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"අන්තර්ගතà¶ș ගෙන à¶șාඞට නොහැකි විà¶ș"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"නැවත අන්තර්ගතà¶ș ගෙන à¶șාඞට උත්සාහ කරන්න"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ඉවත් කරන à¶œà¶Żà·“"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ඉවත් කරන à¶œà¶Żà·“"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"ඎරික්ෂා කරඞින්..."</string>
@@ -1865,14 +1849,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM à·„à¶Ź à·ƒà¶łà·„à· ඎ්‍à¶»à¶­à·’à¶Žà·à¶Żà¶± à¶±à·œà¶Żà·š"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM à·„à¶Ź à·ƒà¶łà·„à· ඉඩ à¶±à·œà¶Żà·š"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"à¶Żà·”à¶»à¶šà¶źà¶±à¶ș à·„à¶Ź à·ƒà¶łà·„à· ඉඩ à¶±à·œà¶Żà·š"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ඉඩ à¶±à·œà¶Żà·š"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ඎ්‍à¶»à¶­à·’à¶Žà·à¶Żà¶±à¶ș නොකරà¶șි"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ඉඩ à¶±à·œà¶Żà·š"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ඉඩ à¶±à·œà¶Żà·š"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"උත්ඎතන කවුළුව"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"à¶șà·™à¶Żà·”à¶žà·Š à¶…à¶±à·”à·€à·à¶Żà¶ș අවශ්‍රේණි කර ඇත, නැතහොත් ඞෙඞ කෙටි ඞග සඞඟ අනුකූග නොවේ"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index ee92b5b..324d60b 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1053,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"NapísaĆ„ na vybratú e-mailovú adresu"</string>
     <string name="dial" msgid="1253998302767701559">"VolaƄ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ZavolaĆ„ na vybraté telefónne číslo"</string>
-    <string name="map" msgid="6521159124535543457">"NájsĆ„"</string>
-    <string name="map_desc" msgid="9036645769910215302">"VyhÄŸadaĆ„ vybratú adresu"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"OtvoriƄ"</string>
     <string name="browse_desc" msgid="8220976549618935044">"OtvoriĆ„ vybratú webovú adresu"</string>
     <string name="sms" msgid="4560537514610063430">"Správa"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 4b1fbcc..b1f0639 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1053,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Pošlji na izbrani naslov"</string>
     <string name="dial" msgid="1253998302767701559">"Pokliči"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Pokliči izbrano telefonsko številko"</string>
-    <string name="map" msgid="6521159124535543457">"PoišÄi na zemljevidu"</string>
-    <string name="map_desc" msgid="9036645769910215302">"PokaĆŸi izbrani naslov na zemljevidu"</string>
+    <string name="map" msgid="5441053548030107189">"Zemljevid"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Odpri"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Odpri izbrani URL"</string>
     <string name="sms" msgid="4560537514610063430">"Sporočilo"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index c0dddf8..8de7d05 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Dërgo email tek adresa e zgjedhur"</string>
     <string name="dial" msgid="1253998302767701559">"Telefono"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Telefono në numrin e zgjedhur të telefonit"</string>
-    <string name="map" msgid="6521159124535543457">"Gjej vendndodhjen"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Gjej adresën e zgjedhur"</string>
+    <string name="map" msgid="5441053548030107189">"Harta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Hap"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Hap URL-në e zgjedhur"</string>
     <string name="sms" msgid="4560537514610063430">"Mesazh"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index e696471..9f6e6cf 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1033,8 +1033,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ĐŸĐŸŃˆĐ°Ń™ĐžŃ‚Đ” ĐžĐŒĐ”Ń˜Đ» ĐœĐ° ĐžĐ·Đ°Đ±Ń€Đ°ĐœŃƒ Đ°ĐŽŃ€Đ”ŃŃƒ"</string>
     <string name="dial" msgid="1253998302767701559">"ĐŸĐŸĐ·ĐŸĐČĐž"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐŸĐŸĐ·ĐŸĐČОтД ĐžĐ·Đ°Đ±Ń€Đ°ĐœĐž Đ±Ń€ĐŸŃ˜ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœĐ°"</string>
-    <string name="map" msgid="6521159124535543457">"ĐŸŃ€ĐŸĐœĐ°Ń’Đž"</string>
-    <string name="map_desc" msgid="9036645769910215302">"ĐŸŃ€ĐŸĐœĐ°Ń’ĐžŃ‚Đ” ĐžĐ·Đ°Đ±Ń€Đ°ĐœŃƒ Đ°ĐŽŃ€Đ”ŃŃƒ"</string>
+    <string name="map" msgid="5441053548030107189">"Мапа"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ОтĐČĐŸŃ€Đž"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ОтĐČĐŸŃ€ĐžŃ‚Đ” ĐžĐ·Đ°Đ±Ń€Đ°ĐœĐž URL"</string>
     <string name="sms" msgid="4560537514610063430">"ĐŸĐŸŃˆĐ°Ń™Đž SMS"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 8b9714b..af4e905 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Tjänsten för röstsamtal har blockerats"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Inga rösttjänster eller nödsamtal"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Tillfälligt avstängt av operatören"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tillfälligt avstängt av operatören för SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Det går inte att nå mobilnätverket"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Testa att byta föredraget nätverk. Tryck om du vill ändra."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Det går inte att ringa nödsamtal"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Identifierades inte"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrycket har autentiserats"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Det finns ingen maskinvara för fingeravtryck."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Skicka e-post till vald adress"</string>
     <string name="dial" msgid="1253998302767701559">"Ring"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ring valt telefonnummer"</string>
-    <string name="map" msgid="6521159124535543457">"Hitta"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Hitta valda adresser"</string>
+    <string name="map" msgid="5441053548030107189">"Karta"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Öppna"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Öppna vald webbadress"</string>
     <string name="sms" msgid="4560537514610063430">"Sms:a"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Om du inte vill att den här funktionen används för <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Inaktivera"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> kontrolleras …"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Granskar nuvarande innehåll"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Nytt <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Tryck för att konfigurera"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"För överföring av foton och media"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Problem med <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tryck och åtgärda"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> har skadats. Välj för att åtgärda."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> stöds inte"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Enheten har inte stöd för <xliff:g id="NAME">%s</xliff:g>. Tryck här om du vill konfigurera i ett format som stöds."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Enheten stöder inte detta <xliff:g id="NAME">%s</xliff:g>. Välj för att konfigurera i ett format som stöds."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> togs bort oväntat"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Mata ut media innan du tar bort den för att inte förlora innehåll"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> har tagits bort"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Vissa funktioner kanske inte fungerar. Sätt i en ny lagringsenhet."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> matas ut"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Ta inte bort"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Konfigurera"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Mata ut"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Utforska"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> saknas"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Sätt i enheten igen"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flyttar <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Flyttar data"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Innehållsöverföringen är klar"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Innehållet har flyttats till <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kan inte flytta innehållet"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Försök att flytta innehållet igen"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Borttaget"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Utmatat"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Kontrollerar …"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM-kort tillhandahålls inte för röst"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM-kort tillåts inte för röst"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tillåts inte för röst"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> är inte tillåtet"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> tillhandahålls inte"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> är inte tillåtet"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> är inte tillåtet"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"popup-fönster"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> till"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versionen av appen är nedgraderad eller så är den inte kompatibel med genvägen"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 3485056..92552e3 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -481,8 +481,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"Inaruhusu programu kuwasiliana na lebo, kadi na wasomaji wa Near Field Communication (NFC)."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"zima kufuli la skrini yako"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Inaruhusu programu kulemaza ufunguo wa vitufe na usalama mwingine ambata wa nenosiri. Kwa mfano, simu inalemaza ufunguo wa viitufe inapopokea simu inayoingia, kisha inawezesha upya ufunguo wa vitufe wakati simu inapokamilika."</string>
-    <string name="permlab_useBiometric" msgid="8837753668509919318">"tumia maunzi ya kibaolojia"</string>
-    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Huruhusu programu itumie maunzi ya kibaolojia katika uthibitishaji"</string>
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"tumia maunzi ya kibiolojia"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Huruhusu programu itumie maunzi ya kibiolojia katika uthibitishaji"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"dhibiti maunzi ya kitambulisho"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Huruhusu programu kuomba njia za kuongeza na kufuta violezo vya kitambulisho kwa matumizi."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"tumia maunzi ya kitambulisho"</string>
@@ -1011,8 +1011,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Tuma barua pepe kwa anwani uliyochagua"</string>
     <string name="dial" msgid="1253998302767701559">"Simu"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Piga simu kwa nambari uliyochagua"</string>
-    <string name="map" msgid="6521159124535543457">"Tafuta"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Fungua ramani za anwani uliyochagua"</string>
+    <string name="map" msgid="5441053548030107189">"Ramani"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Fungua"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Fungua URL uliyochagua"</string>
     <string name="sms" msgid="4560537514610063430">"Ujumbe"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index d1bcc94..db9cd0a 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -122,12 +122,13 @@
     <string name="roamingText11" msgid="4154476854426920970">"àź°àŻ‹àźźàźżàź™àŻ àźȘàŻ‡àź©àź°àŻ àź‡àźŻàź•àŻàź•àź€àŻàź€àźżàźČàŻ àź‰àźłàŻàźłàź€àŻ"</string>
     <string name="roamingText12" msgid="1189071119992726320">"àź°àŻ‹àźźàźżàź™àŻ àźȘàŻ‡àź©àź°àŻ àźźàŻàźŸàź•àŻàź•àźȘàŻàźȘàźŸàŻàźŸàź€àŻ"</string>
     <string name="roamingTextSearching" msgid="8360141885972279963">"àźšàŻ‡àź”àŻˆàźŻàŻˆàź€àŻ àź€àŻ‡àźŸàŻàź•àźżàź±àź€àŻ"</string>
-    <!-- no translation found for wfcRegErrorTitle (3855061241207182194) -->
-    <skip />
+    <string name="wfcRegErrorTitle" msgid="3855061241207182194">"àź”àŻˆàźƒàźȘàŻˆ àź…àźŽàŻˆàźȘàŻàźȘàŻˆ àź…àźźàŻˆàź•àŻàź• àźźàŻàźŸàźżàźŻàź”àźżàźČàŻàźČàŻˆ"</string>
   <string-array name="wfcOperatorErrorAlertMessages">
     <item msgid="3910386316304772394">"àź”àŻˆàźƒàźȘàŻˆ àźźàŻ‚àźČàźźàŻ àź…àźŽàŻˆàź•àŻàź•àź”àŻàźźàŻ àźšàŻ†àźŻàŻàź€àźżàź•àźłàŻˆ àź…àź©àŻàźȘàŻàźȘàź”àŻàźźàŻ, àźźàŻàź€àźČàźżàźČàŻ àź€àŻŠàźČàŻˆàź€àŻàź€àŻŠàźŸàź°àŻàźȘàŻ àźšàźżàź±àŻàź”àź©àź€àŻàź€àźżàźŸàźźàŻ àź‡àźšàŻàź€àźšàŻ àźšàŻ‡àź”àŻˆàźŻàŻˆ àź…àźźàŻˆàź•àŻàź•àŻàźźàźŸàź±àŻ àź•àŻ‡àźŸàŻàź•àź”àŻàźźàŻ. àźȘàźżàź±àź•àŻ àź…àźźàŻˆàźȘàŻàźȘàŻàź•àźłàźżàźČàŻ àźźàŻ€àźŁàŻàźŸàŻàźźàŻ àź”àŻˆàźƒàźȘàŻˆ àź…àźŽàŻˆàźȘàŻàźȘàŻˆ àź‡àźŻàź•àŻàź•àź”àŻàźźàŻ. (àźȘàźżàźŽàŻˆàź•àŻ àź•àŻàź±àźżàźŻàŻ€àźŸàŻ <xliff:g id="CODE">%1$s</xliff:g>)"</item>
   </string-array>
-    <!-- no translation found for wfcOperatorErrorNotificationMessages:0 (7372514042696663278) -->
+  <string-array name="wfcOperatorErrorNotificationMessages">
+    <item msgid="7372514042696663278">"àź‰àź™àŻàź•àźłàŻ àźźàŻŠàźȘàŻˆàźČàŻ àźšàźżàź±àŻàź”àź©àź€àŻàź€àŻàźŸàź©àŻ àź”àŻˆàźƒàźȘàŻˆ àź…àźŽàŻˆàźȘàŻàźȘàŻˆàźȘàŻ àźȘàź€àźżàź”àŻàźšàŻ†àźŻàŻàź”àź€àźżàźČàŻ àźšàźżàź•àŻàź•àźČàŻ: <xliff:g id="CODE">%1$s</xliff:g>"</item>
+  </string-array>
   <string-array name="wfcSpnFormats">
     <item msgid="6830082633573257149">"%s"</item>
     <item msgid="4397097370387921767">"%s àź”àŻˆàźƒàźȘàŻˆ àź…àźŽàŻˆàźȘàŻàźȘàŻ"</item>
@@ -483,10 +484,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"àź•àŻàź±àŻàź•àźżàźŻ àź‡àźŸàŻˆàź”àŻ†àźłàźż àź€àź•àź”àźČàŻàźȘàź°àźżàźźàźŸàź±àŻàź±àźźàŻ (NFC), àź•àŻàź±àźżàź•àźłàŻ, àź•àźŸàź°àŻàźŸàŻàź•àźłàŻ àźźàź±àŻàź±àŻàźźàŻ àź°àŻ€àźŸàź°àŻàź•àźłàŻ àź†àź•àźżàźŻàź”àź±àŻàź±àŻàźŸàź©àŻ àź€àŻŠàźŸàź°àŻàźȘàŻàź•àŻŠàźłàŻàźł, àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàŻˆ àź…àź©àŻàźźàź€àźżàź•àŻàź•àźżàź±àź€àŻ."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"àź‰àź™àŻàź•àźłàŻ àź€àźżàź°àŻˆàźȘàŻ àźȘàŻ‚àźŸàŻàźŸàŻˆ àźźàŻàźŸàź•àŻàź•àŻàź€àźČàŻ"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"àź”àźżàźšàŻˆàźȘàŻàźȘàŻ‚àźŸàŻàźŸàŻˆàźŻàŻàźźàŻ, àź€àŻŠàźŸàź°àŻàźȘàŻàźŸàŻˆàźŻ àź•àźŸàź”àŻàźšàŻàźšàŻŠàźČàŻ àźȘàźŸàź€àŻàź•àźŸàźȘàŻàźȘàŻˆàźŻàŻàźźàŻ àźźàŻàźŸàź•àŻàź•àźȘàŻ àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàŻˆ àź…àź©àŻàźźàź€àźżàź•àŻàź•àźżàź±àź€àŻ. àźŽàźŸàŻàź€àŻàź€àŻàź•àŻàź•àźŸàźŸàŻàźŸàźŸàź•, àź‰àźłàŻàź”àź°àŻàźźàŻ àźźàŻŠàźȘàŻˆàźČàŻ àź…àźŽàŻˆàźȘàŻàźȘàŻˆàźȘàŻ àźȘàŻ†àź±àŻàźźàŻàźȘàŻ‹àź€àŻ àźźàŻŠàźȘàŻˆàźČàŻ àź”àźżàźšàŻˆàźȘàŻàźȘàŻ‚àźŸàŻàźŸàŻˆ àźźàŻàźŸàź•àŻàź•àŻàź•àźżàź±àź€àŻ, àźȘàźżàź±àź•àŻ àź…àźŽàŻˆàźȘàŻàźȘàŻ àźźàŻàźŸàźżàźšàŻàź€àź”àŻàźŸàź©àŻ àź”àźżàźšàŻˆàźȘàŻàźȘàŻ‚àźŸàŻàźŸàŻˆ àźźàŻ€àźŁàŻàźŸàŻàźźàŻ àź‡àźŻàź•àŻàź•àŻàź•àźżàź±àź€àŻ."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"àźȘàźŻàŻ‹àźźàŻ†àźŸàŻàź°àźżàź•àŻ àź”àź©àŻàźȘàŻŠàź°àŻàźłàŻˆàźȘàŻ àźȘàźŻàź©àŻàźȘàźŸàŻàź€àŻàź€àŻ"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"àźȘàźŻàŻ‹àźźàŻ†àźŸàŻàź°àźżàź•àŻ àź”àź©àŻàźȘàŻŠàź°àŻàźłàŻˆàźȘàŻ àźȘàźŻàź©àŻàźȘàźŸàŻàź€àŻàź€àźż àź…àź™àŻàź•àŻ€àź•àź°àźżàźȘàŻàźȘàź€àź±àŻàź•àŻ, àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàŻˆ àź…àź©àŻàźźàź€àźżàź•àŻàź•àŻàźźàŻ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"àź•àŻˆàź°àŻ‡àź•àŻˆ àź”àź©àŻàźȘàŻŠàź°àŻàźłàŻˆ àźšàźżàź°àŻàź”àź•àźż"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"àźȘàźŻàź©àŻàźȘàźŸàŻàź€àŻàź€àŻàź”àź€àź±àŻàź•àźŸàź•, àź•àŻˆàź°àŻ‡àź•àŻˆ àźŸàŻ†àźźàŻàźȘàŻàźłàŻ‡àźŸàŻàź•àźłàŻˆàźšàŻ àźšàŻ‡àź°àŻàź•àŻàź• àźźàź±àŻàź±àŻàźźàŻ àźšàŻ€àź•àŻàź•àŻàź”àź€àź±àŻàź•àźŸàź© àźšàŻ†àźŻàźČàŻàźźàŻàź±àŻˆàź•àźłàŻˆ àź‡àźŻàź•àŻàź•àŻàź”àź€àź±àŻàź•àŻàźȘàŻ àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàŻˆ àź…àź©àŻàźźàź€àźżàź•àŻàź•àŻàźźàŻ."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"àź•àŻˆàź°àŻ‡àź•àŻˆ àź”àź©àŻàźȘàŻŠàź°àŻàźłàŻˆàźȘàŻ àźȘàźŻàź©àŻàźȘàźŸàŻàź€àŻàź€àŻ"</string>
@@ -1013,32 +1012,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"àź‰àźłàŻàźłàŻ€àźŸàŻàźŸàŻ àźźàŻàź±àŻˆ"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"àź‰àź°àŻˆ àźšàźŸàź”àźŸàźżàź•àŻàź•àŻˆàź•àźłàŻ"</string>
     <string name="email" msgid="4560673117055050403">"àźźàźżàź©àŻàź©àźžàŻàźšàźČàŻ"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àźźàŻàź•àź”àź°àźżàź•àŻàź•àŻ àźźàźżàź©àŻàź©àźžàŻàźšàźČàŻ àź…àź©àŻàźȘàŻàźȘàŻàźźàŻ"</string>
     <string name="dial" msgid="1253998302767701559">"àź…àźŽàŻˆ"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"àź•àźŁàŻàźŸàŻàźȘàźżàźŸàźż"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àźƒàźȘàŻ‹àź©àŻ àźŽàźŁàŻàźŁàŻˆ àź…àźŽàŻˆàź•àŻàź•àŻàźźàŻ"</string>
+    <string name="map" msgid="5441053548030107189">"àź”àź°àŻˆàźȘàźŸàźźàŻ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"àź€àźżàź±"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ URLàźàź€àŻ àź€àźżàź±àź•àŻàź•àŻàźźàŻ"</string>
     <string name="sms" msgid="4560537514610063430">"àźšàŻ†àźŻàŻàź€àźż"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àźƒàźȘàŻ‹àź©àŻ àźŽàźŁàŻàźŁàźżàź±àŻàź•àŻàźšàŻ àźšàŻ†àźŻàŻàź€àźż àź…àź©àŻàźȘàŻàźȘàŻàźźàŻ"</string>
     <string name="add_contact" msgid="7867066569670597203">"àźšàŻ‡àź°àŻ"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"àź€àŻŠàźŸàź°àŻàźȘàŻàź•àźłàźżàźČàŻ àźšàŻ‡àź°àŻàź•àŻàź•àŻàźźàŻ"</string>
     <string name="view_calendar" msgid="979609872939597838">"àź•àźŸàźŁàŻàźȘàźż"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"àź•àŻ‡àźČàŻ†àźŁàŻàźŸàź°àźżàźČàŻ àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àźšàŻ‡àź°àź€àŻàź€àŻˆàź•àŻ àź•àźŸàźŸàŻàźŸàŻàźźàŻ"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"àź€àźżàźŸàŻàźŸàźźàźżàźŸàŻàź€àźČàŻ"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àźšàŻ‡àź°àź€àŻàź€àźżàź±àŻàź•àŻ àźšàźżàź•àźŽàŻàź”àŻˆàź€àŻ àź€àźżàźŸàŻàźŸàźźàźżàźŸàŻàźźàŻ"</string>
     <string name="view_flight" msgid="7691640491425680214">"àź•àźŁàŻàź•àźŸàź©àźż"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź€àŻàź€ àź”àźżàźźàźŸàź©àź€àŻàź€àŻˆàź•àŻ àź•àźŁàŻàź•àźŸàźŁàźżàź•àŻàź•àŻàźźàŻ"</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">"àźźàŻàź±àŻˆàźźàŻˆàźŻàźżàźČàŻ àźȘàŻ‹àź€àŻàźźàźŸàź© àźšàŻ‡àźźàźżàźȘàŻàźȘàź•àźźàŻ àź‡àźČàŻàźČàŻˆ. 250àźźàŻ†.àźȘàŻˆ. àź…àźłàź”àŻ àź•àźŸàźČàźż àź‡àźŸàź”àźšàź€àźż àź‡àź°àŻàźȘàŻàźȘàź€àŻˆ àź‰àź±àŻàź€àźżàźšàŻ†àźŻàŻàź€àŻ àźźàŻ€àźŁàŻàźŸàŻàźźàŻ àź€àŻŠàźŸàź™àŻàź•àź”àŻàźźàŻ."</string>
@@ -1167,8 +1158,7 @@
     </plurals>
     <string name="wifi_available_title" msgid="3817100557900599505">"àź€àźżàź±àźšàŻàź€ àź”àŻˆàźƒàźȘàŻˆ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàźŸàź©àŻ àź‡àźŁàŻˆàź•àŻàź•àź”àŻàźźàŻ"</string>
     <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"àź€àŻŠàźČàŻˆàź€àŻàź€àŻŠàźŸàź°àŻàźȘàŻ àźšàŻ‡àź”àŻˆ àź”àźŽàź™àŻàź•àŻàźźàŻ àźšàźżàź±àŻàź”àź©àź€àŻàź€àźżàź©àŻ àź”àŻˆàźƒàźȘàŻˆ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàźŸàź©àŻ àź‡àźŁàŻˆàź•àŻàź•àźżàź±àź€àŻ"</string>
-    <!-- no translation found for wifi_available_title_connecting (1139126673968899002) -->
-    <skip />
+    <string name="wifi_available_title_connecting" msgid="1139126673968899002">"àź”àŻˆàźƒàźȘàŻˆ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàźŸàź©àŻ àź‡àźŁàŻˆàź•àŻàź•àźżàź±àź€àŻ"</string>
     <string name="wifi_available_title_connected" msgid="7542672851522241548">"àź”àŻˆàźƒàźȘàŻˆ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàźŸàź©àŻ àź‡àźŁàŻˆàź•àŻàź•àźȘàŻàźȘàźŸàŻàźŸàź€àŻ"</string>
     <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"àź”àŻˆàźƒàźȘàŻˆ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàźŸàź©àŻ àź‡àźŁàŻˆàź•àŻàź• àźźàŻàźŸàźżàźŻàź”àźżàźČàŻàźČàŻˆ"</string>
     <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"àźŽàźČàŻàźČàźŸ àźšàŻ†àźŸàŻàź”àŻŠàź°àŻàź•àŻàź•àŻàź•àźłàŻˆàźŻàŻàźźàŻ àźȘàźŸàź°àŻàź•àŻàź•, àź€àźŸàŻàźŸàź”àŻàźźàŻ"</string>
@@ -1296,8 +1286,8 @@
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àźȘàźŸàź™àŻàź•àźłàŻˆàźŻàŻàźźàŻ àźźàŻ€àźŸàźżàźŻàźŸàź”àŻˆàźŻàŻàźźàŻ àźźàźŸàź±àŻàź±àźČàźŸàźźàŻ"</string>
     <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
     <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tap to fix"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àźšàźżàź€àŻˆàźšàŻàź€àŻàźłàŻàźłàź€àŻ. àźšàź°àźżàźšàŻ†àźŻàŻàźŻ, àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź•àŻàź•àź”àŻàźźàŻ."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"àź†àź€àź°àźżàź•àŻàź•àźȘàŻàźȘàźŸàźŸàź€ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àźšàźŸàź€àź©àźźàŻ àź‡àźšàŻàź€ <xliff:g id="NAME">%s</xliff:g>àź àź†àź€àź°àźżàź•àŻàź•àź”àźżàźČàŻàźČàŻˆ. àź†àź€àź°àźżàź•àŻàź•àźȘàŻàźȘàźŸàŻàźźàŻ àź”àźŸàźżàź”àźźàŻˆàźȘàŻàźȘàźżàźČàŻ àź…àźźàŻˆàź•àŻàź•, àź€àźŸàŻàźŸàź”àŻàźźàŻ."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àźšàźŸàź€àź©àźźàŻ àź‡àźšàŻàź€ <xliff:g id="NAME">%s</xliff:g>àź àź†àź€àź°àźżàź•àŻàź•àź”àźżàźČàŻàźČàŻˆ. àź†àź€àź°àźżàź•àŻàź•àźȘàŻàźȘàźŸàŻàźźàŻ àź”àźŸàźżàź”àźźàŻˆàźȘàŻàźȘàźżàźČàŻ àź…àźźàŻˆàź•àŻàź•, àź€àŻ‡àź°àŻàźšàŻàź€àŻ†àźŸàŻàź•àŻàź•àź”àŻàźźàŻ."</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 5d23333..821e603 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -483,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"à°žà°źà±€à°Ș ఫీà°Čà±à°Ąà± à°•à°źà±à°Żà±‚à°šà°żà°•à±‡à°·à°šà± (NFC) à°Ÿà±à°Żà°Ÿà°—à±‌à°Čు, à°•à°Ÿà°°à±à°Ąà±à°Čు à°źà°°à°żà°Żà± à°°à±€à°Ąà°°à±‌à°Čఀో à°•à°źà±à°Żà±‚à°šà°żà°•à±‡à°Ÿà± à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°Żà°Ÿà°Ș్‌చు à°…à°šà±à°źà°€à°żà°žà±à°€à±à°‚à°Šà°ż."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"à°źà±€ ఞ్క్రీచ్ à°Čటక్‌చు à°šà°żà°Čà°żà°Șà°żà°”à±‡à°Żà°Ąà°‚"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"కీà°Čటక్ à°źà°°à°żà°Żà± ఏఊైచట à°…à°šà±à°Źà°‚à°§à°żà°‚à°šà°Źà°Ąà°żà°š à°Șటఞ్‌à°”à°°à±à°Ąà± భఊ్రఀచు à°šà°żà°Čà°żà°Șà°żà°”à±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°Żà°Ÿà°Ș్‌చు à°…à°šà±à°źà°€à°żà°žà±à°€à±à°‚à°Šà°ż. ఉఊటà°čà°°à°Łà°•à±, ఇచ్‌à°•à°źà°żà°‚à°—à± ఫోచ్ à°•à°Ÿà°Č్ ఔఞ్ఀుచ్చà°Ș్à°Șà±à°Ąà± ఫోచ్ కీà°Čటక్‌చు à°šà°żà°Čà°żà°Șà°żà°”à±‡à°žà±à°€à±à°‚à°Šà°ż, ఆà°Șై à°•à°Ÿà°Č్ à°źà±à°—à°żà°žà°żà°š ఀర్ఔటఀ కీà°Čటక్‌చు à°źà°łà±à°Čీ à°Șà±à°°à°Ÿà°°à°‚à°­à°żà°žà±à°€à±à°‚à°Šà°ż."</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"à°Źà°Żà±‹à°źà±†à°Ÿà±à°°à°żà°•à± à°čà°Ÿà°°à±à°Ąà±‌ఔేర్‌à°šà°ż ఉà°Șà°Żà±‹à°—à°żà°‚à°šà±"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"à°Șà±à°°à°źà°Ÿà°Łà±€à°•à°°à°Ł కోఞం à°Źà°Żà±‹à°źà±†à°Ÿà±à°°à°żà°•à± à°čà°Ÿà°°à±à°Ąà±‌ఔేర్‌చు ఉà°Șà°Żà±‹à°—à°żà°‚à°šà°Ąà°Ÿà°šà°żà°•à°ż à°Żà°Ÿà°Ș్‌à°šà°ż à°…à°šà±à°źà°€à°żà°žà±à°€à±à°‚à°Šà°ż"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"ఔేà°Čà°żà°źà±à°Šà±à°° à°čà°Ÿà°°à±à°Ąà±‌ఔేర్‌à°šà°ż à°šà°żà°°à±à°”à°čà°żà°‚à°šà°Ąà°Ÿà°šà°żà°•à°ż à°…à°šà±à°źà°€à°ż"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"à°”à°żà°šà°żà°Żà±‹à°—à°‚ కోఞం ఔేà°Čà°żà°źà±à°Šà±à°° టెంà°Ș్à°Čేట్‌à°Čచు à°œà±‹à°Ąà°żà°‚à°šà±‡ à°źà°°à°żà°Żà± ఀొà°Čà°—à°żà°‚à°šà±‡ à°Șఊ్ధఀుà°Čచు à°…à°źà°Čు à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°Żà°Ÿà°Ș్‌చు à°…à°šà±à°źà°€à°żà°žà±à°€à±à°‚à°Šà°ż."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"ఔేà°Čà°żà°źà±à°Šà±à°° à°čà°Ÿà°°à±à°Ąà±‌ఔేర్‌à°šà°ż ఉà°Șà°Żà±‹à°—à°żà°‚à°šà°Ąà°Ÿà°šà°żà°•à°ż à°…à°šà±à°źà°€à°ż"</string>
@@ -1012,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"ఇచ్‌à°Șుట్ à°Șà°Šà±à°§à°€à°ż"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"à°”à°šà°šà°Ÿà°šà°żà°•à°ż à°žà°‚à°Źà°‚à°§à°żà°‚à°šà°żà°š à°šà°°à±à°Żà°Čు"</string>
     <string name="email" msgid="4560673117055050403">"à°‡à°źà±†à°Żà°żà°Č్"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"ఎంచుకుచ్చ à°šà°żà°°à±à°šà°Ÿà°źà°Ÿà°•à± à°‡à°źà±†à°Żà°żà°Č్‌చు à°Șంà°Șà±à°€à±à°‚à°Šà°ż"</string>
     <string name="dial" msgid="1253998302767701559">"à°•à°Ÿà°Č్ à°šà±‡à°Żà°‚à°Ąà°ż"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"à°—à±à°°à±à°€à°żà°‚à°šà°‚à°Ąà°ż"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"ఎంచుకుచ్చ ఫోచ్ à°šà°‚à°Źà°°à±‌కు à°•à°Ÿà°Č్ à°šà±‡à°žà±à°€à±à°‚à°Šà°ż"</string>
+    <string name="map" msgid="5441053548030107189">"à°źà±à°Żà°Ÿà°Ș్"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"à°€à±†à°°à°”à°‚à°Ąà°ż"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"ఎంచుకుచ్చ URLà°šà°ż à°€à±†à°°à±à°žà±à°€à±à°‚à°Šà°ż"</string>
     <string name="sms" msgid="4560537514610063430">"ఞంఊేశం"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"ఎంచుకుచ్చ ఫోచ్ à°šà°‚à°Źà°°à±‌à°•à°ż ఞంఊేశం à°Șంà°Șà±à°€à±à°‚à°Šà°ż"</string>
     <string name="add_contact" msgid="7867066569670597203">"à°œà±‹à°Ąà°żà°‚à°šà°‚à°Ąà°ż"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"à°Șà°°à°żà°šà°Żà°Ÿà°Čకు à°œà±‹à°Ąà°żà°žà±à°€à±à°‚à°Šà°ż"</string>
     <string name="view_calendar" msgid="979609872939597838">"à°šà±‚à°Ąà°‚à°Ąà°ż"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"ఎంచుకుచ్చ à°žà°źà°Żà°Ÿà°šà±à°šà°ż à°•à±à°Żà°Ÿà°Čà±†à°‚à°Ąà°°à±‌à°Čో à°”à±€à°•à±à°·à°żà°‚à°šà°‚à°Ąà°ż"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"à°·à±†à°Ąà±à°Żà±‚à°Č్"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"ఎంచుకుచ్చ à°žà°źà°Żà°Ÿà°šà°żà°•à°ż ఈఔెంట్‌చు à°·à±†à°Ąà±à°Żà±‚à°Č్ à°šà±‡à°žà±à°€à±à°‚à°Šà°ż"</string>
     <string name="view_flight" msgid="7691640491425680214">"ట్రటక్ à°šà±‡à°Żà°‚à°Ąà°ż"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"ఎంచుకుచ్చ à°”à°żà°źà°Ÿà°šà°Ÿà°šà±à°šà°ż ట్రటక్ à°šà±‡à°žà±à°€à±à°‚à°Šà°ż"</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>
@@ -1297,7 +1287,7 @@
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ఊà°čà°żà°‚à°šà°šà°ż à°”à°żà°§à°‚à°—à°Ÿ à°€à±€à°žà°żà°”à±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż"</string>
     <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"కంటెంట్‌à°šà°ż కోà°Č్à°Șà±‹à°”à°Ąà°Ÿà°šà±à°šà°ż à°šà°żà°”à°Ÿà°°à°żà°‚à°šà°Ÿà°Čంటే à°€à±€à°žà°żà°”à±‡à°Żà°Źà±‹à°Żà±‡ à°źà±à°‚à°Šà± à°źà±€à°Ąà°żà°Żà°Ÿà°šà°ż ఀొà°Čà°—à°żà°‚à°šà°‚à°Ąà°ż"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> à°€à±€à°žà°żà°”à±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż"</string>
-    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"కొంఀ à°šà°żà°°à±à°”à°Ÿà°čక à°Șà±à°°à°•à±à°°à°żà°Ż à°žà°°à°żà°—à±à°—à°Ÿ à°Șà°šà°ż చేఞ్ఀుచ్చట్à°Čు à°Čేఊు. కొఀ్ఀ à°šà°żà°Čà±à°”à°šà°ż చొà°Ș్à°Șà°żà°‚à°šà°‚à°Ąà°ż."</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"కొంఀ à°šà°żà°°à±à°”à°Ÿà°čక à°Șà±à°°à°•à±à°°à°żà°Ż à°žà°°à°żà°—à±à°—à°Ÿ à°Șà°šà°ż à°šà±‡à°Żà°•à°Șోఔచ్చు. కొఀ్ఀ à°šà°żà°Čà±à°”à°šà°ż చొà°Ș్à°Șà°żà°‚à°šà°‚à°Ąà°ż."</string>
     <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g>à°šà°ż ఀొà°Čà°—à°żà°žà±à°€à±‹à°‚à°Šà°ż"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"à°€à±€à°žà°żà°”à±‡à°Żà°”à°Šà±à°Šà±"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ఞెటà°Ș్ à°šà±‡à°Żà°‚à°Ąà°ż"</string>
@@ -1858,10 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"à°”à°Ÿà°Żà°żà°žà± కోఞం SIM ఞఊుà°Șà°Ÿà°Żà°‚ à°Čేఊు"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"à°”à°Ÿà°Żà°żà°žà± కోఞం SIM à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Šà±"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"à°”à°Ÿà°Żà°żà°žà± కోఞం ఫోచ్ à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Šà±"</string>
-    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Čేఊు"</string>
-    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°Żà°Ÿà°•à±à°Ÿà°żà°”à± à°šà±‡à°Żà°Čేఊు"</string>
-    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Čేఊు"</string>
-    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Čేఊు"</string>
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Šà±"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ఞఊుà°Șà°Ÿà°Żà°‚ à°Čేఊు"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Šà±"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"SIM <xliff:g id="SIMNUMBER">%d</xliff:g> à°…à°šà±à°źà°€à°żà°‚à°šà°Źà°Ąà°Šà±"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"à°Șà°Ÿà°Ș్అà°Ș్ à°”à°żà°‚à°Ąà±‹"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"à°Żà°Ÿà°Ș్ ఔెర్షచ్ à°Ąà±Œà°šà±‌à°—à±à°°à±‡à°Ąà± à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż à°Čేఊట ఈ à°žà°€à±à°”à°°à°źà°Ÿà°°à±à°—à°‚à°€à±‹ అచుకూà°Čà°‚à°—à°Ÿ à°Čేఊు"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 5fcff06..7f53acd 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"àžȘàčˆàž‡àž­àž”àč€àžĄàž„àč„àž›àžąàž±àž‡àž—àž”àčˆàž­àžąàžčàčˆàž—àž”àčˆàč€àž„àž·àž­àž"</string>
     <string name="dial" msgid="1253998302767701559">"àč‚àž—àžŁ"</string>
     <string name="dial_desc" msgid="6573723404985517250">"àč‚àž—àžŁàž«àžČàž«àžĄàžČàžąàč€àž„àž‚àč‚àž—àžŁàžšàž±àžžàž—àčŒàž—àž”àčˆàč€àž„àž·àž­àž"</string>
-    <string name="map" msgid="6521159124535543457">"àž„àč‰àž™àž«àžČ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"àž«àžČàž—àž”àčˆàž­àžąàžčàčˆàž—àž”àčˆàč€àž„àž·àž­àž"</string>
+    <string name="map" msgid="5441053548030107189">"àčàžœàž™àž—àž”àčˆ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"àč€àž›àžŽàž”"</string>
     <string name="browse_desc" msgid="8220976549618935044">"àč€àž›àžŽàž” URL àž—àž”àčˆàč€àž„àž·àž­àž"</string>
     <string name="sms" msgid="4560537514610063430">"àž‚àč‰àž­àž„àž§àžČàžĄ"</string>
@@ -1276,17 +1277,17 @@
     <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> àčƒàž«àžĄàčˆ"</string>
     <string name="ext_media_new_notification_message" msgid="3673685270558405087">"àčàž•àž°àč€àžžàž·àčˆàž­àž•àž±àč‰àž‡àž„àčˆàžČ"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"àžȘàžłàž«àžŁàž±àžšàžàžČàžŁàč‚àž­àž™àžŁàžčàž›àž àžČàžžàčàž„àž°àžȘàž·àčˆàž­"</string>
-    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"àž›àž±àžàž«àžČàž—àž”àčˆàžžàžšàžˆàžČàž <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"àž›àž±àžàž«àžČàč€àžàž”àčˆàžąàž§àžàž±àžš <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"àčàž•àž°àč€àžžàž·àčˆàž­àčàžàč‰àč„àž‚"</string>
     <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> àč€àžȘàž”àžąàž«àžČàžą àč€àž„àž·àž­àžàč€àžžàž·àčˆàž­àčàžàč‰àč„àž‚"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"àč„àžĄàčˆàžȘàž™àž±àžšàžȘàž™àžžàž™ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"àž­àžžàž›àžàžŁàž“àčŒàž™àž”àč‰àč„àžĄàčˆàžȘàž™àž±àžšàžȘàž™àžžàž™ <xliff:g id="NAME">%s</xliff:g> àž™àž”àč‰ àčàž•àž°àč€àžžàž·àčˆàž­àž•àž±àč‰àž‡àž„àčˆàžČàčƒàž™àžŁàžčàž›àčàžšàžšàž—àž”àčˆàžȘàž™àž±àžšàžȘàž™àžžàž™"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"àž­àžžàž›àžàžŁàž“àčŒàž™àž”àč‰àč„àžĄàčˆàžŁàž­àž‡àžŁàž±àžš <xliff:g id="NAME">%s</xliff:g> àž™àž”àč‰ àč€àž„àž·àž­àžàč€àžžàž·àčˆàž­àž•àž±àč‰àž‡àž„àčˆàžČàčƒàž™àžŁàžčàž›àčàžšàžšàž—àž”àčˆàžŁàž­àž‡àžŁàž±àžš"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> àž–àžčàžàž™àžłàž­àž­àžàč„àž›àč‚àž”àžąàč„àžĄàčˆàž„àžČàž”àž„àžŽàž”"</string>
-    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àž”àž”àž”àžȘàž·àčˆàž­àž­àž­àžàžàčˆàž­àž™àžàžČàžŁàž™àžłàž­àž­àžàč€àžžàž·àčˆàž­àž«àž„àž”àžàč€àž„àž”àčˆàžąàž‡àč€àž™àž·àč‰àž­àž«àžČàžȘàžčàžàž«àžČàžą"</string>
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"àžąàžàč€àž„àžŽàžàžàžČàžŁàž•àčˆàž­àč€àžŠàž·àčˆàž­àžĄàžȘàž·àčˆàž­àžàčˆàž­àž™àž—àž”àčˆàžˆàž°àž™àžłàž­àž­àžàč€àžžàž·àčˆàž­àž«àž„àž”àžàč€àž„àž”àčˆàžąàž‡àč„àžĄàčˆàčƒàž«àč‰àč€àž™àž·àč‰àž­àž«àžČàžȘàžčàžàž«àžČàžą"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"àž™àžł <xliff:g id="NAME">%s</xliff:g> àž­àž­àžàčàž„àč‰àž§"</string>
     <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"àžŸàž±àž‡àžàčŒàžŠàž±àž™àžàžČàžŁàž—àžłàž‡àžČàž™àžšàžČàž‡àž­àžąàčˆàžČàž‡àž­àžČàžˆàž—àžłàž‡àžČàž™àč„àžĄàčˆàž–àžčàžàž•àč‰àž­àž‡ àč‚àž›àžŁàž”àčƒàžȘàčˆàžžàž·àč‰àž™àž—àž”àčˆàč€àžàč‡àžšàž‚àč‰àž­àžĄàžčàž„àčƒàž«àžĄàčˆ"</string>
-    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"àžàžłàž„àž±àž‡àž”àž”àž” <xliff:g id="NAME">%s</xliff:g> àž­àž­àž"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"àžàžłàž„àž±àž‡àžąàžàč€àž„àžŽàžàžàžČàžŁàž•àčˆàž­àč€àžŠàž·àčˆàž­àžĄ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"àž«àč‰àžČàžĄàž™àžłàž­àž­àž"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"àž•àž±àč‰àž‡àž„àčˆàžČ"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"àž™àžłàž­àžžàž›àžàžŁàž“àčŒàž­àž­àž"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index b1abc84..9119c32 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Mag-email sa mga piniling address"</string>
     <string name="dial" msgid="1253998302767701559">"Tawagan"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Tawagan ang piniling numero ng telepono"</string>
-    <string name="map" msgid="6521159124535543457">"Hanapin"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Hanapin ang piniling address"</string>
+    <string name="map" msgid="5441053548030107189">"Mapa"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Buksan"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Buksan ang piniling URL"</string>
     <string name="sms" msgid="4560537514610063430">"Padalhan ng Mensahe"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 989e6d1..72751bc 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Seçilen adrese e-posta gönder"</string>
     <string name="dial" msgid="1253998302767701559">"Telefon et"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Seçilen telefon numarasını ara"</string>
-    <string name="map" msgid="6521159124535543457">"Yerini bul"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Seçilen adresin konumunu bul"</string>
+    <string name="map" msgid="5441053548030107189">"Harita"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Aç"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Seçilen URL\'yi aç"</string>
     <string name="sms" msgid="4560537514610063430">"Mesaj"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index e031539..b5a276f 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1053,8 +1053,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ĐĐ°ĐŽŃ–ŃĐ»Đ°Ń‚Đž ДлДĐșŃ‚Ń€ĐŸĐœĐœĐžĐč лОст ĐœĐ° ĐČĐžĐ±Ń€Đ°ĐœŃƒ Đ°ĐŽŃ€Đ”ŃŃƒ"</string>
     <string name="dial" msgid="1253998302767701559">"Đ—Đ°Ń‚Đ”Đ»Đ”Ń„ĐŸĐœŃƒĐČато"</string>
     <string name="dial_desc" msgid="6573723404985517250">"ĐĐ°Đ±Ń€Đ°Ń‚Đž ĐČĐžĐ±Ń€Đ°ĐœĐžĐč ĐœĐŸĐŒĐ”Ń€ Ń‚Đ”Đ»Đ”Ń„ĐŸĐœŃƒ"</string>
-    <string name="map" msgid="6521159124535543457">"Đ—ĐœĐ°Đčто"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Đ—ĐœĐ°Đčто ĐČĐžĐ±Ń€Đ°ĐœŃƒ Đ°ĐŽŃ€Đ”ŃŃƒ ĐœĐ° Đșартах"</string>
+    <string name="map" msgid="5441053548030107189">"Карта"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"ВіЮĐșрото"</string>
     <string name="browse_desc" msgid="8220976549618935044">"ВіЮĐșрото ĐČĐžĐ±Ń€Đ°ĐœŃƒ URL-Đ°ĐŽŃ€Đ”ŃŃƒ"</string>
     <string name="sms" msgid="4560537514610063430">"ĐŸĐŸĐČŃ–ĐŽĐŸĐŒĐ»Đ”ĐœĐœŃ"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 5c046ee..5a22dc5 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ú©ÙˆŰŠÛŒ Ű”ÙˆŰȘی ŰłŰ±ÙˆŰł نہیÚș"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ú©ÙˆŰŠÛŒ Ű”ÙˆŰȘی ŰłŰ±ÙˆŰł ÛŒŰ§ ÛÙ†ÚŻŰ§Ù…ÛŒ Ú©Ű§Ù„Ù†ÚŻ ŰŻŰłŰȘÛŒŰ§Űš نہیÚș ہے"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ŰąÙŸ کے Ú©ÛŒŰ±ÛŒŰŠŰ± نے ŰčŰ§Ű±Ű¶ÛŒ Ű·ÙˆŰ± ÙŸŰ± ŰąÙ ک۱ ŰŻÛŒŰ§ ہے"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کے Ù„ŰŠÛ’ ŰąÙŸ کے Ú©ÛŒŰ±ÛŒŰŠŰ± نے ŰčŰ§Ű±Ű¶ÛŒ Ű·ÙˆŰ± ÙŸŰ± ŰąÙ ک۱ ŰŻÛŒŰ§ ہے"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Ù…ÙˆŰšŰ§ŰŠÙ„ نیÙč ÙˆŰ±Ú© ŰȘÚ© Ű±ŰłŰ§ŰŠÛŒ نہیÚș ہو ŰłÚ©ŰȘی"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"ŰȘŰ±ŰŹÛŒŰ­ÛŒ نیÙč ÙˆŰ±Ú© ŰȘŰšŰŻÛŒÙ„ ک۱ کے ŰŻÛŒÚ©ÚŸÛŒÚș۔ ŰȘŰšŰŻÛŒÙ„ Ú©Ű±Ù†Û’ کے لیے ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș۔"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ÛÙ†ÚŻŰ§Ù…ÛŒ Ú©Ű§Ù„Ù†ÚŻ ŰŻŰłŰȘÛŒŰ§Űš نہیÚș ہے"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"‏Ű§ÛŒÙŸ کو Near Field Communication (NFC)‎ ÙčÛŒÚŻŰČی کۧ۱ڈŰČ Ű§ÙˆŰ± Ű±ÛŒÚˆŰ±ŰČ Ú©Û’ ۳ۧŰȘÚŸ Ù…ÙˆŰ§Ű”Ù„ŰȘ Ú©Ű±Ù†Û’ کی ۧۏۧŰČŰȘ ŰŻÛŒÙčۧ ہے۔"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"Ű§ÙŸÙ†Û’ Ű§ŰłÚ©Ű±ÛŒÙ† Ù„Ű§Ú© کو ŰșÛŒŰ± فŰčŰ§Ù„ Ú©Ű±ÛŒÚș"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ű§ÛŒÙŸ کو Ú©Ù„ÛŒŰŻÛŒ Ù„Ű§Ú© Ű§ÙˆŰ± Ú©ŰłÛŒ ŰšÚŸÛŒ مŰȘŰčلقہ ÙŸŰ§Űł ÙˆŰ±Úˆ ŰłÛŒÚ©ÛŒÙˆŰ±Ùčی کو ŰșÛŒŰ± فŰčŰ§Ù„ Ú©Ű±Ù†Û’ کی ۧۏۧŰČŰȘ ŰŻÛŒŰȘۧ ہے۔ Ù…Ű«Ù„Ű§Ù‹ŰŒ Ú©ÙˆŰŠÛŒ ŰąÙ†Û’ ÙˆŰ§Ù„ÛŒ فون Ú©Ű§Ù„ Ù…ÙˆŰ”ÙˆÙ„ ہونے کے وقŰȘ فون Ú©Ù„ÛŒŰŻÛŒ Ù„Ű§Ú© کو ŰșÛŒŰ± فŰčŰ§Ù„ ک۱ŰȘۧ ÛÛ’ŰŒ ÙŸÚŸŰ± Ú©Ű§Ù„ ÙŸÙˆŰ±ÛŒ ÛÙˆŰŹŰ§Ù†Û’ ÙŸŰ± Ú©Ù„ÛŒŰŻÛŒ Ù„Ű§Ú© کو ŰŻÙˆŰšŰ§Ű±Û فŰčŰ§Ù„ Ú©Ű±ŰŻÛŒŰȘۧ ہے۔"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"ŰšŰ§ÛŒÙˆÙ…ÛŒÙč۱ک ÛŰ§Ű±Úˆ ÙˆÛŒŰŠŰ± ۧ۳ŰȘŰčÙ…Ű§Ù„ Ú©Ű±ÛŒÚș"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Ű§ÛŒÙŸ کو ŰȘÙˆŰ«ÛŒÙ‚ کے لیے ŰšŰ§ÛŒÙˆÙ…ÛŒÙč۱ک ÛŰ§Ű±Úˆ ÙˆÛŒŰŠŰ± ۧ۳ŰȘŰčÙ…Ű§Ù„ Ú©Ű±Ù†Û’ کی ۧۏۧŰČŰȘ ŰŻÛŒŰȘۧ ہے"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč ÛŰ§Ű±Úˆ ÙˆÛŒŰŠŰ± کۧ Ù†ŰžÙ… Ú©Ű±ÛŒÚș"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Ű§ÛŒÙŸ کو ۧ۳ŰȘŰčÙ…Ű§Ù„ Ú©ÛŒÙ„ŰŠÛ’ ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč کی ŰȘÙ…Ű«ÛŒÙ„Ű§ŰȘ ŰŽŰ§Ù…Ù„ Ú©Ű±Ù†Û’ Ű§ÙˆŰ± Ű­Ű°Ù Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ Ű·Ű±ÛŒÙ‚ÙˆÚș کو Ú©Ű§Ù„ŰčŰŻÙ… Ù‚Ű±Ű§Ű± ŰŻÛŒÙ†Û’ کی ۧۏۧŰČŰȘ ŰŻÛŒŰȘۧ ہے۔"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč ÛŰ§Ű±Úˆ ÙˆÛŒŰŠŰ± ۧ۳ŰȘŰčÙ…Ű§Ù„ Ú©Ű±ÛŒÚș"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ŰȘŰłÙ„ÛŒÙ… ŰŽŰŻÛ نہیÚș ہے"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč کی ŰȘŰ”ŰŻÛŒÙ‚ ہو ÚŻŰŠÛŒ"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč ÛŰ§Ű±Úˆ ÙˆÛŒŰŠŰ± ŰŻŰłŰȘÛŒŰ§Űš نہیÚș ہے۔"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč ۧ۳ÙčÙˆŰ± نہیÚș Ú©ÛŒŰ§ ۏۧ ŰłÚ©ŰȘۧ ہے۔ ŰšŰ±Ű§Û Ú©Ű±Ù… Ű§ÛŒÚ© Ù…ÙˆŰŹÙˆŰŻÛ ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč ہÙčŰ§ŰŠÛŒÚș۔"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ÙÙ†ÚŻŰ± ÙŸŰ±Ù†Ùč کی میŰčۧۯ ŰźŰȘم ÛÙˆÚŻŰŠÛŒÛ” ŰŻÙˆŰšŰ§Ű±Û Ú©ÙˆŰŽŰŽ Ú©Ű±ÛŒÚș۔"</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"Ű§Ù†ŰŻŰ±Ű§ŰŹ کۧ Ű·Ű±ÛŒÙ‚Û"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"مŰȘن کی Ú©Ű§Ű±Ű±ÙˆŰ§ŰŠÛŒŰ§Úș"</string>
     <string name="email" msgid="4560673117055050403">"Ű§ÛŒ میل"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"منŰȘ۟ۚ Ú©Ű±ŰŻÛ ÙŸŰȘہ ÙŸŰ± Ű§ÛŒ میل Ú©Ű±ÛŒÚș"</string>
     <string name="dial" msgid="1253998302767701559">"Ú©Ű§Ù„ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"ÙŸŰȘۧ Ù„ÚŻŰ§ŰŠÛŒÚș"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"منŰȘ۟ۚ Ú©Ű±ŰŻÛ فون Ù†Ù…ŰšŰ± ÙŸŰ± Ú©Ű§Ù„ Ú©Ű±ÛŒÚș"</string>
+    <string name="map" msgid="5441053548030107189">"Ù†Ù‚ŰŽÛ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"کڟولیÚș"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"‏منŰȘ۟ۚ Ú©Ű±ŰŻÛ URL کڟولیÚș"</string>
     <string name="sms" msgid="4560537514610063430">"ÙŸÛŒŰșŰ§Ù…"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"منŰȘ۟ۚ Ú©Ű±ŰŻÛ فون Ù†Ù…ŰšŰ± ÙŸŰ± ÙŸÛŒŰșŰ§Ù… ŰšÚŸÛŒŰŹÛŒÚș"</string>
     <string name="add_contact" msgid="7867066569670597203">"ŰŽŰ§Ù…Ù„ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"Ű±Ű§ŰšŰ·ÙˆÚș میÚș ŰŽŰ§Ù…Ù„ Ú©Ű±ÛŒÚș"</string>
     <string name="view_calendar" msgid="979609872939597838">"ŰŻÛŒÚ©ÚŸÛŒÚș"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"Ú©ÛŒÙ„Ù†ÚˆŰ± میÚș منŰȘ۟ۚ Ú©Ű±ŰŻÛ وقŰȘ ŰŻÛŒÚ©ÚŸÛŒÚș"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"ŰŽÛŒÚˆÙˆÙ„ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"منŰȘ۟ۚ Ú©Ű±ŰŻÛ وقŰȘ کے لیے Ű§ÛŒÙˆÙ†Ùč ŰŽÛŒÙčول Ú©Ű±ÛŒÚș"</string>
     <string name="view_flight" msgid="7691640491425680214">"ÙŸŰȘہ Ù„ÚŻŰ§ŰŠÛŒÚș"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"منŰȘ۟ۚ Ú©Ű±ŰŻÛ ÙŸŰ±ÙˆŰ§ŰČ ÙčŰ±ÛŒÚ© Ú©Ű±ÛŒÚș"</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>
@@ -1285,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ŰŻÛŒÚŻŰ± Ű§ÛŒÙŸŰł ÙŸŰ± ÚˆŰłÙŸÙ„Û’ ہو Ű±ÛÛŒ ہے"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"ۧگ۱ ŰąÙŸ نہیÚș Ú†Ű§ÛŰȘے ہیÚș کہ <xliff:g id="NAME">%s</xliff:g> ۧ۳ ŰźŰ”ÙˆŰ”ÛŒŰȘ کۧ ۧ۳ŰȘŰčÙ…Ű§Ù„ Ú©Ű±Û’ ŰȘو ŰȘ۱ŰȘÛŒŰšŰ§ŰȘ کڟولنے Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș Ű§ÙˆŰ± Ű§ŰłÛ’ ŰšÙ†ŰŻ Ú©Ű±ÛŒÚș۔"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"ŰąÙ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> کو چیک Ú©ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Ù…ÙˆŰŹÙˆŰŻÛ Ù…ÙˆŰ§ŰŻ کۧ ۏۧۊŰČہ Ù„ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Ù†ÛŒŰ§ <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ŰłÛŒÙč Ű§ÙŸ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ŰȘŰ”Ű§ÙˆÛŒŰ± Ű§ÙˆŰ± Ù…ÛŒÚˆÛŒŰ§ منŰȘقل Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> کے ۳ۧŰȘÚŸ Ù…ŰłŰŠÙ„Û"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ۯ۱۳ŰȘ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> ۟۱ۧۚ ہے۔ Ű§ŰłÛ’ Ùčڟیک Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ منŰȘ۟ۚ Ú©Ű±ÛŒÚș۔"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"ŰșÛŒŰ± ŰȘŰčŰ§ÙˆÙ† ÛŒŰ§ÙŰȘہ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"یہ ŰąÙ„Û <xliff:g id="NAME">%s</xliff:g> کو ŰłÙŸÙˆŰ±Ùč نہیÚș ک۱ŰȘŰ§Û” Ű§ÛŒÚ© ŰłÙŸÙˆŰ±Ùč ÛŒŰ§ÙŰȘہ ÙŰ§Ű±Ù…ÛŒÙč میÚș ŰłÛŒÙč Ű§ÙŸ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș۔"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"یہ ŰąÙ„Û ۧ۳ <xliff:g id="NAME">%s</xliff:g> کو ŰłÙŸÙˆŰ±Ùč نہیÚș ک۱ŰȘۧ ہے۔ Ű§ÛŒÚ© ŰłÙŸÙˆŰ±Ùč ÛŒŰ§ÙŰȘہ ÙŰ§Ű±Ù…ÛŒÙč میÚș ŰłÛŒÙč Ű§ÙŸ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ منŰȘ۟ۚ Ú©Ű±ÛŒÚș۔"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> ŰșÛŒŰ± مŰȘوقŰč Ű·ÙˆŰ± ÙŸŰ± ہÙčۧ ŰŻÛŒŰ§ ÚŻÛŒŰ§"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Ù…ÙˆŰ§ŰŻ کڟونے ŰłÛ’ ŰšÚ†Ù†Û’ کے Ù„ŰŠÛ’ ہÙčŰ§Ù†Û’ ŰłÛ’ ٟہلے Ù…ÛŒÚˆÛŒŰ§ ۟ۧ۱ۏ Ú©Ű±ÛŒÚș"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> کو ہÙčۧ ŰŻÛŒŰ§ ÚŻÛŒŰ§"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"ŰŽŰ§ÛŒŰŻ Ú©Ú†ÚŸ ÙÙ†Ú©ŰŽÙ† Ùčڟیک ۷۱ۭ ŰłÛ’ Ú©Ű§Ù… نہ Ú©Ű±ÛŒÚș۔ Ù†ÛŒŰ§ ۧ۳ÙčÙˆŰ±ÛŒŰŹ ŰŻŰ§ŰźÙ„ Ú©Ű±ÛŒÚș۔"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> کو ۟ۧ۱ۏ Ú©ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"نہ ہÙčŰ§ŰŠÛŒÚș"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"ŰłÛŒÙč Ű§ÙŸ Ú©Ű±ÛŒÚș"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"۟ۧ۱ۏ Ú©Ű±ÛŒÚș"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"ŰŻŰ±ÛŒŰ§ÙŰȘ Ú©Ű±ÛŒÚș"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> Űșۧۊۚ ہے"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"ŰąÙ„Û ŰŻÙˆŰšŰ§Ű±Û ŰŻŰ§ŰźÙ„ Ú©Ű±ÛŒÚș"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> کو منŰȘقل Ú©ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"ڈیÙčۧ منŰȘقل Ú©ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے…"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Ù…ÙˆŰ§ŰŻ کی منŰȘقلی مکمل ہو ÚŻŰŠÛŒ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Ù…ÙˆŰ§ŰŻ کو <xliff:g id="NAME">%s</xliff:g> میÚș منŰȘقل ک۱ ŰŻÛŒŰ§ ÚŻÛŒŰ§"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Ù…ÙˆŰ§ŰŻ منŰȘقل نہیÚș Ú©ÛŒŰ§ ۏۧ ۳کۧ"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"ŰŻÙˆŰšŰ§Ű±Û Ù…ÙˆŰ§ŰŻ کو منŰȘقل Ú©Ű±Ù†Û’ کی Ú©ÙˆŰŽŰŽ Ú©Ű±ÛŒÚș"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ہÙčۧ ŰŻÛŒŰ§ ÚŻÛŒŰ§"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ۧ۟۱ۧۏ ŰŽŰŻÛ"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"چیک Ú©ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے…"</string>
@@ -1875,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"‏SIM میÚș ŰąÙˆŰ§ŰČ Ú©ÛŒÙ„ŰŠÛ’ ŰłÛÙˆÙ„ŰȘ نہیÚș ہے"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"‏ŰąÙˆŰ§ŰČ Ú©ÛŒÙ„ŰŠÛ’ SIM کو ۧۏۧŰČŰȘ نہیÚș ہے"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"ŰąÙˆŰ§ŰČ Ú©ÛŒÙ„ŰŠÛ’ فون کو ۧۏۧŰČŰȘ نہیÚș ہے"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو ۧۏۧŰČŰȘ نہیÚș ہے"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> ÙŰ±Ű§ÛÙ… Ú©Ű±ŰŻÛ نہیÚș ہے"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو ۧۏۧŰČŰȘ نہیÚș ہے"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"‏SIM <xliff:g id="SIMNUMBER">%d</xliff:g> کو ۧۏۧŰČŰȘ نہیÚș ہے"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ÙŸŰ§ÙŸ Ű§ÙŸ ونڈو"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"‎‎‎‎‎+ <xliff:g id="NUMBER">%1$d</xliff:g>‎‎"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ű§ÛŒÙŸ کے ÙˆŰ±Ú˜Ù† کۧ ŰŻŰ±ŰŹÛ کم ہے ÛŒŰ§ ۧ۳ ێۧ۱Ùč Ú©Ùč کے ۳ۧŰȘÚŸ Ù…Ű·Ű§ŰšÙ‚ŰȘ ÙŸŰ°ÛŒŰ± نہیÚș ہے"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 97ccc5b..6b5ab8b 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Ovozli chaqiruvlar ishlamaydi"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Ovozli yoki favqulodda chaqiruvlar ishlamayapti"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Aloqa operatoringiz tomonidan vaqtinchalik faolsizlantirilgan"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"<xliff:g id="SIMNUMBER">%d</xliff:g>-SIM karta uchun aloqa operatoringiz tomonidan vaqtinchalik faolsizlantirilgan"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Mobil tarmoqqa ulanib bo‘lmadi"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Tarmoq turini almashtiring. Almashtirish uchun bosing."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Favqulodda chaqiruv ishlamayapti"</string>
@@ -484,8 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"Ilova qisqa masofali aloqa (NFC) texnologiyasi yordamida NFC yorliqlari, kartalar va o‘qish moslamalari bilan ma’lumot almashishi mumkin."</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran qulfini o‘chirib qo‘yish"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ilovaga ekran qulfini va har qanday parol  yordamidagi xavfsizlik himoyalarini o‘chirishga ruxsat beradi. Masalan, kirish qo‘ng‘irog‘ida telefon ekran qulfini o‘chiradi va qo‘ng‘iroq tugashi bilan qulfni yoqadi."</string>
-    <string name="permlab_useBiometric" msgid="8837753668509919318">"biometrik sensoridan foydalanish"</string>
-    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Ilova haqiqiylikni tekshirish uchun biometrik sensoridan foydalanishi mumkin"</string>
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"biometrik sensordan foydalanish"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"Haqiqiylikni tekshirish uchun biometrik sensordan foydalanish imkonini beradi"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"barmoq izi skanerini boshqarish"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Ilova foydalanish uchun barmoq izi namunalarini qo‘shish va o‘chirish usullarini qo‘llashi mumkin."</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"barmoq izi sensoridan foydalanish"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Aniqlanmadi"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmoq izi tekshirildi"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi skaneri ish holatida emas."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Belgilangan manzilga xat yuborish"</string>
     <string name="dial" msgid="1253998302767701559">"Chaqiruv"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Belgilangan raqamga telefon qilish"</string>
-    <string name="map" msgid="6521159124535543457">"Xaritadan topish"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Belgilangan manzilni xaritadan topish"</string>
+    <string name="map" msgid="5441053548030107189">"Xarita"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Ochish"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Belgilangan URL manzilini ochish"</string>
     <string name="sms" msgid="4560537514610063430">"Xabar"</string>
@@ -1274,49 +1273,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Faolsizlantirish"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"<xliff:g id="NAME">%s</xliff:g> tekshirilmoqda…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Joriy kontent tekshirilmoqda"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"Yangi <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Sozlash uchun bosing"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Rasm va boshqa fayllarni o‘tkazish"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g> bilan muammo"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Tuzatish uchun bosing"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>: buzilgan. Tuzatish uchun uni tanlang."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> qo‘llab-quvvatlanmaydi"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Bu xotira qurilmasi (<xliff:g id="NAME">%s</xliff:g>) qo‘llab-quvvatlanmaydi. Uni mos keladigan formatda sozlash uchun bu yerga bosing."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Bu xotira qurilmasi (<xliff:g id="NAME">%s</xliff:g>) qo‘llab-quvvatlanmaydi. Mos formatda sozlash uchun uni tanlang."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g> kutilmaganda chiqarib olindi"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Xotira qurilmasini olib tashlashdan oldin, uni o‘chiring, shuda ma’lumotlar o‘chib ketmaydi."</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g> olib tashlandi"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Ayrim funksiyalar xato ishlashi mumkin. Yangi xotira joylang."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"<xliff:g id="NAME">%s</xliff:g> chiqarib olinmoqda"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Chiqarib olinmasin"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Sozlash"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Chiqarish"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"O‘rganish"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> topilmadi"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Qurilmani yana ulang"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ko‘chirib o‘tkazilmoqda"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Ma’lumotlar ko‘chirilmoqda"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Kontent ko‘chirildi"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Kontent <xliff:g id="NAME">%s</xliff:g> xotirasiga ko‘chirildi"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Kontent ko‘chirilmadi"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Kontentni qaytadan ko‘chirib ko‘ring"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Sug‘urib olingan"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Chiqarib olingan"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Tekshirilmoqda…"</string>
@@ -1864,14 +1848,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"Ovoz uchun SIM karta taqdim etilmagan"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"Ovoz uchun SIM karta ishlatish taqiqlangan"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ovoz uchun telefon taqiqlangan"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"<xliff:g id="SIMNUMBER">%d</xliff:g>-SIM kartani ishlatish taqiqlangan"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"<xliff:g id="SIMNUMBER">%d</xliff:g>-SIM karta faollashtirilmagan"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"<xliff:g id="SIMNUMBER">%d</xliff:g>-SIM kartani ishlatish taqiqlangan"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"<xliff:g id="SIMNUMBER">%d</xliff:g>-SIM kartani ishlatish taqiqlangan"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Qalqib chiquvchi oyna"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ilova versiyasi eski yoki bu yorliq bilan mos emas"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index e1a5791..a46541e 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Không có dịch vỄ thoáșĄi"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Không có dịch vỄ thoáșĄi hoáș·c gọi kháș©n cáș„p"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"Nhà máșĄng đã táșĄm thời táșŻt dịch vỄ này"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Nhà máșĄng đã táșĄm thời táșŻt dịch vỄ này đối với SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"Không thể káșżt nối với máșĄng di động"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"Hãy thá»­ thay đổi máșĄng Æ°u tiên. Nháș„n để thay đổi."</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"Không có dịch vỄ gọi kháș©n cáș„p"</string>
@@ -498,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Không nháș­n dáșĄng Ä‘Æ°á»Łc"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"Đã xác thá»±c vân tay"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Pháș§n cứng vân tay không kháșŁ dỄng."</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lÆ°u vân tay. Vui lòng xóa vân tay hiện có."</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã háșżt thời gian chờ vân tay. Hãy thá»­ láșĄi."</string>
@@ -1015,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Gá»­i email đáșżn địa chỉ đã chọn"</string>
     <string name="dial" msgid="1253998302767701559">"Gọi"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Gọi đáșżn số điện thoáșĄi đã chọn"</string>
-    <string name="map" msgid="6521159124535543457">"Định vị"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Định vị địa chỉ đã chọn"</string>
+    <string name="map" msgid="5441053548030107189">"BáșŁn đồ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Mở"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Mở URL đã chọn"</string>
     <string name="sms" msgid="4560537514610063430">"Gá»­i tin nháșŻn"</string>
@@ -1273,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên ứng dỄng khác"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"Náșżu báșĄn không muốn <xliff:g id="NAME">%s</xliff:g> sá»­ dỄng tính năng này, hãy nháș„n để mở cài đáș·t và táșŻt tính năng này."</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"TáșŻt"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Đang kiểm tra <xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Đang xem láșĄi nội dung hiện táșĄi"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"<xliff:g id="NAME">%s</xliff:g> mới"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"Hãy nháș„n để thiáșżt láș­p"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Để chuyển áșŁnh và phÆ°ÆĄng tiện"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"Váș„n đề với <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"Hãy nháș„n để sá»­a"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g> bị lỗi. Chọn để sửa."</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> không Ä‘Æ°á»Łc hỗ trợ"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"Thiáșżt bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Nháș„n để thiáșżt láș­p ở định dáșĄng Ä‘Æ°á»Łc hỗ trợ."</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"Thiáșżt bị này không hỗ trợ <xliff:g id="NAME">%s</xliff:g> này. Chọn để thiáșżt láș­p ở định dáșĄng Ä‘Æ°á»Łc hỗ trợ."</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"Đã tháo đột ngột <xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"Hãy ngáșŻt káșżt nối phÆ°ÆĄng tiện trước khi tháo để tránh máș„t nội dung"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"Đã xóa <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"Một số chức năng có thể hoáșĄt động không bình thường. Hãy láșŻp bộ nhớ mới."</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"Đang ngáșŻt káșżt nối <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"Không tháo"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"Thiáșżt láș­p"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"Tháo"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"Khám phá"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> bị thiáșżu"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"Hãy láșŻp láșĄi thiáșżt bị"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Di chuyển <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"Di chuyển dữ liệu"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"Đã hoàn táș„t chuyển nội dung"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"Đã di chuyển nội dung sang <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"Không thể di chuyển nội dung"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"Thá»­ di chuyển láșĄi nội dung"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"Đã tháo"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"Đã đáș©y ra"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"Đang kiểm tra…"</string>
@@ -1863,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM không Ä‘Æ°á»Łc cung cáș„p tính năng thoáșĄi"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM không Ä‘Æ°á»Łc phép sá»­ dỄng tính năng thoáșĄi"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"Điện thoáșĄi không Ä‘Æ°á»Łc phép sá»­ dỄng tính năng thoáșĄi"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"Không cho phép SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"ChÆ°a cáș„p phép SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"Không cho phép SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"Không cho phép SIM <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"Cá»­a sổ báș­t lên"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Phiên báșŁn của ứng dỄng đã bị háșĄ cáș„p hoáș·c không tÆ°ÆĄng thích với lối táșŻt này"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 6ac57ae..b15e306 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -82,8 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"æ— æł•äœżç”šèŻ­éŸłé€šèŻæœćŠĄ"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"æ— æł•äœżç”šèŻ­éŸłæœćŠĄæˆ–çŽ§æ€„ć‘Œæ•‘æœćŠĄ"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ć·Čç”±èżè„ć•†æš‚æ—¶ć…łé—­"</string>
-    <!-- no translation found for RestrictedStateContentMsimTemplate (673416791370248176) -->
-    <skip />
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g> ć·Čç”±èżè„ć•†æš‚æ—¶ć…łé—­"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"æ— æł•èżžæŽ„ćˆ°ç§»ćŠšçœ‘ç»œ"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"èŻ·ć°èŻ•æ›Žæ”čéŠ–é€‰çœ‘ç»œă€‚ç‚čæŒ‰ćłćŻæ›Žæ”č。"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"æ— æł•äœżç”šçŽ§æ€„ć‘Œæ•‘æœćŠĄ"</string>
@@ -484,10 +483,8 @@
     <string name="permdesc_nfc" msgid="7120611819401789907">"ć…èźžćș”ç”šäžŽèż‘è·çŠ»æ— çșżé€šäżĄ(NFC)æ ‡ç­Ÿă€ćĄć’ŒèŻ»ć–ć™šé€šäżĄă€‚"</string>
     <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ćœç”šć±ćč•é”ćźš"</string>
     <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ć…èźžèŻ„ćș”ç”šćœç”šé”źé”ä»„ćŠä»»äœ•ć…łè”çš„ćŻ†ç ćź‰ć…šæŽȘæ–œă€‚äŸ‹ćŠ‚ïŒŒèź©æ‰‹æœșćœšæŽ„ćŹæ„ç””æ—¶ćœç”šé”źé”ïŒŒćœšé€šèŻç»“æŸćŽé‡æ–°ćŻç”šé”źé”ă€‚"</string>
-    <!-- no translation found for permlab_useBiometric (8837753668509919318) -->
-    <skip />
-    <!-- no translation found for permdesc_useBiometric (8389855232721612926) -->
-    <skip />
+    <string name="permlab_useBiometric" msgid="8837753668509919318">"äœżç”šç”Ÿç‰©ç‰čćŸçĄŹä»¶"</string>
+    <string name="permdesc_useBiometric" msgid="8389855232721612926">"ć…èźžèŻ„ćș”ç”šäœżç”šç”Ÿç‰©ç‰čćŸçĄŹä»¶èż›èĄŒèș«ä»œéȘŒèŻ"</string>
     <string name="permlab_manageFingerprint" msgid="5640858826254575638">"çźĄç†æŒ‡çșč祏件"</string>
     <string name="permdesc_manageFingerprint" msgid="178208705828055464">"ć…èźžèŻ„ćș”甚调甚æ–čæł•æ„æ·»ćŠ ć’Œćˆ é™€ćŻç”šçš„æŒ‡çșčæšĄæżă€‚"</string>
     <string name="permlab_useFingerprint" msgid="3150478619915124905">"äœżç”šæŒ‡çșč祏件"</string>
@@ -500,8 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"æ— æł•èŻ†ćˆ«"</string>
-    <!-- no translation found for fingerprint_authenticated (5309333983002526448) -->
-    <skip />
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"ć·ČéȘŒèŻæŒ‡çșč"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指çșčçĄŹä»¶æ— æł•äœżç”šă€‚"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"æ— æł•ć­˜ć‚šæŒ‡çșčă€‚èŻ·ç§»é™€äž€äžȘ现有的指çșč。"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指çșčćœ•ć…„æ“äœœè¶…æ—¶ïŒŒèŻ·é‡èŻ•ă€‚"</string>
@@ -1014,32 +1010,24 @@
     <string name="inputMethod" msgid="1653630062304567879">"èŸ“ć…„æł•"</string>
     <string name="editTextMenuTitle" msgid="4909135564941815494">"æ–‡ć­—æ“äœœ"</string>
     <string name="email" msgid="4560673117055050403">"甔歐邟件"</string>
-    <!-- no translation found for email_desc (3638665569546416795) -->
-    <skip />
+    <string name="email_desc" msgid="3638665569546416795">"ć°†ç””ć­é‚źä»¶ć‘é€è‡łæ‰€é€‰ćœ°ć€"</string>
     <string name="dial" msgid="1253998302767701559">"æ‹šæ‰“ç””èŻ"</string>
-    <!-- no translation found for dial_desc (6573723404985517250) -->
-    <skip />
-    <string name="map" msgid="6521159124535543457">"ćźšäœ"</string>
-    <!-- no translation found for map_desc (9036645769910215302) -->
+    <string name="dial_desc" msgid="6573723404985517250">"æ‹šæ‰“æ‰€é€‰ç””èŻć·ç "</string>
+    <string name="map" msgid="5441053548030107189">"ćœ°ć›Ÿ"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
     <skip />
     <string name="browse" msgid="1245903488306147205">"æ‰“ćŒ€"</string>
-    <!-- no translation found for browse_desc (8220976549618935044) -->
-    <skip />
+    <string name="browse_desc" msgid="8220976549618935044">"æ‰“ćŒ€æ‰€é€‰çœ‘ć€"</string>
     <string name="sms" msgid="4560537514610063430">"揑短信"</string>
-    <!-- no translation found for sms_desc (7526588350969638809) -->
-    <skip />
+    <string name="sms_desc" msgid="7526588350969638809">"ć°†çŸ­äżĄć‘é€è‡łæ‰€é€‰ç””èŻć·ç "</string>
     <string name="add_contact" msgid="7867066569670597203">"æ·»ćŠ "</string>
-    <!-- no translation found for add_contact_desc (4830217847004590345) -->
-    <skip />
+    <string name="add_contact_desc" msgid="4830217847004590345">"æ·»ćŠ ćˆ°é€šèźŻćœ•"</string>
     <string name="view_calendar" msgid="979609872939597838">"柄看"</string>
-    <!-- no translation found for view_calendar_desc (5828320291870344584) -->
-    <skip />
+    <string name="view_calendar_desc" msgid="5828320291870344584">"ćœšæ—„ćŽ†äž­æŸ„çœ‹æ‰€é€‰æ—¶é—Ž"</string>
     <string name="add_calendar_event" msgid="1953664627192056206">"æŽ’ćźšæ—¶é—Ž"</string>
-    <!-- no translation found for add_calendar_event_desc (4326891793260687388) -->
-    <skip />
+    <string name="add_calendar_event_desc" msgid="4326891793260687388">"ć°†æŽ»ćŠšćź‰æŽ’ćœšæ‰€é€‰æ—¶é—Ž"</string>
     <string name="view_flight" msgid="7691640491425680214">"跟èžȘ"</string>
-    <!-- no translation found for view_flight_desc (3876322502674253506) -->
-    <skip />
+    <string name="view_flight_desc" msgid="3876322502674253506">"跟èžȘ所选èˆȘ班"</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>
@@ -1284,49 +1272,34 @@
     <string name="alert_windows_notification_title" msgid="3697657294867638947">"“<xliff:g id="NAME">%s</xliff:g>”æ­Łćœšć…¶ä»–ćș”ç”šçš„äžŠć±‚æ˜Ÿç€ș憅ćźč"</string>
     <string name="alert_windows_notification_message" msgid="8917232109522912560">"ćŠ‚æžœæ‚šäžæƒłèź©<xliff:g id="NAME">%s</xliff:g>äœżç”šæ­€ćŠŸèƒœïŒŒèŻ·ç‚čæŒ‰ä»„æ‰“ćŒ€èźŸçœźïŒŒç„¶ćŽć…łé—­æ­€ćŠŸèƒœă€‚"</string>
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"慳闭"</string>
-    <!-- no translation found for ext_media_checking_notification_title (4411133692439308924) -->
-    <skip />
-    <!-- no translation found for ext_media_checking_notification_message (410185170877285434) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_title (1621805083736634077) -->
-    <skip />
-    <!-- no translation found for ext_media_new_notification_message (3673685270558405087) -->
-    <skip />
+    <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"æ­ŁćœšæŁ€æŸ„<xliff:g id="NAME">%s</xliff:g>…"</string>
+    <string name="ext_media_checking_notification_message" msgid="410185170877285434">"æ­ŁćœšæŁ€æŸ„ćœ“ć‰ć†…ćźč"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"新的<xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"ç‚čæŒ‰ćłćŻèż›èĄŒèźŸçœź"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"揯甹äșŽäŒ èŸ“ç…§ç‰‡ć’ŒćȘ’䜓文件"</string>
-    <!-- no translation found for ext_media_unmountable_notification_title (4179418065210797130) -->
-    <skip />
-    <!-- no translation found for ext_media_unmountable_notification_message (4193858924381066522) -->
-    <skip />
+    <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>ć‡ș现闼鱘"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"ç‚čæŒ‰ćłćŻäżźæ­Łé—źéą˜"</string>
+    <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>ć·ČæŸćă€‚é€‰æ‹©ćłćŻèż›èĄŒäżźæ­Łă€‚"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g>äžć—æ”ŻæŒ"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"èŻ„èźŸć€‡äžæ”ŻæŒæ­€<xliff:g id="NAME">%s</xliff:g>。ç‚čæŒ‰ćłćŻäœżç”šæ”ŻæŒçš„æ ŒćŒèż›èĄŒèźŸçœźă€‚"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"æ­€èźŸć€‡äžæ”ŻæŒèŻ„<xliff:g id="NAME">%s</xliff:g>ă€‚é€‰æ‹©ćłćŻäœżç”šæ”ŻæŒçš„æ ŒćŒèż›èĄŒèźŸçœźă€‚"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>ć·Čæ„ć€–ç§»é™€"</string>
-    <!-- no translation found for ext_media_badremoval_notification_message (8556885808951260574) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_title (6593814191061956856) -->
-    <skip />
-    <!-- no translation found for ext_media_nomedia_notification_message (2110883356419799994) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_title (5046532339291216076) -->
-    <skip />
-    <!-- no translation found for ext_media_unmounting_notification_message (1003926904442321115) -->
-    <skip />
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"èŻ·ć…ˆćŒčć‡șćȘ’äœ“ïŒŒć†ć°†ć…¶ç§»é™€ïŒŒä»„é˜Č憅ćźč䞹怱"</string>
+    <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"<xliff:g id="NAME">%s</xliff:g>ć·Čèą«ç§»é™€"</string>
+    <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"éƒšćˆ†ćŠŸèƒœćŻèƒœæ— æł•æ­ŁćžžèżèĄŒă€‚èŻ·æ’ć…„æ–°çš„ć­˜ć‚šèźŸć€‡ă€‚"</string>
+    <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"æ­ŁćœšćŒčć‡ș<xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_unmounting_notification_message" msgid="1003926904442321115">"èŻ·ć‹żç§»é™€"</string>
     <string name="ext_media_init_action" msgid="7952885510091978278">"èźŸçœź"</string>
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"ćŒčć‡ș"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"攏览"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"çŒș民<xliff:g id="NAME">%s</xliff:g>"</string>
-    <!-- no translation found for ext_media_missing_message (4012389235250987930) -->
-    <skip />
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"èŻ·ć†æŹĄæ’ć…„èźŸć€‡"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"æ­Łćœšç§»ćŠš<xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"æ­Łćœšç§»ćŠšæ•°æź"</string>
-    <!-- no translation found for ext_media_move_success_title (7863652232242276066) -->
-    <skip />
-    <!-- no translation found for ext_media_move_success_message (8939137931961728009) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_title (1604422634177382092) -->
-    <skip />
-    <!-- no translation found for ext_media_move_failure_message (7388950499623016135) -->
-    <skip />
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"憅ćźčèœŹç§»æ“äœœć·ČćźŒæˆ"</string>
+    <string name="ext_media_move_success_message" msgid="8939137931961728009">"ć·Č氆憅ćźčç§»è‡ł<xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_move_failure_title" msgid="1604422634177382092">"æ— æł•ç§»ćŠšć†…ćźč"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"èŻ·ć†æŹĄć°èŻ•ç§»ćŠšć†…ćźč"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ć·Č移陀"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ć·ČćŒčć‡ș"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"æ­ŁćœšæŁ€æŸ„…"</string>
@@ -1874,14 +1847,10 @@
     <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"æœȘé…çœźæ”ŻæŒèŻ­éŸłçš„ SIM 捡"</string>
     <string name="mmcc_illegal_ms" msgid="807334478177362062">"SIM ćĄäžæ”ŻæŒèŻ­éŸł"</string>
     <string name="mmcc_illegal_me" msgid="1950705155760872972">"手æœșäžæ”ŻæŒèŻ­éŸł"</string>
-    <!-- no translation found for mmcc_authentication_reject_msim_template (1217031195834766479) -->
-    <skip />
-    <!-- no translation found for mmcc_imsi_unknown_in_hlr_msim_template (5636464607596778986) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_ms_msim_template (5994323296399913454) -->
-    <skip />
-    <!-- no translation found for mmcc_illegal_me_msim_template (5550259730350571826) -->
-    <skip />
+    <string name="mmcc_authentication_reject_msim_template" msgid="1217031195834766479">"äžć…èźžäœżç”š SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_imsi_unknown_in_hlr_msim_template" msgid="5636464607596778986">"æœȘé…çœź SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_ms_msim_template" msgid="5994323296399913454">"äžć…èźžäœżç”š SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
+    <string name="mmcc_illegal_me_msim_template" msgid="5550259730350571826">"äžć…èźžäœżç”š SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g>"</string>
     <string name="popup_window_default_title" msgid="4874318849712115433">"ćŒčć‡șćŒçȘ—揣"</string>
     <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
     <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ćș”ç”šç‰ˆæœŹć·Č降çș§æˆ–äžŽæ­€ćż«æ·æ–čćŒäžć…Œćźč"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 0c9e347..8249de1 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -82,7 +82,7 @@
     <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"æČ’æœ‰èȘžéŸłæœć‹™"</string>
     <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"ç„Ąæł•äœżç”šèȘžéŸłæœć‹™æˆ–æ’„打緊怄電話"</string>
     <string name="RestrictedStateContent" msgid="6538703255570997248">"ć·Čç”±æ”ć‹•ç¶Čç”ĄäŸ›æ‡‰ć•†æš«æ™‚é—œé–‰"</string>
-    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g> æš«æ™‚é­é›»äżĄæ„­è€…ćœç”š"</string>
+    <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"SIM 捡 <xliff:g id="SIMNUMBER">%d</xliff:g> æš«æ™‚èą«æ”ć‹•ç¶Čç”ĄäŸ›æ‡‰ć•†ćœç”š"</string>
     <string name="NetworkPreferenceSwitchTitle" msgid="6982395015324165258">"ç„Ąæł•é€Łç·šè‡łæ”ć‹•ç¶Č甥"</string>
     <string name="NetworkPreferenceSwitchSummary" msgid="509327194863482733">"è«‹ć˜—è©ŠèźŠæ›Žćć„œçš„ç¶Čç”Ąă€‚èŒ•æŒ‰ćłćŻèźŠæ›Žă€‚"</string>
     <string name="EmergencyCallWarningTitle" msgid="813380189532491336">"ç„Ąæł•æ’„æ‰“ç·Šæ€„é›»è©±"</string>
@@ -497,7 +497,7 @@
   <string-array name="fingerprint_acquired_vendor">
   </string-array>
     <string name="fingerprint_not_recognized" msgid="2690661881608146617">"æœȘèƒœèŸšćˆ„"</string>
-    <string name="fingerprint_authenticated" msgid="5309333983002526448">"æŒ‡çŽ‹é©—è­‰æˆćŠŸ"</string>
+    <string name="fingerprint_authenticated" msgid="5309333983002526448">"é©—è­‰ć’—æŒ‡çŽ‹"</string>
     <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ç„Ąæł•äœżç”šæŒ‡çŽ‹è»Ÿä»¶ă€‚"</string>
     <string name="fingerprint_error_no_space" msgid="1055819001126053318">"æŒ‡çŽ‹ç„Ąæł•ć„Čć­˜ă€‚è«‹ç§»é™€çŸæœ‰æŒ‡çŽ‹ă€‚"</string>
     <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指王ć·Čé€Ÿæ™‚ă€‚è«‹ć†è©Šäž€æŹĄă€‚"</string>
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"Send email ćŽ»æŒ‡ćźšćœ°ć€"</string>
     <string name="dial" msgid="1253998302767701559">"通話"</string>
     <string name="dial_desc" msgid="6573723404985517250">"æ‰“æŒ‡ćźšé›»è©±è™ŸçąŒ"</string>
-    <string name="map" msgid="6521159124535543457">"ć°‹æ‰Ÿ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"搔ć‡șæŒ‡ćźšćœ°ć€"</string>
+    <string name="map" msgid="5441053548030107189">"朰朖"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"開敟"</string>
     <string name="browse_desc" msgid="8220976549618935044">"æ‰“é–‹æŒ‡ćźšç¶Č杀"</string>
     <string name="sms" msgid="4560537514610063430">"短蚊"</string>
@@ -1273,17 +1274,17 @@
     <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"關閉"</string>
     <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"æ­ŁćœšæȘąæŸ„ <xliff:g id="NAME">%s</xliff:g>…"</string>
     <string name="ext_media_checking_notification_message" msgid="410185170877285434">"æ­ŁćœšæȘąæŸ„盼才的慧ćźč"</string>
-    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"新的 <xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"èŒ•è§žćłćŻé€ČèĄŒèš­ćźš"</string>
+    <string name="ext_media_new_notification_title" msgid="1621805083736634077">"新 <xliff:g id="NAME">%s</xliff:g>"</string>
+    <string name="ext_media_new_notification_message" msgid="3673685270558405087">"èŒ•æŒ‰ćłćŻèš­ćźš"</string>
     <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"ç”šæ–Œèœ‰ç§»ç›žç‰‡ć’ŒćȘ’é«”"</string>
     <string name="ext_media_unmountable_notification_title" msgid="4179418065210797130">"<xliff:g id="NAME">%s</xliff:g>ç™Œç”Ÿć•éĄŒ"</string>
-    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"èŒ•è§žćłćŻäżźæ­Łć•éĄŒ"</string>
+    <string name="ext_media_unmountable_notification_message" msgid="4193858924381066522">"èŒ•æŒ‰ćłćŻäżźæ­Łć•éĄŒ"</string>
     <string name="ext_media_unmountable_notification_message" product="tv" msgid="3941179940297874950">"<xliff:g id="NAME">%s</xliff:g>ć·ČææŻ€ă€‚éžć–ćłćŻäżźæ­Łă€‚"</string>
     <string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"äžæ”ŻæŽçš„ <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_unsupported_notification_message" msgid="6121601473787888589">"æ­€èŁçœźäžŠäžæ”ŻæŽæ­€ <xliff:g id="NAME">%s</xliff:g>ă€‚èŒ•æŒ‰ćłćŻćœšæ”ŻæŽçš„æ ŒćŒèš­ćźšă€‚"</string>
     <string name="ext_media_unsupported_notification_message" product="tv" msgid="3725436899820390906">"é€™éƒšèŁçœźäžæ”ŻæŽæ­€ <xliff:g id="NAME">%s</xliff:g>ă€‚éžć–ćłćŻäœżç”šæ”ŻæŽçš„æ ŒćŒèš­ćźšă€‚"</string>
     <string name="ext_media_badremoval_notification_title" msgid="3206248947375505416">"<xliff:g id="NAME">%s</xliff:g>èą«æ„ć€–ç§»é™€"</string>
-    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"è«‹ć…ˆé€€ć‡șćȘ’é«”ïŒŒć†ć°‡ć…¶ç§»é™€ïŒŒä»„慍慧ćźčéș怱"</string>
+    <string name="ext_media_badremoval_notification_message" msgid="8556885808951260574">"è«‹ć…ˆé€€ć‡șćȘ’é«”ïŒŒć†ć°‡ć…¶ç§»é™€ïŒŒä»„慍慧ćźčéș怱。"</string>
     <string name="ext_media_nomedia_notification_title" msgid="6593814191061956856">"ć·Č移陀 <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_nomedia_notification_message" msgid="2110883356419799994">"éƒšćˆ†ćŠŸèƒœćŻèƒœç„Ąæł•æ­Łćžžé‹äœœă€‚è«‹æ’ć…„æ–°çš„ć„Č歘ç©ș間。"</string>
     <string name="ext_media_unmounting_notification_title" msgid="5046532339291216076">"æ­Łćœšé€€ć‡ș <xliff:g id="NAME">%s</xliff:g>"</string>
@@ -1292,13 +1293,13 @@
     <string name="ext_media_unmount_action" msgid="1121883233103278199">"移陀"</string>
     <string name="ext_media_browse_action" msgid="8322172381028546087">"æŽąçŽą"</string>
     <string name="ext_media_missing_title" msgid="620980315821543904">"æ‰Ÿäžćˆ°<xliff:g id="NAME">%s</xliff:g>"</string>
-    <string name="ext_media_missing_message" msgid="4012389235250987930">"è«‹ć†æŹĄæ’ć…„èŁçœź"</string>
+    <string name="ext_media_missing_message" msgid="4012389235250987930">"è«‹ć†æ’ć…„èŁçœź"</string>
     <string name="ext_media_move_specific_title" msgid="1471100343872375842">"æ­Łćœšèœ‰ç§»<xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_title" msgid="1022809140035962662">"æ­Łćœšèœ‰ç§»èł‡æ–™"</string>
-    <string name="ext_media_move_success_title" msgid="7863652232242276066">"慧ćźč蜉移䜜愭ć·ČćźŒæˆ"</string>
+    <string name="ext_media_move_success_title" msgid="7863652232242276066">"慧ćźč蜉移操䜜ć·ČćźŒæˆ"</string>
     <string name="ext_media_move_success_message" msgid="8939137931961728009">"ć·Č氇慧ćźčç§»è‡ł <xliff:g id="NAME">%s</xliff:g>"</string>
     <string name="ext_media_move_failure_title" msgid="1604422634177382092">"ç„Ąæł•ç§»ć‹•ć…§ćźč"</string>
-    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"è«‹ć†æŹĄć˜—è©Šç§»ć‹•ć…§ćźč"</string>
+    <string name="ext_media_move_failure_message" msgid="7388950499623016135">"è«‹ć†ć˜—è©Šç§»ć‹•ć…§ćźč"</string>
     <string name="ext_media_status_removed" msgid="6576172423185918739">"ć·Č移陀"</string>
     <string name="ext_media_status_unmounted" msgid="2551560878416417752">"ć·ČćžèŒ‰"</string>
     <string name="ext_media_status_checking" msgid="6193921557423194949">"æ­ŁćœšæȘąæŸ„…"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5d73d07..92b5ec4 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"ć°‡é›»ć­éƒ”ä»¶ćŻ„ćˆ°æ‰€éžćœ°ć€"</string>
     <string name="dial" msgid="1253998302767701559">"通話"</string>
     <string name="dial_desc" msgid="6573723404985517250">"æ’„æ‰“æ‰€éžé›»è©±è™ŸçąŒ"</string>
-    <string name="map" msgid="6521159124535543457">"ćźšäœ"</string>
-    <string name="map_desc" msgid="9036645769910215302">"æ‰Ÿćˆ°æ‰€éžćœ°ć€"</string>
+    <string name="map" msgid="5441053548030107189">"朰朖"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"開敟"</string>
     <string name="browse_desc" msgid="8220976549618935044">"é–‹ć•Ÿæ‰€éžç¶Č杀"</string>
     <string name="sms" msgid="4560537514610063430">"èšŠæŻ"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index c430da9..fb794fd 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1013,8 +1013,9 @@
     <string name="email_desc" msgid="3638665569546416795">"I-imeyili ikhethe amakheli"</string>
     <string name="dial" msgid="1253998302767701559">"Shaya"</string>
     <string name="dial_desc" msgid="6573723404985517250">"Ikholi ikhethe inombolo yefoni"</string>
-    <string name="map" msgid="6521159124535543457">"Beka"</string>
-    <string name="map_desc" msgid="9036645769910215302">"Isifunda sikhethe ikheli"</string>
+    <string name="map" msgid="5441053548030107189">"Imephu"</string>
+    <!-- no translation found for map_desc (1836995341943772348) -->
+    <skip />
     <string name="browse" msgid="1245903488306147205">"Vula"</string>
     <string name="browse_desc" msgid="8220976549618935044">"Vula i-URL ekhethiwe"</string>
     <string name="sms" msgid="4560537514610063430">"Umlayezo"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index aceba08..fe34d98 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2154,9 +2154,6 @@
             Corresponds to <code>LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES</code>.
             -->
             <enum name="shortEdges" value="1" />
-            <!-- Use <code>shortEdges</code> instead. This is temporarily here to unblock pushing
-                 the SDK until all usages have been migrated to <code>shortEdges</code> -->
-            <enum name="always" value="1" />
             <!-- <p>
             The window is never allowed to overlap with the <code>DisplayCutout</code> area.
             <p>
diff --git a/core/res/res/values/colors_device_defaults.xml b/core/res/res/values/colors_device_defaults.xml
index 7048511..0fe80a1 100644
--- a/core/res/res/values/colors_device_defaults.xml
+++ b/core/res/res/values/colors_device_defaults.xml
@@ -38,4 +38,8 @@
     <color name="background_device_default_light">@color/background_material_light</color>
     <color name="background_floating_device_default_dark">@color/background_floating_material_dark</color>
     <color name="background_floating_device_default_light">@color/background_floating_material_light</color>
+
+    <!-- Error color -->
+    <color name="error_color_device_default_dark">@color/error_color_material_dark</color>
+    <color name="error_color_device_default_light">@color/error_color_material_light</color>
 </resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 6d07d57..fc030ca 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -27,6 +27,7 @@
     <!-- Do not translate. Defines the slots for the right-hand side icons.  That is to say, the
          icons in the status bar that are not notifications. -->
     <string-array name="config_statusBarIcons">
+        <item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_rotate</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_headset</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_data_saver</xliff:g></item>
@@ -44,7 +45,6 @@
         <item><xliff:g id="id">@string/status_bar_phone_evdo_signal</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_phone_signal</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_secure</xliff:g></item>
-        <item><xliff:g id="id">@string/status_bar_alarm_clock</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_bluetooth</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_managed_profile</xliff:g></item>
         <item><xliff:g id="id">@string/status_bar_cast</xliff:g></item>
@@ -327,6 +327,13 @@
          This is the default value of that setting. -->
     <integer translatable="false" name="config_networkMeteredMultipathPreference">0</integer>
 
+    <!-- Default daily multipath budget used by ConnectivityManager.getMultipathPreference()
+         on metered networks. This default quota only used if quota could not be determined from
+         data plan or data limit/warning set by the user. The value that is actually used is
+         controlled by Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES. This is the
+         default value of that setting. -->
+    <integer translatable="false" name="config_networkDefaultDailyMultipathQuotaBytes">2500000</integer>
+
     <!-- List of regexpressions describing the interface (if any) that represent tetherable
          USB interfaces.  If the device doesn't want to support tethering over USB this should
          be empty.  An example would be "usb.*" -->
@@ -967,6 +974,9 @@
     -->
     <integer name="config_longPressOnBackBehavior">0</integer>
 
+    <!-- Allows activities to be launched on a long press on power during device setup. -->
+    <bool name="config_allowStartActivityForLongPressOnPowerInSetup">false</bool>
+
     <!-- Control the behavior when the user short presses the power button.
             0 - Nothing
             1 - Go to sleep (doze)
@@ -1279,6 +1289,32 @@
          in darkness (although they may not be visible in a bright room). -->
     <integer name="config_screenBrightnessDark">1</integer>
 
+    <!-- Array of lux values to define the minimum brightness curve, which guarantees that any
+         brightness curve that dips below it is rejected by the system.
+         This prevents auto-brightness from setting the screen so dark as to prevent the user from
+         resetting or disabling it.
+
+         The values must be non-negative and strictly increasing, and correspond to the values in
+         the config_minimumBrightnessCurveNits array. -->
+    <array name="config_minimumBrightnessCurveLux">
+        <item>0.0</item>
+        <item>2000.0</item>
+        <item>4000.0</item>
+    </array>
+
+    <!-- Array of nits values to define the minimum brightness curve, which guarantees that any
+         brightness curve that dips below it is rejected by the system.
+         This should map lux to the absolute minimum nits that are still readable in that ambient
+         brightness.
+
+         The values must be non-negative and non-decreasing, and correspond to the values in the
+         config_minimumBrightnessCurveLux array. -->
+    <array name="config_minimumBrightnessCurveNits">
+        <item>0.0</item>
+        <item>50.0</item>
+        <item>90.0</item>
+    </array>
+
     <!-- Array of light sensor lux values to define our levels for auto backlight brightness support.
          The N entries of this array define N + 1 control points as follows:
          (1-based arrays)
@@ -2242,6 +2278,10 @@
          mirror the content of the default display. -->
     <bool name="config_localDisplaysMirrorContent">true</bool>
 
+    <!-- Indicates whether local non-default displays are private.
+         {@see android.view.Display#FLAG_PRIVATE} -->
+    <bool name="config_localDisplaysPrivate">false</bool>
+
     <!-- The default mode for the default display. One of the following values (See Display.java):
              0 - COLOR_MODE_DEFAULT
              7 - COLOR_MODE_SRGB
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 17b9d28..bd824de 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4515,7 +4515,7 @@
     <string name="package_deleted_device_owner">Deleted by your admin</string>
 
     <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description -->
-    <string name="battery_saver_description">To extend battery life, Battery Saver reduces your device\'s performance and limits or turns off vibration, location services, and background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery Saver turns off automatically when your device is charging.</string>
+    <string name="battery_saver_description">To extend your battery life, Battery Saver turns off some device features and restricts apps.</string>
 
     <!-- [CHAR_LIMIT=NONE] Data saver: Feature description -->
     <string name="data_saver_description">To help reduce data usage, Data Saver prevents some apps from sending or receiving data in the background. An app you’re currently using can access data, but may do so less frequently. This may mean, for example, that images don’t display until you tap them.</string>
@@ -4703,6 +4703,13 @@
     <!-- Menu item in the locale menu  [CHAR LIMIT=30] -->
     <string name="locale_search_menu">Search</string>
 
+    <!-- Title of the dialog that is shown when the user tries to launch a suspended application [CHAR LIMIT=30] -->
+    <string name="app_suspended_title">Action not allowed</string>
+    <!-- Default message shown in the dialog that is shown when the user tries to launch a suspended application [CHAR LIMIT=NONE] -->
+    <string name="app_suspended_default_message">The application <xliff:g id="app_name" example="GMail">%1$s</xliff:g> is currently disabled.</string>
+    <!-- Title of the button to show users more details about why the app has been suspended [CHAR LIMIT=50]-->
+    <string name="app_suspended_more_details">More details</string>
+
     <!-- Title of a dialog. The string is asking if the user wants to turn on their work profile, which contains work apps that are managed by their employer. "Work" is an adjective. [CHAR LIMIT=30] -->
     <string name="work_mode_off_title">Turn on work profile?</string>
     <!-- Text in a dialog. This string describes what will happen if a user decides to turn on their work profile. "Work profile" is used as an adjective. [CHAR LIMIT=NONE] -->
@@ -4936,9 +4943,9 @@
     <!-- Title for the notification channel notifying user of do not disturb system changes (i.e. Do Not Disturb has changed). [CHAR LIMIT=NONE] -->
     <string name="notification_channel_do_not_disturb">Do Not Disturb</string>
     <!-- Title of notification indicating do not disturb visual interruption settings have changed when upgrading to P -->
-    <string name="zen_upgrade_notification_visd_title">Do Not Disturb is hiding notifications to help you focus</string>
+    <string name="zen_upgrade_notification_visd_title">New: Do Not Disturb is hiding notifications</string>
     <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings -->
-    <string name="zen_upgrade_notification_visd_content">This is new behavior. Tap to change.</string>
+    <string name="zen_upgrade_notification_visd_content">Tap to learn more and change.</string>
     <!-- Title of notification indicating do not disturb settings have changed when upgrading to P -->
     <string name="zen_upgrade_notification_title">Do Not Disturb has changed</string>
     <!-- Content of notification indicating users can tap on the notification to go to dnd behavior settings -->
diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml
index 1a51c1d..d722961 100644
--- a/core/res/res/values/styles_device_defaults.xml
+++ b/core/res/res/values/styles_device_defaults.xml
@@ -128,6 +128,9 @@
     <style name="Widget.DeviceDefault.TextSelectHandle" parent="Widget.Material.TextSelectHandle"/>
     <style name="Widget.DeviceDefault.TextView.ListSeparator" parent="Widget.Material.TextView.ListSeparator"/>
     <style name="Widget.DeviceDefault.TimePicker" parent="Widget.Material.TimePicker"/>
+    <style name="Widget.DeviceDefault.Toolbar" parent="Widget.Material.Toolbar">
+        <item name="titleTextAppearance">@style/TextAppearance.DeviceDefault.Widget.Toolbar.Title</item>
+    </style>
 
     <style name="Widget.DeviceDefault.Light" parent="Widget.Material.Light"/>
     <style name="Widget.DeviceDefault.Light.Button" parent="Widget.Material.Light.Button"/>
@@ -186,7 +189,9 @@
     <style name="Widget.DeviceDefault.Light.ActionBar.TabView" parent="Widget.Material.Light.ActionBar.TabView"/>
     <style name="Widget.DeviceDefault.Light.ActionBar.TabText" parent="Widget.Material.Light.ActionBar.TabText"/>
     <style name="Widget.DeviceDefault.Light.ActionBar.TabBar" parent="Widget.Material.Light.ActionBar.TabBar"/>
-    <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Material.Light.ActionBar.Solid"/>
+    <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Material.Light.ActionBar.Solid">
+        <item name="titleTextStyle">@style/TextAppearance.DeviceDefault.Widget.ActionBar.Title</item>
+    </style>
     <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. -->
     <style name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" parent="Widget.Holo.Light.ActionBar.Solid.Inverse"/>
     <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. -->
@@ -242,12 +247,18 @@
     <style name="TextAppearance.DeviceDefault.Widget.PopupMenu" parent="TextAppearance.Material.Widget.PopupMenu"/>
     <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" parent="TextAppearance.Material.Widget.PopupMenu.Large"/>
     <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" parent="TextAppearance.Material.Widget.PopupMenu.Small"/>
-    <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Material.Widget.ActionBar.Title"/>
+    <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Material.Widget.ActionBar.Title">
+        <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
+    </style>
     <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" parent="TextAppearance.Material.Widget.ActionBar.Subtitle"/>
     <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" parent="TextAppearance.Material.Widget.ActionMode.Title"/>
     <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" parent="TextAppearance.Material.Widget.ActionMode.Subtitle"/>
-    <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Material.WindowTitle"/>
-    <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Material.DialogWindowTitle"/>
+    <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Material.WindowTitle">
+        <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
+    </style>
+    <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Material.DialogWindowTitle">
+        <item name="fontFamily">@string/config_headlineFontFamilyMedium</item>
+    </style>
     <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. -->
     <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Material.Widget.ActionBar.Title.Inverse"/>
     <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. -->
@@ -257,6 +268,7 @@
     <!-- @deprecated Action bars are now themed using the inheritable android:theme attribute. -->
     <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse"/>
     <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" parent="TextAppearance.Material.Widget.ActionBar.Menu"/>
+    <style name="TextAppearance.DeviceDefault.Widget.Toolbar.Title" parent="TextAppearance.DeviceDefault.Widget.ActionBar.Title" />
 
     <!-- Preference Styles -->
     <style name="Preference.DeviceDefault" parent="Preference.Material"/>
@@ -280,11 +292,15 @@
     <style name="Animation.DeviceDefault.Dialog" parent="Animation.Material.Dialog"/>
 
     <!-- DialogWindowTitle Styles -->
-    <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Material"/>
-    <style name="DialogWindowTitle.DeviceDefault.Light" parent="DialogWindowTitle.Material.Light"/>
+    <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Material">
+        <item name="textAppearance">@style/TextAppearance.DeviceDefault.DialogWindowTitle</item>
+    </style>
+    <style name="DialogWindowTitle.DeviceDefault.Light"/>
 
     <!-- WindowTitle Styles -->
-    <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Material"/>
+    <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Material">
+        <item name="textAppearance">@style/TextAppearance.DeviceDefault.WindowTitle</item>
+    </style>
     <style name="WindowTitleBackground.DeviceDefault" parent="WindowTitleBackground.Material"/>
 
     <!-- Other Styles -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index eebf581..b6f0b70 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -352,6 +352,7 @@
   <java-symbol type="bool" name="config_noHomeScreen" />
   <java-symbol type="bool" name="config_guestUserEphemeral" />
   <java-symbol type="bool" name="config_localDisplaysMirrorContent" />
+  <java-symbol type="bool" name="config_localDisplaysPrivate" />
   <java-symbol type="integer" name="config_defaultDisplayDefaultColorMode" />
   <java-symbol type="bool" name="config_enableAppWidgetService" />
   <java-symbol type="string" name="config_defaultPictureInPictureScreenEdgeInsets" />
@@ -433,6 +434,7 @@
   <java-symbol type="integer" name="config_veryLongPressOnPowerBehavior" />
   <java-symbol type="integer" name="config_veryLongPressTimeout" />
   <java-symbol type="integer" name="config_longPressOnBackBehavior" />
+  <java-symbol type="bool" name="config_allowStartActivityForLongPressOnPowerInSetup" />
   <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" />
   <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" />
   <java-symbol type="integer" name="config_max_pan_devices" />
@@ -1205,7 +1207,6 @@
   <java-symbol type="string" name="ssl_ca_cert_noti_by_administrator" />
   <java-symbol type="string" name="ssl_ca_cert_noti_managed" />
   <java-symbol type="string" name="work_profile_deleted" />
-  <java-symbol type="string" name="work_profile_deleted_description" />
   <java-symbol type="string" name="work_profile_deleted_details" />
   <java-symbol type="string" name="work_profile_deleted_description_dpm_wipe" />
   <java-symbol type="string" name="work_profile_deleted_reason_maximum_password_failure" />
@@ -1671,6 +1672,7 @@
   <java-symbol type="dimen" name="navigation_bar_height_landscape_car_mode" />
   <java-symbol type="dimen" name="navigation_bar_width_car_mode" />
   <java-symbol type="dimen" name="status_bar_height" />
+  <java-symbol type="dimen" name="quick_qs_offset_height" />
   <java-symbol type="dimen" name="quick_qs_total_height" />
   <java-symbol type="drawable" name="ic_jog_dial_sound_off" />
   <java-symbol type="drawable" name="ic_jog_dial_sound_on" />
@@ -1808,6 +1810,8 @@
   <java-symbol type="array" name="config_dynamicHysteresisBrightLevels" />
   <java-symbol type="array" name="config_dynamicHysteresisDarkLevels" />
   <java-symbol type="array" name="config_dynamicHysteresisLuxLevels" />
+  <java-symbol type="array" name="config_minimumBrightnessCurveLux" />
+  <java-symbol type="array" name="config_minimumBrightnessCurveNits" />
   <java-symbol type="array" name="config_protectedNetworks" />
   <java-symbol type="array" name="config_statusBarIcons" />
   <java-symbol type="array" name="config_tether_bluetooth_regexs" />
@@ -1923,6 +1927,7 @@
   <java-symbol type="integer" name="config_networkWakeupPacketMask" />
   <java-symbol type="bool" name="config_apfDrop802_3Frames" />
   <java-symbol type="array" name="config_apfEthTypeBlackList" />
+  <java-symbol type="integer" name="config_networkDefaultDailyMultipathQuotaBytes" />
   <java-symbol type="integer" name="config_networkMeteredMultipathPreference" />
   <java-symbol type="integer" name="config_notificationsBatteryFullARGB" />
   <java-symbol type="integer" name="config_notificationsBatteryLedOff" />
@@ -2544,6 +2549,7 @@
   <java-symbol type="drawable" name="ic_settings_24dp" />
   <java-symbol type="drawable" name="ic_storage_48dp" />
   <java-symbol type="drawable" name="ic_usb_48dp" />
+  <java-symbol type="drawable" name="ic_zen_24dp" />
 
   <!-- Floating toolbar -->
   <java-symbol type="id" name="floating_toolbar_menu_item_image" />
@@ -2876,6 +2882,10 @@
 
   <java-symbol type="string" name="suspended_widget_accessibility" />
 
+  <java-symbol type="string" name="app_suspended_title" />
+  <java-symbol type="string" name="app_suspended_more_details" />
+  <java-symbol type="string" name="app_suspended_default_message" />
+
   <!-- Used internally for assistant to launch activity transitions -->
   <java-symbol type="id" name="cross_task_transition" />
 
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 2327b33..92b2f33 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -181,6 +181,9 @@
         <item name="actionBarStyle">@style/Widget.DeviceDefault.ActionBar.Solid</item>
         <item name="actionModePopupWindowStyle">@style/Widget.DeviceDefault.PopupWindow.ActionMode</item>
 
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
+
         <item name="buttonBarStyle">@style/DeviceDefault.ButtonBar</item>
         <item name="segmentedButtonStyle">@style/DeviceDefault.SegmentedButton</item>
 
@@ -207,6 +210,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
     </style>
 
@@ -218,6 +222,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -233,6 +238,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar.  This theme
@@ -242,6 +250,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -257,6 +266,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and
@@ -268,6 +280,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -283,6 +296,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent
@@ -293,6 +309,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -308,6 +325,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be
@@ -333,6 +353,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -341,6 +362,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a
@@ -350,6 +374,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -365,6 +390,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar -->
@@ -373,6 +401,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -388,6 +417,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width
@@ -397,6 +429,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -412,6 +445,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -437,6 +473,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -452,6 +489,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for a window without an action bar that will be displayed either
@@ -462,6 +502,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -477,6 +518,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for a presentation window on a secondary display. -->
@@ -485,6 +529,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -500,6 +545,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for panel windows. This removes all extraneous window
@@ -510,6 +558,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -525,6 +574,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -534,6 +586,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -549,6 +602,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear
@@ -558,6 +614,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -573,6 +630,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault style for input methods, which is used by the
@@ -582,6 +642,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -597,6 +658,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault style for input methods, which is used by the
@@ -606,6 +670,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -621,6 +686,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert">
@@ -634,6 +702,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Text styles -->
         <item name="textAppearanceButton">@style/TextAppearance.DeviceDefault.Widget.Button</item>
@@ -645,6 +714,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Material.SearchBar">
@@ -652,6 +724,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -667,6 +740,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Material.Dialog.NoFrame">
@@ -674,6 +750,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -689,6 +766,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style -->
@@ -822,6 +902,9 @@
         <item name="actionBarStyle">@style/Widget.DeviceDefault.Light.ActionBar.Solid</item>
         <item name="actionModePopupWindowStyle">@style/Widget.DeviceDefault.Light.PopupWindow.ActionMode</item>
 
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
+
         <item name="buttonBarStyle">@style/DeviceDefault.Light.ButtonBar</item>
         <item name="segmentedButtonStyle">@style/DeviceDefault.Light.SegmentedButton</item>
 
@@ -845,6 +928,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
     </style>
 
     <!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an
@@ -854,6 +938,7 @@
         <item name="colorPrimary">@color/primary_device_default_dark</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -869,6 +954,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar -->
@@ -877,6 +965,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -892,6 +981,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar.
@@ -901,6 +993,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -916,6 +1009,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar
@@ -927,6 +1023,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -942,6 +1039,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent
@@ -952,6 +1052,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -967,6 +1068,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be
@@ -994,19 +1098,27 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a
     regular dialog. -->
     <style name="Theme.DeviceDefault.Light.Dialog.MinWidth" parent="Theme.Material.Light.Dialog.MinWidth">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1022,14 +1134,21 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
      <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar -->
     <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Material.Light.Dialog.NoActionBar">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1045,15 +1164,22 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum
     width for a regular dialog. -->
     <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Light.Dialog.NoActionBar.MinWidth">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1069,6 +1195,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog that has a fixed size. -->
@@ -1082,6 +1211,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
     </style>
 
     <!-- Variant of Theme.DeviceDefault.Dialog.NoActionBar that has a fixed size. -->
@@ -1095,15 +1225,20 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
     </style>
 
     <!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller
     screens (small, normal) or as a dialog on larger screens (large, xlarge). -->
     <style name="Theme.DeviceDefault.Light.DialogWhenLarge" parent="Theme.Material.Light.DialogWhenLarge">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1119,16 +1254,23 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault light theme for a window without an action bar that will be displayed either
     full-screen on smaller screens (small, normal) or as a dialog on larger screens (large,
     xlarge). -->
     <style name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" parent="Theme.Material.Light.DialogWhenLarge.NoActionBar">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1144,14 +1286,21 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault light theme for a presentation window on a secondary display. -->
     <style name="Theme.DeviceDefault.Light.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault.Light</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1167,6 +1316,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault light theme for panel windows. This removes all extraneous window
@@ -1177,6 +1329,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1192,6 +1345,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Material.Light.Dialog.Alert">
@@ -1201,6 +1357,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1216,6 +1373,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.Material.Light.SearchBar">
@@ -1223,6 +1383,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1238,6 +1399,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Light.Voice" parent="Theme.Material.Light.Voice">
@@ -1245,6 +1409,7 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1260,11 +1425,15 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for a window that should look like the Settings app.  -->
     <style name="Theme.DeviceDefault.Settings" parent="Theme.Material.Settings">
         <!-- action bar -->
+        <item name="actionBarStyle">@style/Widget.DeviceDefault.Light.ActionBar.Solid</item>
         <item name="actionBarTheme">@style/ThemeOverlay.DeviceDefault.ActionBar.Accent</item>
         <item name="popupTheme">@style/ThemeOverlay.DeviceDefault.Popup.Light</item>
 
@@ -1274,6 +1443,7 @@
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
         <item name="colorSecondary">@color/secondary_device_default_settings_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
         <item name="colorEdgeEffect">@android:color/black</item>
 
         <!-- Add white nav bar with divider that matches material -->
@@ -1295,6 +1465,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- @hide DeviceDefault theme for a window that should use Settings theme colors
@@ -1305,6 +1478,7 @@
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
         <item name="colorSecondary">@color/secondary_device_default_settings_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
         <item name="colorControlNormal">?attr/textColorPrimary</item>
         <item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
 
@@ -1319,6 +1493,9 @@
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
 
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
+
         <!-- volume background -->
         <item name="panelColorBackground">@color/primary_material_light</item>
     </style>
@@ -1329,11 +1506,15 @@
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
         <item name="colorSecondary">@color/secondary_device_default_settings_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
         <item name="alertDialogTheme">@style/Theme.DeviceDefault.Light.Dialog.Alert</item>
 
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- Variant of {@link #Theme_DeviceDefault_Settings_Dark} with no action bar -->
@@ -1343,6 +1524,7 @@
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
         <item name="colorSecondary">@color/secondary_device_default_settings</item>
         <item name="colorAccent">@color/accent_device_default_dark</item>
+        <item name="colorError">@color/error_color_device_default_dark</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1358,14 +1540,21 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Settings.Dialog" parent="Theme.Material.Settings.Dialog">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_settings</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
         <item name="colorSecondary">@color/secondary_device_default_settings</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1381,14 +1570,21 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Settings.DialogWhenLarge" parent="Theme.Material.Settings.DialogWhenLarge">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_settings</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
         <item name="colorSecondary">@color/secondary_device_default_settings</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1404,14 +1600,21 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.Alert">
+        <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
+        <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item>
+
         <!-- Color palette -->
         <item name="colorPrimary">@color/primary_device_default_settings</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item>
         <item name="colorSecondary">@color/secondary_device_default_settings</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Dialog attributes -->
         <item name="dialogCornerRadius">@dimen/config_dialogCornerRadius</item>
@@ -1427,6 +1630,9 @@
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <style name="Theme.DeviceDefault.Settings.Dialog.NoActionBar" parent="Theme.DeviceDefault.Light.Dialog.NoActionBar" />
@@ -1457,10 +1663,14 @@
         <item name="colorPrimary">@color/primary_device_default_light</item>
         <item name="colorPrimaryDark">@color/primary_dark_device_default_light</item>
         <item name="colorAccent">@color/accent_device_default_light</item>
+        <item name="colorError">@color/error_color_device_default_light</item>
 
         <!-- Progress bar attributes -->
         <item name="colorProgressBackgroundNormal">@color/config_progress_background_tint</item>
         <item name="progressBarCornerRadius">@dimen/config_progressBarCornerRadius</item>
+
+        <!-- Toolbar attributes -->
+        <item name="toolbarStyle">@style/Widget.DeviceDefault.Toolbar</item>
     </style>
 
     <!-- DeviceDefault theme for the default system theme.  -->
diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml
index 7b5ad9a..68ef34b 100644
--- a/core/tests/coretests/AndroidTest.xml
+++ b/core/tests/coretests/AndroidTest.xml
@@ -25,5 +25,6 @@
     <option name="test-tag" value="FrameworksCoreTests" />
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.coretests" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
index a99e139..9ef58ab 100644
--- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
+++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java
@@ -16,7 +16,10 @@
 
 package android.app.activity;
 
+import static org.junit.Assert.assertNull;
+
 import android.app.Activity;
+import android.app.ActivityThread;
 import android.app.IApplicationThread;
 import android.app.servertransaction.ActivityRelaunchItem;
 import android.app.servertransaction.ClientTransaction;
@@ -76,6 +79,21 @@
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
+    /** Verify that repeated resume requests to activity will be ignored. */
+    @Test
+    public void testRepeatedResume() throws Exception {
+        final Activity activity = mActivityTestRule.launchActivity(new Intent());
+        final ActivityThread activityThread = activity.getActivityThread();
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            activityThread.executeTransaction(newResumeTransaction(activity));
+            assertNull(activityThread.performResumeActivity(activity.getActivityToken(),
+                    true /* finalStateRequest */, "test"));
+
+            assertNull(activityThread.performResumeActivity(activity.getActivityToken(),
+                    false /* finalStateRequest */, "test"));
+        });
+    }
+
     private static ClientTransaction newRelaunchResumeTransaction(Activity activity) {
         final ClientTransactionItem callbackItem = ActivityRelaunchItem.obtain(null,
                 null, 0, new MergedConfiguration(), false /* preserveWindow */);
diff --git a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
index bad0d25..5ef30a8 100644
--- a/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
+++ b/core/tests/coretests/src/android/hardware/display/BrightnessConfigurationTest.java
@@ -41,7 +41,7 @@
     };
 
     private static final float[] NITS_LEVELS = {
-        0.5f,
+        1f,
         90f,
         100f,
     };
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index dfc99f6..a5941b2 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -60,7 +60,6 @@
                     Settings.System.ALARM_ALERT, // backup candidate?
                     Settings.System.ALARM_ALERT_CACHE, // internal cache
                     Settings.System.APPEND_FOR_LAST_AUDIBLE, // suffix deprecated since API 2
-                    Settings.System.DISPLAY_COLOR_MODE, // bug?
                     Settings.System.EGG_MODE, // I am the lolrus
                     Settings.System.END_BUTTON_BEHAVIOR, // bug?
                     Settings.System
@@ -72,6 +71,7 @@
                     Settings.System.NOTIFICATION_SOUND_CACHE, // internal cache
                     Settings.System.POINTER_LOCATION, // backup candidate?
                     Settings.System.RINGTONE_CACHE, // internal cache
+                    Settings.System.SCREEN_BRIGHTNESS, // removed in P
                     Settings.System.SETUP_WIZARD_HAS_RUN, // Only used by SuW
                     Settings.System.SHOW_GTALK_SERVICE_STATUS, // candidate for backup?
                     Settings.System.SHOW_TOUCHES, // bug?
@@ -239,12 +239,16 @@
                     Settings.Global.GLOBAL_HTTP_PROXY_HOST,
                     Settings.Global.GLOBAL_HTTP_PROXY_PAC,
                     Settings.Global.GLOBAL_HTTP_PROXY_PORT,
+                    Settings.Global.GNSS_SATELLITE_BLACKLIST,
                     Settings.Global.GPRS_REGISTER_CHECK_PERIOD_MS,
                     Settings.Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
                     Settings.Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED,
                     Settings.Global.HDMI_CONTROL_ENABLED,
                     Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
                     Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
+                    Settings.Global.HIDDEN_API_POLICY_P_APPS,
+                    Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS,
+                    Settings.Global.HIDE_ERROR_DIALOGS,
                     Settings.Global.HTTP_PROXY,
                     HYBRID_SYSUI_BATTERY_WARNING_FLAGS,
                     Settings.Global.INET_CONDITION_DEBOUNCE_DOWN_DELAY,
@@ -300,7 +304,14 @@
                     Settings.Global.NETSTATS_UID_TAG_DELETE_AGE,
                     Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES,
                     Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE,
+                    Settings.Global.NETPOLICY_QUOTA_ENABLED,
+                    Settings.Global.NETPOLICY_QUOTA_UNLIMITED,
+                    Settings.Global.NETPOLICY_QUOTA_LIMITED,
+                    Settings.Global.NETPOLICY_QUOTA_FRAC_JOBS,
+                    Settings.Global.NETPOLICY_QUOTA_FRAC_MULTIPATH,
+                    Settings.Global.NETPOLICY_OVERRIDE_ENABLED,
                     Settings.Global.NETWORK_AVOID_BAD_WIFI,
+                    Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES,
                     Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE,
                     Settings.Global.NETWORK_WATCHLIST_LAST_REPORT_TIME,
                     Settings.Global.NETWORK_PREFERENCE,
@@ -409,6 +420,7 @@
                     Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
                     Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
                     Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
+                    Settings.Global.UNGAZE_SLEEP_ENABLED,
                     Settings.Global.UNLOCK_SOUND,
                     Settings.Global.USE_GOOGLE_MAIL,
                     Settings.Global.VT_IMS_ENABLED,
diff --git a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
index c205f96..6c05601 100644
--- a/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
+++ b/core/tests/coretests/src/android/text/SpannableStringNoCopyTest.java
@@ -54,7 +54,7 @@
         first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
 
         // Do not copy NoCopySpan if specified so.
-        final SpannedString copied = new SpannedString(first, false /* copyNoCopySpan */);
+        final SpannedString copied = new SpannedString(first, true /* ignoreNoCopySpan */);
         final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
         assertNotNull(spans);
         assertEquals(2, spans.length);
@@ -87,7 +87,7 @@
 
         // Do not copy NoCopySpan if specified so.
         final SpannedString copied = new SpannedString(
-                new CustomSpannable(first), false /* copyNoCopySpan */);
+                new CustomSpannable(first), true /* ignoreNoCopySpan */);
         final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
         assertNotNull(spans);
         assertEquals(2, spans.length);
diff --git a/core/tests/coretests/src/android/text/SpannableTest.java b/core/tests/coretests/src/android/text/SpannableTest.java
index 307ac62..f368428 100644
--- a/core/tests/coretests/src/android/text/SpannableTest.java
+++ b/core/tests/coretests/src/android/text/SpannableTest.java
@@ -16,6 +16,8 @@
 
 package android.text;
 
+import static org.junit.Assert.assertEquals;
+
 import android.platform.test.annotations.Presubmit;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
@@ -24,6 +26,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.concurrent.CountDownLatch;
+
 @Presubmit
 @SmallTest
 @RunWith(AndroidJUnit4.class)
@@ -53,4 +57,34 @@
         spans = spannable.getSpans(2, 2, Object.class);
         MoreAsserts.assertEquals(new Object[]{unemptySpan}, spans);
     }
+
+    @Test
+    public void testRemoveSpanWithIntermediateFlag() {
+        Spannable spannable = newSpannableWithText("abcdef");
+        Object emptySpan = new Object();
+        spannable.setSpan(emptySpan, 1, 1, 0);
+        Object unemptySpan = new Object();
+        spannable.setSpan(unemptySpan, 1, 2, 0);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+        SpanWatcher watcher = new SpanWatcher() {
+            @Override
+            public void onSpanAdded(Spannable text, Object what, int start, int end) {}
+
+            @Override
+            public void onSpanRemoved(Spannable text, Object what, int start, int end) {
+                latch.countDown();
+            }
+
+            @Override
+            public void onSpanChanged(Spannable text, Object what, int ostart, int oend, int nstart,
+                    int nend) {}
+        };
+        spannable.setSpan(watcher, 0, 2, 0);
+
+        spannable.removeSpan(emptySpan, Spanned.SPAN_INTERMEDIATE);
+        assertEquals(1, latch.getCount());
+        spannable.removeSpan(unemptySpan);
+        assertEquals(0, latch.getCount());
+    }
 }
diff --git a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
index 0680924..380e315 100644
--- a/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
+++ b/core/tests/coretests/src/android/text/SpannedStringNoCopyTest.java
@@ -54,7 +54,7 @@
         first.setSpan(new UnderlineSpan(), 0, first.length(), Spanned.SPAN_PRIORITY);
 
         // Do not copy NoCopySpan if specified so.
-        final SpannedString copied = new SpannedString(first, false /* copyNoCopySpan */);
+        final SpannedString copied = new SpannedString(first, true /* ignoreNoCopySpan */);
         final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
         assertNotNull(spans);
         assertEquals(2, spans.length);
@@ -87,7 +87,7 @@
 
         // Do not copy NoCopySpan if specified so.
         final SpannedString copied = new SpannedString(
-                new CustomSpanned(first), false /* copyNoCopySpan */);
+                new CustomSpanned(first), true /* ignoreNoCopySpan */);
         final Object[] spans = copied.getSpans(0, copied.length(), Object.class);
         assertNotNull(spans);
         assertEquals(2, spans.length);
diff --git a/core/tests/coretests/src/android/text/format/FormatterTest.java b/core/tests/coretests/src/android/text/format/FormatterTest.java
index 04d2dad..c02d97c 100644
--- a/core/tests/coretests/src/android/text/format/FormatterTest.java
+++ b/core/tests/coretests/src/android/text/format/FormatterTest.java
@@ -16,12 +16,14 @@
 
 package android.text.format;
 
+import static android.text.format.Formatter.FLAG_IEC_UNITS;
+import static android.text.format.Formatter.FLAG_SI_UNITS;
+
 import static org.junit.Assert.assertEquals;
 
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.icu.util.MeasureUnit;
 import android.platform.test.annotations.Presubmit;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
@@ -34,7 +36,6 @@
 import org.junit.runner.RunWith;
 
 import java.util.Locale;
-import java.util.Set;
 
 @Presubmit
 @SmallTest
@@ -104,6 +105,27 @@
         checkFormatBytes(9123000, false, "9,12", 9120000);
     }
 
+    @Test
+    public void testFormatBytesSi() {
+        setLocale(Locale.US);
+
+        checkFormatBytes(1_000, FLAG_SI_UNITS, "1.00", 1_000);
+        checkFormatBytes(1_024, FLAG_SI_UNITS, "1.02", 1_020);
+        checkFormatBytes(1_500, FLAG_SI_UNITS, "1.50", 1_500);
+        checkFormatBytes(12_582_912L, FLAG_SI_UNITS, "12.58", 12_580_000L);
+    }
+
+    @Test
+    public void testFormatBytesIec() {
+        setLocale(Locale.US);
+
+        checkFormatBytes(1_000, FLAG_IEC_UNITS, "0.98", 1_003);
+        checkFormatBytes(1_024, FLAG_IEC_UNITS, "1.00", 1_024);
+        checkFormatBytes(1_500, FLAG_IEC_UNITS, "1.46", 1_495);
+        checkFormatBytes(12_500_000L, FLAG_IEC_UNITS, "11.92", 12_499_025L);
+        checkFormatBytes(12_582_912L, FLAG_IEC_UNITS, "12.00", 12_582_912L);
+    }
+
     private static final long SECOND = 1000;
     private static final long MINUTE = 60 * SECOND;
     private static final long HOUR = 60 * MINUTE;
@@ -195,8 +217,14 @@
 
     private void checkFormatBytes(long bytes, boolean useShort,
             String expectedString, long expectedRounded) {
+        checkFormatBytes(bytes, (useShort ? Formatter.FLAG_SHORTER : 0),
+                expectedString, expectedRounded);
+    }
+
+    private void checkFormatBytes(long bytes, int flags,
+            String expectedString, long expectedRounded) {
         BytesResult r = Formatter.formatBytes(mContext.getResources(), bytes,
-                Formatter.FLAG_CALCULATE_ROUNDED | (useShort ? Formatter.FLAG_SHORTER : 0));
+                Formatter.FLAG_CALCULATE_ROUNDED | flags);
         assertEquals(expectedString, r.value);
         assertEquals(expectedRounded, r.roundedBytes);
     }
diff --git a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
index 42b6048..39d492d 100644
--- a/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
+++ b/core/tests/coretests/src/android/util/RecurrenceRuleTest.java
@@ -57,13 +57,13 @@
 
         assertTrue(r.isMonthly());
 
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = r.cycleIterator();
         assertTrue(it.hasNext());
-        assertEquals(Pair.create(
+        assertEquals(new Range<>(
                 ZonedDateTime.parse("2015-11-14T00:00:00.00Z"),
                 ZonedDateTime.parse("2015-12-14T00:00:00.00Z")), it.next());
         assertTrue(it.hasNext());
-        assertEquals(Pair.create(
+        assertEquals(new Range<>(
                 ZonedDateTime.parse("2015-10-14T00:00:00.00Z"),
                 ZonedDateTime.parse("2015-11-14T00:00:00.00Z")), it.next());
     }
@@ -77,13 +77,13 @@
 
         assertFalse(r.isMonthly());
 
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = r.cycleIterator();
         assertTrue(it.hasNext());
-        assertEquals(Pair.create(
+        assertEquals(new Range<>(
                 ZonedDateTime.parse("2010-11-17T00:11:00.00Z"),
                 ZonedDateTime.parse("2010-11-20T00:11:00.00Z")), it.next());
         assertTrue(it.hasNext());
-        assertEquals(Pair.create(
+        assertEquals(new Range<>(
                 ZonedDateTime.parse("2010-11-14T00:11:00.00Z"),
                 ZonedDateTime.parse("2010-11-17T00:11:00.00Z")), it.next());
         assertFalse(it.hasNext());
@@ -98,9 +98,9 @@
 
         assertFalse(r.isMonthly());
 
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = r.cycleIterator();
         assertTrue(it.hasNext());
-        assertEquals(Pair.create(
+        assertEquals(new Range<>(
                 ZonedDateTime.parse("2010-11-14T00:11:00.000Z"),
                 ZonedDateTime.parse("2010-11-20T00:11:00.000Z")), it.next());
         assertFalse(it.hasNext());
@@ -112,7 +112,7 @@
 
         assertFalse(r.isMonthly());
 
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = r.cycleIterator();
         assertFalse(it.hasNext());
     }
 
@@ -122,22 +122,22 @@
                 ZonedDateTime.parse("2030-01-31T00:00:00.000Z"),
                 Period.ofMonths(1));
 
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = r.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = r.cycleIterator();
         ZonedDateTime lastStart = null;
         int months = 0;
         while (it.hasNext()) {
-            final Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
+            final Range<ZonedDateTime> cycle = it.next();
 
             // Make sure cycle has reasonable length
-            final long length = cycle.second.toEpochSecond() - cycle.first.toEpochSecond();
+            final long length = cycle.getUpper().toEpochSecond() - cycle.getLower().toEpochSecond();
             assertTrue(cycle + " must be more than 4 weeks", length >= 2419200);
             assertTrue(cycle + " must be less than 5 weeks", length <= 3024000);
 
             // Make sure we have no gaps
             if (lastStart != null) {
-                assertEquals(lastStart, cycle.second);
+                assertEquals(lastStart, cycle.getUpper());
             }
-            lastStart = cycle.first;
+            lastStart = cycle.getLower();
             months++;
         }
 
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
index fed197e..3c04895 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityEventTest.java
@@ -26,11 +26,29 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
 /**
  * AccessibilityEvent is public, so CTS covers it pretty well. Verifying hidden methods here.
  */
 @RunWith(AndroidJUnit4.class)
 public class AccessibilityEventTest {
+    // The number of fields tested in the corresponding CTS AccessibilityEventTest:
+    // See the CTS tests for AccessibilityRecord:
+    // fullyPopulateAccessibilityEvent, assertEqualsAccessiblityEvent,
+    // and assertAccessibilityEventCleared
+
+    /** The number of properties of the {@link AccessibilityEvent} class. */
+    private static final int A11Y_EVENT_NON_STATIC_FIELD_COUNT = 32;
+
+    // The number of fields tested in the corresponding CTS AccessibilityRecordTest:
+    // assertAccessibilityRecordCleared, fullyPopulateAccessibilityRecord,
+    // and assertEqualAccessibilityRecord
+
+    /** The number of properties of the {@link AccessibilityRecord} class. */
+    private static final int A11Y_RECORD_NON_STATIC_FIELD_COUNT = 24;
+
     @Test
     public void testImportantForAccessibiity_getSetWorkAcrossParceling() {
         AccessibilityEvent event = AccessibilityEvent.obtain();
@@ -59,10 +77,42 @@
         assertEquals(windowChanges, copyEventViaParcel(event).getWindowChanges());
     }
 
+    @Test
+    public void dontForgetToUpdateA11yRecordCtsParcelingTestWhenYouAddNewFields() {
+        AccessibilityEventTest.assertNoNewNonStaticFieldsAdded(
+                AccessibilityRecord.class, A11Y_RECORD_NON_STATIC_FIELD_COUNT);
+    }
+
+    @Test
+    public void dontForgetToUpdateA11yEventCtsParcelingTestWhenYouAddNewFields() {
+        AccessibilityEventTest.assertNoNewNonStaticFieldsAdded(
+                AccessibilityEvent.class, A11Y_EVENT_NON_STATIC_FIELD_COUNT);
+    }
+
     private AccessibilityEvent copyEventViaParcel(AccessibilityEvent event) {
         Parcel parcel = Parcel.obtain();
         event.writeToParcel(parcel, 0);
         parcel.setDataPosition(0);
         return AccessibilityEvent.CREATOR.createFromParcel(parcel);
     }
+
+    /**
+     * Asserts that no new fields have been added, so we are testing marshaling
+     * of all such.
+     */
+    static void assertNoNewNonStaticFieldsAdded(Class<?> clazz, int expectedCount) {
+        int nonStaticFieldCount = 0;
+
+        while (clazz != Object.class) {
+            for (Field field : clazz.getDeclaredFields()) {
+                if ((field.getModifiers() & Modifier.STATIC) == 0) {
+                    nonStaticFieldCount++;
+                }
+            }
+            clazz = clazz.getSuperclass();
+        }
+
+        String message = "New fields have been added, so add code to test marshaling them.";
+        assertEquals(message, expectedCount, nonStaticFieldCount);
+    }
 }
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
index 8db1bfa..6414c20 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java
@@ -38,6 +38,16 @@
 @LargeTest
 @RunWith(AndroidJUnit4.class)
 public class AccessibilityNodeInfoTest {
+    // The number of fields tested in the corresponding CTS AccessibilityNodeInfoTest:
+    // See fullyPopulateAccessibilityNodeInfo, assertEqualsAccessibilityNodeInfo,
+    // and assertAccessibilityNodeInfoCleared in that class.
+    private static final int NUM_MARSHALLED_PROPERTIES = 35;
+
+    /**
+     * The number of properties that are purposely not marshalled
+     * mOriginalText - Used when resolving clickable spans; intentionally not parceled
+     */
+    private static final int NUM_NONMARSHALLED_PROPERTIES = 1;
 
     @Test
     public void testStandardActions_serializationFlagIsValid() {
@@ -114,4 +124,10 @@
         assertThat(unparceledNode.getActionList(), emptyCollectionOf(AccessibilityAction.class));
         assertThat(unparceledNode.getText(), equalTo(text));
     }
+
+    @Test
+    public void dontForgetToUpdateCtsParcelingTestWhenYouAddNewFields() {
+        AccessibilityEventTest.assertNoNewNonStaticFieldsAdded(AccessibilityNodeInfo.class,
+                NUM_MARSHALLED_PROPERTIES + NUM_NONMARSHALLED_PROPERTIES);
+    }
 }
diff --git a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
index 861a43a..a3c6179 100644
--- a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java
@@ -19,7 +19,6 @@
 import static org.junit.Assert.assertEquals;
 
 import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
@@ -31,20 +30,34 @@
 public class SelectionEventTest {
 
     @Test
+    public void testCreateSelectionActionEvent_valid() {
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_OVERTYPE);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_COPY);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_PASTE);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_CUT);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_SHARE);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_SMART_SHARE);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_DRAG);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_ABANDON);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_OTHER);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_SELECT_ALL);
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.ACTION_RESET);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateSelectionActionEvent_badRange() {
+        SelectionEvent.createSelectionActionEvent(0, -1, SelectionEvent.ACTION_OVERTYPE);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateSelectionActionEvent_badAction() {
+        SelectionEvent.createSelectionActionEvent(0, 1, SelectionEvent.EVENT_SELECTION_STARTED);
+    }
+
+    @Test
     public void testParcel() {
-        final SelectionEvent[] captured = new SelectionEvent[1];
-        final Logger logger = new Logger(
-                new Logger.Config(
-                        InstrumentationRegistry.getTargetContext(),
-                        TextClassifier.WIDGET_TYPE_TEXTVIEW,
-                        null)) {
-            @Override
-            public void writeEvent(SelectionEvent event) {
-                captured[0] = event;
-            }
-        };
-        logger.logSelectionStartedEvent(SelectionEvent.INVOCATION_MANUAL, 0);
-        final SelectionEvent event = captured[0];
+        final SelectionEvent event = SelectionEvent.createSelectionStartedEvent(
+                SelectionEvent.INVOCATION_MANUAL, 0);
         final Parcel parcel = Parcel.obtain();
         event.writeToParcel(parcel, event.describeContents());
         parcel.setDataPosition(0);
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index f96027d..a3c24cb 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -38,6 +38,7 @@
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
@@ -49,19 +50,14 @@
     private Context mContext;
     private TextClassificationManager mTcm;
     private TextClassifier mClassifier;
-    private TextSelection.Options mSelectionOptions;
-    private TextClassification.Options mClassificationOptions;
-    private TextLinks.Options mLinksOptions;
 
     @Before
     public void setup() {
         mContext = InstrumentationRegistry.getTargetContext();
         mTcm = mContext.getSystemService(TextClassificationManager.class);
-        mTcm.setTextClassifier(null);
-        mClassifier = mTcm.getTextClassifier();
-        mSelectionOptions = new TextSelection.Options().setDefaultLocales(LOCALES);
-        mClassificationOptions = new TextClassification.Options().setDefaultLocales(LOCALES);
-        mLinksOptions = new TextLinks.Options().setDefaultLocales(LOCALES);
+        // Test with the local textClassifier only. (We only bundle "en" model by default).
+        // It's hard to reliably test the results of the device's TextClassifierServiceImpl here.
+        mClassifier = mTcm.getTextClassifier(TextClassifier.LOCAL);
     }
 
     @Test
@@ -75,9 +71,12 @@
         int endIndex = startIndex + selected.length();
         int smartStartIndex = text.indexOf(suggested);
         int smartEndIndex = smartStartIndex + suggested.length();
+        TextSelection.Request request = new TextSelection.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextSelection selection = mClassifier.suggestSelection(
-                text, startIndex, endIndex, mSelectionOptions);
+        TextSelection selection = mClassifier.suggestSelection(request);
         assertThat(selection,
                 isTextSelection(smartStartIndex, smartEndIndex, TextClassifier.TYPE_EMAIL));
     }
@@ -93,9 +92,12 @@
         int endIndex = startIndex + selected.length();
         int smartStartIndex = text.indexOf(suggested);
         int smartEndIndex = smartStartIndex + suggested.length();
+        TextSelection.Request request = new TextSelection.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextSelection selection = mClassifier.suggestSelection(
-                text, startIndex, endIndex, mSelectionOptions);
+        TextSelection selection = mClassifier.suggestSelection(request);
         assertThat(selection,
                 isTextSelection(smartStartIndex, smartEndIndex, TextClassifier.TYPE_URL));
     }
@@ -108,9 +110,12 @@
         String selected = "Hello";
         int startIndex = text.indexOf(selected);
         int endIndex = startIndex + selected.length();
+        TextSelection.Request request = new TextSelection.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextSelection selection = mClassifier.suggestSelection(
-                text, startIndex, endIndex, mSelectionOptions);
+        TextSelection selection = mClassifier.suggestSelection(request);
         assertThat(selection,
                 isTextSelection(startIndex, endIndex, NO_TYPE));
     }
@@ -123,9 +128,12 @@
         String classifiedText = "droid@android.com";
         int startIndex = text.indexOf(classifiedText);
         int endIndex = startIndex + classifiedText.length();
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextClassification classification = mClassifier.classifyText(
-                text, startIndex, endIndex, mClassificationOptions);
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_EMAIL));
     }
 
@@ -137,9 +145,12 @@
         String classifiedText = "www.android.com";
         int startIndex = text.indexOf(classifiedText);
         int endIndex = startIndex + classifiedText.length();
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextClassification classification = mClassifier.classifyText(
-                text, startIndex, endIndex, mClassificationOptions);
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_URL));
     }
 
@@ -148,8 +159,12 @@
         if (isTextClassifierDisabled()) return;
 
         String text = "Brandschenkestrasse 110, Zürich, Switzerland";
-        TextClassification classification = mClassifier.classifyText(
-                text, 0, text.length(), mClassificationOptions);
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, 0, text.length())
+                .setDefaultLocales(LOCALES)
+                .build();
+
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification, isTextClassification(text, TextClassifier.TYPE_ADDRESS));
     }
 
@@ -161,9 +176,12 @@
         String classifiedText = "HTTP://ANDROID.COM";
         int startIndex = text.indexOf(classifiedText);
         int endIndex = startIndex + classifiedText.length();
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextClassification classification = mClassifier.classifyText(
-                text, startIndex, endIndex, mClassificationOptions);
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_URL));
     }
 
@@ -175,9 +193,12 @@
         String classifiedText = "January 9, 2018";
         int startIndex = text.indexOf(classifiedText);
         int endIndex = startIndex + classifiedText.length();
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextClassification classification = mClassifier.classifyText(
-                text, startIndex, endIndex, mClassificationOptions);
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification, isTextClassification(classifiedText, TextClassifier.TYPE_DATE));
     }
 
@@ -189,9 +210,12 @@
         String classifiedText = "2018/01/01 10:30:20";
         int startIndex = text.indexOf(classifiedText);
         int endIndex = startIndex + classifiedText.length();
+        TextClassification.Request request = new TextClassification.Request.Builder(
+                text, startIndex, endIndex)
+                .setDefaultLocales(LOCALES)
+                .build();
 
-        TextClassification classification = mClassifier.classifyText(
-                text, startIndex, endIndex, mClassificationOptions);
+        TextClassification classification = mClassifier.classifyText(request);
         assertThat(classification,
                 isTextClassification(classifiedText, TextClassifier.TYPE_DATE_TIME));
     }
@@ -200,7 +224,8 @@
     public void testGenerateLinks_phone() {
         if (isTextClassifierDisabled()) return;
         String text = "The number is +12122537077. See you tonight!";
-        assertThat(mClassifier.generateLinks(text, null),
+        TextLinks.Request request = new TextLinks.Request.Builder(text).build();
+        assertThat(mClassifier.generateLinks(request),
                 isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE));
     }
 
@@ -208,9 +233,14 @@
     public void testGenerateLinks_exclude() {
         if (isTextClassifierDisabled()) return;
         String text = "The number is +12122537077. See you tonight!";
-        assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
-                TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
-                        Collections.EMPTY_LIST, Arrays.asList(TextClassifier.TYPE_PHONE)))),
+        List<String> hints = Collections.EMPTY_LIST;
+        List<String> included = Collections.EMPTY_LIST;
+        List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+        TextLinks.Request request = new TextLinks.Request.Builder(text)
+                .setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
+                .setDefaultLocales(LOCALES)
+                .build();
+        assertThat(mClassifier.generateLinks(request),
                 not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
     }
 
@@ -218,9 +248,12 @@
     public void testGenerateLinks_explicit_address() {
         if (isTextClassifierDisabled()) return;
         String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!";
-        assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
-                TextClassifier.EntityConfig.createWithEntityList(
-                        Arrays.asList(TextClassifier.TYPE_ADDRESS)))),
+        List<String> explicit = Arrays.asList(TextClassifier.TYPE_ADDRESS);
+        TextLinks.Request request = new TextLinks.Request.Builder(text)
+                .setEntityConfig(TextClassifier.EntityConfig.createWithExplicitEntityList(explicit))
+                .setDefaultLocales(LOCALES)
+                .build();
+        assertThat(mClassifier.generateLinks(request),
                 isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA",
                         TextClassifier.TYPE_ADDRESS));
     }
@@ -229,10 +262,14 @@
     public void testGenerateLinks_exclude_override() {
         if (isTextClassifierDisabled()) return;
         String text = "The number is +12122537077. See you tonight!";
-        assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
-                TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
-                        Arrays.asList(TextClassifier.TYPE_PHONE),
-                        Arrays.asList(TextClassifier.TYPE_PHONE)))),
+        List<String> hints = Collections.EMPTY_LIST;
+        List<String> included = Arrays.asList(TextClassifier.TYPE_PHONE);
+        List<String> excluded = Arrays.asList(TextClassifier.TYPE_PHONE);
+        TextLinks.Request request = new TextLinks.Request.Builder(text)
+                .setEntityConfig(TextClassifier.EntityConfig.create(hints, included, excluded))
+                .setDefaultLocales(LOCALES)
+                .build();
+        assertThat(mClassifier.generateLinks(request),
                 not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
     }
 
@@ -241,7 +278,8 @@
         if (isTextClassifierDisabled()) return;
         char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength()];
         Arrays.fill(manySpaces, ' ');
-        TextLinks links = mClassifier.generateLinks(new String(manySpaces), null);
+        TextLinks.Request request = new TextLinks.Request.Builder(new String(manySpaces)).build();
+        TextLinks links = mClassifier.generateLinks(request);
         assertTrue(links.getLinks().isEmpty());
     }
 
@@ -252,7 +290,8 @@
         }
         char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength() + 1];
         Arrays.fill(manySpaces, ' ');
-        mClassifier.generateLinks(new String(manySpaces), null);
+        TextLinks.Request request = new TextLinks.Request.Builder(new String(manySpaces)).build();
+        mClassifier.generateLinks(request);
     }
 
     @Test
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
index 5d58f55..09ace4c 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationTest.java
@@ -79,14 +79,14 @@
         final RemoteAction remoteAction1 = new RemoteAction(secondaryIcon, secondaryLabel,
                 secondaryDescription, secondaryPendingIntent);
 
-        final String signature = "signature";
+        final String id = "id";
         final TextClassification reference = new TextClassification.Builder()
                 .setText(text)
                 .addAction(remoteAction0)
                 .addAction(remoteAction1)
                 .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
                 .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
-                .setSignature(signature)
+                .setId(id)
                 .build();
 
         // Parcel and unparcel
@@ -96,7 +96,7 @@
         final TextClassification result = TextClassification.CREATOR.createFromParcel(parcel);
 
         assertEquals(text, result.getText());
-        assertEquals(signature, result.getSignature());
+        assertEquals(id, result.getId());
         assertEquals(2, result.getActions().size());
 
         // Legacy API.
@@ -135,7 +135,7 @@
         final Intent intent = new Intent("intent");
         final View.OnClickListener onClickListener = v -> { };
 
-        final String signature = "signature";
+        final String id = "id";
         final TextClassification reference = new TextClassification.Builder()
                 .setText(text)
                 .setIcon(icon.loadDrawable(context))
@@ -144,7 +144,7 @@
                 .setOnClickListener(onClickListener)
                 .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
                 .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
-                .setSignature(signature)
+                .setId(id)
                 .build();
 
         // Parcel and unparcel
@@ -163,22 +163,29 @@
     }
 
     @Test
-    public void testParcelOptions() {
-        ZonedDateTime referenceTime = ZonedDateTime.ofInstant(
+    public void testParcelParcel() {
+        final ZonedDateTime referenceTime = ZonedDateTime.ofInstant(
                 Instant.ofEpochMilli(946771200000L),  // 2000-01-02
                 ZoneId.of("UTC"));
+        final String text = "text";
 
-        TextClassification.Options reference = new TextClassification.Options();
-        reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
-        reference.setReferenceTime(referenceTime);
+        final TextClassification.Request reference =
+                new TextClassification.Request.Builder(text, 0, text.length())
+                        .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+                        .setReferenceTime(referenceTime)
+                        .build();
 
         // Parcel and unparcel.
         final Parcel parcel = Parcel.obtain();
         reference.writeToParcel(parcel, reference.describeContents());
         parcel.setDataPosition(0);
-        TextClassification.Options result = TextClassification.Options.CREATOR.createFromParcel(
-                parcel);
+        final TextClassification.Request result =
+                TextClassification.Request.CREATOR.createFromParcel(parcel);
 
+        assertEquals(text, result.getText());
+        assertEquals(0, result.getStartIndex());
+        assertEquals(text.length(), result.getEndIndex());
+        assertEquals(referenceTime, result.getReferenceTime());
         assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
         assertEquals(referenceTime, result.getReferenceTime());
     }
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
index 4279675..fff723f 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
@@ -20,18 +20,17 @@
 
 import android.os.LocaleList;
 import android.os.Parcel;
-import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.util.ArrayMap;
 
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -40,17 +39,6 @@
 @RunWith(AndroidJUnit4.class)
 public class TextLinksTest {
 
-    private TextClassificationManager mTcm;
-    private TextClassifier mClassifier;
-
-    @Before
-    public void setup() {
-        mTcm = InstrumentationRegistry.getTargetContext()
-                .getSystemService(TextClassificationManager.class);
-        mTcm.setTextClassifier(null);
-        mClassifier = mTcm.getTextClassifier();
-    }
-
     private Map<String, Float> getEntityScores(float address, float phone, float other) {
         final Map<String, Float> result = new ArrayMap<>();
         if (address > 0.f) {
@@ -99,24 +87,26 @@
 
     @Test
     public void testParcelOptions() {
-        TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create(
+        final TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create(
                 Arrays.asList(TextClassifier.HINT_TEXT_IS_EDITABLE),
                 Arrays.asList("a", "b", "c"),
                 Arrays.asList("b"));
-        TextLinks.Options reference = new TextLinks.Options();
-        reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
-        reference.setEntityConfig(entityConfig);
+        final TextLinks.Request reference = new TextLinks.Request.Builder("text")
+                .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+                .setEntityConfig(entityConfig)
+                .build();
 
         // Parcel and unparcel.
         final Parcel parcel = Parcel.obtain();
         reference.writeToParcel(parcel, reference.describeContents());
         parcel.setDataPosition(0);
-        TextLinks.Options result = TextLinks.Options.CREATOR.createFromParcel(parcel);
+        final TextLinks.Request result = TextLinks.Request.CREATOR.createFromParcel(parcel);
 
+        assertEquals("text", result.getText());
         assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
         assertEquals(new String[]{TextClassifier.HINT_TEXT_IS_EDITABLE},
                 result.getEntityConfig().getHints().toArray());
-        assertEquals(Arrays.asList("a", "c"),
+        assertEquals(new HashSet<String>(Arrays.asList("a", "c")),
                 result.getEntityConfig().resolveEntityListModifications(Collections.emptyList()));
     }
 }
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
index a6ea021..4855dad 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextSelectionTest.java
@@ -17,7 +17,6 @@
 package android.view.textclassifier;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 import android.os.LocaleList;
 import android.os.Parcel;
@@ -37,12 +36,12 @@
     public void testParcel() {
         final int startIndex = 13;
         final int endIndex = 37;
-        final String signature = "signature";
+        final String id = "id";
         final TextSelection reference = new TextSelection.Builder(startIndex, endIndex)
                 .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f)
                 .setEntityType(TextClassifier.TYPE_PHONE, 0.7f)
                 .setEntityType(TextClassifier.TYPE_URL, 0.1f)
-                .setSignature(signature)
+                .setId(id)
                 .build();
 
         // Parcel and unparcel
@@ -53,7 +52,7 @@
 
         assertEquals(startIndex, result.getSelectionStartIndex());
         assertEquals(endIndex, result.getSelectionEndIndex());
-        assertEquals(signature, result.getSignature());
+        assertEquals(id, result.getId());
 
         assertEquals(3, result.getEntityCount());
         assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0));
@@ -65,18 +64,22 @@
     }
 
     @Test
-    public void testParcelOptions() {
-        TextSelection.Options reference = new TextSelection.Options();
-        reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
-        reference.setDarkLaunchAllowed(true);
+    public void testParcelRequest() {
+        final String text = "text";
+        final TextSelection.Request reference =
+                new TextSelection.Request.Builder(text, 0, text.length())
+                        .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY))
+                        .build();
 
         // Parcel and unparcel.
         final Parcel parcel = Parcel.obtain();
         reference.writeToParcel(parcel, reference.describeContents());
         parcel.setDataPosition(0);
-        TextSelection.Options result = TextSelection.Options.CREATOR.createFromParcel(parcel);
+        final TextSelection.Request result = TextSelection.Request.CREATOR.createFromParcel(parcel);
 
+        assertEquals(text, result.getText());
+        assertEquals(0, result.getStartIndex());
+        assertEquals(text.length(), result.getEndIndex());
         assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
-        assertTrue(result.isDarkLaunchAllowed());
     }
 }
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 79433ac..320a7ac 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -80,6 +80,7 @@
 import android.view.textclassifier.TextClassificationManager;
 import android.view.textclassifier.TextClassifier;
 import android.view.textclassifier.TextLinks;
+import android.view.textclassifier.TextLinksParams;
 import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
 
 import com.android.frameworks.coretests.R;
@@ -381,8 +382,12 @@
                 mActivity.getSystemService(TextClassificationManager.class);
         TextClassifier textClassifier = textClassificationManager.getTextClassifier();
         Spannable content = new SpannableString("Call me at +19148277737");
-        TextLinks links = textClassifier.generateLinks(content);
-        links.apply(content, TextLinks.APPLY_STRATEGY_REPLACE, null, false /* allowPrefix */);
+        TextLinks.Request request = new TextLinks.Request.Builder(content).build();
+        TextLinks links = textClassifier.generateLinks(request);
+        TextLinksParams applyParams = new TextLinksParams.Builder()
+                .setApplyStrategy(TextLinks.APPLY_STRATEGY_REPLACE)
+                .build();
+        applyParams.apply(content, links);
 
         mActivityRule.runOnUiThread(() -> {
             textView.setText(content);
diff --git a/core/tests/privacytests/AndroidTest.xml b/core/tests/privacytests/AndroidTest.xml
index 8098c14..a3e785c 100644
--- a/core/tests/privacytests/AndroidTest.xml
+++ b/core/tests/privacytests/AndroidTest.xml
@@ -23,5 +23,6 @@
 
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.coretests.privacy" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/core/tests/utiltests/AndroidTest.xml b/core/tests/utiltests/AndroidTest.xml
index 270d773..f32acb4 100644
--- a/core/tests/utiltests/AndroidTest.xml
+++ b/core/tests/utiltests/AndroidTest.xml
@@ -25,5 +25,6 @@
     <option name="test-tag" value="FrameworksUtilTests" />
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.utiltests" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/data/etc/hiddenapi-package-whitelist.xml b/data/etc/hiddenapi-package-whitelist.xml
index a4a1b94..4e09c69 100644
--- a/data/etc/hiddenapi-package-whitelist.xml
+++ b/data/etc/hiddenapi-package-whitelist.xml
@@ -17,65 +17,28 @@
 
 <!--
 This XML file declares which system apps should be exempted from the hidden API blacklisting, i.e.
-which apps should be allowed to access the entire private API.
+which apps should be allowed to access the entire private API. Only apps NOT signed with the
+platform cert need to be included, as apps signed with the platform cert are exempted by default.
 -->
 
 <config>
-  <hidden-api-whitelisted-app package="android.car.cluster.loggingrenderer" />
-  <hidden-api-whitelisted-app package="android.car.input.service" />
-  <hidden-api-whitelisted-app package="android.car.usb.handler" />
   <hidden-api-whitelisted-app package="android.ext.services" />
   <hidden-api-whitelisted-app package="com.android.apps.tag" />
-  <hidden-api-whitelisted-app package="com.android.backupconfirm" />
   <hidden-api-whitelisted-app package="com.android.basicsmsreceiver" />
-  <hidden-api-whitelisted-app package="com.android.bluetooth" />
-  <hidden-api-whitelisted-app package="com.android.bluetoothdebug" />
-  <hidden-api-whitelisted-app package="com.android.bluetoothmidiservice" />
   <hidden-api-whitelisted-app package="com.android.bookmarkprovider" />
   <hidden-api-whitelisted-app package="com.android.calllogbackup" />
   <hidden-api-whitelisted-app package="com.android.camera" />
-  <hidden-api-whitelisted-app package="com.android.captiveportallogin" />
-  <hidden-api-whitelisted-app package="com.android.car" />
   <hidden-api-whitelisted-app package="com.android.car.dialer" />
-  <hidden-api-whitelisted-app package="com.android.car.hvac" />
-  <hidden-api-whitelisted-app package="com.android.car.mapsplaceholder" />
-  <hidden-api-whitelisted-app package="com.android.car.media" />
-  <hidden-api-whitelisted-app package="com.android.car.media.localmediaplayer" />
   <hidden-api-whitelisted-app package="com.android.car.messenger" />
   <hidden-api-whitelisted-app package="com.android.car.overview" />
-  <hidden-api-whitelisted-app package="com.android.car.radio" />
-  <hidden-api-whitelisted-app package="com.android.car.settings" />
   <hidden-api-whitelisted-app package="com.android.car.stream" />
-  <hidden-api-whitelisted-app package="com.android.car.systemupdater" />
-  <hidden-api-whitelisted-app package="com.android.car.trust" />
-  <hidden-api-whitelisted-app package="com.android.carrierconfig" />
-  <hidden-api-whitelisted-app package="com.android.carrierdefaultapp" />
-  <hidden-api-whitelisted-app package="com.android.cellbroadcastreceiver" />
-  <hidden-api-whitelisted-app package="com.android.certinstaller" />
   <hidden-api-whitelisted-app package="com.android.companiondevicemanager" />
-  <hidden-api-whitelisted-app package="com.android.customlocale2" />
-  <hidden-api-whitelisted-app package="com.android.defcontainer" />
-  <hidden-api-whitelisted-app package="com.android.documentsui" />
   <hidden-api-whitelisted-app package="com.android.dreams.basic" />
-  <hidden-api-whitelisted-app package="com.android.egg" />
-  <hidden-api-whitelisted-app package="com.android.emergency" />
-  <hidden-api-whitelisted-app package="com.android.externalstorage" />
-  <hidden-api-whitelisted-app package="com.android.fakeoemfeatures" />
   <hidden-api-whitelisted-app package="com.android.gallery" />
-  <hidden-api-whitelisted-app package="com.android.hotspot2" />
-  <hidden-api-whitelisted-app package="com.android.keychain" />
   <hidden-api-whitelisted-app package="com.android.launcher3" />
-  <hidden-api-whitelisted-app package="com.android.location.fused" />
-  <hidden-api-whitelisted-app package="com.android.managedprovisioning" />
-  <hidden-api-whitelisted-app package="com.android.mms.service" />
   <hidden-api-whitelisted-app package="com.android.mtp" />
   <hidden-api-whitelisted-app package="com.android.musicfx" />
-  <hidden-api-whitelisted-app package="com.android.nfc" />
-  <hidden-api-whitelisted-app package="com.android.osu" />
   <hidden-api-whitelisted-app package="com.android.packageinstaller" />
-  <hidden-api-whitelisted-app package="com.android.pacprocessor" />
-  <hidden-api-whitelisted-app package="com.android.phone" />
-  <hidden-api-whitelisted-app package="com.android.pmc" />
   <hidden-api-whitelisted-app package="com.android.printservice.recommendation" />
   <hidden-api-whitelisted-app package="com.android.printspooler" />
   <hidden-api-whitelisted-app package="com.android.providers.blockednumber" />
@@ -84,36 +47,13 @@
   <hidden-api-whitelisted-app package="com.android.providers.downloads" />
   <hidden-api-whitelisted-app package="com.android.providers.downloads.ui" />
   <hidden-api-whitelisted-app package="com.android.providers.media" />
-  <hidden-api-whitelisted-app package="com.android.providers.settings" />
-  <hidden-api-whitelisted-app package="com.android.providers.telephony" />
   <hidden-api-whitelisted-app package="com.android.providers.tv" />
   <hidden-api-whitelisted-app package="com.android.providers.userdictionary" />
-  <hidden-api-whitelisted-app package="com.android.provision" />
-  <hidden-api-whitelisted-app package="com.android.proxyhandler" />
-  <hidden-api-whitelisted-app package="com.android.sdksetup" />
-  <hidden-api-whitelisted-app package="com.android.se" />
-  <hidden-api-whitelisted-app package="com.android.server.telecom" />
-  <hidden-api-whitelisted-app package="com.android.service.ims" />
-  <hidden-api-whitelisted-app package="com.android.service.ims.presence" />
-  <hidden-api-whitelisted-app package="com.android.settings" />
-  <hidden-api-whitelisted-app package="com.android.sharedstoragebackup" />
-  <hidden-api-whitelisted-app package="com.android.shell" />
   <hidden-api-whitelisted-app package="com.android.smspush" />
   <hidden-api-whitelisted-app package="com.android.spare_parts" />
   <hidden-api-whitelisted-app package="com.android.statementservice" />
-  <hidden-api-whitelisted-app package="com.android.stk" />
   <hidden-api-whitelisted-app package="com.android.storagemanager" />
-  <hidden-api-whitelisted-app package="com.android.support.car.lenspicker" />
-  <hidden-api-whitelisted-app package="com.android.systemui" />
   <hidden-api-whitelisted-app package="com.android.systemui.plugins" />
   <hidden-api-whitelisted-app package="com.android.terminal" />
-  <hidden-api-whitelisted-app package="com.android.timezone.updater" />
-  <hidden-api-whitelisted-app package="com.android.traceur" />
-  <hidden-api-whitelisted-app package="com.android.tv.settings" />
-  <hidden-api-whitelisted-app package="com.android.vpndialogs" />
-  <hidden-api-whitelisted-app package="com.android.wallpaper.livepicker" />
-  <hidden-api-whitelisted-app package="com.android.wallpaperbackup" />
-  <hidden-api-whitelisted-app package="com.android.wallpapercropper" />
-  <hidden-api-whitelisted-app package="com.googlecode.android_scripting" />
   <hidden-api-whitelisted-app package="jp.co.omronsoft.openwnn" />
 </config>
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 7080657..3cc92bc 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -367,12 +367,19 @@
      * call to <code>saveLayer()</code> and <code>saveLayerAlpha()</code>
      * variants.
      *
-     * @removed There are no visible methods remaining that use this flag
      * <p class="note"><strong>Note:</strong> all methods that accept this flag
      * have flagless versions that are equivalent to passing this flag.
      */
     public static final int ALL_SAVE_FLAG = 0x1F;
 
+    private static void checkValidSaveFlags(int saveFlags) {
+        if (sCompatiblityVersion >= Build.VERSION_CODES.P
+                && saveFlags != ALL_SAVE_FLAG) {
+            throw new IllegalArgumentException(
+                    "Invalid Layer Save Flag - only ALL_SAVE_FLAGS is allowed");
+        }
+    }
+
     /**
      * Saves the current matrix and clip onto a private stack.
      * <p>
@@ -414,10 +421,8 @@
      * redirects drawing to an offscreen bitmap.
      * <p class="note"><strong>Note:</strong> this method is very expensive,
      * incurring more than double rendering cost for contained content. Avoid
-     * using this method, especially if the bounds provided are large, or if
-     * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the
-     * {@code saveFlags} parameter. It is recommended to use a
-     * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
+     * using this method, especially if the bounds provided are large. It is
+     * recommended to use a {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
      * to apply an xfermode, color filter, or alpha, as it will perform much
      * better than this method.
      * <p>
@@ -431,7 +436,9 @@
      * {@link Paint#getColorFilter() ColorFilter} are applied when the
      * offscreen bitmap is drawn back when restore() is called.
      *
-     * @removed
+     * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+     * {@code saveFlags} is {@link #ALL_SAVE_FLAG}.  All other flags are ignored.
+     *
      * @deprecated Use {@link #saveLayer(RectF, Paint)} instead.
      * @param bounds May be null. The maximum size the offscreen bitmap
      *               needs to be (in local coordinates)
@@ -445,7 +452,9 @@
         if (bounds == null) {
             bounds = new RectF(getClipBounds());
         }
-        return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags);
+        checkValidSaveFlags(saveFlags);
+        return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint,
+                ALL_SAVE_FLAG);
     }
 
     /**
@@ -479,17 +488,26 @@
     }
 
     /**
+     * @hide
+     */
+    public int saveUnclippedLayer(int left, int top, int right, int bottom) {
+        return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom, 0, 0);
+    }
+
+    /**
      * Helper version of saveLayer() that takes 4 values rather than a RectF.
      *
-     * @removed
+     * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+     * {@code saveFlags} is {@link #ALL_SAVE_FLAG}.  All other flags are ignored.
+     *
      * @deprecated Use {@link #saveLayer(float, float, float, float, Paint)} instead.
      */
-    @Deprecated
     public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint,
             @Saveflags int saveFlags) {
+        checkValidSaveFlags(saveFlags);
         return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom,
                 paint != null ? paint.getNativeInstance() : 0,
-                saveFlags);
+                ALL_SAVE_FLAG);
     }
 
     /**
@@ -505,10 +523,8 @@
      * redirects drawing to an offscreen bitmap.
      * <p class="note"><strong>Note:</strong> this method is very expensive,
      * incurring more than double rendering cost for contained content. Avoid
-     * using this method, especially if the bounds provided are large, or if
-     * the {@link #CLIP_TO_LAYER_SAVE_FLAG} is omitted from the
-     * {@code saveFlags} parameter. It is recommended to use a
-     * {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
+     * using this method, especially if the bounds provided are large. It is
+     * recommended to use a {@link android.view.View#LAYER_TYPE_HARDWARE hardware layer} on a View
      * to apply an xfermode, color filter, or alpha, as it will perform much
      * better than this method.
      * <p>
@@ -520,7 +536,9 @@
      * The {@code alpha} parameter is applied when the offscreen bitmap is
      * drawn back when restore() is called.
      *
-     * @removed
+     * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+     * {@code saveFlags} is {@link #ALL_SAVE_FLAG}.  All other flags are ignored.
+     *
      * @deprecated Use {@link #saveLayerAlpha(RectF, int)} instead.
      * @param bounds    The maximum size the offscreen bitmap needs to be
      *                  (in local coordinates)
@@ -534,7 +552,9 @@
         if (bounds == null) {
             bounds = new RectF(getClipBounds());
         }
-        return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha, saveFlags);
+        checkValidSaveFlags(saveFlags);
+        return saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha,
+                ALL_SAVE_FLAG);
     }
 
     /**
@@ -553,15 +573,17 @@
     /**
      * Helper for saveLayerAlpha() that takes 4 values instead of a RectF.
      *
-     * @removed
+     * As of API Level API level {@value Build.VERSION_CODES#P} the only valid
+     * {@code saveFlags} is {@link #ALL_SAVE_FLAG}.  All other flags are ignored.
+     *
      * @deprecated Use {@link #saveLayerAlpha(float, float, float, float, int)} instead.
      */
-    @Deprecated
     public int saveLayerAlpha(float left, float top, float right, float bottom, int alpha,
             @Saveflags int saveFlags) {
+        checkValidSaveFlags(saveFlags);
         alpha = Math.min(255, Math.max(0, alpha));
         return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom,
-                                     alpha, saveFlags);
+                                     alpha, ALL_SAVE_FLAG);
     }
 
     /**
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 00dc22e..098f100 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -23,8 +23,10 @@
 
 import android.annotation.AnyThread;
 import android.annotation.IntDef;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.Px;
 import android.annotation.TestApi;
 import android.annotation.WorkerThread;
 import android.content.ContentResolver;
@@ -59,23 +61,131 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- *  Class for decoding images as {@link Bitmap}s or {@link Drawable}s.
+ *  <p>A class for converting encoded images (like {@code PNG}, {@code JPEG},
+ *  {@code WEBP}, {@code GIF}, or {@code HEIF}) into {@link Drawable} or
+ *  {@link Bitmap} objects.
+ *
+ *  <p>To use it, first create a {@link Source Source} using one of the
+ *  {@code createSource} overloads. For example, to decode from a {@link File}, call
+ *  {@link #createSource(File)} and pass the result to {@link #decodeDrawable(Source)}
+ *  or {@link #decodeBitmap(Source)}:
+ *
+ *  <pre class="prettyprint">
+ *  File file = new File(...);
+ *  ImageDecoder.Source source = ImageDecoder.createSource(file);
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source);
+ *  </pre>
+ *
+ *  <p>To change the default settings, pass the {@link Source Source} and an
+ *  {@link OnHeaderDecodedListener OnHeaderDecodedListener} to
+ *  {@link #decodeDrawable(Source, OnHeaderDecodedListener)} or
+ *  {@link #decodeBitmap(Source, OnHeaderDecodedListener)}. For example, to
+ *  create a sampled image with half the width and height of the original image,
+ *  call {@link #setTargetSampleSize setTargetSampleSize(2)} inside
+ *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}:
+ *
+ *  <pre class="prettyprint">
+ *  OnHeaderDecodedListener listener = new OnHeaderDecodedListener() {
+ *      public void onHeaderDecoded(ImageDecoder decoder, ImageInfo info, Source source) {
+ *          decoder.setTargetSampleSize(2);
+ *      }
+ *  };
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source, listener);
+ *  </pre>
+ *
+ *  <p>The {@link ImageInfo ImageInfo} contains information about the encoded image, like
+ *  its width and height, and the {@link Source Source} can be used to match to a particular
+ *  {@link Source Source} if a single {@link OnHeaderDecodedListener OnHeaderDecodedListener}
+ *  is used with multiple {@link Source Source} objects.
+ *
+ *  <p>The {@link OnHeaderDecodedListener OnHeaderDecodedListener} can also be implemented
+ *  as a lambda:
+ *
+ *  <pre class="prettyprint">
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -&gt; {
+ *      decoder.setTargetSampleSize(2);
+ *  });
+ *  </pre>
+ *
+ *  <p>If the encoded image is an animated {@code GIF} or {@code WEBP},
+ *  {@link #decodeDrawable decodeDrawable} will return an {@link AnimatedImageDrawable}. To
+ *  start its animation, call {@link AnimatedImageDrawable#start AnimatedImageDrawable.start()}:
+ *
+ *  <pre class="prettyprint">
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source);
+ *  if (drawable instanceof AnimatedImageDrawable) {
+ *      ((AnimatedImageDrawable) drawable).start();
+ *  }
+ *  </pre>
+ *
+ *  <p>By default, a {@link Bitmap} created by {@link ImageDecoder} (including
+ *  one that is inside a {@link Drawable}) will be immutable (i.e.
+ *  {@link Bitmap#isMutable Bitmap.isMutable()} returns {@code false}), and it
+ *  will typically have {@code Config} {@link Bitmap.Config#HARDWARE}. Although
+ *  these properties can be changed with {@link #setMutableRequired setMutableRequired(true)}
+ *  (which is only compatible with {@link #decodeBitmap(Source)} and
+ *  {@link #decodeBitmap(Source, OnHeaderDecodedListener)}) and {@link #setAllocator},
+ *  it is also possible to apply custom effects regardless of the mutability of
+ *  the final returned object by passing a {@link PostProcessor} to
+ *  {@link #setPostProcessor setPostProcessor}. A {@link PostProcessor} can also be a lambda:
+ *
+ *  <pre class="prettyprint">
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -&gt; {
+ *      decoder.setPostProcessor((canvas) -&gt; {
+ *              // This will create rounded corners.
+ *              Path path = new Path();
+ *              path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
+ *              int width = canvas.getWidth();
+ *              int height = canvas.getHeight();
+ *              path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
+ *              Paint paint = new Paint();
+ *              paint.setAntiAlias(true);
+ *              paint.setColor(Color.TRANSPARENT);
+ *              paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+ *              canvas.drawPath(path, paint);
+ *              return PixelFormat.TRANSLUCENT;
+ *      });
+ *  });
+ *  </pre>
+ *
+ *  <p>If the encoded image is incomplete or contains an error, or if an
+ *  {@link Exception} occurs during decoding, a {@link DecodeException DecodeException}
+ *  will be thrown. In some cases, the {@link ImageDecoder} may have decoded part of
+ *  the image. In order to display the partial image, an
+ *  {@link OnPartialImageListener OnPartialImageListener} must be passed to
+ *  {@link #setOnPartialImageListener setOnPartialImageListener}. For example:
+ *
+ *  <pre class="prettyprint">
+ *  Drawable drawable = ImageDecoder.decodeDrawable(source, (decoder, info, src) -&gt; {
+ *      decoder.setOnPartialImageListener((DecodeException e) -&gt; {
+ *              // Returning true indicates to create a Drawable or Bitmap even
+ *              // if the whole image could not be decoded. Any remaining lines
+ *              // will be blank.
+ *              return true;
+ *      });
+ *  });
+ *  </pre>
  */
 public final class ImageDecoder implements AutoCloseable {
     /** @hide **/
     public static int sApiLevel;
 
     /**
-     *  Source of the encoded image data.
+     *  Source of encoded image data.
      *
-     *  <p>This object references the data that will be used to decode a
-     *  Drawable or Bitmap in {@link #decodeDrawable} or {@link #decodeBitmap}.
-     *  Constructing a {@code Source} (with one of the overloads of
-     *  {@code createSource}) can be done on any thread because the construction
-     *  simply captures values. The real work is done in decodeDrawable or
-     *  decodeBitmap.</p>
+     *  <p>References the data that will be used to decode a {@link Drawable}
+     *  or {@link Bitmap} in {@link #decodeDrawable decodeDrawable} or
+     *  {@link #decodeBitmap decodeBitmap}. Constructing a {@code Source} (with
+     *  one of the overloads of {@code createSource}) can be done on any thread
+     *  because the construction simply captures values. The real work is done
+     *  in {@link #decodeDrawable decodeDrawable} or {@link #decodeBitmap decodeBitmap}.
      *
-     *  <p>Further, a Source object can be reused with different settings, or
+     *  <p>A {@code Source} object can be reused to create multiple versions of the
+     *  same image. For example, to decode a full size image and its thumbnail,
+     *  the same {@code Source} can be used once with no
+     *  {@link OnHeaderDecodedListener OnHeaderDecodedListener} and once with an
+     *  implementation of {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}
+     *  that calls {@link #setTargetSize} with smaller dimensions. One {@code Source}
      *  even used simultaneously in multiple threads.</p>
      */
     public static abstract class Source {
@@ -418,7 +528,7 @@
     }
 
     /**
-     *  Contains information about the encoded image.
+     *  Information about an encoded image.
      */
     public static class ImageInfo {
         private final Size mSize;
@@ -448,8 +558,8 @@
         /**
          * Whether the image is animated.
          *
-         * <p>Calling {@link #decodeDrawable} will return an
-         * {@link AnimatedImageDrawable}.</p>
+         * <p>If {@code true}, {@link #decodeDrawable decodeDrawable} will
+         * return an {@link AnimatedImageDrawable}.</p>
          */
         public boolean isAnimated() {
             return mDecoder.mAnimated;
@@ -471,23 +581,29 @@
     /** @removed
      * @deprecated Subsumed by {@link #DecodeException}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public static class IncompleteException extends IOException {};
 
     /**
-     *  Optional listener supplied to {@link #decodeDrawable} or
-     *  {@link #decodeBitmap}.
+     *  Interface for changing the default settings of a decode.
      *
-     *  <p>This is necessary in order to change the default settings of the
-     *  decode.</p>
+     *  <p>Supply an instance to
+     *  {@link #decodeDrawable(Source, OnHeaderDecodedListener) decodeDrawable}
+     *  or {@link #decodeBitmap(Source, OnHeaderDecodedListener) decodeBitmap},
+     *  which will call {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}
+     *  (in the same thread) once the size is known. The implementation of
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded} can then
+     *  change the decode settings as desired.
      */
     public static interface OnHeaderDecodedListener {
         /**
-         *  Called when the header is decoded and the size is known.
+         *  Called by {@link ImageDecoder} when the header has been decoded and
+         *  the image size is known.
          *
-         *  @param decoder allows changing the default settings of the decode.
-         *  @param info Information about the encoded image.
-         *  @param source that created the decoder.
+         *  @param decoder the object performing the decode, for changing
+         *      its default settings.
+         *  @param info information about the encoded image.
+         *  @param source object that created {@code decoder}.
          */
         public void onHeaderDecoded(@NonNull ImageDecoder decoder,
                 @NonNull ImageInfo info, @NonNull Source source);
@@ -497,19 +613,19 @@
     /** @removed
      * @deprecated Replaced by {@link #DecodeException#SOURCE_EXCEPTION}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public static final int ERROR_SOURCE_EXCEPTION  = 1;
 
     /** @removed
      * @deprecated Replaced by {@link #DecodeException#SOURCE_INCOMPLETE}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public static final int ERROR_SOURCE_INCOMPLETE = 2;
 
     /** @removed
      * @deprecated Replaced by {@link #DecodeException#SOURCE_MALFORMED_DATA}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public static final int ERROR_SOURCE_ERROR      = 3;
 
     /**
@@ -570,7 +686,7 @@
         }
 
         /**
-         *  Retrieve the {@link Source} that was interrupted.
+         *  Retrieve the {@link Source Source} that was interrupted.
          *
          *  <p>This can be used for equality checking to find the Source which
          *  failed to completely decode.</p>
@@ -595,25 +711,36 @@
     }
 
     /**
-     *  Optional listener supplied to the ImageDecoder.
+     *  Interface for inspecting a {@link DecodeException DecodeException}
+     *  and potentially preventing it from being thrown.
      *
-     *  Without this listener, errors will throw {@link java.io.IOException}.
+     *  <p>If an instance is passed to
+     *  {@link #setOnPartialImageListener setOnPartialImageListener}, a
+     *  {@link DecodeException DecodeException} that would otherwise have been
+     *  thrown can be inspected inside
+     *  {@link OnPartialImageListener#onPartialImage onPartialImage}.
+     *  If {@link OnPartialImageListener#onPartialImage onPartialImage} returns
+     *  {@code true}, a partial image will be created.
      */
     public static interface OnPartialImageListener {
         /**
-         *  Called when there is only a partial image to display.
+         *  Called by {@link ImageDecoder} when there is only a partial image to
+         *  display.
          *
-         *  If decoding is interrupted after having decoded a partial image,
-         *  this listener lets the client know that and allows them to
-         *  optionally finish the rest of the decode/creation process to create
-         *  a partial {@link Drawable}/{@link Bitmap}.
+         *  <p>If decoding is interrupted after having decoded a partial image,
+         *  this method will be called. The implementation can inspect the
+         *  {@link DecodeException DecodeException} and optionally finish the
+         *  rest of the decode creation process to create a partial {@link Drawable}
+         *  or {@link Bitmap}.
          *
-         *  @param e containing information about the decode interruption.
-         *  @return True to create and return a {@link Drawable}/{@link Bitmap}
-         *      with partial data. False (which is the default) to abort the
-         *      decode and throw {@code e}.
+         *  @param exception exception containing information about the
+         *      decode interruption.
+         *  @return {@code true} to create and return a {@link Drawable} or
+         *      {@link Bitmap} with partial data. {@code false} (which is the
+         *      default) to abort the decode and throw {@code e}. Any undecoded
+         *      lines in the image will be blank.
          */
-        boolean onPartialImage(@NonNull DecodeException e);
+        boolean onPartialImage(@NonNull DecodeException exception);
     };
 
     // Fields
@@ -621,6 +748,7 @@
     private final int     mWidth;
     private final int     mHeight;
     private final boolean mAnimated;
+    private final boolean mIsNinePatch;
 
     private int        mDesiredWidth;
     private int        mDesiredHeight;
@@ -651,13 +779,14 @@
      */
     @SuppressWarnings("unused")
     private ImageDecoder(long nativePtr, int width, int height,
-            boolean animated) {
+            boolean animated, boolean isNinePatch) {
         mNativePtr = nativePtr;
         mWidth = width;
         mHeight = height;
         mDesiredWidth = width;
         mDesiredHeight = height;
         mAnimated = animated;
+        mIsNinePatch = isNinePatch;
         mCloseGuard.open("close");
     }
 
@@ -679,12 +808,13 @@
     }
 
     /**
-     * Create a new {@link Source} from a resource.
+     * Create a new {@link Source Source} from a resource.
      *
      * @param res the {@link Resources} object containing the image data.
      * @param resId resource ID of the image data.
      * @return a new Source object, which can be passed to
-     *      {@link #decodeDrawable} or {@link #decodeBitmap}.
+     *      {@link #decodeDrawable decodeDrawable} or
+     *      {@link #decodeBitmap decodeBitmap}.
      */
     @AnyThread
     @NonNull
@@ -694,12 +824,20 @@
     }
 
     /**
-     * Create a new {@link Source} from a {@link android.net.Uri}.
+     * Create a new {@link Source Source} from a {@link android.net.Uri}.
+     *
+     * <h5>Accepts the following URI schemes:</h5>
+     * <ul>
+     * <li>content ({@link ContentResolver#SCHEME_CONTENT})</li>
+     * <li>android.resource ({@link ContentResolver#SCHEME_ANDROID_RESOURCE})</li>
+     * <li>file ({@link ContentResolver#SCHEME_FILE})</li>
+     * </ul>
      *
      * @param cr to retrieve from.
      * @param uri of the image file.
      * @return a new Source object, which can be passed to
-     *      {@link #decodeDrawable} or {@link #decodeBitmap}.
+     *      {@link #decodeDrawable decodeDrawable} or
+     *      {@link #decodeBitmap decodeBitmap}.
      */
     @AnyThread
     @NonNull
@@ -721,7 +859,7 @@
     }
 
     /**
-     * Create a new {@link Source} from a file in the "assets" directory.
+     * Create a new {@link Source Source} from a file in the "assets" directory.
      */
     @AnyThread
     @NonNull
@@ -730,12 +868,15 @@
     }
 
     /**
-     * Create a new {@link Source} from a byte array.
+     * Create a new {@link Source Source} from a byte array.
      *
      * @param data byte array of compressed image data.
      * @param offset offset into data for where the decoder should begin
      *      parsing.
      * @param length number of bytes, beginning at offset, to parse.
+     * @return a new Source object, which can be passed to
+     *      {@link #decodeDrawable decodeDrawable} or
+     *      {@link #decodeBitmap decodeBitmap}.
      * @throws NullPointerException if data is null.
      * @throws ArrayIndexOutOfBoundsException if offset and length are
      *      not within data.
@@ -767,16 +908,20 @@
     }
 
     /**
-     * Create a new {@link Source} from a {@link java.nio.ByteBuffer}.
+     * Create a new {@link Source Source} from a {@link java.nio.ByteBuffer}.
      *
-     * <p>Decoding will start from {@link java.nio.ByteBuffer#position()}. The
-     * position of {@code buffer} will not be affected.</p>
+     * <p>Decoding will start from {@link java.nio.ByteBuffer#position() buffer.position()}.
+     * The position of {@code buffer} will not be affected.</p>
      *
-     * <p>Note: If this {@code Source} is passed to {@link #decodeDrawable}, and
-     * the encoded image is animated, the returned {@link AnimatedImageDrawable}
+     * <p>Note: If this {@code Source} is passed to {@link #decodeDrawable decodeDrawable},
+     * and the encoded image is animated, the returned {@link AnimatedImageDrawable}
      * will continue reading from the {@code buffer}, so its contents must not
      * be modified, even after the {@code AnimatedImageDrawable} is returned.
      * {@code buffer}'s contents should never be modified during decode.</p>
+     *
+     * @return a new Source object, which can be passed to
+     *      {@link #decodeDrawable decodeDrawable} or
+     *      {@link #decodeBitmap decodeBitmap}.
      */
     @AnyThread
     @NonNull
@@ -812,7 +957,11 @@
     }
 
     /**
-     * Create a new {@link Source} from a {@link java.io.File}.
+     * Create a new {@link Source Source} from a {@link java.io.File}.
+     *
+     * @return a new Source object, which can be passed to
+     *      {@link #decodeDrawable decodeDrawable} or
+     *      {@link #decodeBitmap decodeBitmap}.
      */
     @AnyThread
     @NonNull
@@ -853,7 +1002,7 @@
     /** @removed
      * @deprecated Renamed to {@link #setTargetSize}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setResize(int width, int height) {
         this.setTargetSize(width, height);
         return this;
@@ -863,19 +1012,23 @@
      *  Specify the size of the output {@link Drawable} or {@link Bitmap}.
      *
      *  <p>By default, the output size will match the size of the encoded
-     *  image, which can be retrieved from the {@link ImageInfo} in
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  image, which can be retrieved from the {@link ImageInfo ImageInfo} in
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
+     *
+     *  <p>This will sample or scale the output to an arbitrary size that may
+     *  be smaller or larger than the encoded size.</p>
      *
      *  <p>Only the last call to this or {@link #setTargetSampleSize} is
      *  respected.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
-     *  @param width must be greater than 0.
-     *  @param height must be greater than 0.
+     *  @param width width in pixels of the output, must be greater than 0
+     *  @param height height in pixels of the output, must be greater than 0
      */
-    public void setTargetSize(int width, int height) {
+    public void setTargetSize(@Px @IntRange(from = 1) int width,
+                              @Px @IntRange(from = 1) int height) {
         if (width <= 0 || height <= 0) {
             throw new IllegalArgumentException("Dimensions must be positive! "
                     + "provided (" + width + ", " + height + ")");
@@ -888,7 +1041,7 @@
     /** @removed
      * @deprecated Renamed to {@link #setTargetSampleSize}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setResize(int sampleSize) {
         this.setTargetSampleSize(sampleSize);
         return this;
@@ -924,25 +1077,31 @@
      *  Set the target size with a sampleSize.
      *
      *  <p>By default, the output size will match the size of the encoded
-     *  image, which can be retrieved from the {@link ImageInfo} in
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  image, which can be retrieved from the {@link ImageInfo ImageInfo} in
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      *  <p>Requests the decoder to subsample the original image, returning a
-     *  smaller image to save memory. The sample size is the number of pixels
+     *  smaller image to save memory. The {@code sampleSize} is the number of pixels
      *  in either dimension that correspond to a single pixel in the output.
-     *  For example, sampleSize == 4 returns an image that is 1/4 the
+     *  For example, {@code sampleSize == 4} returns an image that is 1/4 the
      *  width/height of the original, and 1/16 the number of pixels.</p>
      *
      *  <p>Must be greater than or equal to 1.</p>
      *
+     *  <p>This has the same effect as calling {@link #setTargetSize} with
+     *  dimensions based on the {@code sampleSize}. Unlike dividing the original
+     *  width and height by the {@code sampleSize} manually, calling this method
+     *  allows {@code ImageDecoder} to round in the direction that it can do most
+     *  efficiently.</p>
+     *
      *  <p>Only the last call to this or {@link #setTargetSize} is respected.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
-     *  @param sampleSize Sampling rate of the encoded image.
+     *  @param sampleSize sampling rate of the encoded image.
      */
-    public void setTargetSampleSize(int sampleSize) {
+    public void setTargetSampleSize(@IntRange(from = 1) int sampleSize) {
         Size size = this.getSampledSize(sampleSize);
         int targetWidth = getTargetDimension(mWidth, sampleSize, size.getWidth());
         int targetHeight = getTargetDimension(mHeight, sampleSize, size.getHeight());
@@ -960,14 +1119,15 @@
      *  Will typically result in a {@link Bitmap.Config#HARDWARE}
      *  allocation, but may be software for small images. In addition, this will
      *  switch to software when HARDWARE is incompatible, e.g.
-     *  {@link #setMutableRequired}, {@link #setDecodeAsAlphaMaskEnabled}.
+     *  {@link #setMutableRequired setMutableRequired(true)} or
+     *  {@link #setDecodeAsAlphaMaskEnabled setDecodeAsAlphaMaskEnabled(true)}.
      */
     public static final int ALLOCATOR_DEFAULT = 0;
 
     /**
      *  Use a software allocation for the pixel memory.
      *
-     *  Useful for drawing to a software {@link Canvas} or for
+     *  <p>Useful for drawing to a software {@link Canvas} or for
      *  accessing the pixels on the final output.
      */
     public static final int ALLOCATOR_SOFTWARE = 1;
@@ -975,17 +1135,18 @@
     /**
      *  Use shared memory for the pixel memory.
      *
-     *  Useful for sharing across processes.
+     *  <p>Useful for sharing across processes.
      */
     public static final int ALLOCATOR_SHARED_MEMORY = 2;
 
     /**
      *  Require a {@link Bitmap.Config#HARDWARE} {@link Bitmap}.
      *
-     *  When this is combined with incompatible options, like
-     *  {@link #setMutableRequired} or {@link #setDecodeAsAlphaMaskEnabled},
-     *  {@link #decodeDrawable} / {@link #decodeBitmap} will throw an
-     *  {@link java.lang.IllegalStateException}.
+     *  <p>When this is combined with incompatible options, like
+     *  {@link #setMutableRequired setMutableRequired(true)} or
+     *  {@link #setDecodeAsAlphaMaskEnabled setDecodeAsAlphaMaskEnabled(true)},
+     *  {@link #decodeDrawable decodeDrawable} or {@link #decodeBitmap decodeBitmap}
+     *  will throw an {@link java.lang.IllegalStateException}.
      */
     public static final int ALLOCATOR_HARDWARE = 3;
 
@@ -1002,7 +1163,7 @@
      *  <p>This is ignored for animated drawables.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      *  @param allocator Type of allocator to use.
      */
@@ -1029,13 +1190,13 @@
      *  {@link android.view.View} system (i.e. to a {@link Canvas}). Calling
      *  this method with a value of {@code true} will result in
      *  {@link #decodeBitmap} returning a {@link Bitmap} with unpremultiplied
-     *  pixels. See {@link Bitmap#isPremultiplied}. This is incompatible with
-     *  {@link #decodeDrawable}; attempting to decode an unpremultiplied
-     *  {@link Drawable} will throw an {@link java.lang.IllegalStateException}.
-     *  </p>
+     *  pixels. See {@link Bitmap#isPremultiplied Bitmap.isPremultiplied()}.
+     *  This is incompatible with {@link #decodeDrawable decodeDrawable};
+     *  attempting to decode an unpremultiplied {@link Drawable} will throw an
+     *  {@link java.lang.IllegalStateException}. </p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      */
     public void setUnpremultipliedRequired(boolean unpremultipliedRequired) {
         mUnpremultipliedRequired = unpremultipliedRequired;
@@ -1044,7 +1205,7 @@
     /** @removed
      * @deprecated Renamed to {@link #setUnpremultipliedRequired}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setRequireUnpremultiplied(boolean unpremultipliedRequired) {
         this.setUnpremultipliedRequired(unpremultipliedRequired);
         return this;
@@ -1060,7 +1221,7 @@
     /** @removed
      * @deprecated Renamed to {@link #isUnpremultipliedRequired}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public boolean getRequireUnpremultiplied() {
         return this.isUnpremultipliedRequired();
     }
@@ -1072,6 +1233,9 @@
      *  {@link Bitmap}. For a {@code Drawable} or an immutable {@code Bitmap},
      *  this is the only way to process the image after decoding.</p>
      *
+     *  <p>If combined with {@link #setTargetSize} and/or {@link #setCrop},
+     *  {@link PostProcessor#onPostProcess} occurs last.</p>
+     *
      *  <p>If set on a nine-patch image, the nine-patch data is ignored.</p>
      *
      *  <p>For an animated image, the drawing commands drawn on the
@@ -1079,11 +1243,11 @@
      *  frame.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      */
-    public void setPostProcessor(@Nullable PostProcessor p) {
-        mPostProcessor = p;
+    public void setPostProcessor(@Nullable PostProcessor postProcessor) {
+        mPostProcessor = postProcessor;
     }
 
     /**
@@ -1098,18 +1262,18 @@
      *  Set (replace) the {@link OnPartialImageListener} on this object.
      *
      *  <p>Will be called if there is an error in the input. Without one, an
-     *  error will result in an Exception being thrown.</p>
+     *  error will result in an {@code Exception} being thrown.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      */
-    public void setOnPartialImageListener(@Nullable OnPartialImageListener l) {
-        mOnPartialImageListener = l;
+    public void setOnPartialImageListener(@Nullable OnPartialImageListener listener) {
+        mOnPartialImageListener = listener;
     }
 
     /**
-     *  Return the {@link OnPartialImageListener} currently set.
+     *  Return the {@link OnPartialImageListener OnPartialImageListener} currently set.
      */
     @Nullable
     public OnPartialImageListener getOnPartialImageListener() {
@@ -1122,14 +1286,14 @@
      *  <p>{@code subset} must be contained within the size set by
      *  {@link #setTargetSize} or the bounds of the image if setTargetSize was
      *  not called. Otherwise an {@link IllegalStateException} will be thrown by
-     *  {@link #decodeDrawable}/{@link #decodeBitmap}.</p>
+     *  {@link #decodeDrawable decodeDrawable}/{@link #decodeBitmap decodeBitmap}.</p>
      *
      *  <p>NOT intended as a replacement for
-     *  {@link BitmapRegionDecoder#decodeRegion}. This supports all formats,
-     *  but merely crops the output.</p>
+     *  {@link BitmapRegionDecoder#decodeRegion BitmapRegionDecoder.decodeRegion()}.
+     *  This supports all formats, but merely crops the output.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      */
     public void setCrop(@Nullable Rect subset) {
@@ -1151,7 +1315,7 @@
      *  rectangle during decode. Otherwise it will not be modified.
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      *
      *  @hide
      */
@@ -1162,21 +1326,22 @@
     /**
      *  Specify whether the {@link Bitmap} should be mutable.
      *
-     *  <p>By default, a {@link Bitmap} created will be immutable, but that can
-     *  be changed with this call.</p>
+     *  <p>By default, a {@link Bitmap} created by {@link #decodeBitmap decodeBitmap}
+     *  will be immutable i.e. {@link Bitmap#isMutable() Bitmap.isMutable()} returns
+     *  {@code false}. This can be changed with {@code setMutableRequired(true)}.
      *
      *  <p>Mutable Bitmaps are incompatible with {@link #ALLOCATOR_HARDWARE},
      *  because {@link Bitmap.Config#HARDWARE} Bitmaps cannot be mutable.
      *  Attempting to combine them will throw an
      *  {@link java.lang.IllegalStateException}.</p>
      *
-     *  <p>Mutable Bitmaps are also incompatible with {@link #decodeDrawable},
+     *  <p>Mutable Bitmaps are also incompatible with {@link #decodeDrawable decodeDrawable},
      *  which would require retrieving the Bitmap from the returned Drawable in
      *  order to modify. Attempting to decode a mutable {@link Drawable} will
      *  throw an {@link java.lang.IllegalStateException}.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      */
     public void setMutableRequired(boolean mutable) {
         mMutable = mutable;
@@ -1185,14 +1350,14 @@
     /** @removed
      * @deprecated Renamed to {@link #setMutableRequired}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setMutable(boolean mutable) {
         this.setMutableRequired(mutable);
         return this;
     }
 
     /**
-     *  Return whether the {@link Bitmap} will be mutable.
+     *  Return whether the decoded {@link Bitmap} will be mutable.
      */
     public boolean isMutableRequired() {
         return mMutable;
@@ -1201,37 +1366,68 @@
     /** @removed
      * @deprecated Renamed to {@link #isMutableRequired}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public boolean getMutable() {
         return this.isMutableRequired();
     }
 
     /**
-     *  Specify whether to potentially save RAM at the expense of quality.
+     * Save memory if possible by using a denser {@link Bitmap.Config} at the
+     * cost of some image quality.
      *
-     *  <p>Setting this to {@code true} may result in a {@link Bitmap} with a
-     *  denser {@link Bitmap.Config}, depending on the image. For example, an
-     *  opaque {@link Bitmap} with 8 bits or precision for each of its red,
-     *  green and blue components would decode to
-     *  {@link Bitmap.Config#ARGB_8888} by default, but setting this to
-     *  {@code true} will result in decoding to {@link Bitmap.Config#RGB_565}.
-     *  This necessarily lowers the quality of the output, but saves half
-     *  the memory used.</p>
+     * <p>For example an opaque 8-bit image may be compressed into an
+     * {@link Bitmap.Config#RGB_565} configuration, sacrificing image
+     * quality to save memory.
+     */
+    public static final int MEMORY_POLICY_LOW_RAM = 0;
+
+    /**
+     * Use the most natural {@link Bitmap.Config} for the internal {@link Bitmap}.
+     *
+     * <p>This is the recommended default for most applications and usages. This
+     * will use the closest {@link Bitmap.Config} for the encoded source. If the
+     * encoded source does not exactly match any {@link Bitmap.Config}, the next
+     * highest quality {@link Bitmap.Config} will be used avoiding any loss in
+     * image quality.
+     */
+    public static final int MEMORY_POLICY_DEFAULT  = 1;
+
+    /** @hide **/
+    @Retention(SOURCE)
+    @IntDef(value = { MEMORY_POLICY_DEFAULT, MEMORY_POLICY_LOW_RAM },
+              prefix = {"MEMORY_POLICY_"})
+    public @interface MemoryPolicy {};
+
+    /**
+     *  Specify the memory policy for the decoded {@link Bitmap}.
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      */
+    public void setMemorySizePolicy(@MemoryPolicy int policy) {
+        mConserveMemory = (policy == MEMORY_POLICY_LOW_RAM);
+    }
+
+    /**
+     *  Retrieve the memory policy for the decoded {@link Bitmap}.
+     */
+    @MemoryPolicy
+    public int getMemorySizePolicy() {
+        return mConserveMemory ? MEMORY_POLICY_LOW_RAM : MEMORY_POLICY_DEFAULT;
+    }
+
+    /** @removed
+     * @deprecated Replaced by {@link #setMemorySizePolicy}.
+     */
+    @Deprecated
     public void setConserveMemory(boolean conserveMemory) {
         mConserveMemory = conserveMemory;
     }
 
-    /**
-     *  Return whether this object will try to save RAM at the expense of quality.
-     *
-     *  <p>This returns whether {@link #setConserveMemory} was set to {@code true}.
-     *  It may still return {@code true} even if the {@code ImageDecoder} does not
-     *  have a way to save RAM at the expense of quality for this image.</p>
+    /** @removed
+     * @deprecated Replaced by {@link #getMemorySizePolicy}.
      */
+    @Deprecated
     public boolean getConserveMemory() {
         return mConserveMemory;
     }
@@ -1244,12 +1440,12 @@
      *  no effect.</p>
      *
      *  <p>This is incompatible with {@link #ALLOCATOR_HARDWARE}. Trying to
-     *  combine them will result in {@link #decodeDrawable}/
-     *  {@link #decodeBitmap} throwing an
+     *  combine them will result in {@link #decodeDrawable decodeDrawable}/
+     *  {@link #decodeBitmap decodeBitmap} throwing an
      *  {@link java.lang.IllegalStateException}.</p>
      *
      *  <p>Like all setters on ImageDecoder, this must be called inside
-     *  {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     *  {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      */
     public void setDecodeAsAlphaMaskEnabled(boolean enabled) {
         mDecodeAsAlphaMask = enabled;
@@ -1258,7 +1454,7 @@
     /** @removed
      * @deprecated Renamed to {@link #setDecodeAsAlphaMaskEnabled}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setDecodeAsAlphaMask(boolean enabled) {
         this.setDecodeAsAlphaMaskEnabled(enabled);
         return this;
@@ -1267,7 +1463,7 @@
     /** @removed
      * @deprecated Renamed to {@link #setDecodeAsAlphaMaskEnabled}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public ImageDecoder setAsAlphaMask(boolean asAlphaMask) {
         this.setDecodeAsAlphaMask(asAlphaMask);
         return this;
@@ -1288,7 +1484,7 @@
     /** @removed
      * @deprecated Renamed to {@link #isDecodeAsAlphaMaskEnabled}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public boolean getDecodeAsAlphaMask() {
         return mDecodeAsAlphaMask;
     }
@@ -1296,7 +1492,7 @@
     /** @removed
      * @deprecated Renamed to {@link #isDecodeAsAlphaMaskEnabled}.
      */
-    @java.lang.Deprecated
+    @Deprecated
     public boolean getAsAlphaMask() {
         return this.getDecodeAsAlphaMask();
     }
@@ -1304,21 +1500,22 @@
     /**
      * Specify the desired {@link ColorSpace} for the output.
      *
-     * <p>If non-null, the decoder will try to decode into this
-     * color space. If it is null, which is the default, or the request cannot
-     * be met, the decoder will pick either the color space embedded in the
-     * image or the color space best suited for the requested image
-     * configuration (for instance {@link ColorSpace.Named#SRGB sRGB} for
-     * the {@link Bitmap.Config#ARGB_8888} configuration).</p>
+     * <p>If non-null, the decoder will try to decode into {@code colorSpace}.
+     * If it is null, which is the default, or the request cannot be met, the
+     * decoder will pick either the color space embedded in the image or the
+     * {@link ColorSpace} best suited for the requested image configuration
+     * (for instance {@link ColorSpace.Named#SRGB sRGB} for the
+     * {@link Bitmap.Config#ARGB_8888} configuration).</p>
      *
      * <p>{@link Bitmap.Config#RGBA_F16} always uses the
-     * {@link ColorSpace.Named#LINEAR_EXTENDED_SRGB scRGB} color space).
+     * {@link ColorSpace.Named#LINEAR_EXTENDED_SRGB scRGB} color space.
      * Bitmaps in other configurations without an embedded color space are
      * assumed to be in the {@link ColorSpace.Named#SRGB sRGB} color space.</p>
      *
      * <p class="note">Only {@link ColorSpace.Model#RGB} color spaces are
      * currently supported. An <code>IllegalArgumentException</code> will
-     * be thrown by the decode methods when setting a non-RGB color space
+     * be thrown by {@link #decodeDrawable decodeDrawable}/
+     * {@link #decodeBitmap decodeBitmap} when setting a non-RGB color space
      * such as {@link ColorSpace.Named#CIE_LAB Lab}.</p>
      *
      * <p class="note">The specified color space's transfer function must be
@@ -1328,12 +1525,20 @@
      * specified color space returns null.</p>
      *
      * <p>Like all setters on ImageDecoder, this must be called inside
-     * {@link OnHeaderDecodedListener#onHeaderDecoded}.</p>
+     * {@link OnHeaderDecodedListener#onHeaderDecoded onHeaderDecoded}.</p>
      */
     public void setTargetColorSpace(ColorSpace colorSpace) {
         mDesiredColorSpace = colorSpace;
     }
 
+    /**
+     * Closes this resource, relinquishing any underlying resources. This method
+     * is invoked automatically on objects managed by the try-with-resources
+     * statement.
+     *
+     * <p>This is an implementation detail of {@link ImageDecoder}, and should
+     * never be called manually.</p>
+     */
     @Override
     public void close() {
         mCloseGuard.close();
@@ -1421,7 +1626,7 @@
      *  Create a {@link Drawable} from a {@code Source}.
      *
      *  @param src representing the encoded image.
-     *  @param listener for learning the {@link ImageInfo} and changing any
+     *  @param listener for learning the {@link ImageInfo ImageInfo} and changing any
      *      default settings on the {@code ImageDecoder}. This will be called on
      *      the same thread as {@code decodeDrawable} before that method returns.
      *      This is required in order to change any of the default settings.
@@ -1462,7 +1667,7 @@
 
             // this call potentially manipulates the decoder so it must be performed prior to
             // decoding the bitmap and after decode set the density on the resulting bitmap
-            final int srcDensity = computeDensity(src, decoder);
+            final int srcDensity = decoder.computeDensity(src);
             if (decoder.mAnimated) {
                 // AnimatedImageDrawable calls postProcessAndRelease only if
                 // mPostProcessor exists.
@@ -1503,8 +1708,8 @@
     /**
      *  Create a {@link Drawable} from a {@code Source}.
      *
-     *  <p>Since there is no {@link OnHeaderDecodedListener}, the default
-     *  settings will be used. In order to change any settings, call
+     *  <p>Since there is no {@link OnHeaderDecodedListener OnHeaderDecodedListener},
+     *  the default settings will be used. In order to change any settings, call
      *  {@link #decodeDrawable(Source, OnHeaderDecodedListener)} instead.</p>
      *
      *  @param src representing the encoded image.
@@ -1523,7 +1728,7 @@
      *  Create a {@link Bitmap} from a {@code Source}.
      *
      *  @param src representing the encoded image.
-     *  @param listener for learning the {@link ImageInfo} and changing any
+     *  @param listener for learning the {@link ImageInfo ImageInfo} and changing any
      *      default settings on the {@code ImageDecoder}. This will be called on
      *      the same thread as {@code decodeBitmap} before that method returns.
      *      This is required in order to change any of the default settings.
@@ -1552,7 +1757,7 @@
 
             // this call potentially manipulates the decoder so it must be performed prior to
             // decoding the bitmap
-            final int srcDensity = computeDensity(src, decoder);
+            final int srcDensity = decoder.computeDensity(src);
             Bitmap bm = decoder.decodeBitmapInternal();
             bm.setDensity(srcDensity);
 
@@ -1569,12 +1774,26 @@
     }
 
     // This method may modify the decoder so it must be called prior to performing the decode
-    private static int computeDensity(@NonNull Source src, @NonNull ImageDecoder decoder) {
+    private int computeDensity(@NonNull Source src) {
         // if the caller changed the size then we treat the density as unknown
-        if (decoder.requestedResize()) {
+        if (this.requestedResize()) {
             return Bitmap.DENSITY_NONE;
         }
 
+        final int srcDensity = src.getDensity();
+        if (srcDensity == Bitmap.DENSITY_NONE) {
+            return srcDensity;
+        }
+
+        // Scaling up nine-patch divs is imprecise and is better handled
+        // at draw time. An app won't be relying on the internal Bitmap's
+        // size, so it is safe to let NinePatchDrawable handle scaling.
+        // mPostProcessor disables nine-patching, so behave normally if
+        // it is present.
+        if (mIsNinePatch && mPostProcessor == null) {
+            return srcDensity;
+        }
+
         // Special stuff for compatibility mode: if the target density is not
         // the same as the display density, but the resource -is- the same as
         // the display density, then don't scale it down to the target density.
@@ -1583,23 +1802,25 @@
         // to the compatibility density only to have them scaled back up when
         // drawn to the screen.
         Resources res = src.getResources();
-        final int srcDensity = src.getDensity();
         if (res != null && res.getDisplayMetrics().noncompatDensityDpi == srcDensity) {
             return srcDensity;
         }
 
+        final int dstDensity = src.computeDstDensity();
+        if (srcDensity == dstDensity) {
+            return srcDensity;
+        }
+
         // For P and above, only resize if it would be a downscale. Scale up prior
         // to P in case the app relies on the Bitmap's size without considering density.
-        final int dstDensity = src.computeDstDensity();
-        if (srcDensity == Bitmap.DENSITY_NONE || srcDensity == dstDensity
-                || (srcDensity < dstDensity && sApiLevel >= Build.VERSION_CODES.P)) {
+        if (srcDensity < dstDensity && sApiLevel >= Build.VERSION_CODES.P) {
             return srcDensity;
         }
 
         float scale = (float) dstDensity / srcDensity;
-        int scaledWidth = (int) (decoder.mWidth * scale + 0.5f);
-        int scaledHeight = (int) (decoder.mHeight * scale + 0.5f);
-        decoder.setTargetSize(scaledWidth, scaledHeight);
+        int scaledWidth = (int) (mWidth * scale + 0.5f);
+        int scaledHeight = (int) (mHeight * scale + 0.5f);
+        this.setTargetSize(scaledWidth, scaledHeight);
         return dstDensity;
     }
 
@@ -1616,8 +1837,8 @@
     /**
      *  Create a {@link Bitmap} from a {@code Source}.
      *
-     *  <p>Since there is no {@link OnHeaderDecodedListener}, the default
-     *  settings will be used. In order to change any settings, call
+     *  <p>Since there is no {@link OnHeaderDecodedListener OnHeaderDecodedListener},
+     *  the default settings will be used. In order to change any settings, call
      *  {@link #decodeBitmap(Source, OnHeaderDecodedListener)} instead.</p>
      *
      *  @param src representing the encoded image.
diff --git a/graphics/java/android/graphics/PostProcessor.java b/graphics/java/android/graphics/PostProcessor.java
index b1712e9..6fed39b 100644
--- a/graphics/java/android/graphics/PostProcessor.java
+++ b/graphics/java/android/graphics/PostProcessor.java
@@ -16,25 +16,26 @@
 
 package android.graphics;
 
-import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.graphics.drawable.AnimatedImageDrawable;
 import android.graphics.drawable.Drawable;
 
 /**
  *  Helper interface for adding custom processing to an image.
  *
- *  <p>The image being processed may be a {@link Drawable}, {@link Bitmap} or frame
- *  of an animated image produced by {@link ImageDecoder}. This is called before
- *  the requested object is returned.</p>
+ *  <p>The image being processed may be a {@link Drawable}, a {@link Bitmap}, or
+ *  a frame of an {@link AnimatedImageDrawable} produced by {@link ImageDecoder}.
+ *  This is called before the requested object is returned.</p>
  *
- *  <p>This custom processing also applies to image types that are otherwise
- *  immutable, such as {@link Bitmap.Config#HARDWARE}.</p>
+ *  <p>This custom processing can even be applied to images that will be returned
+ *  as immutable objects, such as a {@link Bitmap} with {@code Config}
+ *  {@link Bitmap.Config#HARDWARE} returned by {@link ImageDecoder}.</p>
  *
- *  <p>On an animated image, the callback will only be called once, but the drawing
- *  commands will be applied to each frame, as if the {@code Canvas} had been
- *  returned by {@link Picture#beginRecording}.<p>
+ *  <p>On an {@link AnimatedImageDrawable}, the callback will only be called once,
+ *  but the drawing commands will be applied to each frame, as if the {@link Canvas}
+ *  had been returned by {@link Picture#beginRecording Picture.beginRecording}.<p>
  *
- *  <p>Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor}.</p>
+ *  <p>Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor setPostProcessor}.</p>
  */
 public interface PostProcessor {
     /**
@@ -43,43 +44,44 @@
      *  <p>Drawing to the {@link Canvas} will behave as if the initial processing
      *  (e.g. decoding) already exists in the Canvas. An implementation can draw
      *  effects on top of this, or it can even draw behind it using
-     *  {@link PorterDuff.Mode#DST_OVER}. A common effect is to add transparency
-     *  to the corners to achieve rounded corners. That can be done with the
-     *  following code:</p>
+     *  {@link PorterDuff.Mode#DST_OVER PorterDuff.Mode.DST_OVER}. A common
+     *  effect is to add transparency to the corners to achieve rounded corners.
+     *  That can be done with the following code:</p>
      *
-     *  <code>
-     *      Path path = new Path();
-     *      path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
-     *      int width = canvas.getWidth();
-     *      int height = canvas.getHeight();
-     *      path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
-     *      Paint paint = new Paint();
-     *      paint.setAntiAlias(true);
-     *      paint.setColor(Color.TRANSPARENT);
-     *      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
-     *      canvas.drawPath(path, paint);
-     *      return PixelFormat.TRANSLUCENT;
-     *  </code>
+     *  <pre class="prettyprint">
+     *  Path path = new Path();
+     *  path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
+     *  int width = canvas.getWidth();
+     *  int height = canvas.getHeight();
+     *  path.addRoundRect(0, 0, width, height, 20, 20, Path.Direction.CW);
+     *  Paint paint = new Paint();
+     *  paint.setAntiAlias(true);
+     *  paint.setColor(Color.TRANSPARENT);
+     *  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
+     *  canvas.drawPath(path, paint);
+     *  return PixelFormat.TRANSLUCENT;
+     *  </pre>
      *
      *
      *  @param canvas The {@link Canvas} to draw to.
      *  @return Opacity of the result after drawing.
-     *      {@link PixelFormat#UNKNOWN} means that the implementation did not
-     *      change whether the image has alpha. Return this unless you added
-     *      transparency (e.g. with the code above, in which case you should
-     *      return {@code PixelFormat.TRANSLUCENT}) or you forced the image to
-     *      be opaque (e.g. by drawing everywhere with an opaque color and
-     *      {@code PorterDuff.Mode.DST_OVER}, in which case you should return
-     *      {@code PixelFormat.OPAQUE}).
-     *      {@link PixelFormat#TRANSLUCENT} means that the implementation added
-     *      transparency. This is safe to return even if the image already had
-     *      transparency. This is also safe to return if the result is opaque,
-     *      though it may draw more slowly.
-     *      {@link PixelFormat#OPAQUE} means that the implementation forced the
-     *      image to be opaque. This is safe to return even if the image was
-     *      already opaque.
-     *      {@link PixelFormat#TRANSPARENT} (or any other integer) is not
-     *      allowed, and will result in throwing an
+     *      {@link PixelFormat#UNKNOWN PixelFormat.UNKNOWN} means that the
+     *      implementation did not change whether the image has alpha. Return
+     *      this unless you added transparency (e.g. with the code above, in
+     *      which case you should return
+     *      {@link PixelFormat#TRANSLUCENT PixelFormat.TRANSLUCENT}) or you
+     *      forced the image to be opaque (e.g. by drawing everywhere with an
+     *      opaque color and {@link PorterDuff.Mode#DST_OVER PorterDuff.Mode.DST_OVER},
+     *      in which case you should return {@link PixelFormat#OPAQUE PixelFormat.OPAQUE}).
+     *      {@link PixelFormat#TRANSLUCENT PixelFormat.TRANSLUCENT} means that
+     *      the implementation added transparency. This is safe to return even
+     *      if the image already had transparency. This is also safe to return
+     *      if the result is opaque, though it may draw more slowly.
+     *      {@link PixelFormat#OPAQUE PixelFormat.OPAQUE} means that the
+     *      implementation forced the image to be opaque. This is safe to return
+     *      even if the image was already opaque.
+     *      {@link PixelFormat#TRANSPARENT PixelFormat.TRANSPARENT} (or any other
+     *      integer) is not allowed, and will result in throwing an
      *      {@link java.lang.IllegalArgumentException}.
      */
     @PixelFormat.Opacity
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 20c22b7..18dd97f 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -738,6 +738,23 @@
     /**
      * Creates a typeface object that best matches the specified existing typeface and the specified
      * weight and italic style
+     * <p>Below are numerical values and corresponding common weight names.</p>
+     * <table>
+     * <thead>
+     * <tr><th>Value</th><th>Common weight name</th></tr>
+     * </thead>
+     * <tbody>
+     * <tr><td>100</td><td>Thin</td></tr>
+     * <tr><td>200</td><td>Extra Light</td></tr>
+     * <tr><td>300</td><td>Light</td></tr>
+     * <tr><td>400</td><td>Normal</td></tr>
+     * <tr><td>500</td><td>Medium</td></tr>
+     * <tr><td>600</td><td>Semi Bold</td></tr>
+     * <tr><td>700</td><td>Bold</td></tr>
+     * <tr><td>800</td><td>Extra Bold</td></tr>
+     * <tr><td>900</td><td>Black</td></tr>
+     * </tbody>
+     * </table>
      *
      * <p>
      * This method is thread safe.
@@ -749,6 +766,9 @@
      * @param italic {@code true} if italic style is desired to be drawn. Otherwise, {@code false}
      * @return A {@link Typeface} object for drawing specified weight and italic style. Never
      *         returns {@code null}
+     *
+     * @see #getWeight()
+     * @see #isItalic()
      */
     public static @NonNull Typeface create(@Nullable Typeface family,
             @IntRange(from = 1, to = 1000) int weight, boolean italic) {
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
index e4cf84a..cc80560 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreBCWorkaroundProvider.java
@@ -93,15 +93,17 @@
         putSymmetricCipherImpl("AES/CTR/NoPadding",
                 PACKAGE_NAME + ".AndroidKeyStoreUnauthenticatedAESCipherSpi$CTR$NoPadding");
 
-        putSymmetricCipherImpl("DESede/CBC/NoPadding",
+        if ("true".equals(System.getProperty("supports3DES"))) {
+            putSymmetricCipherImpl("DESede/CBC/NoPadding",
                 PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$NoPadding");
-        putSymmetricCipherImpl("DESede/CBC/PKCS7Padding",
+            putSymmetricCipherImpl("DESede/CBC/PKCS7Padding",
                 PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$CBC$PKCS7Padding");
 
-        putSymmetricCipherImpl("DESede/ECB/NoPadding",
+            putSymmetricCipherImpl("DESede/ECB/NoPadding",
                 PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$NoPadding");
-        putSymmetricCipherImpl("DESede/ECB/PKCS7Padding",
+            putSymmetricCipherImpl("DESede/ECB/PKCS7Padding",
                 PACKAGE_NAME + ".AndroidKeyStore3DESCipherSpi$ECB$PKCS7Padding");
+        }
 
         putSymmetricCipherImpl("AES/GCM/NoPadding",
                 PACKAGE_NAME + ".AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding");
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
index d68a33d..5fc742a 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -475,6 +475,12 @@
 
             success = true;
             return keyPair;
+        } catch (ProviderException e) {
+          if ((mSpec.getPurposes() & KeyProperties.PURPOSE_WRAP_KEY) != 0) {
+              throw new SecureKeyImportUnavailableException(e);
+          } else {
+              throw e;
+          }
         } finally {
             if (!success) {
                 Credentials.deleteAllTypesForAlias(mKeyStore, mEntryAlias, mEntryUid);
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
index 2c45d43..9b7695d 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreProvider.java
@@ -67,6 +67,8 @@
     public AndroidKeyStoreProvider() {
         super(PROVIDER_NAME, 1.0, "Android KeyStore security provider");
 
+        boolean supports3DES = "true".equals(System.getProperty("supports3DES"));
+
         // java.security.KeyStore
         put("KeyStore.AndroidKeyStore", PACKAGE_NAME + ".AndroidKeyStoreSpi");
 
@@ -80,16 +82,21 @@
 
         // javax.crypto.KeyGenerator
         put("KeyGenerator.AES", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$AES");
-        put("KeyGenerator.DESede", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$DESede");
         put("KeyGenerator.HmacSHA1", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA1");
         put("KeyGenerator.HmacSHA224", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA224");
         put("KeyGenerator.HmacSHA256", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA256");
         put("KeyGenerator.HmacSHA384", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA384");
         put("KeyGenerator.HmacSHA512", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$HmacSHA512");
 
+        if (supports3DES) {
+            put("KeyGenerator.DESede", PACKAGE_NAME + ".AndroidKeyStoreKeyGeneratorSpi$DESede");
+        }
+
         // java.security.SecretKeyFactory
         putSecretKeyFactoryImpl("AES");
-        putSecretKeyFactoryImpl("DESede");
+        if (supports3DES) {
+            putSecretKeyFactoryImpl("DESede");
+        }
         putSecretKeyFactoryImpl("HmacSHA1");
         putSecretKeyFactoryImpl("HmacSHA224");
         putSecretKeyFactoryImpl("HmacSHA256");
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
index fc86ca0..3e9853c 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
@@ -26,6 +26,7 @@
 import android.security.keymaster.KeymasterDefs;
 import android.security.keystore.KeyProperties;
 import android.security.keystore.KeyProtection;
+import android.security.keystore.SecureKeyImportUnavailableException;
 import android.security.keystore.WrappedKeyEntry;
 import android.util.Log;
 
@@ -755,7 +756,9 @@
             0, // FIXME fingerprint id?
             mUid,
             new KeyCharacteristics());
-        if (errorCode != KeyStore.NO_ERROR) {
+        if (errorCode == KeymasterDefs.KM_ERROR_UNIMPLEMENTED) {
+          throw new SecureKeyImportUnavailableException("Could not import wrapped key");
+        } else if (errorCode != KeyStore.NO_ERROR) {
             throw new KeyStoreException("Failed to import wrapped key. Keystore error code: "
                 + errorCode);
         }
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index c342acd..c0d0fb0 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -259,7 +259,7 @@
     private final boolean mRandomizedEncryptionRequired;
     private final boolean mUserAuthenticationRequired;
     private final int mUserAuthenticationValidityDurationSeconds;
-    private final boolean mTrustedUserPresenceRequred;
+    private final boolean mUserPresenceRequired;
     private final byte[] mAttestationChallenge;
     private final boolean mUniqueIdIncluded;
     private final boolean mUserAuthenticationValidWhileOnBody;
@@ -291,7 +291,7 @@
             boolean randomizedEncryptionRequired,
             boolean userAuthenticationRequired,
             int userAuthenticationValidityDurationSeconds,
-            boolean trustedUserPresenceRequired,
+            boolean userPresenceRequired,
             byte[] attestationChallenge,
             boolean uniqueIdIncluded,
             boolean userAuthenticationValidWhileOnBody,
@@ -339,7 +339,7 @@
         mBlockModes = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(blockModes));
         mRandomizedEncryptionRequired = randomizedEncryptionRequired;
         mUserAuthenticationRequired = userAuthenticationRequired;
-        mTrustedUserPresenceRequred = trustedUserPresenceRequired;
+        mUserPresenceRequired = userPresenceRequired;
         mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
         mAttestationChallenge = Utils.cloneIfNotNull(attestationChallenge);
         mUniqueIdIncluded = uniqueIdIncluded;
@@ -595,8 +595,8 @@
      * Returns {@code true} if the key is authorized to be used only if a test of user presence has
      * been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
      */
-    public boolean isTrustedUserPresenceRequired() {
-        return mTrustedUserPresenceRequred;
+    public boolean isUserPresenceRequired() {
+        return mUserPresenceRequired;
     }
 
     /**
@@ -673,7 +673,9 @@
     }
 
     /**
-     * Returns {@code true} if the key cannot be used unless the device screen is unlocked.
+     * Returns {@code true} if the screen must be unlocked for this key to be used for encryption or
+     * signing. Decryption and signature verification will still be available when the screen is
+     * locked.
      *
      * @see Builder#setUnlockedDeviceRequired(boolean)
      */
@@ -712,7 +714,7 @@
         private boolean mRandomizedEncryptionRequired = true;
         private boolean mUserAuthenticationRequired;
         private int mUserAuthenticationValidityDurationSeconds = -1;
-        private boolean mTrustedUserPresenceRequired = false;
+        private boolean mUserPresenceRequired = false;
         private byte[] mAttestationChallenge = null;
         private boolean mUniqueIdIncluded = false;
         private boolean mUserAuthenticationValidWhileOnBody;
@@ -775,7 +777,7 @@
             mUserAuthenticationRequired = sourceSpec.isUserAuthenticationRequired();
             mUserAuthenticationValidityDurationSeconds =
                 sourceSpec.getUserAuthenticationValidityDurationSeconds();
-            mTrustedUserPresenceRequired = sourceSpec.isTrustedUserPresenceRequired();
+            mUserPresenceRequired = sourceSpec.isUserPresenceRequired();
             mAttestationChallenge = sourceSpec.getAttestationChallenge();
             mUniqueIdIncluded = sourceSpec.isUniqueIdIncluded();
             mUserAuthenticationValidWhileOnBody = sourceSpec.isUserAuthenticationValidWhileOnBody();
@@ -1180,8 +1182,8 @@
          * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
          */
         @NonNull
-        public Builder setTrustedUserPresenceRequired(boolean required) {
-            mTrustedUserPresenceRequired = required;
+        public Builder setUserPresenceRequired(boolean required) {
+            mUserPresenceRequired = required;
             return this;
         }
 
@@ -1289,9 +1291,10 @@
 
         /**
          * Sets whether the keystore requires the screen to be unlocked before allowing decryption
-         * using this key. If this is set to {@code true}, any attempt to decrypt using this key
-         * while the screen is locked will fail. A locked device requires a PIN, password,
-         * fingerprint, or other trusted factor to access.
+         * using this key. If this is set to {@code true}, any attempt to decrypt or sign using this
+         * key while the screen is locked will fail. A locked device requires a PIN, password,
+         * fingerprint, or other trusted factor to access. While the screen is locked, the key can
+         * still be used for encryption or signature verification.
          */
         @NonNull
         public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
@@ -1324,7 +1327,7 @@
                     mRandomizedEncryptionRequired,
                     mUserAuthenticationRequired,
                     mUserAuthenticationValidityDurationSeconds,
-                    mTrustedUserPresenceRequired,
+                    mUserPresenceRequired,
                     mAttestationChallenge,
                     mUniqueIdIncluded,
                     mUserAuthenticationValidWhileOnBody,
diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java
index f54b6de..f12a659 100644
--- a/keystore/java/android/security/keystore/KeyProperties.java
+++ b/keystore/java/android/security/keystore/KeyProperties.java
@@ -689,7 +689,11 @@
      */
     public static final int ORIGIN_UNKNOWN = 1 << 2;
 
-    /** Key was imported into the AndroidKeyStore in an encrypted wrapper */
+    /**
+     * Key was imported into the AndroidKeyStore in an encrypted wrapper. Unlike imported keys,
+     * securely imported keys can be imported without appearing as plaintext in the device's host
+     * memory.
+     */
     public static final int ORIGIN_SECURELY_IMPORTED = 1 << 3;
 
 
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 22568ce..41dc201 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -224,7 +224,7 @@
     private final boolean mRandomizedEncryptionRequired;
     private final boolean mUserAuthenticationRequired;
     private final int mUserAuthenticationValidityDurationSeconds;
-    private final boolean mTrustedUserPresenceRequired;
+    private final boolean mUserPresenceRequred;
     private final boolean mUserAuthenticationValidWhileOnBody;
     private final boolean mInvalidatedByBiometricEnrollment;
     private final long mBoundToSecureUserId;
@@ -244,7 +244,7 @@
             boolean randomizedEncryptionRequired,
             boolean userAuthenticationRequired,
             int userAuthenticationValidityDurationSeconds,
-            boolean trustedUserPresenceRequired,
+            boolean userPresenceRequred,
             boolean userAuthenticationValidWhileOnBody,
             boolean invalidatedByBiometricEnrollment,
             long boundToSecureUserId,
@@ -264,7 +264,7 @@
         mRandomizedEncryptionRequired = randomizedEncryptionRequired;
         mUserAuthenticationRequired = userAuthenticationRequired;
         mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds;
-        mTrustedUserPresenceRequired = trustedUserPresenceRequired;
+        mUserPresenceRequred = userPresenceRequred;
         mUserAuthenticationValidWhileOnBody = userAuthenticationValidWhileOnBody;
         mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
         mBoundToSecureUserId = boundToSecureUserId;
@@ -445,9 +445,12 @@
     /**
      * Returns {@code true} if the key is authorized to be used only if a test of user presence has
      * been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
+     * It requires that the KeyStore implementation have a direct way to validate the user presence
+     * for example a KeyStore hardware backed strongbox can use a button press that is observable
+     * in hardware.
      */
-    public boolean isTrustedUserPresenceRequired() {
-        return mTrustedUserPresenceRequired;
+    public boolean isUserPresenceRequired() {
+        return mUserPresenceRequred;
     }
 
     /**
@@ -508,7 +511,9 @@
     }
 
     /**
-     * Returns {@code true} if the key cannot be used unless the device screen is unlocked.
+     * Returns {@code true} if the screen must be unlocked for this key to be used for encryption or
+     * signing. Decryption and signature verification will still be available when the screen is
+     * locked.
      *
      * @see Builder#setUnlockedDeviceRequired(boolean)
      */
@@ -532,7 +537,7 @@
         private boolean mRandomizedEncryptionRequired = true;
         private boolean mUserAuthenticationRequired;
         private int mUserAuthenticationValidityDurationSeconds = -1;
-        private boolean mTrustedUserPresenceRequired = false;
+        private boolean mUserPresenceRequired = false;
         private boolean mUserAuthenticationValidWhileOnBody;
         private boolean mInvalidatedByBiometricEnrollment = true;
         private boolean mUserConfirmationRequired;
@@ -841,8 +846,8 @@
          * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
          */
         @NonNull
-        public Builder setTrustedUserPresenceRequired(boolean required) {
-            mTrustedUserPresenceRequired = required;
+        public Builder setUserPresenceRequired(boolean required) {
+            mUserPresenceRequired = required;
             return this;
         }
 
@@ -929,9 +934,10 @@
 
         /**
          * Sets whether the keystore requires the screen to be unlocked before allowing decryption
-         * using this key. If this is set to {@code true}, any attempt to decrypt using this key
-         * while the screen is locked will fail. A locked device requires a PIN, password,
-         * fingerprint, or other trusted factor to access.
+         * using this key. If this is set to {@code true}, any attempt to decrypt or sign using this
+         * key while the screen is locked will fail. A locked device requires a PIN, password,
+         * fingerprint, or other trusted factor to access. While the screen is locked, the key can
+         * still be used for encryption or signature verification.
          */
         @NonNull
         public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
@@ -958,7 +964,7 @@
                     mRandomizedEncryptionRequired,
                     mUserAuthenticationRequired,
                     mUserAuthenticationValidityDurationSeconds,
-                    mTrustedUserPresenceRequired,
+                    mUserPresenceRequired,
                     mUserAuthenticationValidWhileOnBody,
                     mInvalidatedByBiometricEnrollment,
                     mBoundToSecureUserId,
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 14a9970..f829bb7 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -106,7 +106,7 @@
             args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
         }
 
-        if (spec.isTrustedUserPresenceRequired()) {
+        if (spec.isUserPresenceRequired()) {
             args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
         }
 
diff --git a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
index e5fdea7..911bbf8 100644
--- a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java
@@ -101,7 +101,7 @@
         out.writeBoolean(mSpec.isUniqueIdIncluded());
         out.writeBoolean(mSpec.isUserAuthenticationValidWhileOnBody());
         out.writeBoolean(mSpec.isInvalidatedByBiometricEnrollment());
-        out.writeBoolean(mSpec.isTrustedUserPresenceRequired());
+        out.writeBoolean(mSpec.isUserPresenceRequired());
     }
 
     private static Date readDateOrNull(Parcel in) {
@@ -165,7 +165,7 @@
         builder.setUniqueIdIncluded(in.readBoolean());
         builder.setUserAuthenticationValidWhileOnBody(in.readBoolean());
         builder.setInvalidatedByBiometricEnrollment(in.readBoolean());
-        builder.setTrustedUserPresenceRequired(in.readBoolean());
+        builder.setUserPresenceRequired(in.readBoolean());
         mSpec = builder.build();
     }
 
diff --git a/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
new file mode 100644
index 0000000..d1cc572
--- /dev/null
+++ b/keystore/java/android/security/keystore/SecureKeyImportUnavailableException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.keystore;
+
+import android.security.KeyStore;
+import android.security.KeyStoreException;
+
+import java.security.ProviderException;
+
+/**
+ * Indicates that the Keystore does not support securely importing wrapped keys.
+ */
+public class SecureKeyImportUnavailableException extends ProviderException {
+
+    public SecureKeyImportUnavailableException() {
+        super();
+    }
+
+    public SecureKeyImportUnavailableException(String message) {
+        super(message, new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE,
+                "Secure Key Import not available"));
+    }
+
+    public SecureKeyImportUnavailableException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public SecureKeyImportUnavailableException(Throwable cause) {
+        super(cause);
+    }
+}
+
diff --git a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
index 66a77ed..6c7e9a9 100644
--- a/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
+++ b/keystore/java/android/security/keystore/StrongBoxUnavailableException.java
@@ -27,13 +27,22 @@
  */
 public class StrongBoxUnavailableException extends ProviderException {
 
-    /**
-     * @hide
-     */
+    public StrongBoxUnavailableException() {
+        super();
+    }
+
     public StrongBoxUnavailableException(String message) {
         super(message,
                 new KeyStoreException(KeyStore.HARDWARE_TYPE_UNAVAILABLE, "No StrongBox available")
         );
     }
+
+    public StrongBoxUnavailableException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    public StrongBoxUnavailableException(Throwable cause) {
+        super(cause);
+    }
 }
 
diff --git a/keystore/java/android/security/keystore/UserAuthArgs.java b/keystore/java/android/security/keystore/UserAuthArgs.java
index ad18ff8..6952060 100644
--- a/keystore/java/android/security/keystore/UserAuthArgs.java
+++ b/keystore/java/android/security/keystore/UserAuthArgs.java
@@ -32,7 +32,6 @@
     boolean isInvalidatedByBiometricEnrollment();
     boolean isUserConfirmationRequired();
     long getBoundToSpecificSecureUserId();
-    boolean isTrustedUserPresenceRequired();
+    boolean isUserPresenceRequired();
     boolean isUnlockedDeviceRequired();
-
 }
diff --git a/keystore/java/android/security/keystore/UserPresenceUnavailableException.java b/keystore/java/android/security/keystore/UserPresenceUnavailableException.java
index cf4099e..1b053a5 100644
--- a/keystore/java/android/security/keystore/UserPresenceUnavailableException.java
+++ b/keystore/java/android/security/keystore/UserPresenceUnavailableException.java
@@ -16,13 +16,13 @@
 
 package android.security.keystore;
 
-import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
 
 /**
  * Indicates the condition that a proof of user-presence was
  * requested but this proof was not presented.
  */
-public class UserPresenceUnavailableException extends InvalidAlgorithmParameterException {
+public class UserPresenceUnavailableException extends InvalidKeyException {
     /**
      * Constructs a {@code UserPresenceUnavailableException} without a detail message or cause.
      */
diff --git a/keystore/java/android/security/keystore/WrappedKeyEntry.java b/keystore/java/android/security/keystore/WrappedKeyEntry.java
index a8f4afe..7155686 100644
--- a/keystore/java/android/security/keystore/WrappedKeyEntry.java
+++ b/keystore/java/android/security/keystore/WrappedKeyEntry.java
@@ -21,7 +21,55 @@
 import java.security.spec.AlgorithmParameterSpec;
 
 /**
- * An {@link Entry} that holds a wrapped key.
+ * An {@link Entry} that holds a wrapped key. Wrapped keys contain encrypted key data and
+ * description information that can be used to securely import key material into a hardware-backed
+ * Keystore.
+ *
+ * <p>
+ *   The wrapped key is in DER-encoded ASN.1 format, specified by the following schema:
+ * </p>
+ *
+ * <pre>
+ *     KeyDescription ::= SEQUENCE(
+ *         keyFormat INTEGER,                   # Values from KeyFormat enum.
+ *         keyParams AuthorizationList,
+ *     )
+ *
+ *     SecureKeyWrapper ::= SEQUENCE(
+ *         version INTEGER,                     # Contains value 0
+ *         encryptedTransportKey OCTET_STRING,
+ *         initializationVector OCTET_STRING,
+ *         keyDescription KeyDescription,
+ *         encryptedKey OCTET_STRING,
+ *         tag OCTET_STRING
+ *     )
+ * </pre>
+ * <ul>
+ *     <li>keyFormat is an integer from the KeyFormat enum, defining the format of the plaintext
+ *       key material.
+ *     </li>
+ *     <li>keyParams is the characteristics of the key to be imported (as with generateKey or
+ *       importKey).  If the secure import is successful, these characteristics must be
+ *       associated with the key exactly as if the key material had been insecurely imported
+ *       with importKey. See <a href="https://developer.android.com/training/articles/security-key-attestation.html#certificate_schema">Key Attestation</a> for the AuthorizationList format.
+ *     </li>
+ *     <li>encryptedTransportKey is a 256-bit AES key, XORed with a masking key and then encrypted
+ *       in RSA-OAEP mode (SHA-256 digest, SHA-1 MGF1 digest) with the wrapping key specified by
+ *       wrappingKeyBlob.
+ *     </li>
+ *     <li>keyDescription is a KeyDescription, above.
+ *     </li>
+ *     <li>encryptedKey is the key material of the key to be imported, in format keyFormat, and
+ *       encrypted with encryptedEphemeralKey in AES-GCM mode, with the DER-encoded
+ *       representation of keyDescription provided as additional authenticated data.
+ *     </li>
+ *     <li>tag is the tag produced by the AES-GCM encryption of encryptedKey.
+ *     </li>
+ *</ul>
+ *
+ * <p>
+ *     Imported wrapped keys will have KeymasterDefs.KM_ORIGIN_SECURELY_IMPORTED
+ * </p>
  */
 public class WrappedKeyEntry implements Entry {
 
@@ -30,6 +78,14 @@
     private final String mTransformation;
     private final AlgorithmParameterSpec mAlgorithmParameterSpec;
 
+    /**
+     * Constructs a {@link WrappedKeyEntry} with a binary wrapped key.
+     *
+     * @param wrappedKeyBytes ASN.1 DER encoded wrapped key
+     * @param wrappingKeyAlias identifies the private key that can unwrap the wrapped key
+     * @param transformation used to unwrap the key. ex: "RSA/ECB/OAEPPadding"
+     * @param algorithmParameterSpec spec for the private key used to unwrap the wrapped key
+     */
     public WrappedKeyEntry(byte[] wrappedKeyBytes, String wrappingKeyAlias, String transformation,
             AlgorithmParameterSpec algorithmParameterSpec) {
         mWrappedKeyBytes = wrappedKeyBytes;
@@ -54,3 +110,4 @@
         return mAlgorithmParameterSpec;
     }
 }
+
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index d9f1293..5460b3b 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -596,7 +596,7 @@
   const ResTable_map* const map_entry_end = map_entry + dtohl(map->count);
 
   uint32_t parent_resid = dtohl(map->parent.ident);
-  if (parent_resid == 0) {
+  if (parent_resid == 0 || parent_resid == resid) {
     // There is no parent, meaning there is nothing to inherit and we can do a simple
     // copy of the entries in the map.
     const size_t entry_count = map_entry_end - map_entry;
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 6268c40..7d4e6f8 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -456,6 +456,22 @@
 
     uninit();
 
+    // The chunk must be at least the size of the string pool header.
+    if (size < sizeof(ResStringPool_header)) {
+        LOG_ALWAYS_FATAL("Bad string block: data size %zu is too small to be a string block", size);
+        return (mError=BAD_TYPE);
+    }
+
+    // The data is at least as big as a ResChunk_header, so we can safely validate the other
+    // header fields.
+    // `data + size` is safe because the source of `size` comes from the kernel/filesystem.
+    if (validate_chunk(reinterpret_cast<const ResChunk_header*>(data), sizeof(ResStringPool_header),
+                       reinterpret_cast<const uint8_t*>(data) + size,
+                       "ResStringPool_header") != NO_ERROR) {
+        LOG_ALWAYS_FATAL("Bad string block: malformed block dimensions");
+        return (mError=BAD_TYPE);
+    }
+
     const bool notDeviceEndian = htods(0xf0) != 0xf0;
 
     if (copyData || notDeviceEndian) {
@@ -467,6 +483,8 @@
         data = mOwnedData;
     }
 
+    // The size has been checked, so it is safe to read the data in the ResStringPool_header
+    // data structure.
     mHeader = (const ResStringPool_header*)data;
 
     if (notDeviceEndian) {
@@ -727,11 +745,42 @@
                 if ((uint32_t)(u8str+u8len-strings) < mStringPoolSize) {
                     AutoMutex lock(mDecodeLock);
 
+                    if (mCache != NULL && mCache[idx] != NULL) {
+                        return mCache[idx];
+                    }
+
+                    // Retrieve the actual length of the utf8 string if the
+                    // encoded length was truncated
+                    if (stringDecodeAt(idx, u8str, u8len, &u8len) == NULL) {
+                        return NULL;
+                    }
+
+                    // Since AAPT truncated lengths longer than 0x7FFF, check
+                    // that the bits that remain after truncation at least match
+                    // the bits of the actual length
+                    ssize_t actualLen = utf8_to_utf16_length(u8str, u8len);
+                    if (actualLen < 0 || ((size_t)actualLen & 0x7FFF) != *u16len) {
+                        ALOGW("Bad string block: string #%lld decoded length is not correct "
+                                "%lld vs %llu\n",
+                                (long long)idx, (long long)actualLen, (long long)*u16len);
+                        return NULL;
+                    }
+
+                    *u16len = (size_t) actualLen;
+                    char16_t *u16str = (char16_t *)calloc(*u16len+1, sizeof(char16_t));
+                    if (!u16str) {
+                        ALOGW("No memory when trying to allocate decode cache for string #%d\n",
+                                (int)idx);
+                        return NULL;
+                    }
+
+                    utf8_to_utf16(u8str, u8len, u16str, *u16len + 1);
+
                     if (mCache == NULL) {
 #ifndef __ANDROID__
                         if (kDebugStringPoolNoisy) {
                             ALOGI("CREATING STRING CACHE OF %zu bytes",
-                                    mHeader->stringCount*sizeof(char16_t**));
+                                  mHeader->stringCount*sizeof(char16_t**));
                         }
 #else
                         // We do not want to be in this case when actually running Android.
@@ -741,41 +790,15 @@
                         mCache = (char16_t**)calloc(mHeader->stringCount, sizeof(char16_t*));
                         if (mCache == NULL) {
                             ALOGW("No memory trying to allocate decode cache table of %d bytes\n",
-                                    (int)(mHeader->stringCount*sizeof(char16_t**)));
+                                  (int)(mHeader->stringCount*sizeof(char16_t**)));
                             return NULL;
                         }
                     }
 
-                    if (mCache[idx] != NULL) {
-                        return mCache[idx];
-                    }
-
-                    ssize_t actualLen = utf8_to_utf16_length(u8str, u8len);
-                    if (actualLen < 0 || (size_t)actualLen != *u16len) {
-                        ALOGW("Bad string block: string #%lld decoded length is not correct "
-                                "%lld vs %llu\n",
-                                (long long)idx, (long long)actualLen, (long long)*u16len);
-                        return NULL;
-                    }
-
-                    // Reject malformed (non null-terminated) strings
-                    if (u8str[u8len] != 0x00) {
-                        ALOGW("Bad string block: string #%d is not null-terminated",
-                              (int)idx);
-                        return NULL;
-                    }
-
-                    char16_t *u16str = (char16_t *)calloc(*u16len+1, sizeof(char16_t));
-                    if (!u16str) {
-                        ALOGW("No memory when trying to allocate decode cache for string #%d\n",
-                                (int)idx);
-                        return NULL;
-                    }
-
                     if (kDebugStringPoolNoisy) {
-                        ALOGI("Caching UTF8 string: %s", u8str);
+                      ALOGI("Caching UTF8 string: %s", u8str);
                     }
-                    utf8_to_utf16(u8str, u8len, u16str, *u16len + 1);
+
                     mCache[idx] = u16str;
                     return u16str;
                 } else {
@@ -812,13 +835,8 @@
             *outLen = encLen;
 
             if ((uint32_t)(str+encLen-strings) < mStringPoolSize) {
-                // Reject malformed (non null-terminated) strings
-                if (str[encLen] != 0x00) {
-                    ALOGW("Bad string block: string #%d is not null-terminated",
-                          (int)idx);
-                    return NULL;
-                }
-              return (const char*)str;
+                return stringDecodeAt(idx, str, encLen, outLen);
+
             } else {
                 ALOGW("Bad string block: string #%d extends to %d, past end at %d\n",
                         (int)idx, (int)(str+encLen-strings), (int)mStringPoolSize);
@@ -832,6 +850,38 @@
     return NULL;
 }
 
+/**
+ * AAPT incorrectly writes a truncated string length when the string size
+ * exceeded the maximum possible encode length value (0x7FFF). To decode a
+ * truncated length, iterate through length values that end in the encode length
+ * bits. Strings that exceed the maximum encode length are not placed into
+ * StringPools in AAPT2.
+ **/
+const char* ResStringPool::stringDecodeAt(size_t idx, const uint8_t* str,
+                                          const size_t encLen, size_t* outLen) const {
+    const uint8_t* strings = (uint8_t*)mStrings;
+
+    size_t i = 0, end = encLen;
+    while ((uint32_t)(str+end-strings) < mStringPoolSize) {
+        if (str[end] == 0x00) {
+            if (i != 0) {
+                ALOGW("Bad string block: string #%d is truncated (actual length is %d)",
+                      (int)idx, (int)end);
+            }
+
+            *outLen = end;
+            return (const char*)str;
+        }
+
+        end = (++i << (sizeof(uint8_t) * 8 * 2 - 1)) | encLen;
+    }
+
+    // Reject malformed (non null-terminated) strings
+    ALOGW("Bad string block: string #%d is not null-terminated",
+          (int)idx);
+    return NULL;
+}
+
 const String8 ResStringPool::string8ObjectAt(size_t idx) const
 {
     size_t len;
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index a1f15f0..bc0a07a 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -538,6 +538,9 @@
     uint32_t                    mStringPoolSize;    // number of uint16_t
     const uint32_t*             mStyles;
     uint32_t                    mStylePoolSize;    // number of uint32_t
+
+    const char* stringDecodeAt(size_t idx, const uint8_t* str, const size_t encLen,
+                               size_t* outLen) const;
 };
 
 /**
diff --git a/libs/androidfw/tests/ResTable_test.cpp b/libs/androidfw/tests/ResTable_test.cpp
index 2df4130..326474e 100644
--- a/libs/androidfw/tests/ResTable_test.cpp
+++ b/libs/androidfw/tests/ResTable_test.cpp
@@ -424,4 +424,56 @@
   EXPECT_EQ(1, std::count(locales.begin(), locales.end(), String8("sv")));
 }
 
+TEST(ResTableTest, TruncatedEncodeLength) {
+  std::string contents;
+  ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/length_decode/length_decode_valid.apk",
+                                      "resources.arsc", &contents));
+
+  ResTable table;
+  ASSERT_EQ(NO_ERROR, table.add(contents.data(), contents.size()));
+
+  Res_value val;
+  ssize_t block = table.getResource(0x7f010001, &val, MAY_NOT_BE_BAG);
+  ASSERT_GE(block, 0);
+  ASSERT_EQ(Res_value::TYPE_STRING, val.dataType);
+
+  const ResStringPool* pool = table.getTableStringBlock(block);
+  ASSERT_TRUE(pool != NULL);
+  ASSERT_LT(val.data, pool->size());
+
+  // Make sure a string with a truncated length is read to its correct length
+  size_t str_len;
+  const char* target_str8 = pool->string8At(val.data, &str_len);
+  ASSERT_TRUE(target_str8 != NULL);
+  ASSERT_EQ(size_t(40076), String8(target_str8, str_len).size());
+  ASSERT_EQ(target_str8[40075], ']');
+
+  const char16_t* target_str16 = pool->stringAt(val.data, &str_len);
+  ASSERT_TRUE(target_str16 != NULL);
+  ASSERT_EQ(size_t(40076), String16(target_str16, str_len).size());
+  ASSERT_EQ(target_str8[40075], (char16_t) ']');
+
+  // Load an edited apk with the null terminator removed from the end of the
+  // string
+  std::string invalid_contents;
+  ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/length_decode/length_decode_invalid.apk",
+                                      "resources.arsc", &invalid_contents));
+  ResTable invalid_table;
+  ASSERT_EQ(NO_ERROR, invalid_table.add(invalid_contents.data(), invalid_contents.size()));
+
+  Res_value invalid_val;
+  ssize_t invalid_block = invalid_table.getResource(0x7f010001, &invalid_val, MAY_NOT_BE_BAG);
+  ASSERT_GE(invalid_block, 0);
+  ASSERT_EQ(Res_value::TYPE_STRING, invalid_val.dataType);
+
+  const ResStringPool* invalid_pool = invalid_table.getTableStringBlock(invalid_block);
+  ASSERT_TRUE(invalid_pool != NULL);
+  ASSERT_LT(invalid_val.data, invalid_pool->size());
+
+  // Make sure a string with a truncated length that is not null terminated errors
+  // and does not return the string
+  ASSERT_TRUE(invalid_pool->string8At(invalid_val.data, &str_len) == NULL);
+  ASSERT_TRUE(invalid_pool->stringAt(invalid_val.data, &str_len) == NULL);
+}
+
 }  // namespace android
diff --git a/libs/androidfw/tests/data/length_decode/length_decode_invalid.apk b/libs/androidfw/tests/data/length_decode/length_decode_invalid.apk
new file mode 100644
index 0000000..b089651
--- /dev/null
+++ b/libs/androidfw/tests/data/length_decode/length_decode_invalid.apk
Binary files differ
diff --git a/libs/androidfw/tests/data/length_decode/length_decode_valid.apk b/libs/androidfw/tests/data/length_decode/length_decode_valid.apk
new file mode 100644
index 0000000..add23e1
--- /dev/null
+++ b/libs/androidfw/tests/data/length_decode/length_decode_valid.apk
Binary files differ
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 35790b6..592a6e6 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -168,6 +168,7 @@
         "pipeline/skia/ReorderBarrierDrawables.cpp",
         "pipeline/skia/ShaderCache.cpp",
         "pipeline/skia/SkiaDisplayList.cpp",
+        "pipeline/skia/SkiaMemoryTracer.cpp",
         "pipeline/skia/SkiaOpenGLPipeline.cpp",
         "pipeline/skia/SkiaOpenGLReadback.cpp",
         "pipeline/skia/SkiaPipeline.cpp",
diff --git a/libs/hwui/ProfileData.cpp b/libs/hwui/ProfileData.cpp
index f9cf549..1696661 100644
--- a/libs/hwui/ProfileData.cpp
+++ b/libs/hwui/ProfileData.cpp
@@ -104,7 +104,8 @@
     dprintf(fd, "\nStats since: %" PRIu64 "ns", mStatStartTime);
     dprintf(fd, "\nTotal frames rendered: %u", mTotalFrameCount);
     dprintf(fd, "\nJanky frames: %u (%.2f%%)", mJankFrameCount,
-            (float)mJankFrameCount / (float)mTotalFrameCount * 100.0f);
+            mTotalFrameCount == 0 ? 0.0f :
+                (float)mJankFrameCount / (float)mTotalFrameCount * 100.0f);
     dprintf(fd, "\n50th percentile: %ums", findPercentile(50));
     dprintf(fd, "\n90th percentile: %ums", findPercentile(90));
     dprintf(fd, "\n95th percentile: %ums", findPercentile(95));
diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp
index 1602b4b..0a6c45b 100644
--- a/libs/hwui/Properties.cpp
+++ b/libs/hwui/Properties.cpp
@@ -65,6 +65,8 @@
 bool Properties::debuggingEnabled = false;
 bool Properties::isolatedProcess = false;
 
+int Properties::contextPriority = 0;
+
 static int property_get_int(const char* key, int defaultValue) {
     char buf[PROPERTY_VALUE_MAX] = {
             '\0',
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index 81a3657..764c502 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -271,6 +271,8 @@
     ANDROID_API static bool debuggingEnabled;
     ANDROID_API static bool isolatedProcess;
 
+    ANDROID_API static int contextPriority;
+
 private:
     static ProfileType sProfileType;
     static bool sDisableProfileBars;
diff --git a/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp b/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp
new file mode 100644
index 0000000..ee99622
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaMemoryTracer.cpp
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ */
+
+#include "SkiaMemoryTracer.h"
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+SkiaMemoryTracer::SkiaMemoryTracer(std::vector<ResourcePair> resourceMap, bool itemizeType)
+            : mResourceMap(resourceMap)
+            , mItemizeType(itemizeType)
+            , mTotalSize("bytes", 0)
+            , mPurgeableSize("bytes", 0) {}
+
+SkiaMemoryTracer::SkiaMemoryTracer(const char* categoryKey, bool itemizeType)
+            : mCategoryKey(categoryKey)
+            , mItemizeType(itemizeType)
+            , mTotalSize("bytes", 0)
+            , mPurgeableSize("bytes", 0) {}
+
+const char* SkiaMemoryTracer::mapName(const char* resourceName) {
+    for (auto& resource : mResourceMap) {
+        if (SkStrContains(resourceName, resource.first)) {
+            return resource.second;
+        }
+    }
+    return nullptr;
+}
+
+void SkiaMemoryTracer::processElement() {
+    if(!mCurrentElement.empty()) {
+        // Only count elements that contain "size", other values just provide metadata.
+        auto sizeResult = mCurrentValues.find("size");
+        if (sizeResult != mCurrentValues.end()) {
+            mTotalSize.value += sizeResult->second.value;
+            mTotalSize.count++;
+        } else {
+            mCurrentElement.clear();
+            mCurrentValues.clear();
+            return;
+        }
+
+        // find the purgeable size if one exists
+        auto purgeableResult = mCurrentValues.find("purgeable_size");
+        if (purgeableResult != mCurrentValues.end()) {
+            mPurgeableSize.value += purgeableResult->second.value;
+            mPurgeableSize.count++;
+        }
+
+        // find the type if one exists
+        const char* type;
+        auto typeResult = mCurrentValues.find("type");
+        if (typeResult != mCurrentValues.end()) {
+            type = typeResult->second.units;
+        } else if (mItemizeType) {
+            type = "Other";
+        }
+
+        // compute the type if we are itemizing or use the default "size" if we are not
+        const char* key = (mItemizeType) ? type : sizeResult->first;
+        SkASSERT(key != nullptr);
+
+        // compute the top level element name using either the map or category key
+        const char* resourceName = mapName(mCurrentElement.c_str());
+        if (mCategoryKey != nullptr) {
+            // find the category if one exists
+            auto categoryResult = mCurrentValues.find(mCategoryKey);
+            if (categoryResult != mCurrentValues.end()) {
+                resourceName = categoryResult->second.units;
+            } else if (mItemizeType) {
+                resourceName = "Other";
+            }
+        }
+
+        // if we don't have a resource name then we don't know how to label the
+        // data and should abort.
+        if (resourceName == nullptr) {
+            mCurrentElement.clear();
+            mCurrentValues.clear();
+            return;
+        }
+
+        auto result = mResults.find(resourceName);
+        if (result != mResults.end()) {
+            auto& resourceValues = result->second;
+            typeResult = resourceValues.find(key);
+            if (typeResult != resourceValues.end()) {
+                SkASSERT(sizeResult->second.units == typeResult->second.units);
+                typeResult->second.value += sizeResult->second.value;
+                typeResult->second.count++;
+            } else {
+                resourceValues.insert({key, sizeResult->second});
+            }
+        } else {
+            mCurrentValues.clear();
+            mCurrentValues.insert({key, sizeResult->second});
+            mResults.insert({resourceName, mCurrentValues});
+        }
+    }
+
+    mCurrentElement.clear();
+    mCurrentValues.clear();
+}
+
+void SkiaMemoryTracer::dumpNumericValue(const char* dumpName, const char* valueName,
+                                        const char* units, uint64_t value) {
+    if (mCurrentElement != dumpName) {
+        processElement();
+        mCurrentElement = dumpName;
+    }
+    mCurrentValues.insert({valueName, {units, value}});
+}
+
+void SkiaMemoryTracer::logOutput(String8& log) {
+    // process any remaining elements
+    processElement();
+
+    for (const auto& namedItem : mResults) {
+        if (mItemizeType) {
+            log.appendFormat("  %s:\n", namedItem.first.c_str());
+            for (const auto& typedValue : namedItem.second) {
+                TraceValue traceValue = convertUnits(typedValue.second);
+                const char* entry = (traceValue.count > 1) ? "entries" : "entry";
+                log.appendFormat("    %s: %.2f %s (%d %s)\n", typedValue.first,
+                                 traceValue.value, traceValue.units, traceValue.count, entry);
+            }
+        } else {
+            auto result = namedItem.second.find("size");
+            if (result != namedItem.second.end()) {
+                TraceValue traceValue = convertUnits(result->second);
+                const char* entry = (traceValue.count > 1) ? "entries" : "entry";
+                log.appendFormat("  %s: %.2f %s (%d %s)\n", namedItem.first.c_str(),
+                                 traceValue.value, traceValue.units, traceValue.count, entry);
+            }
+        }
+    }
+}
+
+void SkiaMemoryTracer::logTotals(String8& log) {
+    TraceValue total = convertUnits(mTotalSize);
+    TraceValue purgeable = convertUnits(mPurgeableSize);
+    log.appendFormat("  %.0f bytes, %.2f %s (%.2f %s is purgeable)\n", mTotalSize.value,
+                     total.value, total.units, purgeable.value, purgeable.units);
+}
+
+SkiaMemoryTracer::TraceValue SkiaMemoryTracer::convertUnits(const TraceValue& value) {
+    TraceValue output(value);
+    if (SkString("bytes") == SkString(output.units) && output.value >= 1024) {
+        output.value = output.value / 1024.0f;
+        output.units = "KB";
+    }
+    if (SkString("KB") == SkString(output.units) && output.value >= 1024) {
+        output.value = output.value / 1024.0f;
+        output.units = "MB";
+    }
+    return output;
+}
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
diff --git a/libs/hwui/pipeline/skia/SkiaMemoryTracer.h b/libs/hwui/pipeline/skia/SkiaMemoryTracer.h
new file mode 100644
index 0000000..abf1f4b
--- /dev/null
+++ b/libs/hwui/pipeline/skia/SkiaMemoryTracer.h
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <SkString.h>
+#include <SkTraceMemoryDump.h>
+#include <utils/String8.h>
+#include <unordered_map>
+#include <vector>
+
+namespace android {
+namespace uirenderer {
+namespace skiapipeline {
+
+typedef std::pair<const char*, const char*> ResourcePair;
+
+class SkiaMemoryTracer : public SkTraceMemoryDump {
+public:
+    SkiaMemoryTracer(std::vector<ResourcePair> resourceMap, bool itemizeType);
+    SkiaMemoryTracer(const char* categoryKey, bool itemizeType);
+    ~SkiaMemoryTracer() override {}
+
+    void logOutput(String8& log);
+    void logTotals(String8& log);
+
+    void dumpNumericValue(const char* dumpName, const char* valueName, const char* units,
+                          uint64_t value) override;
+
+    void dumpStringValue(const char* dumpName, const char* valueName, const char* value) override {
+        // for convenience we just store this in the same format as numerical values
+        dumpNumericValue(dumpName, valueName, value, 0);
+    }
+
+    LevelOfDetail getRequestedDetails() const override {
+        return SkTraceMemoryDump::kLight_LevelOfDetail;
+    }
+
+    bool shouldDumpWrappedObjects() const override { return true; }
+    void setMemoryBacking(const char*, const char*, const char*) override { }
+    void setDiscardableMemoryBacking(const char*, const SkDiscardableMemory&) override { }
+
+private:
+    struct TraceValue {
+        TraceValue(const char* units, uint64_t value) : units(units), value(value), count(1) {}
+        TraceValue(const TraceValue& v) : units(v.units), value(v.value), count(v.count) {}
+
+        const char* units;
+        float value;
+        int count;
+    };
+
+    const char* mapName(const char* resourceName);
+    void processElement();
+    TraceValue convertUnits(const TraceValue& value);
+
+    const std::vector<ResourcePair> mResourceMap;
+    const char* mCategoryKey = nullptr;
+    const bool mItemizeType;
+
+    // variables storing the size of all elements being dumped
+    TraceValue mTotalSize;
+    TraceValue mPurgeableSize;
+
+    // variables storing information on the current node being dumped
+    std::string mCurrentElement;
+    std::unordered_map<const char*, TraceValue> mCurrentValues;
+
+    // variable that stores the final format of the data after the individual elements are processed
+    std::unordered_map<std::string, std::unordered_map<const char*, TraceValue>> mResults;
+};
+
+} /* namespace skiapipeline */
+} /* namespace uirenderer */
+} /* namespace android */
\ No newline at end of file
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index 907f2d2..3ca9295 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -20,10 +20,12 @@
 #include "Properties.h"
 #include "RenderThread.h"
 #include "pipeline/skia/ShaderCache.h"
+#include "pipeline/skia/SkiaMemoryTracer.h"
 #include "renderstate/RenderState.h"
 
 #include <GrContextOptions.h>
 #include <SkExecutor.h>
+#include <SkGraphics.h>
 #include <gui/Surface.h>
 #include <math.h>
 #include <set>
@@ -149,7 +151,12 @@
             mGrContext->freeGpuResources();
             break;
         case TrimMemoryMode::UiHidden:
-            mGrContext->purgeUnlockedResources(mMaxResourceBytes - mBackgroundResourceBytes, true);
+            // Here we purge all the unlocked scratch resources and then toggle the resources cache
+            // limits between the background and max amounts. This causes the unlocked resources
+            // that have persistent data to be purged in LRU order.
+            mGrContext->purgeUnlockedResources(true);
+            mGrContext->setResourceCacheLimits(mMaxResources, mBackgroundResourceBytes);
+            mGrContext->setResourceCacheLimits(mMaxResources, mMaxResourceBytes);
             break;
     }
 }
@@ -159,7 +166,10 @@
         return;
     }
     mGrContext->flush();
-    mGrContext->purgeResourcesNotUsedInMs(std::chrono::seconds(30));
+    // Here we purge all the unlocked scratch resources (leaving those resources w/ persistent data)
+    // and then purge those w/ persistent data based on age.
+    mGrContext->purgeUnlockedResources(true);
+    mGrContext->purgeResourcesNotUsedInMs(std::chrono::seconds(10));
 }
 
 sp<skiapipeline::VectorDrawableAtlas> CacheManager::acquireVectorDrawableAtlas() {
@@ -178,12 +188,29 @@
         return;
     }
 
-    size_t bytesCached;
-    mGrContext->getResourceCacheUsage(nullptr, &bytesCached);
+    log.appendFormat("Font Cache (CPU):\n");
+    log.appendFormat("  Size: %.2f kB \n", SkGraphics::GetFontCacheUsed() / 1024.0f);
+    log.appendFormat("  Glyph Count: %d \n", SkGraphics::GetFontCacheCountUsed());
 
-    log.appendFormat("Caches:\n");
+    log.appendFormat("CPU Caches:\n");
+    std::vector<skiapipeline::ResourcePair> cpuResourceMap = {
+            {"skia/sk_resource_cache/bitmap_", "Bitmaps"},
+            {"skia/sk_resource_cache/rrect-blur_", "Masks"},
+            {"skia/sk_resource_cache/rects-blur_", "Masks"},
+            {"skia/sk_resource_cache/tessellated", "Shadows"},
+    };
+    skiapipeline::SkiaMemoryTracer cpuTracer(cpuResourceMap, false);
+    SkGraphics::DumpMemoryStatistics(&cpuTracer);
+    cpuTracer.logOutput(log);
+
+    log.appendFormat("GPU Caches:\n");
+    skiapipeline::SkiaMemoryTracer gpuTracer("category", true);
+    mGrContext->dumpMemoryStatistics(&gpuTracer);
+    gpuTracer.logOutput(log);
+
+    log.appendFormat("Other Caches:\n");
     log.appendFormat("                         Current / Maximum\n");
-    log.appendFormat("  VectorDrawableAtlas  %6.2f kB / %6.2f kB (entries = %zu)\n", 0.0f, 0.0f,
+    log.appendFormat("  VectorDrawableAtlas  %6.2f kB / %6.2f KB (entries = %zu)\n", 0.0f, 0.0f,
                      (size_t)0);
 
     if (renderState) {
@@ -200,14 +227,12 @@
                              layer->getHeight());
             layerMemoryTotal += layer->getWidth() * layer->getHeight() * 4;
         }
-        log.appendFormat("  Layers Total         %6.2f kB (numLayers = %zu)\n",
+        log.appendFormat("  Layers Total         %6.2f KB (numLayers = %zu)\n",
                          layerMemoryTotal / 1024.0f, renderState->mActiveLayers.size());
     }
 
-    log.appendFormat("Total memory usage:\n");
-    log.appendFormat("  %zu bytes, %.2f MB (%.2f MB is purgeable)\n", bytesCached,
-                     bytesCached / 1024.0f / 1024.0f,
-                     mGrContext->getResourceCachePurgeableBytes() / 1024.0f / 1024.0f);
+    log.appendFormat("Total GPU memory usage:\n");
+    gpuTracer.logTotals(log);
 }
 
 } /* namespace renderthread */
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 5b87e10..6e239e3 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -82,6 +82,7 @@
     bool pixelFormatFloat = false;
     bool glColorSpace = false;
     bool scRGB = false;
+    bool contextPriority = false;
 } EglExtensions;
 
 EglManager::EglManager(RenderThread& thread)
@@ -168,6 +169,7 @@
 #else
     EglExtensions.scRGB = extensions.has("EGL_EXT_gl_colorspace_scrgb");
 #endif
+    EglExtensions.contextPriority = extensions.has("EGL_IMG_context_priority");
 }
 
 bool EglManager::hasEglContext() {
@@ -247,10 +249,18 @@
 }
 
 void EglManager::createContext() {
-    EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, GLES_VERSION, EGL_NONE};
+    std::vector<EGLint> contextAttributes;
+    contextAttributes.reserve(5);
+    contextAttributes.push_back(EGL_CONTEXT_CLIENT_VERSION);
+    contextAttributes.push_back(GLES_VERSION);
+    if (Properties::contextPriority != 0 && EglExtensions.contextPriority) {
+        contextAttributes.push_back(EGL_CONTEXT_PRIORITY_LEVEL_IMG);
+        contextAttributes.push_back(Properties::contextPriority);
+    }
+    contextAttributes.push_back(EGL_NONE);
     mEglContext = eglCreateContext(
             mEglDisplay, EglExtensions.noConfigContext ? ((EGLConfig) nullptr) : mEglConfig,
-            EGL_NO_CONTEXT, attribs);
+            EGL_NO_CONTEXT, contextAttributes.data());
     LOG_ALWAYS_FATAL_IF(mEglContext == EGL_NO_CONTEXT, "Failed to create context, error = %s",
                         eglErrorString());
 }
diff --git a/libs/hwui/tests/unit/CacheManagerTests.cpp b/libs/hwui/tests/unit/CacheManagerTests.cpp
index b1106f0..c235715 100644
--- a/libs/hwui/tests/unit/CacheManagerTests.cpp
+++ b/libs/hwui/tests/unit/CacheManagerTests.cpp
@@ -20,6 +20,8 @@
 #include "renderthread/EglManager.h"
 #include "tests/common/TestUtils.h"
 
+#include <SkImagePriv.h>
+
 using namespace android;
 using namespace android::uirenderer;
 using namespace android::uirenderer::renderthread;
@@ -49,7 +51,12 @@
         surfaces.push_back(surface);
     }
 
-    ASSERT_TRUE(1 < surfaces.size());
+    // create an image and pin it so that we have something with a unique key in the cache
+    sk_sp<Bitmap> bitmap =
+            Bitmap::allocateHeapBitmap(SkImageInfo::MakeA8(displayInfo.w, displayInfo.h));
+    sk_sp<SkColorFilter> filter;
+    sk_sp<SkImage> image = bitmap->makeImage(&filter);
+    ASSERT_TRUE(SkImage_pinAsTexture(image.get(), grContext));
 
     // attempt to trim all memory while we still hold strong refs
     renderThread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::Complete);
@@ -61,11 +68,14 @@
         surfaces[i].reset();
     }
 
+    // unpin the image which should add a unique purgeable key to the cache
+    SkImage_unpinAsTexture(image.get(), grContext);
+
     // verify that we have enough purgeable bytes
     const size_t purgeableBytes = grContext->getResourceCachePurgeableBytes();
     ASSERT_TRUE(renderThread.cacheManager().getBackgroundCacheSize() < purgeableBytes);
 
-    // UI hidden and make sure only some got purged
+    // UI hidden and make sure only some got purged (unique should remain)
     renderThread.cacheManager().trimMemory(CacheManager::TrimMemoryMode::UiHidden);
     ASSERT_TRUE(0 < grContext->getResourceCachePurgeableBytes());
     ASSERT_TRUE(renderThread.cacheManager().getBackgroundCacheSize() > getCacheUsage(grContext));
diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp
index 4f1d2d5..7ad83ca 100644
--- a/libs/protoutil/Android.bp
+++ b/libs/protoutil/Android.bp
@@ -37,3 +37,20 @@
         "liblog",
     ],
 }
+
+cc_test {
+    name: "libprotoutil_test",
+
+    srcs: [
+        "tests/EncodedBuffer_test.cpp",
+    ],
+
+    shared_libs: [
+        "libcutils",
+        "libprotoutil",
+    ],
+
+    static_libs: [
+        "libgmock",
+    ],
+}
diff --git a/libs/protoutil/AndroidTest.xml b/libs/protoutil/AndroidTest.xml
new file mode 100644
index 0000000..46d418e
--- /dev/null
+++ b/libs/protoutil/AndroidTest.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+<configuration description="Config for libprotoutil_test">
+    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+        <option name="cleanup" value="true" />
+        <option name="push" value="libprotoutil_test->/data/nativetest/libprotoutil_test" />
+    </target_preparer>
+    <option name="test-suite-tag" value="apct" />
+    <test class="com.android.tradefed.testtype.GTest" >
+        <option name="native-test-device-path" value="/data/nativetest" />
+        <option name="module-name" value="libprotoutil_test" />
+    </test>
+</configuration>
diff --git a/libs/protoutil/include/android/util/EncodedBuffer.h b/libs/protoutil/include/android/util/EncodedBuffer.h
index bf698d4..c84de4c 100644
--- a/libs/protoutil/include/android/util/EncodedBuffer.h
+++ b/libs/protoutil/include/android/util/EncodedBuffer.h
@@ -23,8 +23,6 @@
 namespace android {
 namespace util {
 
-using namespace std;
-
 /**
  * A stream of bytes containing a read pointer and a write pointer,
  * backed by a set of fixed-size buffers.  There are write functions for the
@@ -217,7 +215,7 @@
 
 private:
     size_t mChunkSize;
-    vector<uint8_t*> mBuffers;
+    std::vector<uint8_t*> mBuffers;
 
     Pointer mWp;
     Pointer mEp;
diff --git a/libs/protoutil/include/android/util/protobuf.h b/libs/protoutil/include/android/util/protobuf.h
index ca45e26..4b49ced 100644
--- a/libs/protoutil/include/android/util/protobuf.h
+++ b/libs/protoutil/include/android/util/protobuf.h
@@ -22,8 +22,6 @@
 namespace android {
 namespace util {
 
-using namespace std;
-
 const int FIELD_ID_SHIFT = 3;
 const uint8_t WIRE_TYPE_MASK = (1 << FIELD_ID_SHIFT) - 1;
 
diff --git a/libs/protoutil/src/EncodedBuffer.cpp b/libs/protoutil/src/EncodedBuffer.cpp
index 3a5e2e9..c017851 100644
--- a/libs/protoutil/src/EncodedBuffer.cpp
+++ b/libs/protoutil/src/EncodedBuffer.cpp
@@ -13,11 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+#define LOG_TAG "libprotoutil"
+
+#include <stdlib.h>
 
 #include <android/util/EncodedBuffer.h>
 #include <android/util/protobuf.h>
-
-#include <stdlib.h>
+#include <cutils/log.h>
 
 namespace android {
 namespace util {
@@ -228,7 +230,7 @@
     size_t start = mEp.pos();
     while (true) {
         uint8_t byte = readRawByte();
-        val += (byte & 0x7F) << shift;
+        val |= (UINT64_C(0x7F) & byte) << shift;
         if ((byte & 0x80) == 0) break;
         shift += 7;
     }
@@ -345,7 +347,7 @@
     uint64_t val = 0, shift = 0;
     while (true) {
         uint8_t byte = next();
-        val += (byte & 0x7F) << shift;
+        val |= (INT64_C(0x7F) & byte) << shift;
         if ((byte & 0x80) == 0) break;
         shift += 7;
     }
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index af98a11..22b9709 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -175,7 +175,7 @@
 }
 
 bool
-ProtoOutputStream::write(uint64_t fieldId, string val)
+ProtoOutputStream::write(uint64_t fieldId, std::string val)
 {
     if (mCompact) return false;
     const uint32_t id = (uint32_t)fieldId;
diff --git a/libs/protoutil/tests/EncodedBuffer_test.cpp b/libs/protoutil/tests/EncodedBuffer_test.cpp
new file mode 100644
index 0000000..615ab4a
--- /dev/null
+++ b/libs/protoutil/tests/EncodedBuffer_test.cpp
@@ -0,0 +1,25 @@
+// 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.
+#include <android/util/EncodedBuffer.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using namespace android::util;
+
+TEST(EncodedBufferTest, ReadVarint) {
+    EncodedBuffer buffer;
+    uint64_t val = UINT64_C(1522865904593);
+    buffer.writeRawVarint64(val);
+    EXPECT_EQ(val, buffer.begin().readRawVarint());
+}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index fa3f99a..1276881 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -89,6 +89,10 @@
     ProviderProperties getProviderProperties(String provider);
     String getNetworkProviderPackage();
 
+    boolean isProviderEnabledForUser(String provider, int userId);
+    boolean setProviderEnabledForUser(String provider, boolean enabled, int userId);
+    boolean isLocationEnabledForUser(int userId);
+    void setLocationEnabledForUser(boolean enabled, int userId);
     void addTestProvider(String name, in ProviderProperties properties, String opPackageName);
     void removeTestProvider(String provider, String opPackageName);
     void setTestProviderLocation(String provider, in Location loc, String opPackageName);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index a523958..6eb3d8d 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -29,6 +29,7 @@
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
@@ -392,6 +393,18 @@
     }
 
     /**
+     * @hide
+     */
+    @TestApi
+    public String[] getBackgroundThrottlingWhitelist() {
+        try {
+            return mService.getBackgroundThrottlingWhitelist();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
      * @hide - hide this constructor because it has a parameter
      * of type ILocationManager, which is a system private class. The
      * right way to create an instance of this class is using the
@@ -1249,40 +1262,11 @@
     @SystemApi
     @RequiresPermission(WRITE_SECURE_SETTINGS)
     public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) {
-        final List<String> allProvidersList = getAllProviders();
-        // Update all providers on device plus gps and network provider when disabling location.
-        Set<String> allProvidersSet = new ArraySet<>(allProvidersList.size() + 2);
-        allProvidersSet.addAll(allProvidersList);
-        // When disabling location, disable gps and network provider that could have been enabled by
-        // location mode api.
-        if (enabled == false) {
-            allProvidersSet.add(GPS_PROVIDER);
-            allProvidersSet.add(NETWORK_PROVIDER);
+        try {
+            mService.setLocationEnabledForUser(enabled, userHandle.getIdentifier());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
-        if (allProvidersSet.isEmpty()) {
-            return;
-        }
-        // to ensure thread safety, we write the provider name with a '+' or '-'
-        // and let the SettingsProvider handle it rather than reading and modifying
-        // the list of enabled providers.
-        final String prefix = enabled ? "+" : "-";
-        StringBuilder locationProvidersAllowed = new StringBuilder();
-        for (String provider : allProvidersSet) {
-            checkProvider(provider);
-            if (provider.equals(PASSIVE_PROVIDER)) {
-                continue;
-            }
-            locationProvidersAllowed.append(prefix);
-            locationProvidersAllowed.append(provider);
-            locationProvidersAllowed.append(",");
-        }
-        // Remove the trailing comma
-        locationProvidersAllowed.setLength(locationProvidersAllowed.length() - 1);
-        Settings.Secure.putStringForUser(
-                mContext.getContentResolver(),
-                Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
-                locationProvidersAllowed.toString(),
-                userHandle.getIdentifier());
     }
 
     /**
@@ -1295,22 +1279,11 @@
      */
     @SystemApi
     public boolean isLocationEnabledForUser(UserHandle userHandle) {
-        final String allowedProviders = Settings.Secure.getStringForUser(
-                mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
-                userHandle.getIdentifier());
-        if (allowedProviders == null) {
-            return false;
+        try {
+            return mService.isLocationEnabledForUser(userHandle.getIdentifier());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
-        final List<String> providerList = Arrays.asList(allowedProviders.split(","));
-        for(String provider : getAllProviders()) {
-            if (provider.equals(PASSIVE_PROVIDER)) {
-                continue;
-            }
-            if (providerList.contains(provider)) {
-                return true;
-            }
-        }
-        return false;
     }
 
     /**
@@ -1362,9 +1335,12 @@
     @SystemApi
     public boolean isProviderEnabledForUser(String provider, UserHandle userHandle) {
         checkProvider(provider);
-        String allowedProviders = Settings.Secure.getStringForUser(mContext.getContentResolver(),
-                Settings.Secure.LOCATION_PROVIDERS_ALLOWED, userHandle.getIdentifier());
-        return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
+
+        try {
+            return mService.isProviderEnabledForUser(provider, userHandle.getIdentifier());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
@@ -1383,16 +1359,13 @@
     public boolean setProviderEnabledForUser(
             String provider, boolean enabled, UserHandle userHandle) {
         checkProvider(provider);
-        // to ensure thread safety, we write the provider name with a '+' or '-'
-        // and let the SettingsProvider handle it rather than reading and modifying
-        // the list of enabled providers.
-        if (enabled) {
-            provider = "+" + provider;
-        } else {
-            provider = "-" + provider;
+
+        try {
+            return mService.setProviderEnabledForUser(
+                    provider, enabled, userHandle.getIdentifier());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
         }
-        return Settings.Secure.putStringForUser(mContext.getContentResolver(),
-                Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider, userHandle.getIdentifier());
     }
 
     /**
diff --git a/location/tests/locationtests/AndroidTest.xml b/location/tests/locationtests/AndroidTest.xml
index 0c5b7cc..bb6547b 100644
--- a/location/tests/locationtests/AndroidTest.xml
+++ b/location/tests/locationtests/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.locationtests" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index d432658..9152ff2 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -180,6 +180,7 @@
      * IMPORTANT: when adding new usage types, add them to SDK_USAGES and update SUPPRESSIBLE_USAGES
      *            if applicable, as well as audioattributes.proto.
      *            Also consider adding them to <aaudio/AAudio.h> for the NDK.
+     *            Also consider adding them to UsageTypeConverter for service dump and etc.
      */
 
     /**
@@ -249,9 +250,10 @@
         SUPPRESSIBLE_USAGES.put(USAGE_ASSISTANCE_NAVIGATION_GUIDANCE,    SUPPRESSIBLE_MEDIA);
         SUPPRESSIBLE_USAGES.put(USAGE_GAME,                              SUPPRESSIBLE_MEDIA);
         SUPPRESSIBLE_USAGES.put(USAGE_ASSISTANT,                         SUPPRESSIBLE_MEDIA);
+        /** default volume assignment is STREAM_MUSIC, handle unknown usage as media */
+        SUPPRESSIBLE_USAGES.put(USAGE_UNKNOWN,                           SUPPRESSIBLE_MEDIA);
         SUPPRESSIBLE_USAGES.put(USAGE_VOICE_COMMUNICATION_SIGNALLING,    SUPPRESSIBLE_SYSTEM);
         SUPPRESSIBLE_USAGES.put(USAGE_ASSISTANCE_SONIFICATION,           SUPPRESSIBLE_SYSTEM);
-        SUPPRESSIBLE_USAGES.put(USAGE_UNKNOWN,                           SUPPRESSIBLE_SYSTEM);
     }
 
     /**
@@ -1056,8 +1058,7 @@
             case USAGE_ASSISTANCE_ACCESSIBILITY:
                 return AudioSystem.STREAM_ACCESSIBILITY;
             case USAGE_UNKNOWN:
-                return fromGetVolumeControlStream ?
-                        AudioManager.USE_DEFAULT_STREAM_TYPE : AudioSystem.STREAM_MUSIC;
+                return AudioSystem.STREAM_MUSIC;
             default:
                 if (fromGetVolumeControlStream) {
                     throw new IllegalArgumentException("Unknown usage value " + aa.getUsage() +
diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java
index 7104dad..fe89b89 100644
--- a/media/java/android/media/AudioFocusRequest.java
+++ b/media/java/android/media/AudioFocusRequest.java
@@ -19,6 +19,7 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.media.AudioManager.OnAudioFocusChangeListener;
 import android.os.Bundle;
 import android.os.Handler;
@@ -262,6 +263,7 @@
      * Returns the focus change listener set for this {@code AudioFocusRequest}.
      * @return null if no {@link AudioManager.OnAudioFocusChangeListener} was set.
      */
+    @TestApi
     public @Nullable OnAudioFocusChangeListener getOnAudioFocusChangeListener() {
         return mFocusListener;
     }
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index f98480b..d0a2c98 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -18,6 +18,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -437,6 +438,7 @@
      * @param mask a combination of the CHANNEL_IN_* definitions, even CHANNEL_IN_DEFAULT
      * @return number of channels for the mask
      */
+    @TestApi
     public static int channelCountFromInChannelMask(int mask) {
         return Integer.bitCount(mask);
     }
@@ -446,6 +448,7 @@
      * @param mask a combination of the CHANNEL_OUT_* definitions, but not CHANNEL_OUT_DEFAULT
      * @return number of channels for the mask
      */
+    @TestApi
     public static int channelCountFromOutChannelMask(int mask) {
         return Integer.bitCount(mask);
     }
@@ -492,6 +495,7 @@
     // CHANNEL_IN_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_IN_ALL
 
     /** @hide */
+    @TestApi
     public static int getBytesPerSample(int audioFormat)
     {
         switch (audioFormat) {
@@ -562,6 +566,7 @@
     }
 
     /** @hide */
+    @TestApi
     public static boolean isEncodingLinearPcm(int audioFormat)
     {
         switch (audioFormat) {
diff --git a/media/java/android/media/AudioPresentation.java b/media/java/android/media/AudioPresentation.java
index e39cb7d..ce71436 100644
--- a/media/java/android/media/AudioPresentation.java
+++ b/media/java/android/media/AudioPresentation.java
@@ -18,8 +18,7 @@
 
 import android.annotation.IntDef;
 import android.annotation.NonNull;
-
-import com.android.internal.annotations.VisibleForTesting;
+import android.annotation.TestApi;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -94,7 +93,7 @@
     /**
      * @hide
      */
-    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+    @TestApi
     public AudioPresentation(int presentationId,
                         int programId,
                         @NonNull Map<String, String> labels,
@@ -119,7 +118,7 @@
      * decoder. Presentation id is typically sequential, but does not have to be.
      * @hide
      */
-    @VisibleForTesting
+    @TestApi
     public int getPresentationId() {
         return mPresentationId;
     }
@@ -129,7 +128,7 @@
      * Program id can be used to further uniquely identify the presentation to a decoder.
      * @hide
      */
-    @VisibleForTesting
+    @TestApi
     public int getProgramId() {
         return mProgramId;
     }
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index bc0e43b..7888436 100644
--- a/media/java/android/media/ExifInterface.java
+++ b/media/java/android/media/ExifInterface.java
@@ -66,7 +66,7 @@
 /**
  * This is a class for reading and writing Exif tags in a JPEG file or a RAW image file.
  * <p>
- * Supported formats are: JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW and RAF.
+ * Supported formats are: JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF and HEIF.
  * <p>
  * Attribute mutation is supported for JPEG image files.
  */
@@ -2524,46 +2524,46 @@
     private void getHeifAttributes(ByteOrderedDataInputStream in) throws IOException {
         MediaMetadataRetriever retriever = new MediaMetadataRetriever();
         try {
-            if (mSeekableFileDescriptor != null) {
-                retriever.setDataSource(mSeekableFileDescriptor);
-            } else {
-                retriever.setDataSource(new MediaDataSource() {
-                    long mPosition;
+            retriever.setDataSource(new MediaDataSource() {
+                long mPosition;
 
-                    @Override
-                    public void close() throws IOException {}
+                @Override
+                public void close() throws IOException {}
 
-                    @Override
-                    public int readAt(long position, byte[] buffer, int offset, int size)
-                            throws IOException {
-                        if (size == 0) {
-                            return 0;
-                        }
-                        if (position < 0) {
-                            return -1;
-                        }
-                        if (mPosition != position) {
-                            in.seek(position);
-                            mPosition = position;
-                        }
-
-                        int bytesRead = in.read(buffer, offset, size);
-                        if (bytesRead < 0) {
-                            mPosition = -1; // need to seek on next read
-                            return -1;
-                        }
-
-                        mPosition += bytesRead;
-                        return bytesRead;
+                @Override
+                public int readAt(long position, byte[] buffer, int offset, int size)
+                        throws IOException {
+                    if (size == 0) {
+                        return 0;
                     }
-
-                    @Override
-                    public long getSize() throws IOException {
+                    if (position < 0) {
                         return -1;
                     }
-                });
-            }
+                    if (mPosition != position) {
+                        in.seek(position);
+                        mPosition = position;
+                    }
 
+                    int bytesRead = in.read(buffer, offset, size);
+                    if (bytesRead < 0) {
+                        mPosition = -1; // need to seek on next read
+                        return -1;
+                    }
+
+                    mPosition += bytesRead;
+                    return bytesRead;
+                }
+
+                @Override
+                public long getSize() throws IOException {
+                    return -1;
+                }
+            });
+
+            String exifOffsetStr = retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_EXIF_OFFSET);
+            String exifLengthStr = retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_EXIF_LENGTH);
             String hasImage = retriever.extractMetadata(
                     MediaMetadataRetriever.METADATA_KEY_HAS_IMAGE);
             String hasVideo = retriever.extractMetadata(
@@ -2622,6 +2622,30 @@
                         ExifAttribute.createUShort(orientation, mExifByteOrder));
             }
 
+            if (exifOffsetStr != null && exifLengthStr != null) {
+                int offset = Integer.parseInt(exifOffsetStr);
+                int length = Integer.parseInt(exifLengthStr);
+                if (length <= 6) {
+                    throw new IOException("Invalid exif length");
+                }
+                in.seek(offset);
+                byte[] identifier = new byte[6];
+                if (in.read(identifier) != 6) {
+                    throw new IOException("Can't read identifier");
+                }
+                offset += 6;
+                length -= 6;
+                if (!Arrays.equals(identifier, IDENTIFIER_EXIF_APP1)) {
+                    throw new IOException("Invalid identifier");
+                }
+
+                byte[] bytes = new byte[length];
+                if (in.read(bytes) != length) {
+                    throw new IOException("Can't read exif");
+                }
+                readExifSegment(bytes, IFD_TYPE_PRIMARY);
+            }
+
             if (DEBUG) {
                 Log.d(TAG, "Heif meta: " + width + "x" + height + ", rotation " + rotation);
             }
diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java
index 37c5785..9828275 100644
--- a/media/java/android/media/Image.java
+++ b/media/java/android/media/Image.java
@@ -193,6 +193,13 @@
     public abstract int getTransform();
 
     /**
+     * Get the scaling mode associated with this frame.
+     * @return The scaling mode that needs to be applied for this frame.
+     * @hide
+     */
+    public abstract int getScalingMode();
+
+    /**
      * Get the {@link android.hardware.HardwareBuffer HardwareBuffer} handle of the input image
      * intended for GPU and/or hardware access.
      * <p>
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 72d52d3..8ec0e35 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -871,6 +871,12 @@
         }
 
         @Override
+        public int getScalingMode() {
+            throwISEIfImageIsInvalid();
+            return mScalingMode;
+        }
+
+        @Override
         public HardwareBuffer getHardwareBuffer() {
             throwISEIfImageIsInvalid();
             return nativeGetHardwareBuffer();
@@ -1004,14 +1010,11 @@
         private long mNativeBuffer;
 
         /**
-         * This field is set by native code during nativeImageSetup().
+         * These fields are set by native code during nativeImageSetup().
          */
         private long mTimestamp;
-
-        /**
-         * This field is set by native code during nativeImageSetup().
-         */
         private int mTransform;
+        private int mScalingMode;
 
         private SurfacePlane[] mPlanes;
         private int mFormat = ImageFormat.UNKNOWN;
diff --git a/media/java/android/media/ImageWriter.java b/media/java/android/media/ImageWriter.java
index 8ee27ae..397768a 100644
--- a/media/java/android/media/ImageWriter.java
+++ b/media/java/android/media/ImageWriter.java
@@ -371,7 +371,7 @@
 
         Rect crop = image.getCropRect();
         nativeQueueInputImage(mNativeContext, image, image.getTimestamp(), crop.left, crop.top,
-                crop.right, crop.bottom, image.getTransform());
+                crop.right, crop.bottom, image.getTransform(), image.getScalingMode());
 
         /**
          * Only remove and cleanup the Images that are owned by this
@@ -558,7 +558,7 @@
         Rect crop = image.getCropRect();
         nativeAttachAndQueueImage(mNativeContext, image.getNativeContext(), image.getFormat(),
                 image.getTimestamp(), crop.left, crop.top, crop.right, crop.bottom,
-                image.getTransform());
+                image.getTransform(), image.getScalingMode());
     }
 
     /**
@@ -676,6 +676,7 @@
         private long mTimestamp = DEFAULT_TIMESTAMP;
 
         private int mTransform = 0; //Default no transform
+        private int mScalingMode = 0; //Default frozen scaling mode
 
         public WriterSurfaceImage(ImageWriter writer) {
             mOwner = writer;
@@ -721,6 +722,13 @@
         }
 
         @Override
+        public int getScalingMode() {
+            throwISEIfImageIsInvalid();
+
+            return mScalingMode;
+        }
+
+        @Override
         public long getTimestamp() {
             throwISEIfImageIsInvalid();
 
@@ -866,11 +874,12 @@
     private synchronized native void nativeDequeueInputImage(long nativeCtx, Image wi);
 
     private synchronized native void nativeQueueInputImage(long nativeCtx, Image image,
-            long timestampNs, int left, int top, int right, int bottom, int transform);
+            long timestampNs, int left, int top, int right, int bottom, int transform,
+            int scalingMode);
 
     private synchronized native int nativeAttachAndQueueImage(long nativeCtx,
             long imageNativeBuffer, int imageFormat, long timestampNs, int left,
-            int top, int right, int bottom, int transform);
+            int top, int right, int bottom, int transform, int scalingMode);
 
     private synchronized native void cancelImage(long nativeCtx, Image image);
 
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index e3fba0c..1f00c78 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -3574,6 +3574,7 @@
         private final static int TYPE_YUV = 1;
 
         private final int mTransform = 0; //Default no transform
+        private final int mScalingMode = 0; //Default frozen scaling mode
 
         @Override
         public int getFormat() {
@@ -3600,6 +3601,12 @@
         }
 
         @Override
+        public int getScalingMode() {
+            throwISEIfImageIsInvalid();
+            return mScalingMode;
+        }
+
+        @Override
         public long getTimestamp() {
             throwISEIfImageIsInvalid();
             return mTimestamp;
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 2a601f9..c29300d 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -2971,6 +2971,8 @@
         public static final int AACObjectLD         = 23;
         public static final int AACObjectHE_PS      = 29;
         public static final int AACObjectELD        = 39;
+        /** xHE-AAC (includes USAC) */
+        public static final int AACObjectXHE        = 42;
 
         // from OMX_VIDEO_VP8LEVELTYPE
         public static final int VP8Level_Version0 = 0x01;
diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java
index 5173743..7ac1529 100644
--- a/media/java/android/media/MediaDrm.java
+++ b/media/java/android/media/MediaDrm.java
@@ -993,6 +993,9 @@
      * active. The license server returns a secure stop release response
      * message to the app which then deletes the secure stop from persistent
      * memory using {@link #releaseSecureStops}.
+     * <p>
+     * Each secure stop has a unique ID that can be used to identify it during
+     * enumeration, access and removal.
      * @return a list of all secure stops from secure persistent memory
      */
     @NonNull
@@ -1000,6 +1003,8 @@
 
     /**
      * Return a list of all secure stop IDs currently in persistent memory.
+     * The secure stop ID can be used to access or remove the corresponding
+     * secure stop.
      *
      * @return a list of secure stop IDs
      */
@@ -1008,6 +1013,7 @@
 
     /**
      * Access a specific secure stop given its secure stop ID.
+     * Each secure stop has a unique ID.
      *
      * @param ssid the ID of the secure stop to return
      * @return the secure stop identified by ssid
diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java
index 0955dd6..8ab5ec4 100644
--- a/media/java/android/media/MediaMetadataRetriever.java
+++ b/media/java/android/media/MediaMetadataRetriever.java
@@ -890,5 +890,14 @@
      */
     public static final int METADATA_KEY_VIDEO_FRAME_COUNT = 32;
 
+    /**
+     * @hide
+     */
+    public static final int METADATA_KEY_EXIF_OFFSET = 33;
+
+    /**
+     * @hide
+     */
+    public static final int METADATA_KEY_EXIF_LENGTH = 34;
     // Add more here...
 }
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index aef31b1..f9a1f8b 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2128,7 +2128,13 @@
             mTimeProvider.close();
             mTimeProvider = null;
         }
-        mOnSubtitleDataListener = null;
+        synchronized(this) {
+            mSubtitleDataListenerDisabled = false;
+            mExtSubtitleDataListener = null;
+            mExtSubtitleDataHandler = null;
+            mOnMediaTimeDiscontinuityListener = null;
+            mOnMediaTimeDiscontinuityHandler = null;
+        }
 
         // Modular DRM clean up
         mOnDrmConfigHelper = null;
@@ -2699,7 +2705,7 @@
     private int mSelectedSubtitleTrackIndex = -1;
     private Vector<InputStream> mOpenSubtitleSources;
 
-    private OnSubtitleDataListener mSubtitleDataListener = new OnSubtitleDataListener() {
+    private final OnSubtitleDataListener mIntSubtitleDataListener = new OnSubtitleDataListener() {
         @Override
         public void onSubtitleData(MediaPlayer mp, SubtitleData data) {
             int index = data.getTrackIndex();
@@ -2725,7 +2731,9 @@
             }
             mSelectedSubtitleTrackIndex = -1;
         }
-        setOnSubtitleDataListener(null);
+        synchronized (this) {
+            mSubtitleDataListenerDisabled = true;
+        }
         if (track == null) {
             return;
         }
@@ -2745,7 +2753,9 @@
                 selectOrDeselectInbandTrack(mSelectedSubtitleTrackIndex, true);
             } catch (IllegalStateException e) {
             }
-            setOnSubtitleDataListener(mSubtitleDataListener);
+            synchronized (this) {
+                mSubtitleDataListenerDisabled = false;
+            }
         }
         // no need to select out-of-band tracks
     }
@@ -3304,6 +3314,7 @@
     private static final int MEDIA_SUBTITLE_DATA = 201;
     private static final int MEDIA_META_DATA = 202;
     private static final int MEDIA_DRM_INFO = 210;
+    private static final int MEDIA_TIME_DISCONTINUITY = 211;
     private static final int MEDIA_AUDIO_ROUTING_CHANGED = 10000;
 
     private TimeProvider mTimeProvider;
@@ -3514,15 +3525,34 @@
                 return;
 
             case MEDIA_SUBTITLE_DATA:
-                OnSubtitleDataListener onSubtitleDataListener = mOnSubtitleDataListener;
-                if (onSubtitleDataListener == null) {
-                    return;
+                final OnSubtitleDataListener extSubtitleListener;
+                final Handler extSubtitleHandler;
+                synchronized(this) {
+                    if (mSubtitleDataListenerDisabled) {
+                        return;
+                    }
+                    extSubtitleListener = mExtSubtitleDataListener;
+                    extSubtitleHandler = mExtSubtitleDataHandler;
                 }
                 if (msg.obj instanceof Parcel) {
                     Parcel parcel = (Parcel) msg.obj;
-                    SubtitleData data = new SubtitleData(parcel);
+                    final SubtitleData data = new SubtitleData(parcel);
                     parcel.recycle();
-                    onSubtitleDataListener.onSubtitleData(mMediaPlayer, data);
+
+                    mIntSubtitleDataListener.onSubtitleData(mMediaPlayer, data);
+
+                    if (extSubtitleListener != null) {
+                        if (extSubtitleHandler == null) {
+                            extSubtitleListener.onSubtitleData(mMediaPlayer, data);
+                        } else {
+                            extSubtitleHandler.post(new Runnable() {
+                                @Override
+                                public void run() {
+                                    extSubtitleListener.onSubtitleData(mMediaPlayer, data);
+                                }
+                            });
+                        }
+                    }
                 }
                 return;
 
@@ -3553,6 +3583,43 @@
                 }
                 return;
 
+            case MEDIA_TIME_DISCONTINUITY:
+                final OnMediaTimeDiscontinuityListener mediaTimeListener;
+                final Handler mediaTimeHandler;
+                synchronized(this) {
+                    mediaTimeListener = mOnMediaTimeDiscontinuityListener;
+                    mediaTimeHandler = mOnMediaTimeDiscontinuityHandler;
+                }
+                if (mediaTimeListener == null) {
+                    return;
+                }
+                if (msg.obj instanceof Parcel) {
+                    Parcel parcel = (Parcel) msg.obj;
+                    parcel.setDataPosition(0);
+                    long anchorMediaUs = parcel.readLong();
+                    long anchorRealUs = parcel.readLong();
+                    float playbackRate = parcel.readFloat();
+                    parcel.recycle();
+                    final MediaTimestamp timestamp;
+                    if (anchorMediaUs != -1 && anchorRealUs != -1) {
+                        timestamp = new MediaTimestamp(
+                                anchorMediaUs /*Us*/, anchorRealUs * 1000 /*Ns*/, playbackRate);
+                    } else {
+                        timestamp = MediaTimestamp.TIMESTAMP_UNKNOWN;
+                    }
+                    if (mediaTimeHandler == null) {
+                        mediaTimeListener.onMediaTimeDiscontinuity(mMediaPlayer, timestamp);
+                    } else {
+                        mediaTimeHandler.post(new Runnable() {
+                            @Override
+                            public void run() {
+                                mediaTimeListener.onMediaTimeDiscontinuity(mMediaPlayer, timestamp);
+                            }
+                        });
+                    }
+                }
+                return;
+
             default:
                 Log.e(TAG, "Unknown message type " + msg.what);
                 return;
@@ -3877,13 +3944,15 @@
     private void setOnSubtitleDataListenerInt(
             @Nullable OnSubtitleDataListener listener, @Nullable Handler handler) {
         synchronized (this) {
-            mOnSubtitleDataListener = listener;
-            mOnSubtitleDataHandler = handler;
+            mExtSubtitleDataListener = listener;
+            mExtSubtitleDataHandler = handler;
         }
     }
 
-    private OnSubtitleDataListener mOnSubtitleDataListener;
-    private Handler mOnSubtitleDataHandler;
+    private boolean mSubtitleDataListenerDisabled;
+    /** External OnSubtitleDataListener, the one set by {@link #setOnSubtitleDataListener}. */
+    private OnSubtitleDataListener mExtSubtitleDataListener;
+    private Handler mExtSubtitleDataHandler;
 
     /**
      * Interface definition of a callback to be invoked when discontinuity in the normal progression
diff --git a/media/java/android/media/MediaTimestamp.java b/media/java/android/media/MediaTimestamp.java
index 938dd14..dd43b4e 100644
--- a/media/java/android/media/MediaTimestamp.java
+++ b/media/java/android/media/MediaTimestamp.java
@@ -98,4 +98,13 @@
                 && (this.nanoTime == that.nanoTime)
                 && (this.clockRate == that.clockRate);
     }
+
+    @Override
+    public String toString() {
+        return getClass().getName()
+                + "{AnchorMediaTimeUs=" + mediaTimeUs
+                + " AnchorSystemNanoTime=" + nanoTime
+                + " clockRate=" + clockRate
+                + "}";
+    }
 }
diff --git a/media/java/android/media/PlaybackParams.java b/media/java/android/media/PlaybackParams.java
index 938a953..b85e4d0 100644
--- a/media/java/android/media/PlaybackParams.java
+++ b/media/java/android/media/PlaybackParams.java
@@ -17,6 +17,7 @@
 package android.media;
 
 import android.annotation.IntDef;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -151,6 +152,7 @@
      * @param audioStretchMode
      * @return this <code>PlaybackParams</code> instance.
      */
+    @TestApi
     public PlaybackParams setAudioStretchMode(@AudioStretchMode int audioStretchMode) {
         mAudioStretchMode = audioStretchMode;
         mSet |= SET_AUDIO_STRETCH_MODE;
@@ -163,6 +165,7 @@
      * @return audio stretch mode
      * @throws IllegalStateException if the audio stretch mode is not set.
      */
+    @TestApi
     public @AudioStretchMode int getAudioStretchMode() {
         if ((mSet & SET_AUDIO_STRETCH_MODE) == 0) {
             throw new IllegalStateException("audio stretch mode not set");
diff --git a/media/java/android/media/VolumeShaper.java b/media/java/android/media/VolumeShaper.java
index 3068706..b654214 100644
--- a/media/java/android/media/VolumeShaper.java
+++ b/media/java/android/media/VolumeShaper.java
@@ -18,6 +18,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -843,6 +844,7 @@
              * @return the same {@code Builder} instance.
              * @throws IllegalArgumentException if flag is not recognized.
              */
+            @TestApi
             public @NonNull Builder setOptionFlags(@OptionFlag int optionFlags) {
                 if ((optionFlags & ~OPTION_FLAG_PUBLIC_ALL) != 0) {
                     throw new IllegalArgumentException("invalid bits in flag: " + optionFlags);
diff --git a/media/java/android/media/audiofx/AudioEffect.java b/media/java/android/media/audiofx/AudioEffect.java
index 21d6873..24c595f 100644
--- a/media/java/android/media/audiofx/AudioEffect.java
+++ b/media/java/android/media/audiofx/AudioEffect.java
@@ -18,6 +18,7 @@
 
 import android.annotation.SdkConstant;
 import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.os.Handler;
 import android.os.Looper;
@@ -133,9 +134,10 @@
               .fromString("7261676f-6d75-7369-6364-28e2fd3ac39e");
 
     /**
-     * Null effect UUID. Used when the UUID for effect type of
+     * Null effect UUID. See {@link AudioEffect(UUID, UUID, int, int)} for use.
      * @hide
      */
+    @TestApi
     public static final UUID EFFECT_TYPE_NULL = UUID
             .fromString("ec7178ec-e5e1-4432-a3f4-4657e6795210");
 
@@ -492,6 +494,7 @@
      * @return true if the device implements the specified effect type, false otherwise.
      * @hide
      */
+    @TestApi
     public static boolean isEffectTypeAvailable(UUID type) {
         AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
         if (desc == null) {
@@ -544,6 +547,7 @@
      * @throws IllegalStateException
      * @hide
      */
+    @TestApi
     public int setParameter(byte[] param, byte[] value)
             throws IllegalStateException {
         checkState("setParameter()");
@@ -556,6 +560,7 @@
      * @see #setParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int setParameter(int param, int value) throws IllegalStateException {
         byte[] p = intToByteArray(param);
         byte[] v = intToByteArray(value);
@@ -569,6 +574,7 @@
      * @see #setParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int setParameter(int param, short value)
             throws IllegalStateException {
         byte[] p = intToByteArray(param);
@@ -583,6 +589,7 @@
      * @see #setParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int setParameter(int param, byte[] value)
             throws IllegalStateException {
         byte[] p = intToByteArray(param);
@@ -596,6 +603,7 @@
      * @see #setParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int setParameter(int[] param, int[] value)
             throws IllegalStateException {
         if (param.length > 2 || value.length > 2) {
@@ -647,6 +655,7 @@
      * @see #setParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int setParameter(int[] param, byte[] value)
             throws IllegalStateException {
         if (param.length > 2) {
@@ -675,6 +684,7 @@
      * @throws IllegalStateException
      * @hide
      */
+    @TestApi
     public int getParameter(byte[] param, byte[] value)
             throws IllegalStateException {
         checkState("getParameter()");
@@ -688,6 +698,7 @@
      * @see #getParameter(byte[], byte[])
      * @hide
      */
+    @TestApi
     public int getParameter(int param, byte[] value)
             throws IllegalStateException {
         byte[] p = intToByteArray(param);
@@ -703,6 +714,7 @@
      * In case of success, returns the number of meaningful integers in value array.
      * @hide
      */
+    @TestApi
     public int getParameter(int param, int[] value)
             throws IllegalStateException {
         if (value.length > 2) {
@@ -734,6 +746,7 @@
      * In case of success, returns the number of meaningful short integers in value array.
      * @hide
      */
+    @TestApi
     public int getParameter(int param, short[] value)
             throws IllegalStateException {
         if (value.length > 2) {
@@ -799,6 +812,7 @@
      * In case of success, returns the number of meaningful short integers in value array.
      * @hide
      */
+    @TestApi
     public int getParameter(int[] param, short[] value)
             throws IllegalStateException {
         if (param.length > 2 || value.length > 2) {
@@ -938,6 +952,7 @@
      * @param listener
      * @hide
      */
+    @TestApi
     public void setParameterListener(OnParameterChangeListener listener) {
         synchronized (mListenerLock) {
             mParameterChangeListener = listener;
@@ -999,6 +1014,7 @@
      * when a parameter is changed in the effect engine by the controlling application.
      * @hide
      */
+    @TestApi
     public interface OnParameterChangeListener {
         /**
          * Called on the listener to notify it that a parameter value has changed.
@@ -1291,6 +1307,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static boolean isError(int status) {
         return (status < 0);
     }
@@ -1298,6 +1315,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static int byteArrayToInt(byte[] valueBuf) {
         return byteArrayToInt(valueBuf, 0);
 
@@ -1316,6 +1334,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static byte[] intToByteArray(int value) {
         ByteBuffer converter = ByteBuffer.allocate(4);
         converter.order(ByteOrder.nativeOrder());
@@ -1326,6 +1345,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static short byteArrayToShort(byte[] valueBuf) {
         return byteArrayToShort(valueBuf, 0);
     }
@@ -1343,6 +1363,7 @@
     /**
      * @hide
      */
+    @TestApi
     public static byte[] shortToByteArray(short value) {
         ByteBuffer converter = ByteBuffer.allocate(2);
         converter.order(ByteOrder.nativeOrder());
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index f16804c..84f85e7 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -531,7 +531,7 @@
          *
          * @param state The new playback state of the session
          */
-        public void onPlaybackStateChanged(@NonNull PlaybackState state) {
+        public void onPlaybackStateChanged(@Nullable PlaybackState state) {
         }
 
         /**
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 519af1b..fbc1438 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -47,6 +47,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Executor;
 
 /**
@@ -342,12 +343,16 @@
     }
 
     /**
-     * Returns whether the app is trusted.
+     * Checks whether the remote user is a trusted app.
      * <p>
      * An app is trusted if the app holds the android.Manifest.permission.MEDIA_CONTENT_CONTROL
      * permission or has an enabled notification listener.
      *
-     * @param userInfo The remote user info
+     * @param userInfo The remote user info from either
+     *            {@link MediaSession#getCurrentControllerInfo()} or
+     *            {@link MediaBrowserService#getCurrentBrowserInfo()}.
+     * @return {@code true} if the remote user is trusted and its package name matches with the UID.
+     *            {@code false} otherwise.
      */
     public boolean isTrustedForMediaControl(RemoteUserInfo userInfo) {
         if (userInfo.getPackageName() == null) {
@@ -814,6 +819,11 @@
                     && mPid == otherUserInfo.mPid
                     && mUid == otherUserInfo.mUid;
         }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(mPackageName, mPid, mUid);
+        }
     }
 
     private static final class SessionsChangedWrapper {
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index bfb3ea2..c36858a 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -46,6 +46,7 @@
 #define ANDROID_MEDIA_SURFACEIMAGE_BUFFER_JNI_ID   "mNativeBuffer"
 #define ANDROID_MEDIA_SURFACEIMAGE_TS_JNI_ID       "mTimestamp"
 #define ANDROID_MEDIA_SURFACEIMAGE_TF_JNI_ID       "mTransform"
+#define ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID       "mScalingMode"
 
 #define CONSUMER_BUFFER_USAGE_UNKNOWN              0;
 // ----------------------------------------------------------------------------
@@ -68,6 +69,7 @@
     jfieldID mNativeBuffer;
     jfieldID mTimestamp;
     jfieldID mTransform;
+    jfieldID mScalingMode;
     jfieldID mPlanes;
 } gSurfaceImageClassInfo;
 
@@ -315,6 +317,12 @@
                         "can't find android/graphics/ImageReader.%s",
                         ANDROID_MEDIA_SURFACEIMAGE_TF_JNI_ID);
 
+    gSurfaceImageClassInfo.mScalingMode = env->GetFieldID(
+            imageClazz, ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID, "I");
+    LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mScalingMode == NULL,
+                        "can't find android/graphics/ImageReader.%s",
+                        ANDROID_MEDIA_SURFACEIMAGE_SM_JNI_ID);
+
     gSurfaceImageClassInfo.mPlanes = env->GetFieldID(
             imageClazz, "mPlanes", "[Landroid/media/ImageReader$SurfaceImage$SurfacePlane;");
     LOG_ALWAYS_FATAL_IF(gSurfaceImageClassInfo.mPlanes == NULL,
@@ -606,6 +614,8 @@
             static_cast<jlong>(buffer->mTimestamp));
     env->SetIntField(image, gSurfaceImageClassInfo.mTransform,
             static_cast<jint>(buffer->mTransform));
+    env->SetIntField(image, gSurfaceImageClassInfo.mScalingMode,
+            static_cast<jint>(buffer->mScalingMode));
 
     return ACQUIRE_SUCCESS;
 }
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index 2b8f9f89..11659e4 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -421,7 +421,8 @@
 }
 
 static void ImageWriter_queueImage(JNIEnv* env, jobject thiz, jlong nativeCtx, jobject image,
-        jlong timestampNs, jint left, jint top, jint right, jint bottom, jint transform) {
+        jlong timestampNs, jint left, jint top, jint right, jint bottom, jint transform,
+        jint scalingMode) {
     ALOGV("%s", __FUNCTION__);
     JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
     if (ctx == NULL || thiz == NULL) {
@@ -471,6 +472,12 @@
         return;
     }
 
+    res = native_window_set_scaling_mode(anw.get(), scalingMode);
+    if (res != OK) {
+        jniThrowRuntimeException(env, "Set scaling mode failed");
+        return;
+    }
+
     // Finally, queue input buffer
     res = anw->queueBuffer(anw.get(), buffer, fenceFd);
     if (res != OK) {
@@ -493,7 +500,7 @@
 
 static jint ImageWriter_attachAndQueueImage(JNIEnv* env, jobject thiz, jlong nativeCtx,
         jlong nativeBuffer, jint imageFormat, jlong timestampNs, jint left, jint top,
-        jint right, jint bottom, jint transform) {
+        jint right, jint bottom, jint transform, jint scalingMode) {
     ALOGV("%s", __FUNCTION__);
     JNIImageWriterContext* const ctx = reinterpret_cast<JNIImageWriterContext *>(nativeCtx);
     if (ctx == NULL || thiz == NULL) {
@@ -536,8 +543,8 @@
     }
     sp < ANativeWindow > anw = surface;
 
-    // Step 2. Set timestamp, crop and transform. Note that we do not need unlock the image because
-    // it was not locked.
+    // Step 2. Set timestamp, crop, transform and scaling mode. Note that we do not need unlock the
+    // image because it was not locked.
     ALOGV("timestamp to be queued: %" PRId64, timestampNs);
     res = native_window_set_buffers_timestamp(anw.get(), timestampNs);
     if (res != OK) {
@@ -562,6 +569,12 @@
         return res;
     }
 
+    res = native_window_set_scaling_mode(anw.get(), scalingMode);
+    if (res != OK) {
+        jniThrowRuntimeException(env, "Set scaling mode failed");
+        return res;
+    }
+
     // Step 3. Queue Image.
     res = anw->queueBuffer(anw.get(), buffer->mGraphicBuffer.get(), /*fenceFd*/
             -1);
@@ -797,9 +810,9 @@
     {"nativeInit",              "(Ljava/lang/Object;Landroid/view/Surface;II)J",
                                                               (void*)ImageWriter_init },
     {"nativeClose",              "(J)V",                      (void*)ImageWriter_close },
-    {"nativeAttachAndQueueImage", "(JJIJIIIII)I",          (void*)ImageWriter_attachAndQueueImage },
+    {"nativeAttachAndQueueImage", "(JJIJIIIIII)I",          (void*)ImageWriter_attachAndQueueImage },
     {"nativeDequeueInputImage", "(JLandroid/media/Image;)V",  (void*)ImageWriter_dequeueImage },
-    {"nativeQueueInputImage",   "(JLandroid/media/Image;JIIIII)V",  (void*)ImageWriter_queueImage },
+    {"nativeQueueInputImage",   "(JLandroid/media/Image;JIIIIII)V",  (void*)ImageWriter_queueImage },
     {"cancelImage",             "(JLandroid/media/Image;)V",   (void*)ImageWriter_cancelImage },
 };
 
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index b4ca88c..ed2afdd 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -809,7 +809,11 @@
             mAudioTrack = newTrack;
             ALOGV("using new track %p for sample %d", newTrack.get(), sample->sampleID());
         }
-        newTrack->setVolume(leftVolume, rightVolume);
+        if (mMuted) {
+            newTrack->setVolume(0.0f, 0.0f);
+        } else {
+            newTrack->setVolume(leftVolume, rightVolume);
+        }
         newTrack->setLoop(0, frameCount, loop);
         mPos = 0;
         mSample = sample;
diff --git a/packages/CaptivePortalLogin/Android.mk b/packages/CaptivePortalLogin/Android.mk
index 7dc23ff..8a96b16 100644
--- a/packages/CaptivePortalLogin/Android.mk
+++ b/packages/CaptivePortalLogin/Android.mk
@@ -2,7 +2,7 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := optional
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 services.net
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index dbdf5e16..cdc3867 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -30,6 +30,7 @@
 import android.net.NetworkRequest;
 import android.net.Proxy;
 import android.net.Uri;
+import android.net.dns.ResolvUtil;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
@@ -119,6 +120,8 @@
 
         // Also initializes proxy system properties.
         mCm.bindProcessToNetwork(mNetwork);
+        mCm.setProcessDefaultNetworkForHostResolution(
+                ResolvUtil.getNetworkWithUseLocalNameserversFlag(mNetwork));
 
         // Proxy system properties must be initialized before setContentView is called because
         // setContentView initializes the WebView logic which in turn reads the system properties.
diff --git a/packages/CarrierDefaultApp/Android.mk b/packages/CarrierDefaultApp/Android.mk
index df88afd..5068b3b 100644
--- a/packages/CarrierDefaultApp/Android.mk
+++ b/packages/CarrierDefaultApp/Android.mk
@@ -9,6 +9,8 @@
 LOCAL_PRIVATE_PLATFORM_APIS := true
 LOCAL_CERTIFICATE := platform
 
+LOCAL_STATIC_JAVA_LIBRARIES := services.net
+
 include $(BUILD_PACKAGE)
 
 # This finds and builds the test apk as well, so a single make does both.
diff --git a/packages/CarrierDefaultApp/res/values-eu/strings.xml b/packages/CarrierDefaultApp/res/values-eu/strings.xml
index f98a192..81bd6f8 100644
--- a/packages/CarrierDefaultApp/res/values-eu/strings.xml
+++ b/packages/CarrierDefaultApp/res/values-eu/strings.xml
@@ -5,7 +5,7 @@
     <string name="android_system_label" msgid="2797790869522345065">"Telefonia mugikorreko operadorea"</string>
     <string name="portal_notification_id" msgid="5155057562457079297">"Agortu egin dira datu mugikorrak"</string>
     <string name="no_data_notification_id" msgid="668400731803969521">"Desaktibatu da datu-konexioa"</string>
-    <string name="portal_notification_detail" msgid="2295729385924660881">"Sakatu hau %s gunera joateko"</string>
+    <string name="portal_notification_detail" msgid="2295729385924660881">"Sakatu hau %s webgunera joateko"</string>
     <string name="no_data_notification_detail" msgid="3112125343857014825">"Jarri harremanetan %s operadorearekin"</string>
     <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"Ez dago datu-konexiorik"</string>
     <string name="no_mobile_data_connection" msgid="544980465184147010">"Gehitu datuak eta ibiltaritza-plana %s bidez"</string>
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
index 95ec83d..7479d9a 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CaptivePortalLoginActivity.java
@@ -32,6 +32,7 @@
 import android.net.Proxy;
 import android.net.TrafficStats;
 import android.net.Uri;
+import android.net.dns.ResolvUtil;
 import android.net.http.SslError;
 import android.os.Bundle;
 import android.telephony.CarrierConfigManager;
@@ -115,6 +116,8 @@
             requestNetworkForCaptivePortal();
         } else {
             mCm.bindProcessToNetwork(mNetwork);
+            mCm.setProcessDefaultNetworkForHostResolution(
+                    ResolvUtil.getNetworkWithUseLocalNameserversFlag(mNetwork));
             // Start initial page load so WebView finishes loading proxy settings.
             // Actual load of mUrl is initiated by MyWebViewClient.
             mWebView.loadData("", "text/html", null);
diff --git a/packages/InputDevices/res/raw/keyboard_layout_polish.kcm b/packages/InputDevices/res/raw/keyboard_layout_polish.kcm
new file mode 100644
index 0000000..559ec07
--- /dev/null
+++ b/packages/InputDevices/res/raw/keyboard_layout_polish.kcm
@@ -0,0 +1,327 @@
+# 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.
+
+#
+# Polish (qwerty) keyboard layout.
+#
+
+type OVERLAY
+
+### ROW 1
+
+key GRAVE {
+    label:                              '`'
+    base:                               '`'
+    shift:                              '~'
+}
+
+key 1 {
+    label:                              '1'
+    base:                               '1'
+    shift:                              '!'
+}
+
+key 2 {
+    label:                              '2'
+    base:                               '2'
+    shift:                              '@'
+}
+
+key 3 {
+    label:                              '3'
+    base:                               '3'
+    shift:                              '#'
+}
+
+key 4 {
+    label:                              '4'
+    base:                               '4'
+    shift:                              '$'
+}
+
+key 5 {
+    label:                              '5'
+    base:                               '5'
+    shift:                              '%'
+}
+
+key 6 {
+    label:                              '6'
+    base:                               '6'
+    shift:                              '^'
+}
+
+key 7 {
+    label:                              '7'
+    base:                               '7'
+    shift:                              '&'
+}
+
+key 8 {
+    label:                              '8'
+    base:                               '8'
+    shift:                              '*'
+}
+
+key 9 {
+    label:                              '9'
+    base:                               '9'
+    shift:                              '('
+}
+
+key 0 {
+    label:                              '0'
+    base:                               '0'
+    shift:                              ')'
+}
+
+key MINUS {
+    label:                              '-'
+    base:                               '-'
+    shift:                              '_'
+}
+
+key EQUALS {
+    label:                              '='
+    base:                               '='
+    shift:                              '+'
+}
+
+### ROW 2
+
+key Q {
+    label:                              'Q'
+    base:                               'q'
+    shift, capslock:                    'Q'
+}
+
+key W {
+    label:                              'W'
+    base:                               'w'
+    shift, capslock:                    'W'
+}
+
+key E {
+    label:                              'E'
+    base:                               'e'
+    shift, capslock:                    'E'
+    ralt:                               '\u0119'
+    ralt+shift, ralt+capslock:          '\u0118'
+}
+
+key R {
+    label:                              'R'
+    base:                               'r'
+    shift, capslock:                    'R'
+}
+
+key T {
+    label:                              'T'
+    base:                               't'
+    shift, capslock:                    'T'
+}
+
+key Y {
+    label:                              'Y'
+    base:                               'y'
+    shift, capslock:                    'Y'
+}
+
+key U {
+    label:                              'U'
+    base:                               'u'
+    shift, capslock:                    'U'
+}
+
+key I {
+    label:                              'I'
+    base:                               'i'
+    shift, capslock:                    'I'
+}
+
+key O {
+    label:                              'O'
+    base:                               'o'
+    shift, capslock:                    'O'
+    ralt:                               '\u00F3'
+    ralt+shift, ralt+capslock:          '\u00D3'
+}
+
+key P {
+    label:                              'P'
+    base:                               'p'
+    shift, capslock:                    'P'
+}
+
+key LEFT_BRACKET {
+    label:                              '['
+    base:                               '['
+    shift:                              '{'
+}
+
+key RIGHT_BRACKET {
+    label:                              ']'
+    base:                               ']'
+    shift:                              '}'
+}
+
+key BACKSLASH {
+    label:                              '\\'
+    base:                               '\\'
+    shift:                              '|'
+}
+
+### ROW 3
+
+key A {
+    label:                              'A'
+    base:                               'a'
+    shift, capslock:                    'A'
+    ralt:                               '\u0105'
+    ralt+shift, ralt+capslock:          '\u0104'
+}
+
+key S {
+    label:                              'S'
+    base:                               's'
+    shift, capslock:                    'S'
+    ralt:                               '\u015b'
+    ralt+shift, ralt+capslock:          '\u015a'
+}
+
+key D {
+    label:                              'D'
+    base:                               'd'
+    shift, capslock:                    'D'
+}
+
+key F {
+    label:                              'F'
+    base:                               'f'
+    shift, capslock:                    'F'
+}
+
+key G {
+    label:                              'G'
+    base:                               'g'
+    shift, capslock:                    'G'
+}
+
+key H {
+    label:                              'H'
+    base:                               'h'
+    shift, capslock:                    'H'
+}
+
+key J {
+    label:                              'J'
+    base:                               'j'
+    shift, capslock:                    'J'
+}
+
+key K {
+    label:                              'K'
+    base:                               'k'
+    shift, capslock:                    'K'
+}
+
+key L {
+    label:                              'L'
+    base:                               'l'
+    shift, capslock:                    'L'
+    ralt:                               '\u0142'
+    ralt+shift, ralt+capslock:          '\u0141'
+}
+
+key SEMICOLON {
+    label:                              ';'
+    base:                               ';'
+    shift:                              ':'
+}
+
+key APOSTROPHE {
+    label:                              '\''
+    base:                               '\''
+    shift:                              '"'
+}
+
+### ROW 4
+
+key Z {
+    label:                              'Z'
+    base:                               'z'
+    shift, capslock:                    'Z'
+    ralt:                               '\u017c'
+    ralt+shift, ralt+capslock:          '\u017b'
+}
+
+key X {
+    label:                              'X'
+    base:                               'x'
+    shift, capslock:                    'X'
+    ralt:                               '\u017a'
+    ralt+shift, ralt+capslock:          '\u0179'
+}
+
+key C {
+    label:                              'C'
+    base:                               'c'
+    shift, capslock:                    'C'
+    ralt:                               '\u0107'
+    ralt+shift, ralt+capslock:          '\u0106'
+}
+
+key V {
+    label:                              'V'
+    base:                               'v'
+    shift, capslock:                    'V'
+}
+
+key B {
+    label:                              'B'
+    base:                               'b'
+    shift, capslock:                    'B'
+}
+
+key N {
+    label:                              'N'
+    base:                               'n'
+    shift, capslock:                    'N'
+    ralt:                               '\u0144'
+    ralt+shift, ralt+capslock:          '\u0143'
+}
+
+key M {
+    label:                              'M'
+    base:                               'm'
+    shift, capslock:                    'M'
+}
+
+key COMMA {
+    label:                              ','
+    base:                               ','
+    shift:                              '<'
+}
+
+key PERIOD {
+    label:                              '.'
+    base:                               '.'
+    shift:                              '>'
+}
+
+key SLASH {
+    label:                              '/'
+    base:                               '/'
+    shift:                              '?'
+}
diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml
index 61d3234..5fdc4a6 100644
--- a/packages/InputDevices/res/values/strings.xml
+++ b/packages/InputDevices/res/values/strings.xml
@@ -125,4 +125,7 @@
 
     <!-- Azerbaijani keyboard layout label. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_azerbaijani">Azerbaijani</string>
+
+    <!-- Polish keyboard layout label. [CHAR LIMIT=35] -->
+    <string name="keyboard_layout_polish">Polish</string>
 </resources>
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index c6bfc1f..1807aea 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -159,4 +159,8 @@
     <keyboard-layout android:name="keyboard_layout_azerbaijani"
             android:label="@string/keyboard_layout_azerbaijani"
             android:keyboardLayout="@raw/keyboard_layout_azerbaijani" />
+
+    <keyboard-layout android:name="keyboard_layout_polish"
+            android:label="@string/keyboard_layout_polish"
+            android:keyboardLayout="@raw/keyboard_layout_polish" />
 </keyboard-layouts>
diff --git a/packages/MtpDocumentsProvider/tests/AndroidTest.xml b/packages/MtpDocumentsProvider/tests/AndroidTest.xml
index 940d364..f84131c 100644
--- a/packages/MtpDocumentsProvider/tests/AndroidTest.xml
+++ b/packages/MtpDocumentsProvider/tests/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.InstrumentationTest" >
         <option name="package" value="com.android.mtp.tests" />
         <option name="runner" value="com.android.mtp.TestResultInstrumentation" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/PrintSpooler/res/values-bs/strings.xml b/packages/PrintSpooler/res/values-bs/strings.xml
index 2e9bfa3..e7f6d13 100644
--- a/packages/PrintSpooler/res/values-bs/strings.xml
+++ b/packages/PrintSpooler/res/values-bs/strings.xml
@@ -42,7 +42,7 @@
     <string name="page_description_template" msgid="6831239682256197161">"Strana <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> od <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
     <string name="summary_template" msgid="8899734908625669193">"Rezime, primjeraka <xliff:g id="COPIES">%1$s</xliff:g>, veličina papira <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
     <string name="expand_handle" msgid="7282974448109280522">"Regulator za proširivanje"</string>
-    <string name="collapse_handle" msgid="6886637989442507451">"Regulator za skupljanje"</string>
+    <string name="collapse_handle" msgid="6886637989442507451">"Regulator za suĆŸavanje"</string>
     <string name="print_button" msgid="645164566271246268">"Štampaj"</string>
     <string name="savetopdf_button" msgid="2976186791686924743">"Sačuvaj u PDF"</string>
     <string name="print_options_expanded" msgid="6944679157471691859">"Opcije za štampanje su proširene"</string>
diff --git a/packages/PrintSpooler/res/values-ne/strings.xml b/packages/PrintSpooler/res/values-ne/strings.xml
index 18f96dd..da49afb 100644
--- a/packages/PrintSpooler/res/values-ne/strings.xml
+++ b/packages/PrintSpooler/res/values-ne/strings.xml
@@ -70,7 +70,7 @@
     <string name="print_no_printers" msgid="4869403323900054866">"à€•à„à€šà„ˆ à€Șà„à€°à€żà€šà„à€Ÿà€°à€čà€°à„‚ à€­à„‡à€Ÿà€Ÿà€‡à€à€š"</string>
     <string name="cannot_add_printer" msgid="7840348733668023106">"à€Șà„à€°à€żà€šà„à€Ÿà€°à€čà€°à„‚ à€„à€Șà„à€š à€žà€•à„à€Šà„ˆà€š"</string>
     <string name="select_to_add_printers" msgid="3800709038689830974">"à€Șà„à€°à€żà€šà„à€Ÿà€° à€„à€Șà„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="enable_print_service" msgid="3482815747043533842">"à€žà€•à„à€·à€ź à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="enable_print_service" msgid="3482815747043533842">"à€žà€•à„à€·à€ź à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="enabled_services_title" msgid="7036986099096582296">"à€žà€•à„à€·à€ź à€—à€°à€żà€à€•à€Ÿ à€žà„‡à€”à€Ÿà€čà€°à„‚"</string>
     <string name="recommended_services_title" msgid="3799434882937956924">"à€žà€żà€«à€Ÿà€°à€żà€ž à€—à€°à€żà€à€•à€Ÿ à€žà„‡à€”à€Ÿà€čà€°à„‚"</string>
     <string name="disabled_services_title" msgid="7313253167968363211">"à€…à€žà€•à„à€·à€ź à€—à€°à€żà€à€•à€Ÿ à€žà„‡à€”à€Ÿà€čà€°à„‚"</string>
diff --git a/packages/PrintSpooler/tests/outofprocess/AndroidTest.xml b/packages/PrintSpooler/tests/outofprocess/AndroidTest.xml
index 15dd64b..d21a2e4 100644
--- a/packages/PrintSpooler/tests/outofprocess/AndroidTest.xml
+++ b/packages/PrintSpooler/tests/outofprocess/AndroidTest.xml
@@ -25,5 +25,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.printspooler.outofprocess.tests" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/SettingsLib/res/layout/preference_category_material_settings.xml b/packages/SettingsLib/res/layout/preference_category_material_settings.xml
index 245e3b7..1086106 100644
--- a/packages/SettingsLib/res/layout/preference_category_material_settings.xml
+++ b/packages/SettingsLib/res/layout/preference_category_material_settings.xml
@@ -50,6 +50,7 @@
             android:layout_marginTop="16dp"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
             android:textAppearance="@android:style/TextAppearance.Material.Body2"
             android:textAlignment="viewStart"
             android:textColor="?android:attr/colorAccent"
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index 763a0eb..a181ee2 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ àŠźàŠŸàŠ§à§àŠŻàŠźà§‡àŠŠàŠż àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠŸ àŠčà§ˆàŠ›à§‡"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ àŠźàŠŸàŠ§à§àŠŻàŠźà§‡à§°à§‡ àŠ‰àŠȘàŠČàŠŹà§àŠ§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"àŠžàŠ‚àŠŻà§‹àŠœàŠżàŠ€, àŠ‡àŠŁà§àŠŸàŠŸà§°àŠšà§‡àŠŸ àŠšàŠŸàŠ‡"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠŸ àŠč\'àŠČ (àŠ«\'àŠš àŠšàŠŸàŠ‡), àŠŹà§‡àŠŸàŠŸà§°àŠżà§° àŠžà§àŠ€à§° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠŸ àŠč\'àŠČ (àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠšàŠŸàŠ‡), àŠŹà§‡àŠŸàŠŸà§°àŠżà§° àŠžà§àŠ€à§° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠŸ àŠč\'àŠČ (àŠ•à§‹àŠšà§‹ àŠ«\'àŠš àŠŹàŠŸ àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠšàŠŸàŠ‡), àŠŹà§‡àŠŸàŠŸà§°àŠżà§° àŠžà§àŠ€à§° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"àŠžàŠ•à§à§°àŠżàŠŻàŠŒ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àŠŹà§‡àŠŸàŠŸà§°àŠż"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àŠŹà§‡àŠŸàŠŸà§°àŠż"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"àŠžàŠ•à§à§°àŠżàŠŻàŠŒ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸà§° àŠ…àŠĄàŠżàŠ…’"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"àŠ«\'àŠš àŠ•àŠČàŠžàŠźà§‚àŠč"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"àŠ«àŠŸàŠ‡àŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§°àŠŁ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"àŠčà§‡àŠĄàŠ«\'àŠš"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"àŠ‡àŠšàŠȘà§àŠŸ àŠžàŠźà§àŠȘà§°à§àŠ•à§€àŠŻàŠŒ àŠŹàŠŸàŠčà§àŠŻàŠŒ àŠĄàŠżàŠ­àŠŸàŠ‡àŠš"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"àŠŹà§àŠČà§àŠŸà§àŠ„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"àŠŹàŠŸàŠ“àŠàŠ«àŠŸàŠČৰ àŠ¶à§à§°à§±àŠŁ àŠŻàŠšà§àŠ€à§à§°àŠŸà§‹ àŠŻà§‹à§° àŠȘàŠ€à§‹à§±àŠŸ àŠčà§ˆàŠ›à§‡…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"àŠžà§‹àŠàŠ«àŠŸàŠČৰ àŠ¶à§à§°à§±àŠŁ àŠŻàŠšà§àŠ€à§à§°àŠŸà§‹ àŠŻà§‹à§° àŠȘàŠ€à§‹à§±àŠŸ àŠčà§ˆàŠ›à§‡…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àŠŹà§‡àŠŸàŠŸà§°àŠż àŠŹàŠŸàŠ•à§€ àŠ†àŠ›à§‡"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"àŠžà§‹àŠ - àŠŹà§‡àŠŸàŠŸà§°àŠż <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"à§±àŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠ…àŠ«àŠčৈ àŠ†àŠ›à§‡à„€"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"à§±àŠŸàŠ‡àŠ«àŠŸàŠ‡ àŠžàŠ‚àŠŻà§‹àŠ— àŠŹàŠżàŠšà§àŠ›àŠżàŠšà§àŠš àŠčৈ àŠ†àŠ›à§‡à„€"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"à§±àŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠàŠŠàŠŸàŠČ àŠŠàŠŁà§àŠĄà„€"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àŠžàŠ•àŠČো àŠŹà§àŠČà§àŠŸà§àŠ„ HCI àŠȘà§‡àŠ•à§‡àŠŸàŠ• àŠ•à§‹àŠšà§‹ àŠ«àŠŸàŠ‡àŠČàŠ€ àŠ…àŠšà§àŠ€à§°à§àŠ­à§àŠ•à§àŠ€ àŠ•à§°àŠ• (àŠàŠ‡ àŠ›à§‡àŠŸàŠżàŠ‚ àŠžàŠČàŠšàŠż àŠ•à§°àŠŸà§° àŠȘàŠżàŠ›àŠ€ àŠŹà§àŠČà§àŠŸà§àŠ„ àŠŸ\'àŠ—àŠČ àŠ•à§°àŠ•)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"àŠžà§àŠŹàŠŻàŠŒàŠ‚àŠ•à§à§°àŠżàŠŻàŠŒ"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"àŠŹà§àŠŻàŠ•à§àŠ€àŠżàŠ—àŠ€ àŠĄàŠżàŠàŠšàŠàŠ› àŠȘà§à§°àŠŠàŠŸàŠšàŠ•àŠŸà§°à§€à§° àŠčà§‹àŠ·à§àŠŸàŠšàŠŸàŠź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"àŠĄàŠżàŠàŠšàŠàŠ› àŠžà§‡à§±àŠŸ àŠŻà§‹àŠ—àŠŸàŠšàŠ•àŠŸà§°à§€à§° àŠč\'àŠ·à§àŠŸàŠšàŠŸàŠź àŠŠàŠżàŠŻàŠŒàŠ•"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠ—\'àŠČ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"àŠŹà§‡àŠ€àŠŸàŠà§° àŠĄàŠżàŠ›àŠȘ্àŠČে àŠȘà§à§°àŠźàŠŸàŠŁàŠȘàŠ€à§à§°à§° àŠŹàŠŸàŠŹà§‡ àŠŹàŠżàŠ•àŠČ্àŠȘàŠžàŠźà§‚àŠč àŠŠà§‡àŠ–à§à§±àŠŸàŠ“àŠ•"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"à§±àŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠČàŠ—àŠżàŠ™à§° àŠźàŠŸàŠ€à§à§°àŠŸ àŠŹàŠąàŠŒàŠŸàŠ“àŠ•, Wi‑Fi àŠȘàŠżàŠ•àŠŸà§°àŠ€ àŠȘà§à§°àŠ€àŠż SSID RSSI àŠŠà§‡àŠ–à§à§±àŠŸàŠ“àŠ•"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"à§±àŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠšà§‡àŠŸà§±à§°à§àŠ•à§° àŠČàŠ—àŠ€ àŠžàŠ‚àŠŻà§‹àŠ— àŠ•à§°àŠż àŠ„àŠ•àŠŸà§° àŠžàŠźàŠŻàŠŒàŠ€ MAC àŠ àŠżàŠ•àŠšàŠŸ àŠŻàŠŸàŠŠà§ƒàŠšà§àŠ›àŠżàŠ• àŠ•à§°àŠ•"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"àŠšàŠżà§°àŠżàŠ–-àŠšàŠżà§°à§àŠŠàŠżàŠ·à§àŠŸ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"àŠšàŠżà§°àŠżàŠ– àŠ…àŠšàŠżà§°à§àŠŠàŠżàŠ·à§àŠŸ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"àŠČàŠ—àŠŸà§°à§° àŠŹàŠŸàŠ«àŠŸà§°à§° àŠ†àŠ•àŠŸà§°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"àŠȘà§à§°àŠ€àŠżàŠŸà§‹ àŠČàŠ— àŠŹàŠŸàŠ«àŠŸà§°àŠ€ àŠČ\'àŠ—àŠŸà§°à§° àŠ†àŠ•àŠŸà§° àŠŹàŠŸàŠ›àŠšàŠż àŠ•à§°àŠ•"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"àŠČàŠ—àŠŸà§°à§° àŠžà§àŠ„àŠŸàŠŻàŠŒà§€ àŠžàŠžà§àŠšàŠŻàŠŒàŠŸàŠ—àŠŸà§°à§° àŠŹàŠžà§àŠ€à§àŠŹà§‹à§° àŠźàŠšàŠżàŠŹàŠšà§‡?"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index ee54231..499a2fb 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ĐŸĐ°ĐŽĐ»ŃƒŃ‡Đ°ĐœĐ° праз %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Đ”Đ°ŃŃ‚ŃƒĐżĐœĐ° праз %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ПаЮĐșĐ»ŃŽŃ‡Đ°ĐœĐ°, бДз ĐŽĐŸŃŃ‚ŃƒĐżŃƒ ĐŽĐ° Ń–ĐœŃ‚ŃŃ€ĐœŃŃ‚Ńƒ"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ПаЮĐșĐ»ŃŽŃ‡Đ°ĐœĐ° прылаЎа <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (бДз Đ·ĐČĐ°ĐœĐșĐŸŃž). ĐŁĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ ŃĐ” Đ°ĐșŃƒĐŒŃƒĐ»ŃŃ‚Đ°Ń€Đ°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ПаЮĐșĐ»ŃŽŃ‡Đ°ĐœĐ° прылаЎа <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (бДз аўЮыя). ĐŁĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ ŃĐ” Đ°ĐșŃƒĐŒŃƒĐ»ŃŃ‚Đ°Ń€Đ°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ПаЮĐșĐ»ŃŽŃ‡Đ°ĐœĐ° прылаЎа <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (бДз Đ·ĐČĐ°ĐœĐșĐŸŃž і аўЮыя). ĐŁĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ ŃĐ” Đ°ĐșŃƒĐŒŃƒĐ»ŃŃ‚Đ°Ń€Đ°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ĐŁĐșĐ»ŃŽŃ‡Đ°ĐœĐ°, зараЎ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"ĐŁĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ĐŁĐșĐ»ŃŽŃ‡Đ°ĐœĐ°"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"АўЮыё ĐŒĐ”ĐŽŃ‹ŃĐżŃ€Ń‹Đ»Đ°ĐŽŃ‹"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ĐąŃĐ»Đ”Ń„ĐŸĐœĐœŃ‹Ń ĐČыĐșліĐșі"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ĐŸĐ”Ń€Đ°ĐŽĐ°Ń‡Đ° фаĐčлаў"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"НаĐČŃƒŃˆĐœŃ–Đșі"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ĐŸĐ”Ń€Ń‹Ń„Đ”Ń€Ń‹ĐčĐœĐ°Ń прылаЎа ўĐČĐŸĐŽŃƒ"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ĐĄĐżĐ°Đ»ŃƒŃ‡Đ°Đ”Ń†Ń†Đ° лДĐČы слыхаĐČы апарат…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ĐĄĐżĐ°Đ»ŃƒŃ‡Đ°Đ”Ń†Ń†Đ° праĐČы слыхаĐČы апарат…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ЛДĐČы – ŃƒĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ПраĐČы – ŃƒĐ·Ń€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€Đ°ĐŽŃƒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ĐČыĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi Đ°ĐŽĐ»ŃƒŃ‡Đ°ĐœŃ‹."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"АЎзiĐœ ŃĐ»ŃƒĐżĐŸĐș Wi-Fi."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ĐŃžŃ‚Đ°ĐŒĐ°Ń‚Ń‹Ń‡ĐœĐ°"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Đ†ĐŒŃ ĐČузла апДратара прыĐČĐ°Ń‚ĐœĐ°Đč DNS"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ĐŁĐČŃĐŽĐ·Ń–Ń†Đ” Ń–ĐŒŃ ĐČузла апДратара DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ĐĐ” Đ°Ń‚Ń€Ń‹ĐŒĐ°Đ»Đ°ŃŃ паЎĐșлючыцца"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ПаĐșĐ°Đ·Đ°Ń†ŃŒ ĐŸĐżŃ†Ń‹Ń– сДртыфіĐșацыі бДспраĐČĐ°ĐŽĐœĐŸĐłĐ° ĐŽŃ‹ŃĐżĐ»Đ”Ń"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ПаЮĐČыс. ŃƒĐ·Ń€ĐŸĐČĐ”ĐœŃŒ ĐŽŃŃ‚Đ°Đ»-цыі Đ¶ŃƒŃ€ĐœĐ°Đ»Đ° Wi‑Fi у Đ·Đ°Đ»Đ”Đ¶Đœ. Đ°ĐŽ SSID RSSI у Wi‑Fi Picker"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Đ“Đ”ĐœĐ”Ń€Ń‹Ń€Đ°ĐČаць ĐČыпаЮĐșĐŸĐČы MAC-аЮрас пры паЎĐșĐ»ŃŽŃ‡ŃĐœĐœŃ– ĐŽĐ° сДтаĐș Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"З ŃƒĐ»Ń–ĐșĐ°ĐŒ трафіĐșĐ°"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"БДз ŃƒĐ»Ń–Đșу трафіĐșĐ°"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ĐŸĐ°ĐŒĐ”Ń€Ń‹ Đ±ŃƒŃ„Đ”Ń€Đ° ĐŽĐ»Ń ŃŃ€ĐŸĐŽĐșу ĐČŃĐŽĐ·Đ”ĐœĐœŃ Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ВыбДрыцД ĐżĐ°ĐŒĐ”Ń€Ń‹ ŃŃ€ĐŸĐŽĐșу ĐČŃĐŽĐ·Đ”ĐœĐœŃ Đ¶ŃƒŃ€ĐœĐ°Đ»Đ° ĐŽĐ»Ń Đ±ŃƒŃ„Đ”Ń€Đ°Ńž Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ачысціць ĐżĐ°ŃŃ‚Đ°ŃĐœĐœĐ°Đ” ŃŃ…ĐŸĐČішча Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°?"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 35f82e5..6b37300 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s àŠźàŠŸàŠ§à§àŠŻàŠźà§‡ àŠžàŠ‚àŠŻà§àŠ•à§àŠ€ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s àŠàŠ° àŠźàŠŸàŠ§à§àŠŻàŠźà§‡ àŠ‰àŠȘàŠČàŠŹà§àŠ§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"àŠžàŠ‚àŠŻà§àŠ•à§àŠ€, àŠ‡àŠšà§àŠŸàŠŸàŠ°àŠšà§‡àŠŸ àŠšà§‡àŠ‡"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"àŠ•àŠŸàŠšà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠ†àŠ›à§‡ (àŠ«à§‹àŠšà§‡àŠ° àŠ…àŠĄàŠżàŠ“ àŠ›àŠŸàŠĄàŠŒàŠŸ), àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"àŠ•àŠŸàŠšà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠ†àŠ›à§‡ (àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸàŠ° àŠ…àŠĄàŠżàŠ“ àŠ›àŠŸàŠĄàŠŒàŠŸ), àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"àŠ•àŠŸàŠšà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠ†àŠ›à§‡ (àŠ«à§‹àŠšà§‡àŠ° àŠŹàŠŸ àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸàŠ° àŠ…àŠĄàŠżàŠ“ àŠ›àŠŸàŠĄàŠŒàŠŸ), àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"àŠšàŠŸàŠČু àŠ†àŠ›à§‡, àŠšàŠŸàŠ°à§àŠœ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"àŠšàŠŸàŠ°à§àŠœ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"àŠšàŠŸàŠČু àŠ†àŠ›à§‡"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"àŠźàŠżàŠĄàŠżàŠŻàŠŒàŠŸ àŠ…àŠĄàŠżàŠ“"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"àŠ«à§‹àŠš àŠ•àŠČ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"àŠ«àŠŸàŠ‡àŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€àŠ°"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"àŠčà§‡àŠĄàŠ«à§‹àŠš"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"àŠȘà§‡àŠ°àŠżàŠ«à§‡àŠ°àŠŸàŠČ àŠ‡àŠšàŠȘà§àŠŸ"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"àŠŹà§àŠČà§àŠŸà§àŠ„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"àŠŹàŠŸàŠàŠŠàŠżàŠ•à§‡àŠ° àŠčàŠżàŠŻàŠŒàŠŸàŠ°àŠżàŠ‚ àŠàŠĄàŠŸàŠż àŠȘà§‡àŠŻàŠŒàŠŸàŠ° àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡..."</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"àŠĄàŠŸàŠšàŠŠàŠżàŠ•à§‡àŠ° àŠčàŠżàŠŻàŠŒàŠŸàŠ°àŠżàŠ‚ àŠàŠĄ àŠȘà§‡àŠŻàŠŒàŠŸàŠ° àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àŠšàŠŸàŠ°à§àŠœ àŠŹàŠŸàŠ•àŠż àŠ†àŠ›à§‡"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"àŠĄàŠŸàŠšàŠŠàŠżàŠ•à§‡àŠ° - àŠšàŠŸàŠ°à§àŠœ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"àŠ“àŠŻàŠŒàŠŸàŠ‡ àŠ«àŠŸàŠ‡ àŠŹàŠšà§àŠ§à§·"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"àŠ“àŠŻàŠŒàŠŸàŠ‡ àŠ«àŠŸàŠ‡ àŠàŠ° àŠžàŠ‚àŠŻà§‹àŠ— àŠŹàŠżàŠšà§àŠ›àŠżàŠšà§àŠš àŠčàŠŻàŠŒà§‡àŠ›à§‡à§·"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"àŠ“àŠŻàŠŒàŠŸàŠ‡ àŠ«àŠŸàŠ‡ àŠ àŠàŠ•àŠŸàŠż àŠŠàŠŁà§àŠĄà§·"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àŠžàŠźàŠžà§àŠ€ àŠŹà§àŠČà§àŠŸà§àŠ„ HCI àŠȘà§àŠŻàŠŸàŠ•à§‡àŠŸ àŠàŠ•àŠŸàŠż àŠ«àŠŸàŠ‡àŠČে àŠ•à§àŠŻàŠŸàŠȘàŠšàŠŸàŠ° àŠ•àŠ°à§‡ àŠ°àŠŸàŠ–à§àŠš (àŠàŠ‡ àŠžà§‡àŠŸàŠżàŠ‚ àŠȘàŠ°àŠżàŠŹàŠ°à§àŠ€àŠš àŠ•àŠ°àŠŸàŠ° àŠȘàŠ°à§‡ àŠŹà§àŠČà§àŠŸà§àŠ„ àŠšàŠŸàŠČু àŠ…àŠ„àŠŹàŠŸ àŠŹàŠšà§àŠ§ àŠ•àŠ°à§àŠš)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"àŠ…àŠŸà§‹àŠźà§‡àŠŸàŠżàŠ•"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"àŠŹà§àŠŻàŠ•à§àŠ€àŠżàŠ—àŠ€ àŠĄàŠżàŠàŠšàŠàŠž àŠȘà§àŠ°àŠŠàŠŸàŠšàŠ•àŠŸàŠ°à§€àŠ° àŠčà§‹àŠžà§àŠŸàŠšà§‡àŠź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"àŠĄàŠżàŠàŠšàŠàŠž àŠȘà§àŠ°àŠŠàŠŸàŠšàŠ•àŠŸàŠ°à§€àŠ° àŠčà§‹àŠžà§àŠŸàŠšà§‡àŠź àŠČàŠżàŠ–à§àŠš"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"àŠ•àŠŸàŠšà§‡àŠ•à§àŠŸ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŻàŠŒàŠšàŠż"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"àŠ“àŠŻàŠŒà§àŠŻàŠŸàŠ°àŠČà§‡àŠž àŠȘà§àŠ°àŠŠàŠ°à§àŠ¶àŠš àŠžàŠŸàŠ°à§àŠŸàŠżàŠ«àŠżàŠ•à§‡àŠ¶àŠš àŠœàŠšà§àŠŻ àŠŹàŠżàŠ•àŠČ্àŠȘàŠ—à§àŠČàŠż àŠŠà§‡àŠ–àŠŸàŠš"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"àŠ“àŠŻàŠŒàŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠČàŠ—àŠżàŠ‚ àŠžà§àŠ€àŠ° àŠŹàŠŸàŠĄàŠŒàŠŸàŠš, àŠ“àŠŻàŠŒàŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠšàŠŻàŠŒàŠšàŠ•àŠŸàŠ°à§€àŠ€à§‡ SSID RSSI àŠ…àŠšà§àŠŻàŠŸàŠŻàŠŒà§€ àŠŠà§‡àŠ–àŠŸàŠš"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"àŠ“àŠŻàŠŒàŠŸàŠ‡-àŠ«àŠŸàŠ‡ àŠšà§‡àŠŸàŠ“àŠŻàŠŒàŠŸàŠ°à§àŠ•à§‡ àŠžàŠ‚àŠŻà§àŠ•à§àŠ€ àŠ•àŠ°àŠŸàŠ° àŠžàŠźàŠŻàŠŒ MAC àŠ…à§àŠŻàŠŸàŠĄà§àŠ°à§‡àŠž àŠ°‍à§àŠŻàŠŸàŠšà§àŠĄàŠźàŠŸàŠ‡àŠœ àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"àŠȘàŠ°àŠżàŠźàŠŸàŠȘ àŠ•àŠ°àŠŸ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"àŠȘàŠ°àŠżàŠźàŠŸàŠȘ àŠ•àŠ°àŠŸ àŠšàŠŻàŠŒ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"àŠČàŠ—àŠŸàŠ° àŠŹàŠŸàŠ«àŠŸàŠ°à§‡àŠ° àŠ†àŠ•àŠŸàŠ°àŠ—à§àŠČàŠż"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"àŠČàŠ— àŠŹàŠŸàŠ«àŠŸàŠ° àŠȘà§àŠ°àŠ€àŠż àŠ…àŠȘà§‡àŠ•à§àŠ·àŠŸàŠ•à§ƒàŠ€ àŠŹàŠĄàŠŒ àŠ†àŠ•àŠŸàŠ°àŠ—à§àŠČàŠżàŠ° àŠŹà§‡àŠ›à§‡ àŠšàŠżàŠš"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"àŠČàŠ—àŠŸàŠ°à§‡àŠ° àŠžà§àŠŸà§‹àŠ°à§‡àŠœ àŠžàŠŸàŠ« àŠ•àŠ°àŠŹà§‡àŠš?"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 3e51f16..db563b5 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -242,7 +242,7 @@
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećajte nivo Wi-Fi zapisivanja, pokazati po SSID RSSI Wi-Fi Picker"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Nasumično odaberi MAC adresu prilikom povezivanja na Wi-Fi mreĆŸe"</string>
     <string name="wifi_metered_label" msgid="4514924227256839725">"S naplatom"</string>
-    <string name="wifi_unmetered_label" msgid="6124098729457992931">"MreĆŸa bez ograničenja"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"MreĆŸa bez ograničenja prometa"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Veličine bafera za zapisnik"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Odaberite veličine za Logger prema međumemoriji evidencije"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ćœelite li izbrisati trajnu pohranu zapisivača?"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index a5b92de..2909265 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connectada mitjançant %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible mitjançant %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connectada, sense Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon ni al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Actiu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Actiu"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Àudio multimèdia"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Trucades telefòniques"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferència del fitxer"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auricular"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Perifèric d\'entrada"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"S\'està vinculant l\'audiòfon esquerre…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"S\'està vinculant l\'audiòfon dret…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Esquerre: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Dret: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desactivada."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconnectada."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Senyal Wi-Fi: una barra."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automàtic"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'amfitrió del proveïdor de DNS privat"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introdueix el nom d\'amfitrió del proveïdor de DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"No s\'ha pogut connectar"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra les opcions de certificació de pantalla sense fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Augmenta nivell de registre Wi‑Fi i mostra\'l per SSID RSSI al Selector de Wi‑Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Aleatoritza l\'adreça MAC quan estiguis connectat a una xarxa Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Amb límit de dades"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Sense límit de dades"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Mides memòria intermèdia Logger"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Mida Logger per memòria intermèdia"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vols esborrar l\'emmagatzematge persistent del registrador?"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 7a693b5..f3c7323 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Tilsluttet via %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tilgængelig via %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilsluttet – intet internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon eller medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivt"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonopkald"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverførsel"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hovedtelefoner"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Eksterne inputenheder"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Parrer venstre høreapparat…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Parrer højre høreapparat…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Venstre – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Højre – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi er slået fra."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi er afbrudt."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi har én bjælke."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname for privat DNS-udbyder"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Angiv hostname for DNS-udbyder"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Der kunne ikke oprettes forbindelse"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis valgmuligheder for certificering af trådløs skærm"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øg mængden af Wi‑Fi-logføring. Vis opdelt efter SSID RSSI i Wi‑Fi-vælgeren"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Brug en tilfældig MAC-adresse, når der oprettes forbindelse til Wi‑Fi-netværk"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Forbrugsafregnet"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Ikke forbrugsafregnet"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Størrelser for Logger-buffer"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Vælg Logger-størrelser pr. logbuffer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vil du rydde det permanente lager for logger?"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index b7eb02a..90a63d9 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Über %1$s verbunden"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Verfügbar über %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbunden, kein Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Telefon-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (weder Telefon- noch Medien-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiv, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiv"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medien-Audio"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonanrufe"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dateiübertragung"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kopfhörer"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Eingabeperipherie"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Linke Hörhilfe wird gekoppelt…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Rechte Hörhilfe wird gekoppelt…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Links, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Rechts, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"WLAN: aus"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"WLAN getrennt"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WLAN: ein Balken"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisch"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostname des privaten DNS-Anbieters"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Hostname des DNS-Anbieters eingeben"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Verbindung nicht möglich"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Level für WLAN-Protokollierung erhöhen, in WiFi Picker pro SSID-RSSI anzeigen"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC-Adresse randomisieren, wenn WLAN-Verbindungen hergestellt werden"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Kostenpflichtig"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Nicht kostenpflichtig"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Logger-Puffergrößen"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Größe pro Protokollpuffer wählen"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Speicher der dauerhaften Protokollierung löschen?"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 662ecda..952e874 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conexión a través de %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conectado pero sin conexión a Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin teléfono ni archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Activado (batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Activado"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas telefónicas"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Sincronizando el audífono izquierdo…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Sincronizando el audífono derecho…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Izquierdo (batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Derecho (batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>)"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi inhabilitado"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Una barra de Wi-Fi"</string>
@@ -246,15 +237,12 @@
     <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">"Ingresa el nombre de host del proveedor de DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"No se pudo establecer conexión"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones de certificación de pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Seleccionar la dirección MAC de forma aleatoria cuando se establezca conexión con redes Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Con tarifa plana"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Sin tarifa plana"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de Logger"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Selecciona el tamaño del Logger por búfer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"¿Borrar el almacenamiento persistente del registrador?"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 3647f43..c518415 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Conectado a través de %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible a través de %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Conexión sin Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin audio de teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin audio multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin audio de teléfono ni multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Activo, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Activo"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas de teléfono"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Auriculares"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periférico de entrada"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Vinculando el audífono izquierdo…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Vinculando el audífono derecho…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Izquierdo: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Derecho: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi desactivado."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi desconectado."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Una barra de Wi-Fi."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automático"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nombre de host de proveedor de DNS privado"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Introduce el nombre de host del proveedor de DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"No se ha podido establecer la conexión"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostrar opciones para la certificación de la pantalla inalámbrica"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumentar el nivel de registro de Wi-Fi, mostrar por SSID RSSI en el selector Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Ordenar las direcciones MAC de forma aleatoria al conectarse a redes Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Medida"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"No medida"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Tamaños de búfer de registrador"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Elige el tamaño del Logger por búfer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"¿Borrar almacenamiento continuo del registrador?"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 0998679..7a1a216 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Ühendatud üksuse %1$s kaudu"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Saadaval üksuse %1$s kaudu"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ühendatud, Interneti-ühendus puudub"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ühendatud (telefoni pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ühendatud (meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ühendatud (telefoni ega meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiivne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiivne"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Meedia heli"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonikõned"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failiedastus"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kõrvaklapid"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Sisestatud välisseade"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Vasakpoolse kuuldeaparaadi sidumine …"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Parempoolse kuuldeaparaadi sidumine …"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Vasakpoolne – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Parempoolne – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi on välja lülitatud."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"WiFi-ühendus on katkestatud."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi: üks pulk."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaatne"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Privaatse DNS-i teenusepakkuja hostinimi"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Sisestage DNS-i teenusepakkuja hostinimi"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ühendamine ebaõnnestus"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Juhtmeta ekraaniühenduse sertifitseerimisvalikute kuvamine"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Suurenda WiFi logimistaset, kuva WiFi valijas SSID RSSI järgi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Määra WiFi-võrkudega ühenduse loomisel juhuslik MAC-aadress"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Mahupõhine"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Mittemahupõhine"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Logija puhvri suurused"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Vali logija suur. logipuhvri kohta"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Kas kustutada logija püsivalt salvestatud andmed?"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 2c98966..7f1b105 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s bidez konektatuta"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s bidez erabilgarri"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Konektatuta; ezin da atzitu Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Konektatuta (telefonoaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Konektatuta (gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Konektatuta (telefonoaren edo gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktibo. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktibo"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Euskarriaren audioa"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono-deiak"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fitxategi-transferentzia"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Aurikularra"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Idazteko gailua"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth gailua"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Ezkerreko audiofonoa parekatzen…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Eskuineko audiofonoa parekatzen…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Ezkerrekoa. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Eskuinekoa. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Desaktibatuta dago Wi-Fi konexioa."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Deskonektatu egin da Wi-Fi konexioa."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi sarearen barra bat."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatikoa"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"DNS hornitzaile pribatuaren ostalari-izena"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Idatzi DNS hornitzailearen ostalari-izena"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ezin izan da konektatu"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Erakutsi hari gabeko bistaratze-egiaztapenaren aukerak"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Erakutsi datu gehiago Wi-Fi sareetan saioa hasterakoan. Erakutsi sarearen identifikatzailea eta seinalearen indarra Wi‑Fi sareen hautagailuan."</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Aukeratu ausaz MAC helbideak Wi‑Fi sareetara konektatzean"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Sare mugatua"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Sare ez-mugatua"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Erregistroen buffer-tamainak"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Hautatu erregistroen buffer-tamainak"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Erregistro iraunkorraren biltegia garbitu nahi duzu?"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index fe85a6c..1690fda 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Yhdistetty seuraavan kautta: %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Käytettävissä seuraavan kautta: %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Yhdistetty, ei internetyhteyttä"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Yhdistetty (ei puhelimen ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Yhdistetty (ei median ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Yhdistetty (ei puhelimen tai median ääntä), akun varaustaso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiivinen, akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiivinen"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Median ääni"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Puhelut"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Tiedostonsiirto"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Kuulokkeet"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Syöttölisälaite"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Muodostetaan paria vasemmanpuoleisen kuulolaitteen kanssa…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Muodostetaan paria oikeanpuoleisen kuulolaitteen kanssa…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Vasen – akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Oikea – akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi pois käytöstä"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Ei Wi-Fi-yhteyttä"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-signaali – yksi palkki"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automaattinen"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Yksityisen DNS-tarjoajan isäntänimi"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Anna isäntänimi tai DNS-tarjoaja."</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ei yhteyttä"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Näytä langattoman näytön sertifiointiin liittyvät asetukset"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Käytä satunnaista MAC-osoitetta, kun yhdistät Wi-Fi-verkkoon"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Maksullinen"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Maksuton"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Lokipuskurien koot"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Valitse puskurikohtaiset lokikoot"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Tyhjennetäänkö lokityökalun pysyvä tallennustila?"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 270a868..d658187 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté par %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Accessible par %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Actif, pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Actif"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Paramètres audio du support"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Écouteurs"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Périphérique d\'entrée"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Association de la prothèse auditive gauche en cours…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Association de la prothèse auditive droite en cours…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Gauche, pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Droite, pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi désactivé."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi déconnecté."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi : une barre."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <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>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Entrez le nom d\'hôte du fournisseur DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Impossible de se connecter"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options pour la certification d\'affichage sans fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler davantage les données Wi-Fi, afficher par SSID RSSI dans sélect. Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Sélectionner l\'adresse MAC de manière aléatoire lors de la connexion aux réseaux Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Mesuré"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Non mesuré"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Tailles des mémoires tampons d\'enregistreur"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Tailles enreg. par tampon journal"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Supprimer les données de l\'enregistreur?"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 6712813..903c98c 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Connecté via %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponible via %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connecté, aucun accès à Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Actif, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Actif"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Multimédia"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Casque audio"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Périphérique d\'entrée"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Association de l\'appareil auditif gauche…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Association de l\'appareil auditif droit…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Gauche – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Droit – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batterie"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi désactivé"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi déconnecté"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Signal Wi-Fi faible"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatique"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nom d\'hôte du fournisseur DNS privé"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Saisissez le nom d\'hôte du fournisseur DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Impossible de se connecter"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afficher les options de la certification de l\'affichage sans fil"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Détailler plus infos Wi-Fi, afficher par RSSI de SSID dans outil sélection Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Sélectionner l\'adresse MAC de manière aléatoire lors de la connexion aux réseaux Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Facturé à l\'usage"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Non facturé à l\'usage"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Tailles mémoires tampons enregistr."</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Tailles enreg. par tampon journal"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Effacer l\'espace de stockage persistant de l\'enregistreur ?"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 8972930..4919aa9 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s àȘŠà«àȘ”àȘŸàȘ°àȘŸ àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ„àȘŻà«‡àȘČ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s àȘŠà«àȘ”àȘŸàȘ°àȘŸ àȘ‰àȘȘàȘČàȘŹà«àȘ§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ•àȘ°à«àȘŻà«àȘ‚, àȘ•à«‹àȘˆ àȘ‡àȘšà«àȘŸàȘ°àȘšà«‡àȘŸ àȘšàȘ„ી"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> àȘžàȘŸàȘ„ે àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ„àȘŻà«‡àȘČ (àȘ•à«‹àȘˆ àȘ«à«‹àȘš àȘšàȘ„ી), àȘŹà«…àȘŸàȘ°à«€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> àȘžàȘŸàȘ„ે àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ„àȘŻà«‡àȘČ (àȘ•à«‹àȘˆ àȘźà«€àȘĄàȘżàȘŻàȘŸ àȘšàȘ„ી), àȘŹà«…àȘŸàȘ°à«€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> àȘžàȘŸàȘ„ે àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ„àȘŻà«‡àȘČ (àȘ•à«‹àȘˆ àȘ«à«‹àȘš àȘ…àȘ„àȘ”àȘŸ àȘźà«€àȘĄàȘżàȘŻàȘŸ àȘšàȘ„ી), àȘŹà«…àȘŸàȘ°à«€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"àȘžàȘ•à«àȘ°àȘżàȘŻ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àȘŹà«…àȘŸàȘ°à«€"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àȘŹà«…àȘŸàȘ°à«€"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"àȘžàȘ•à«àȘ°àȘżàȘŻ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"àȘźà«€àȘĄàȘżàȘŻàȘŸ àȘ‘àȘĄàȘżàȘ“"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"àȘ«à«‹àȘš àȘ•à«‰àȘČ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"àȘ«àȘŸàȘ‡àȘČ àȘžà«àȘ„àȘŸàȘšàȘŸàȘ‚àȘ€àȘ°àȘŁ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"àȘčેàȘĄàȘ«à«‹àȘš"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"àȘ‡àȘšàȘȘુàȘŸ àȘȘેàȘ°àȘżàȘ«à«‡àȘ°àȘČ"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"àȘŹà«àȘČૂàȘŸà«‚àȘ„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"àȘĄàȘŸàȘŹà«€ àȘŹàȘŸàȘœà«àȘšàȘŸ àȘ¶à«àȘ°àȘ”àȘŁ àȘŻàȘ‚àȘ€à«àȘ° àȘžàȘŸàȘ„ે àȘœà«‹àȘĄàȘŸàȘŁ àȘ•àȘ°à«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"àȘœàȘźàȘŁà«€ àȘŹàȘŸàȘœà«àȘšàȘŸ àȘ¶à«àȘ°àȘ”àȘŁ àȘŻàȘ‚àȘ€à«àȘ° àȘžàȘŸàȘ„ે àȘœà«‹àȘĄàȘŸàȘŁ àȘ•àȘ°à«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘ›à«€àȘ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"àȘĄàȘŸàȘŹà«‡ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àȘŹà«…àȘŸàȘ°à«€"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"àȘœàȘźàȘŁà«€ àȘŹàȘŸàȘœà«àȘšà«€ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àȘŹà«…àȘŸàȘ°à«€"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi àȘŹàȘ‚àȘ§."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi àȘĄàȘżàȘžà«àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ„àȘŻà«àȘ‚."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi àȘàȘ• àȘŹàȘŸàȘ°."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àȘ«àȘŸàȘ‡àȘČàȘźàȘŸàȘ‚ àȘŹàȘ§àȘŸ àȘŹà«àȘČૂàȘŸà«‚àȘ„ HCI àȘȘૅàȘ•à«‡àȘŸàȘšà«‡ àȘ•à«…àȘȘ્àȘšàȘ° àȘ•àȘ°à«‹ (àȘ† àȘžà«‡àȘŸàȘżàȘ‚àȘ— àȘŹàȘŠàȘČ્àȘŻàȘŸ àȘȘàȘ›à«€ àȘŹà«àȘČૂàȘŸà«‚àȘ„àȘšà«‡ àȘŸà«‰àȘ—àȘČ àȘ•àȘ°à«‹)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"àȘ†àȘȘàȘźà«‡àȘłà«‡"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"àȘ–àȘŸàȘšàȘ—à«€ DNS àȘȘ્àȘ°àȘŠàȘŸàȘ€àȘŸ àȘčોàȘžà«àȘŸàȘšà«àȘ‚ àȘšàȘŸàȘź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS àȘȘ્àȘ°àȘŠàȘŸàȘ€àȘŸàȘšàȘŸ àȘčોàȘžà«àȘŸàȘšà«àȘ‚ àȘšàȘŸàȘź àȘŠàȘŸàȘ–àȘČ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ•àȘ°à«€ àȘ¶àȘ•àȘŸàȘŻà«àȘ‚ àȘšàȘ„ી"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"àȘ”àȘŸàȘŻàȘ°àȘČેàȘž àȘĄàȘżàȘžà«àȘȘ્àȘČે àȘȘ્àȘ°àȘźàȘŸàȘŁàȘȘàȘ€à«àȘ° àȘźàȘŸàȘŸà«‡àȘšàȘŸ àȘ”àȘżàȘ•àȘČ્àȘȘો àȘŹàȘ€àȘŸàȘ”ો"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"àȘ”àȘŸàȘ‡-àȘ«àȘŸàȘ‡ àȘČોàȘ—àȘżàȘ‚àȘ— àȘžà«àȘ€àȘ° àȘ”àȘ§àȘŸàȘ°à«‹, àȘ”àȘŸàȘ‡-àȘ«àȘŸàȘ‡ àȘȘીàȘ•àȘ°àȘźàȘŸàȘ‚ SSID RSSI àȘŠà«€àȘ  àȘŹàȘ€àȘŸàȘ”ો"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"àȘ”àȘŸàȘ‡-àȘ«àȘŸàȘ‡ àȘšà«‡àȘŸàȘ”àȘ°à«àȘ• àȘžàȘŸàȘ„ે àȘœà«àȘŻàȘŸàȘ°à«‡ àȘ•àȘšà«‡àȘ•à«àȘŸ àȘ•àȘ°à«€ àȘ°àȘč્àȘŻàȘŸàȘ‚ àȘčોàȘŻ àȘ€à«àȘŻàȘŸàȘ°à«‡ MAC àȘàȘĄà«àȘ°à«‡àȘžàȘšà«‡ àȘ°à«‡àȘšà«àȘĄàȘźàȘŸàȘ‡àȘ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"àȘźà«€àȘŸàȘ° àȘ•àȘ°à«‡àȘČ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"àȘźà«€àȘŸàȘ° àȘš àȘ•àȘ°à«‡àȘČ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"àȘČોàȘ—àȘ° àȘŹàȘ«àȘ° àȘ•àȘŠ"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"àȘČૉàȘ— àȘŠà«€àȘ  àȘČૉàȘ—àȘ° àȘ•àȘŠ àȘŹàȘ«àȘ° àȘȘàȘžàȘ‚àȘŠ àȘ•àȘ°à«‹"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"àȘČૉàȘ—àȘ° àȘšàȘżàȘ°àȘ‚àȘ€àȘ° àȘžà«àȘŸà«‹àȘ°à«‡àȘœ àȘžàȘŸàȘ« àȘ•àȘ°à«€àȘ?"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 296da2d..f15cdd0 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s à€•à„‡ à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Čà€Źà„à€§"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s à€•à„‡ à€Šà„à€”à€Ÿà€°à€Ÿ à€‰à€Șà€Čà€Źà„à€§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"à€•à€šà„‡à€•à„à€Ÿ à€čà„‹ à€—à€Żà€Ÿ à€čà„ˆ, à€Čà„‡à€•à€żà€š à€‡à€‚à€Ÿà€°à€šà„‡à€Ÿ à€šà€čà„€à€‚ à€čà„ˆ"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"à€œà„à€Ąà€Œ à€—à€Żà€Ÿ (à€«à€Œà„‹à€š à€•à„‡ à€‘à€Ąà€żà€Żà„‹ à€•à„‹ à€›à„‹à€Ąà€Œà€•à€°), à€Źà„ˆà€Ÿà€°à„€ à€•à€Ÿ à€Čà„‡à€”à€Č <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"à€œà„à€Ąà€Œ à€—à€Żà€Ÿ (à€źà„€à€Ąà€żà€Żà€Ÿ à€‘à€Ąà€żà€Żà„‹ à€•à„‹ à€›à„‹à€Ąà€Œà€•à€°), à€Źà„ˆà€Ÿà€°à„€ à€•à€Ÿ à€Čà„‡à€”à€Č <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"à€œà„à€Ąà€Œ à€—à€Żà€Ÿ (à€«à€Œà„‹à€š à€Żà€Ÿ à€źà„€à€Ąà€żà€Żà€Ÿ à€‘à€Ąà€żà€Żà„‹ à€•à„‹ à€›à„‹à€Ąà€Œà€•à€°), à€Źà„ˆà€Ÿà€°à„€ à€•à€Ÿ à€Čà„‡à€”à€Č <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"à€šà€Ÿà€Čà„‚, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„ˆà€Ÿà€°à„€"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„ˆà€Ÿà€°à„€"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"à€šà€Ÿà€Čà„‚"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"à€źà„€à€Ąà€żà€Żà€Ÿ à€‘à€Ąà€żà€Żà„‹"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"à€«à€Œà„‹à€š à€•à„‰à€Č"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"à€«à€Œà€Ÿà€‡à€Č à€žà„à€„à€Ÿà€šà€Ÿà€‚à€€à€°à€Ł"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"à€čà„‡à€Ąà€«à€Œà„‹à€š"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"à€‡à€šà€Șà„à€Ÿ à€Șà„‡à€°à€żà€«à€Œà„‡à€°à€Č"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"à€Źà„à€Čà„‚à€Ÿà„‚à€„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"à€žà„à€šà€šà„‡ à€źà„‡à€‚ à€źà€Šà€Šà€—à€Ÿà€° à€Źà€Ÿà€ˆà€‚ à€“à€° à€•à€Ÿ à€Ąà€żà€”à€Ÿà€‡à€ž à€œà„‹à€Ąà€Œà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"à€žà„à€šà€šà„‡ à€źà„‡à€‚ à€źà€Šà€Šà€—à€Ÿà€° à€Šà€Ÿà€ˆà€‚ à€“à€° à€•à€Ÿ à€Ąà€żà€”à€Ÿà€‡à€ž à€œà„‹à€Ąà€Œà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"à€Źà€Ÿà€ˆà€‚ à€“à€° à€•à€Ÿ à€Ąà€żà€”à€Ÿà€‡à€ž - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„ˆà€Ÿà€°à„€"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"à€Šà€Ÿà€ˆà€‚ à€“à€° à€•à€Ÿ à€Ąà€żà€”à€Ÿà€‡à€ž - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„ˆà€Ÿà€°à„€"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€Źà€‚à€Š à€čà„ˆ."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€Ąà€żà€žà€•à€šà„‡à€•à„à€Ÿ à€čà„ˆ."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€•à€Ÿ à€à€• à€Źà€Ÿà€° à€čà„ˆ."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"à€žà€­à„€ à€Źà„à€Čà„‚à€Ÿà„‚à€„ à€à€šà€žà„€à€†à€ˆ à€Șà„ˆà€•à„‡à€Ÿ à€à€• à€«à€Œà€Ÿà€‡à€Č à€źà„‡à€‚ à€•à„ˆà€Șà„à€šà€° à€•à€°à„‡à€‚ (à€Żà€č à€žà„‡à€Ÿà€żà€‚à€— à€Źà€Šà€Čà€šà„‡ à€•à„‡ à€Źà€Ÿà€Š à€Źà„à€Čà„‚à€Ÿà„‚à€„ à€Ÿà„‰à€—à€Č à€•à€°à„‡à€‚)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"à€…à€Șà€šà„‡ à€†à€Ș"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"à€šà€żà€œà„€ DNS à€žà„‡à€”à€Ÿ à€Šà„‡à€šà„‡ à€”à€Ÿà€Čà„‡ à€•à€Ÿ à€čà„‹à€žà„à€Ÿà€šà€Ÿà€ź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS à€žà„‡à€”à€Ÿ à€Šà„‡à€šà„‡ à€”à€Ÿà€Čà„‡ à€•à€Ÿ à€čà„‹à€žà„à€Ÿà€šà€Ÿà€ź à€Ąà€Ÿà€Čà„‡à€‚"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"à€•à€šà„‡à€•à„‍à€Ÿ à€šà€čà„€à€‚ à€čà„‹ à€žà€•à€Ÿ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"à€”à€Ÿà€Żà€°à€Čà„‡à€ž à€Šà€żà€–à€Ÿà€ˆ à€Šà„‡à€šà„‡ à€•à„‡ à€Čà€żà€ à€Șà„à€°à€źà€Ÿà€Łà€š à€”à€żà€•à€Čà„à€Ș à€Šà€żà€–à€Ÿà€à€‚"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€Șà„à€°à€”à„‡à€¶ à€žà„à€€à€° à€Źà€ąà€Œà€Ÿà€à€‚, à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€Șà€żà€•à€° à€źà„‡à€‚ à€Șà„à€°à€€à€ż SSID RSSI à€Šà€żà€–à€Ÿà€à€‚"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"à€”à€Ÿà€ˆ-à€«à€Œà€Ÿà€ˆ à€žà„‡ à€œà„à€Ąà€Œà€€à„‡ à€žà€źà€Ż à€…à€Čà€—-à€…à€Čà€— à€à€źà€à€žà„€ à€Șà€€à„‡ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"à€Ąà„‡à€Ÿà€Ÿ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€•à€°à€šà„‡ à€•à„€ à€žà„€à€źà€Ÿ à€€à€Ż à€•à„€ à€—à€ˆ à€čà„ˆ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"à€Ąà„‡à€Ÿà€Ÿ à€‡à€žà„à€€à„‡à€źà€Ÿà€Č à€•à€°à€šà„‡ à€•à„€ à€žà„€à€źà€Ÿ à€€à€Ż à€šà€čà„€à€‚ à€•à„€ à€—à€ˆ à€čà„ˆ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"à€Čà„‰à€—à€° à€Źà€«à€Œà€° à€†à€•à€Ÿà€°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"à€Șà„à€°à€€à€ż à€Čà„‰à€— à€Źà€«à€Œà€° à€Čà„‰à€—à€° à€†à€•à€Ÿà€° à€šà„à€šà„‡à€‚"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"à€Čà„‰à€—à€° à€žà€€à€€ à€źà„‡à€źà„‹à€°à„€ à€žà€Ÿà€«à€Œ à€•à€°à„‡à€‚?"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 8f4cff8..ae14171 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Povezano putem %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupno putem %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Povezano, bez interneta"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona i medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktivan, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktivan"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medijski zvuk"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prijenos datoteke"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Slušalice"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferni uređaj za unos"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Uparivanje lijevog slušnog aparata…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Uparivanje desnog slušnog aparata…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Lijeva strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Desna strana – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterije"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi je isključen."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi je isključen."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi signal ima jedan stupac."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatski"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Naziv hosta davatelja usluge privatnog DNS-a"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Unesite naziv hosta davatelja usluge DNS-a"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Povezivanje nije moguće"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"PrikaĆŸi opcije za certifikaciju beĆŸičnog prikaza"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećana razina prijave na Wi‑Fi, prikaz po SSID RSSI-ju u Biraču Wi‑Fi-ja"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Nasumično odaberi MAC adresu pri povezivanju s Wi-Fi mreĆŸama"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"S ograničenim prometom"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Bez ograničenja prometa"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Veličine međuspremnika zapisnika"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Odaberite veličinu međuspremnika zapisnika"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ćœelite li izbrisati trajnu pohranu zapisivača?"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 2c31478..6a659be 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Csatlakozva a következƑn keresztül: %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"ElérhetƑ a következƑn keresztül: %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Csatlakozva, nincs internet-hozzáférés"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Csatlakoztatva (telefonhang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Csatlakoztatva (médiahang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Csatlakoztatva (nincs telefon- és médiahang); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktív, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-os töltöttség"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktív"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Média audió"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonhívások"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fájlátvitel"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Fejhallgató"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Beviteli periféria"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Bal oldali hallókészülék párosítása…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Jobb oldali hallókészülék párosítása…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Bal oldali – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-os töltöttség"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Jobb oldali – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-os töltöttség"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi kikapcsolva."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Nincs Wi-Fi-kapcsolat."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-jel: egy sáv."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatikus"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Privát DNS-szolgáltató gazdagépneve"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Adja meg a DNS-szolgáltató gazdagépnevét"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nem sikerült kapcsolódni"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vezeték nélküli kijelzƑ tanúsítványával kapcsolatos lehetƑségek megjelenítése"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC-cím véletlenszerƱ generálása Wi‑Fi-hálózatra való csatlakozáskor"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Forgalomkorlátos"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Nem forgalomkorlátos"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Naplózási puffer mérete"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Naplózási pufferméret kiválasztása"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Törli a naplózó program állandó tárhelyét?"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index de2cfc9..0b821ed 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ÔżŐĄŐșŐĄŐŻÖŐŸŐĄŐź Ő§ %1$s-Ő« ŐŽŐ«Ő»ŐžÖŐžŐŸ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Ő€ŐĄŐœŐĄŐ¶Ő„ŐŹŐ« Ő§ %1$s-Ő« ŐŽŐ«Ő»ŐžÖŐžŐŸ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ő„Ő«ŐĄÖŐŸŐĄŐź Ő§, ŐœŐĄŐŻŐĄŐ”Ő¶ Ő«Ő¶ŐżŐ„Ö€Ő¶Ő„Őż ŐŻŐĄŐș ŐčŐŻŐĄ"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ő„Ő«ŐĄÖŐŸŐĄŐź Ő§ (Ő°Ő„ŐŒŐĄŐ­ŐžŐœ ŐčŐŻŐĄ), Վերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ő„Ő«ŐĄÖŐŸŐĄŐź Ő§ (ŐŽŐ„Ő€Ő«ŐĄ ŐčŐŻŐĄ), Վերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ő„Ő«ŐĄÖŐŸŐĄŐź Ő§ (Ő°Ő„ŐŒŐĄŐ­ŐžŐœ ŐŻŐĄŐŽ ŐŽŐ„Ő€Ő«ŐĄ ŐčŐŻŐĄ), Վերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ô±ŐŻŐżŐ«ŐŸ է։ Մերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Մերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ô±ŐŻŐżŐ«ŐŸ Ő§"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Ő„Ő„Ő€Ő«ŐĄ ŐĄŐžÖ‚Ő€Ő«Őž"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Ő€Ő„ŐŒŐĄŐ­ŐžŐœŐĄŐŠŐĄŐ¶ŐŁŐ„Ö€"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Ő–ŐĄŐ”ŐŹŐ„Ö€Ő« ÖƒŐžŐ­ŐĄŐ¶ÖŐžÖ‚ŐŽ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Ô±ŐŻŐĄŐ¶Ő»ŐĄŐŻŐĄŐŹ"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Ő„ŐžÖ‚ŐżÖ„Ő« ŐĄÖ€ŐżŐĄÖ„Ő«Ő¶ ŐœŐĄÖ€Ö„Ő„Ö€"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Ô¶ŐžÖ‚ŐŁŐĄŐŻÖŐŸŐžÖ‚ŐŽ Ő§ Ő±ŐĄŐ­ ŐŹŐœŐžŐČŐĄŐŻŐĄŐ¶ ŐĄŐșŐĄÖ€ŐĄŐżŐ« Ő°Ő„Őż…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Ô¶ŐžÖ‚ŐŁŐĄŐŻÖŐŸŐžÖ‚ŐŽ Ő§ ŐĄŐ» ŐŹŐœŐžŐČŐĄŐŻŐĄŐ¶ ŐĄŐșŐĄÖ€ŐĄŐżŐ« Ő°Ő„Őż…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Ձեխ ŐŹŐœŐžŐČŐĄŐŻŐĄŐ¶ ŐĄŐșարատ – Վերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Ô±Ő» ŐŹŐœŐžŐČŐĄŐŻŐĄŐ¶ ŐĄŐșարատ – Վերտկ՞ցի ŐŹŐ«ÖÖ„ŐšŐ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi-Ő¶ ŐĄŐ¶Ő»ŐĄŐżŐŸŐĄŐź Ő§:"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi-Őš ŐŻŐĄŐșŐĄŐŻÖŐŸŐĄŐź ŐčŐ§:"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-Ő« վւŐȘŐŁŐ¶ŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶ŐšŐ ŐŽŐ„ŐŻ ŐŁŐ«Őź:"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Ô±ŐŸŐżŐžŐŽŐĄŐż"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Ô±Ő¶Ő°ŐĄŐżŐĄŐŻŐĄŐ¶ DNS ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐŽŐĄŐżŐĄŐŻŐĄÖ€ŐĄÖ€Ő« Ő­Ő¶ŐĄŐŽŐžÖ€Ő€Ő« ŐĄŐ¶ŐžÖ‚Ő¶Őš"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ő„ŐžÖ‚ŐżÖ„ŐĄŐŁÖ€Ő„Ö„ DNS ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐŽŐĄŐżŐĄŐŻŐĄÖ€ŐĄÖ€Ő« Ő­Ő¶ŐĄŐŽŐžÖ€Ő€Ő« ŐĄŐ¶ŐžÖ‚Ő¶Őš"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ő‰Ő°ŐĄŐ»ŐžŐČŐŸŐ„Ö ŐŽŐ«ŐĄŐ¶ŐĄŐŹ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Ց՞ւՔց ŐżŐĄŐŹ ŐĄŐ¶ŐŹŐĄÖ€ Ő§ŐŻÖ€ŐĄŐ¶Ő« Ő°ŐĄŐŸŐĄŐœŐżŐĄŐŁÖ€ŐŽŐĄŐ¶ ŐšŐ¶ŐżÖ€ŐĄŐ¶Ö„Ő¶Ő„Ö€Őš"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ÔČերձրեցնՄՏ ŐŽŐĄŐŻŐĄÖ€Ő€ŐĄŐŻŐš, Wi‑Fi ŐšŐ¶ŐżÖ€Ő«Őčվւծ ŐĄŐŽŐ„Ő¶ ŐŽŐ« SSID-Ő« հածար ց՞ւՔց ŐżŐĄŐŹ RSSI"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"ŐŠŐĄŐżŐĄŐ°ŐĄŐŻŐĄŐ¶ŐžÖ€Ő„Ő¶ ŐšŐ¶ŐżÖ€Ő„ŐŹ MAC Ő°ŐĄŐœÖŐ„Ő¶ Wi-Fi ցենցՄրին ŐŽŐ«ŐĄŐ¶ŐĄŐŹŐ«Őœ"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ŐŽŐłŐĄÖ€ŐžŐŸŐ« Ő©Ö€ŐĄÖ†Ő«ŐŻ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Ô±Ő¶ŐœŐĄŐ°ŐŽŐĄŐ¶ŐĄÖƒŐĄŐŻ Ő©Ö€ŐĄÖ†Ő«ŐŻ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ŐŐ„ŐČŐ„ŐŻŐĄŐŽŐĄŐżŐ”ŐĄŐ¶Ő« ŐșŐĄŐ°Ő¶ŐĄŐŻŐ« ŐčŐĄÖƒŐ„Ö€Őš"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ÔžŐ¶ŐżÖ€Ő„Ö„ ŐżŐ„ŐČŐ„ŐŻŐĄŐŽŐĄŐżŐ”ŐĄŐ¶Ő« Őčեփ՚ ŐŽŐ„ŐŻ ŐșŐĄŐ°Ő¶ŐĄŐŻŐ« հածար"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ő‹Ő¶Ő»Ő„ŐžŐŹ ŐŽŐĄŐżŐ”ŐĄŐ¶Ő« ŐŽŐ·ŐżŐĄŐŻŐĄŐ¶ Ő°Ő«Ő·ŐžŐČŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Őš:"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index eb611ac..0150f32 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -65,7 +65,7 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Terhubung (tanpa ponsel), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Terhubung (tanpa media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Terhubung (tanpa ponsel atau media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktif, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktif, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_battery_level" msgid="1447164613319663655">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktif"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
@@ -116,8 +116,8 @@
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
     <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Menyambungkan alat bantu dengar sebelah kiri…"</string>
     <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Menyambungkan alat bantu dengar sebelah kanan…"</string>
-    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kiri - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
-    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kanan - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> baterai"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kiri - baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kanan - baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi tidak aktif."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi tidak tersambung."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi satu baris."</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index d2f5ff1..9eca2b2 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Collegato tramite %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Disponibile tramite %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Connesso, senza Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono escluso), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono o contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Attivo - Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Attivo"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimediale"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonate"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Trasferimento file"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Cuffie"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Periferica di immissione"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Accoppiamento dell\'apparecchio acustico sinistro…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Accoppiamento dell\'apparecchio acustico destro…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Sinistro - Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Destro - Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi non attivo."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Rete Wi-Fi scollegata."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: una barra."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatico"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nome host del provider DNS privato"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Inserisci il nome host del provider DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Impossibile collegarsi"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Mostra opzioni per la certificazione display wireless"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Aumenta il livello di registrazione Wi-Fi, mostrando il SSID RSSI nel selettore Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Seleziona indirizzo MAC casuale con reti Wi-Fi collegate"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"A consumo"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Non a consumo"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Dimensioni buffer Logger"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Seleziona dimensioni Logger per buffer log"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Cancellare i dati nello spazio di archiviazione permanente del logger?"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 666ca76..48b037f 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏ŚžŚ—Ś•Ś‘Śš Ś“ŚšŚš %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏Ś–ŚžŚ™Ś Ś” Ś“ŚšŚš %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ŚžŚ—Ś•Ś‘Śš. ŚŚ™ŚŸ ŚŚ™Ś Ś˜ŚšŚ Ś˜"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ŚžŚ—Ś•Ś‘Śš (ŚœŚœŚ Ś˜ŚœŚ€Ś•ŚŸ), Ś©Ś™ŚąŚ•Śš Ś”ŚĄŚ•ŚœŚœŚ” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ŚžŚ—Ś•Ś‘Śš (ŚœŚœŚ ŚžŚ“Ś™Ś”), Ś©Ś™ŚąŚ•Śš Ś”ŚĄŚ•ŚœŚœŚ” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ŚžŚ—Ś•Ś‘Śš (ŚœŚœŚ Ś˜ŚœŚ€Ś•ŚŸ ŚŚ• ŚžŚ“Ś™Ś”), Ś©Ś™ŚąŚ•Śš Ś”ŚĄŚ•ŚœŚœŚ” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Ś€ŚąŚ™Śœ, Ś˜ŚąŚ™Ś ŚȘ Ś”ŚĄŚ•ŚœŚœŚ”: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Ś˜ŚąŚ™Ś ŚȘ Ś”ŚĄŚ•ŚœŚœŚ”: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Ś€ŚąŚ™Śœ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ŚŚ•Ś“Ś™Ś• Ś©Śœ ŚžŚ“Ś™Ś”"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Ś©Ś™Ś—Ś•ŚȘ Ś˜ŚœŚ€Ś•ŚŸ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Ś”ŚąŚ‘ŚšŚȘ Ś§Ś‘ŚŠŚ™Ś"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ŚŚ•Ś–Ś Ś™Ś™Ś”"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ŚŠŚ™Ś•Ś“ Ś§ŚœŚ˜ Ś”Ś™Ś§Ś€Ś™"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ŚžŚȘŚ‘ŚŠŚąŚȘ Ś”ŚȘŚŚžŚ” Ś©Śœ ŚžŚ›Ś©Ś™Śš Ś©ŚžŚ™ŚąŚ” Ś©ŚžŚŚœŚ™…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ŚžŚȘŚ‘ŚŠŚąŚȘ Ś”ŚȘŚŚžŚ” Ś©Śœ ŚžŚ›Ś©Ś™Śš Ś©ŚžŚ™ŚąŚ” Ś™ŚžŚ Ś™…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Ś©ŚžŚŚœŚ™ - Ś˜ŚąŚ™Ś ŚȘ Ś”ŚĄŚ•ŚœŚœŚ”: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Ś™ŚžŚ Ś™ - Ś˜ŚąŚ™Ś ŚȘ Ś”ŚĄŚ•ŚœŚœŚ”: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"‏Wi-Fi Ś›Ś‘Ś•Ś™."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"‏Wi-Fi ŚžŚ Ś•ŚȘŚ§."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"‏Ś€ŚĄ ŚŚ—Ś“ Ś©Śœ Wi-Fi."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏ŚŚ™Ś—Ś•Ś“ Ś©Śœ Ś›Śœ Ś—Ś‘Ś™ŚœŚ•ŚȘ Bluetooth HCI Ś‘Ś§Ś•Ś‘Ś„ (Ś™Ś© ŚœŚ”Ś—ŚœŚ™ŚŁ ŚžŚŠŚ‘ Bluetooth ŚœŚŚ—Śš Ś©Ś™Ś Ś•Ś™ Ś”Ś’Ś“ŚšŚ” Ś–Ś•)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Ś‘ŚŚ•Ś€ŚŸ ŚŚ•Ś˜Ś•ŚžŚ˜Ś™"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"‏Ś©Ś ŚžŚŚšŚ— Ś©Śœ ŚĄŚ€Ś§ DNS Ś€ŚšŚ˜Ś™"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"‏ŚŠŚšŚ™Śš ŚœŚ”Ś–Ś™ŚŸ ŚŚȘ Ś©Ś Ś”ŚžŚŚšŚ— Ś©Śœ ŚĄŚ€Ś§ DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ŚœŚ Ś Ś™ŚȘŚŸ Ś”Ś™Ś” ŚœŚ”ŚȘŚ—Ś‘Śš"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"‏Ś”ŚŠŚ’ ŚŚ€Ś©ŚšŚ•Ś™Ś•ŚȘ ŚąŚ‘Ś•Śš ŚŚ™Ś©Ś•Śš Ś©Śœ ŚȘŚŠŚ•Ś’ŚȘ WiFi"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏Ś”ŚąŚœŚ” ŚŚȘ ŚšŚžŚȘ Ś”ŚšŚ™Ś©Ś•Ś Ś©Śœ Wi‑Fi Ś‘Ś™Ś•ŚžŚŸ, Ś”ŚŠŚ’ ŚœŚ›Śœ SSID RSSI Ś‘-Wi‑Fi Picker"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"‏Ś™ŚŠŚ™ŚšŚȘ Ś›ŚȘŚ•Ś‘ŚȘ MAC ŚŚ§ŚšŚŚ™ŚȘ Ś‘Ś”ŚȘŚ—Ś‘ŚšŚ•ŚȘ ŚœŚšŚ©ŚȘŚ•ŚȘ Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Ś ŚžŚ“Ś“ŚȘ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ŚœŚ Ś ŚžŚ“Ś“ŚȘ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Ś’Ś“ŚœŚ™ ŚžŚŚ’Śš Ś©Śœ Ś™Ś•ŚžŚŸ ŚšŚ™Ś©Ś•Ś"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Ś‘Ś—Śš Ś’Ś“ŚœŚ™Ś Ś©Śœ Ś™Ś•ŚŠŚš Ś™Ś•ŚžŚŸ ŚœŚ›Śœ ŚžŚŚ’Śš Ś™Ś•ŚžŚŸ"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ś”ŚŚ ŚœŚžŚ—Ś•Ś§ ŚŚȘ ŚŚ—ŚĄŚ•ŚŸ Ś”ŚžŚȘŚąŚ“ Ś”ŚžŚȘŚžŚ™Ś“?"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 6422103..dae07e2 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$sç”Œç”±ă§æŽ„ç¶š"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$sç”Œç”±ă§äœżç”šćŻèƒœ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"æŽ„ç¶šæžˆăżă€ă‚€ăƒłă‚żăƒŒăƒăƒƒăƒˆæŽ„ç¶šăȘし"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"æŽ„ç¶šæžˆăżïŒˆé›»è©±ăȘă—ïŒ‰ă€é›»æ± æź‹é‡ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"æŽ„ç¶šæžˆăżïŒˆăƒĄăƒ‡ă‚Łă‚ąăȘă—ïŒ‰ă€é›»æ± æź‹é‡ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"æŽ„ç¶šæžˆăżïŒˆé›»è©±ă€ăƒĄăƒ‡ă‚Łă‚ąăȘă—ïŒ‰ă€é›»æ± æź‹é‡ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"有ćŠčă€é›»æ±  <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"有ćŠč"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"メディケぼ音棰"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"電話"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ăƒ•ă‚Ąă‚€ăƒ«è»ąé€"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ăƒ˜ăƒƒăƒ‰ăƒ•ă‚©ăƒł"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"慄抛甚摚èŸșæ©Ÿć™š"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ć·ŠćŽăźèŁœèŽć™šăšăƒšă‚ąèš­ćźšă—ăŠă„ăŸă™…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ćłćŽăźèŁœèŽć™šăšăƒšă‚ąèš­ćźšă—ăŠă„ăŸă™…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"淊恎 - 電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"揳恮 - 電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-FiはOFFです。"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-FiăŒćˆ‡æ–­ă•ă‚ŒăŸă—ăŸă€‚"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-FiăŻăƒŹăƒ™ăƒ«1です。"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"è‡Ș拕"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"ăƒ—ăƒ©ă‚€ăƒ™ăƒŒăƒˆ DNS ăƒ—ăƒ­ăƒă‚€ăƒ€ăźăƒ›ă‚čト損"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ăƒ—ăƒ­ăƒă‚€ăƒ€ăźăƒ›ă‚čăƒˆćă‚’ć…„ćŠ›"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"æŽ„ç¶šă§ăăŸă›ă‚“ă§ă—ăŸ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ăƒŻă‚€ăƒ€ăƒŹă‚čディă‚čăƒ—ăƒŹă‚€èȘèšŒăźă‚Șăƒ—ă‚·ăƒ§ăƒłă‚’èĄšç€ș"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fiăƒ­ă‚°ăƒŹăƒ™ăƒ«ă‚’äžŠă’ăŠă€Wi-FiéžæŠžăƒ„ăƒŒăƒ«ă§SSID RSSIă”ăšă«èĄšç€șă—ăŸă™"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi ăƒăƒƒăƒˆăƒŻăƒŒă‚ŻæŽ„ç¶šæ™‚ăź MAC ケドレă‚čăźăƒ©ăƒłăƒ€ăƒ ćŒ–"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ćŸ“é‡ćˆ¶"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ćźšéĄćˆ¶"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ăƒ­ă‚°ăƒăƒƒăƒ•ă‚Ąăźă‚”ă‚€ă‚ș"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ć„ăƒ­ă‚°ăƒăƒƒăƒ•ă‚Ąăźăƒ­ă‚°ă‚”ă‚€ă‚șă‚’éžæŠž"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ăƒ­ă‚°ăźæ°žç¶šă‚čăƒˆăƒŹăƒŒă‚žă‚’æ¶ˆćŽ»ă—ăŸă™ă‹ïŒŸ"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index d6271f0..84fd1e1a 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ით დაკავჹირებული"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"ჼელმისაწვდომია %1$s-ით"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"დაკავჹირებულია, ინჱერნეჱის გარეჹე"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"დაკავჹირებულია (áƒąáƒ”áƒšáƒ”áƒ€áƒáƒœáƒ˜ არ არიქ). ბაჱარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"დაკავჹირებულია (მედია არ არის). ბაჱარეა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"დაკავჹირებულია (áƒąáƒ”áƒšáƒ”áƒ€áƒáƒœáƒ˜ ან მედია არ არიქ). ბაჱარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"აჄჹიურია, ბაჱარეა <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>-ქ ჹეადგენს"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ბაჱარეა"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"აჄჹიური"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"მედია აუდიო"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"áƒĄáƒáƒąáƒ”áƒšáƒ”áƒ€áƒáƒœáƒ ზარები"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"áƒ€áƒáƒ˜áƒšáƒ”áƒ‘áƒ˜áƒĄ გადაáƒȘემა"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ყურსასმენი"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ჹეყვანის áƒžáƒ”áƒ áƒ˜áƒ€áƒ”áƒ áƒ˜áƒŁáƒšáƒ˜ მოწყობილობა"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"მიმდინარეობს მარáƒȘჼენა სმენის აპარაჱის დაწყვილება…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"მიმდინარეობს მარჯვენა სმენის აპარაჱის დაწყვილება…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"მარáƒȘჼენა — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ბაჱარეა"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"მარჯვენა — <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ბაჱარეა"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi გამორთულია."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"WiFi არ არის დაკავჹირებული."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WiFi სიგნალი ერთ ზოლზეა."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ავჱომაჱური"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"პირადი DNS პროვაიდერის სერვერის საჼელი"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ჹეიყვანეთ DNS პროვაიდერის სერვერის საჼელი"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"დაკავჹირება ვერ მოჼერჼდა"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"უსადენო ეკრანის áƒĄáƒ”áƒ áƒąáƒ˜áƒ€áƒ˜áƒȘირების ვარიანჱების ჩვენება"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi-ქ ა჊რიáƒȘჼვის დონის გაზრდა, Wi‑Fi ამომრჩეველლი ყოველ SSID RSSI-ზე ჩვენება"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"MAC მისამართის ჹემთჼვევითობა áƒ©áƒáƒ˜áƒ áƒ—áƒáƒĄ, როáƒȘა Wi‑Fi-áƒ„áƒĄáƒ”áƒšáƒ”áƒ‘áƒ—áƒáƒœ დაკავჹირება ჼდება"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ლიმიჱირებული"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"არალიმიჱირებული"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ჟურნალიზაáƒȘიიქ áƒ‘áƒŁáƒ€áƒ”áƒ áƒ˜áƒĄ ზომები"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"აირჩიეთ ჟურნ. ზომა / ჟურნ. áƒ‘áƒŁáƒ€áƒ”áƒ áƒ–áƒ”"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"გსურთ მუდმივი ჟურნალირების მეჼსიერების áƒ’áƒáƒĄáƒŁáƒ€áƒ—áƒáƒ•áƒ”áƒ‘áƒ?"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index f80421f..058eecb 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s Đ°Ń€Ò›Ń‹Đ»Ń‹ Ò›ĐŸŃŃ‹Đ»Ò“Đ°Đœ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s Đ°Ń€Ò›Ń‹Đ»Ń‹ Ò›ĐŸĐ»Đ¶Đ”Ń‚Ń–ĐŒĐŽŃ–"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ÒšĐŸŃŃ‹Đ»Ò“Đ°Đœ, ĐžĐœŃ‚Đ”Ń€ĐœĐ”Ń‚ Đ¶ĐŸÒ›"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Đ–Đ°Đ»Ò“Đ°ĐœĐŽŃ‹ (Ń‚Đ”Đ»Đ”Ń„ĐŸĐœŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”Ń Đ·Đ°Ń€ŃĐŽŃ‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Đ–Đ°Đ»Ò“Đ°ĐœĐŽŃ‹ (Đ°ŃƒĐŽĐžĐŸŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”Ń Đ·Đ°Ń€ŃĐŽŃ‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Đ–Đ°Đ»Ò“Đ°ĐœĐŽŃ‹ (Ń‚Đ”Đ»Đ”Ń„ĐŸĐœŃŃ‹Đ· ĐœĐ” Đ°ŃƒĐŽĐžĐŸŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”Ń Đ·Đ°Ń€ŃĐŽŃ‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ÒšĐŸŃŃƒĐ»Ń‹, Đ±Đ°Ń‚Đ°Ń€Đ”Ń Ò›ŃƒĐ°Ń‚Ń‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Đ‘Đ°Ń‚Đ°Ń€Đ”Ń Ò›ŃƒĐ°Ń‚Ń‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ÒšĐŸŃŃƒĐ»Ń‹"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"MeЎОа Đ°ŃƒĐŽĐžĐŸŃŃ‹"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ĐąĐ”Đ»Đ”Ń„ĐŸĐœ Ò›ĐŸÒŁŃ‹Ń€Đ°ŃƒĐ»Đ°Ń€Ń‹"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ЀаĐčĐ» Đ¶Ń–Đ±Đ”Ń€Ńƒ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ÒšÒ±Đ»Đ°Ò›Đ°ŃĐżĐ°Đż"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Кіріс Ò›Ò±Ń€Đ°Đ»Ń‹"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ĐĄĐŸĐ» Đ¶Đ°Ò› Đ”ŃŃ‚Ńƒ Đ°ĐżĐżĐ°Ń€Đ°Ń‚Ń‹Đœ Đ¶Ò±ĐżŃ‚Đ°Đ»ŃƒĐŽĐ°…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ĐžÒŁ Đ¶Đ°Ò› Đ”ŃŃ‚Ńƒ аппараты Đ¶Ò±ĐżŃ‚Đ°Đ»ŃƒĐŽĐ°…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ĐĄĐŸĐ» Đ¶Đ°Ò›. Đ‘Đ°Ń‚Đ°Ń€Đ”Ń Ò›ŃƒĐ°Ń‚Ń‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ĐžÒŁ Đ¶Đ°Ò›. Đ‘Đ°Ń‚Đ°Ń€Đ”Ń Ò›ŃƒĐ°Ń‚Ń‹: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi Ó©ŃˆŃ–Ń€ŃƒĐ»Ń–."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi Đ°Đ¶Ń‹Ń€Đ°Ń‚Ń‹Đ»Ò“Đ°Đœ."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi ŃĐžĐłĐœĐ°Đ»Ń‹ — бір Đ¶ĐŸĐ»Đ°Ò›."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"АĐČŃ‚ĐŸĐŒĐ°Ń‚Ń‚Ń‹"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Đ–Đ”ĐșĐ” DNS ĐżŃ€ĐŸĐČĐ°ĐčĐŽĐ”Ń€Ń–ĐœŃ–ÒŁ Ń…ĐŸŃŃ‚ атауы"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ĐżŃ€ĐŸĐČĐ°ĐčĐŽĐ”Ń€Ń–ĐœŃ–ÒŁ Ń…ĐŸŃŃ‚ Đ°Ń‚Đ°ŃƒŃ‹Đœ Đ”ĐœĐłŃ–Đ·Ń–ÒŁŃ–Đ·"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ÒšĐŸŃŃ‹Đ»ĐŒĐ°ĐŽŃ‹"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ĐĄŃ‹ĐŒŃŃ‹Đ· ЎОсплДĐč растау ĐŸĐżŃ†ĐžŃĐ»Đ°Ń€Ń‹Đœ ĐșÓ©Ń€ŃĐ”Ń‚Ńƒ"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi Đ¶ŃƒŃ€. тір. ĐŽĐ”ÒŁ. арт., Wi‑Fi Đ¶Đ”Đ»Ń–ŃŃ–Đœ Ń‚Đ°ÒŁĐŽĐ°Ò“Ń‹ŃˆŃ‚Đ° әр SSID RSSI Đ±ĐŸĐčŃ‹ĐœŃˆĐ° ĐșÓ©Ń€ŃĐ”Ń‚Ńƒ"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi Đ¶Đ”Đ»Ń–ŃŃ–ĐœĐ” Ò›ĐŸŃŃ‹Đ»Ńƒ ĐșĐ”Đ·Ń–ĐœĐŽĐ” MAC ĐŒĐ”ĐșĐ”ĐœĐ¶Đ°ĐčĐ»Đ°Ń€Ń‹Đœ ДрĐșŃ–Đœ Ń‚Đ°ÒŁĐŽĐ°Ńƒ"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"КДĐșŃ‚Đ”Đ»ĐłĐ”Đœ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"КДĐșŃ‚Đ”Đ»ĐŒĐ”ĐłĐ”Đœ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Đ–ŃƒŃ€ĐœĐ°Đ»Ò“Đ° тірĐșĐ”ŃƒŃˆŃ– Đ±ŃƒŃ„Đ”Ń€Ń–ĐœŃ–ÒŁ Ó©Đ»ŃˆĐ”ĐŒĐŽĐ”Ń€Ń–"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Әр Đ¶ŃƒŃ€ĐœĐ°Đ» Đ±ŃƒŃ„Đ”Ń€Ń– ÒŻŃˆŃ–Đœ Đ¶ŃƒŃ€ĐœĐ°Đ»Ò“Đ° тірĐșĐ”ŃƒŃˆŃ– Ó©Đ»ŃˆĐ”ĐŒĐŽĐ”Ń€Ń–Đœ Ń‚Đ°ÒŁĐŽĐ°Ńƒ"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"бірĐșĐ”ŃƒŃ–ŃˆŃ‚Ń–ÒŁ Ń‚Ò±Ń€Đ°Ò›Ń‚Ń‹ Đ¶Đ°ĐŽŃ‹Đœ Ń‚Đ°Đ·Đ°Ń€Ń‚Ńƒ ĐșДрДĐș пД?"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 09f28bc..046b53b 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"បានភ្ជាប់តាមរយៈ %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"មានតាមរយៈ %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"បាន​ភ្ជាប់ áž”áŸ‰áž»áž“áŸ’ážáŸ‚â€‹áž‚áŸ’áž˜áž¶áž“â€‹ážąáŸŠážžáž“áž’ážșណិត​ទេ"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"បាន​ភ្ជាប់ (គ្មាន​ទឌរសព្ទ​ទេ) ហសយ​ថ្ម​មាន​កម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"បាន​ភ្ជាប់ (គ្មាន​មេឌៀ​ទេ) ហសយ​ថ្ម​មាន​កម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"បាន​ភ្ជាប់ (គ្មាន​ទឌរសព្ទ ឬ​មេឌៀ​ទេ) ហសយ​ថ្ម​មាន​កម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"សកម្ម ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"សកម្ម"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"សំឡេង​មេឌៀ"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ការហៅ​ទឌរសព្ទ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"áž•áŸ’áž‘áŸážšâ€‹ážŻáž€ážŸáž¶ážš"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"កាស"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ធាតុបញ្ចឌលបន្ថែម"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ប៊្លឌធឌស"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"កំពុង​ផ្គឌផ្គង​ឧបករណ៍​ជំនវយ​ការ​ស្តាប់​ខាង​ឆ្វេង…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"កំពុងផ្គឌផ្គង​ឧបករណ៍​ជំនវយ​ការ​ស្តាប់​ខាង​ស្តាំ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ឆ្វេង៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ស្តាំ៖ ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"បានបិទ Wifi"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"បានផ្តាច់ Wifi"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi មវយកាំ"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ស្វ័យប្រវត្តិ"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"ឈ្មោះម៉ាស៊ឞនក្រុមហ៊ុនផ្ដល់សេវា DNS ឯកជន"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"បញ្ចឌលឈ្មោះម៉ាស៊ឞនរបស់ក្រុមហ៊ុនផ្ដល់សេវា DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"áž˜áž·áž“â€‹ážąáž¶áž…áž—áŸ’áž‡áž¶áž”áŸ‹â€‹áž”áž¶áž“áž‘áŸ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"បង្ហាញ​ជម្រសស​សម្រាប់​វិញ្ញាបនបត្រ​បង្ហាញ​ងត​ខ្សែ"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"បង្កសនកម្រិតកំណត់ហេតុវ៉ាយហ្វាយបង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធឞជ្រសស​វ៉ាយហ្វាយ"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"áž‡áŸ’ážšážŸážŸážšážŸážŸážąáž¶ážŸáž™ážŠáŸ’áž‹áž¶áž“ MAC ដោយចៃដន្យ នៅពេល​ភ្ជាប់​បណ្តាញ Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"មានការកំណត់"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"មិនមានការកំណត់"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ទំហំ buffer របស់ Logger"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ជ្រសស​ទំហំ Logger per log buffer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ជម្រះទំហំផ្ទុក logger ážŠáŸ‚áž›áž”áŸ’ážšážŸáž”áž¶áž“áž™ážŒážšážŹ?"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 65273c7..a7756ed 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -197,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àČ«àłˆàČČàł‌àČšàČČàłàČČàČż àȎàČČàłàČČ àČŹàłàČČàł‚àČŸàł‚àČ€àł HCI àČȘàłàČŻàČŸàČ•àł†àČŸàł‌àȗàČłàČšàłàČšàł àČžàł†àČ°àł†àČčàČżàČĄàČżàČŻàČżàČ°àČż (àȈ àČžàł†àČŸàłàȟàČżàȂàČ—àł àȅàČšàłàČšàł àČŹàČŠàČČàČŸàČŻàČżàČžàČżàČŠ àČšàȂàČ€àČ° àČŹàłàČČàł‚àČŸàł‚àČ€àł àȟàČŸàȗàČČàł àČźàČŸàČĄàČż)"</string>
     <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/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index cae1535..2c6a9a2 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s을(ë„Œ) 톔핎 연êȰ됚"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s을(ë„Œ) 톔핎 ì‚Źìš© 가늄"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"연êȰ됚, 읞터넷 ì‚Źìš© 불가"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"연êȰ됚(전화 없음), 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"연êȰ됚(ëŻžë””ì–Ž 없음), 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"연êȰ됚(전화 또는 ëŻžë””ì–Ž 없음), 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"활성, 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"활성"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ëŻžë””ì–Ž 였디였"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"전화 톔화"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"파음 ì „ì†Ą"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"헀드폰"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ìž…ë „ ìŁŒëł€êž°êž°"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ëž”ëŁšíˆŹìŠ€"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"왌ìȘœ 볎ìČ­êž° 페얎링 쀑…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"였넞ìȘœ 볎ìČ­êž° 페얎링 쀑..."</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"왌ìȘœ - 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"였넞ìȘœ - 배터멬 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi가 êșŒì ž 있슔니닀."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi 연êČ°ìŽ ëŠì–ŽìĄŒìŠ”ë‹ˆë‹€."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi 신혞 막대가 한 개입니닀."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"자동"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"ëč„êł”개 DNS ì œêł”ì—…ìČŽ 혞슀튞 읎늄"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ì œêł”ì—…ìČŽì˜ 혞슀튞 읎늄 ìž…ë „"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"연êȰ할 수 없음"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ëŹŽì„  디슀플레읎 읞슝서 옔션 표시"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi 로êč… ìˆ˜ì€€ì„ ë†’ìŽêł , Wi‑Fi ì„ íƒë„ê”Źì—ì„œ SSID RSSIë‹č 값을 표시합니닀."</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi ë„€íŠžì›ŒíŹì— 연êȰ할 때 MAC ìŁŒì†Œ 임의 선택"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ìą…ëŸ‰ì œ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ëŹŽì œí•œ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ëĄœê±° ëČ„íŒ íŹêž°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ëĄœê·ž ëČ„íŒë‹č ëĄœê±° íŹêž° 선택"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ëĄœê±° ì˜ê”Ź 저임소넌 삭제하시êČ ìŠ”ë‹ˆêčŒ?"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 65689f1..f6318f2 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s арĐșŃ‹Đ»ŃƒŃƒ жДтĐșОлОĐșŃ‚ÒŻÒŻ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s арĐșŃ‹Đ»ŃƒŃƒ жДтĐșОлОĐșŃ‚ÒŻÒŻ"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"буташып турат, Đ˜ĐœŃ‚Đ”Ń€ĐœĐ”Ń‚ Đ¶ĐŸĐș"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"буташып турат (Ń‚Đ”Đ»Đ”Ń„ĐŸĐœĐžŃŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"буташып турат (ĐŒĐ”ĐŽĐžĐ°ŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"буташып турат (Ń‚Đ”Đ»Đ”Ń„ĐŸĐœĐžŃŃŃ‹Đ· жД ĐŒĐ”ĐŽĐžĐ°ŃŃ‹Đ·), Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Đ–ĐžĐłĐ”Ń€ĐŽÒŻÒŻ, Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Đ‘Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Đ–ĐžĐłĐ”Ń€ĐŽÒŻÒŻ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ĐŃƒĐŽĐžĐŸ"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ĐąĐ”Đ»Đ”Ń„ĐŸĐœ Ń‡Đ°Đ»ŃƒŃƒĐ»Đ°Ń€"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ЀаĐčĐ» Đ°Đ»ĐŒĐ°ŃˆŃƒŃƒ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ĐšŃƒĐ»Đ°ĐșŃ‡Ń‹Đœ"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ДаĐčŃ‹ĐœĐŽĐ°Ń€ĐŽŃ‹ ĐșĐžŃ€ĐłĐžĐ·ÒŻÒŻŃ‡ÒŻ сыртĐșы Ń‚ÒŻĐ·ĐŒÓ©Đș"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Угуу Đ°ĐżĐżĐ°Ń€Đ°Ń‚Ń‹ĐœŃ‹Đœ ŃĐŸĐ» ĐșŃƒĐ»Đ°ĐłŃ‹ Đ¶ŃƒĐżŃ‚Đ°ŃˆŃ‚Ń‹Ń€Ń‹Đ»ŃƒŃƒĐŽĐ°…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Угуу Đ°ĐżĐżĐ°Ń€Đ°Ń‚Ń‹ĐœŃ‹Đœ ĐŸÒŁ ĐșŃƒĐ»Đ°ĐłŃ‹ Đ¶ŃƒĐżŃ‚Đ°ŃˆŃ‚Ń‹Ń€Ń‹Đ»ŃƒŃƒĐŽĐ°…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ĐĄĐŸĐ» ĐșулаĐș – Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ĐžÒŁ ĐșŃƒĐ»Đ°ĐłŃ‹ – Đ±Đ°Ń‚Đ°Ń€Đ”ŃĐœŃ‹Đœ ĐŽĐ”ÒŁĐłŃŃĐ»Đž: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi Ó©Ń‡ÒŻĐș."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi туташуусу Đ¶ĐŸĐș."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi: бОр таяĐșча."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"АĐČŃ‚ĐŸĐŒĐ°Ń‚Ń‚Ń‹Đș Ń€Đ”Đ¶ĐžĐŒ"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Купуя DNS Ń‚ÒŻĐčÒŻĐœĐŽÒŻĐœ Đ°Ń‚Đ°Đ»Ń‹ŃˆŃ‹"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS Ń‚ÒŻĐčÒŻĐœĐŽÒŻĐœ Đ°Ń‚Đ°Đ»Ń‹ŃˆŃ‹Đœ ĐșĐžŃ€ĐłĐžĐ·ĐžÒŁĐžĐ·"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"буташпаĐč ĐșĐŸĐčЎу"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Đ—Ń‹ĐŒŃŃ‹Đ· ЎОсплДĐčĐŽĐž сДртОфОĐșĐ°Ń‚Ń‚ĐŸ ĐŒÒŻĐŒĐșÒŻĐœŃ‡ÒŻĐ»ÒŻĐșŃ‚Ó©Ń€ÒŻĐœ ĐșÓ©Ń€ĐłÓ©Đ·ÒŻÒŻ"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi ĐšĐ°Ń€ĐŒĐ°ĐłŃ‹Ń‡Ń‚Đ° Wi‑Fi ĐżŃ€ĐŸŃ‚ĐŸĐșĐŸĐ» ĐŽĐ”ÒŁĐłŃŃĐ»ĐžĐœ Đ¶ĐŸĐłĐŸŃ€ŃƒĐ»Đ°Ń‚ŃƒŃƒ Đ¶Đ°ĐœĐ° ар бОр SSID RSSI ÒŻŃ‡ÒŻĐœ ĐșÓ©Ń€ŃÓ©Ń‚ÒŻÒŻ."</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi Ń‚Đ°Ń€ĐŒĐ°ĐłŃ‹ĐœĐ° туташууЮа ĐșĐŸĐșŃƒŃŃ‚Đ°Đœ Ń‚Đ°ĐœĐŽĐ°ĐłĐ°Đœ MAC ĐŽĐ°Ń€Đ”ĐłĐžĐœ ĐșĐŸĐ»ĐŽĐŸĐœŃƒŃƒ"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"брафоĐș Ń‡Đ”ĐœĐ”Đ»Đ”Ń‚"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ЧДĐșŃ‚Đ”Đ»Đ±Đ”ĐłĐ”Đœ Ń‚Đ°Ń€ĐŒĐ°Đș"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Каттагыч Đ±ŃƒŃ„Đ”Ń€Đ»Đ”Ń€ĐžĐœĐžĐœ Ó©Đ»Ń‡Ó©ĐŒĐŽÓ©Ń€ÒŻ"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ĐšĐ°Ń‚Ń‚ĐŸĐŸ Đ±ŃƒŃ„Đ”Ń€Đž ÒŻŃ‡ÒŻĐœ ĐšĐ°Ń‚Ń‚Đ°ĐłŃ‹Ń‡Ń‚Ń‹Đœ ĐșÓ©Đ»Ó©ĐŒÒŻĐœ Ń‚Đ°ĐœĐŽĐ°ÒŁŃ‹Đ·"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ĐąĐ°Ń€Đ¶Ń‹ĐŒĐ°Đ»ĐŽŃ‹Đœ туруĐșтуу ЎОсĐșĐž Ń‚Đ°Đ·Đ°Đ»Đ°ĐœŃŃ‹ĐœĐ±Ń‹?"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 434c6e7..f7dc1be 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"​ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆâ€‹àșœà»ˆàșČàș™ %1$s ​ແàș„້àș§"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"àșĄàș”​ໃàș«à»‰â€‹àșœà»ˆàșČàș™ %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆà»àș„້àș§, àșšà»à»ˆàșĄàș”àș­àșŽàș™à»€àș•àș”ເàș™àș±àș”"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆà»àș„້àș§ (àșšà»à»ˆàșĄàș”ໂàș—àș„àș°àșȘàș±àșš), ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆà»àș„້àș§ (àșšà»à»ˆàșĄàș”àșĄàș”ເàș”àș), ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆà»àș„້àș§ (àșšà»à»ˆàșĄàș”ໂàș—àș„àș°àșȘàș±àșš àș«àșŒàș· àșĄàș”ເàș”àș), ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ເàș›àș”àș”ໃàșŠà»‰àșąàșč່, ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"àș­àș­àș™àș„àșČàș"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"àșȘàșœàș‡"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"àșàșČàș™à»‚àș—"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"àșàșČàș™à»‚àș­àș™àșà»‰àșČàșà»„àșŸàș„໌"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"àș«àșčàșŸàș±àș‡"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"àș­àșžàș›àș°àșàș­àș™àșžà»ˆàș§àș‡àș­àșŽàș™àșžàșžàș”"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"àșàșłàș„àș±àș‡àșˆàș±àșšàș„àșč່ເàș„àș·à»ˆàș­àș‡àșŠà»ˆàș§àșàșŸàș±àș‡àșŠà»‰àșČàș…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"àșàșłàș„àș±àș‡àșˆàș±àșšàș„àșč່ເàș„àș·à»ˆàș­àș‡àșŠà»ˆàș§àșàșŸàș±àș‡àș‚àș§àșČ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"àșŠà»‰àșČàș - ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"àș‚àș§àșČ - ແàșšàș±àș”ເàș•àș”àșŁàș” <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"WiFi àș›àșŽàș”àșąàșč່."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"àș•àș±àș”àșàșČàș™à»€àșŠàș·à»ˆàș­àșĄàș•à»à»ˆ Wi-Fi ແàș„້àș§."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"àșȘàș±àș™àșàșČàș™ Wi-Fi àș™àș¶à»ˆàș‡àș‚àș”àș”."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àșšàș±àș™àș—àș¶àșà»àșžàș±àșà»€àșàș±àș” Bluetooth HCI àș—àș±àș‡à»àș»àș”ໃàș™à»„àșŸàș„໌ (àșȘàș°àș«àșŒàș±àșšàșàșČàș™à»ƒàșŠà»‰ Bluetooth àș«àșŒàș±àș‡àșˆàșČàșàșàșČàș™àș›à»ˆàșœàș™à»àș›àș‡àșàșČàș™àș•àș±à»‰àș‡àș„່àșČàș™àș”້)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"àș­àș±àș”àș•àș°à»‚àș™àșĄàș±àș”"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"àșŠàș·à»ˆà»‚àșźàșȘàșœàșč້ໃàș«à»‰àșšà»àș„àșŽàșàșČàș™ DNS àșȘ່àș§àș™àș•àș»àș§"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"àș„àș°àșšàșžàșŠàș·à»ˆà»‚àșźàșȘàș‚àș­àș‡àșœàșč້ໃàș«à»‰àșšà»àș„àșŽàșàșČàș™ DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"àșšà»à»ˆàșȘàșČàșĄàșČàș”ເàșŠàș·à»ˆàș­àșĄàș•à»à»ˆà»„àș”້"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"àșȘàș°à»àș”àș‡à»‚àș•à»€àș„àș·àș­àșàșȘàșłàș„àș±àșšàșàșČàș™àșȘàș°à»àș”àș‡àșàșČàș™àșźàș±àșšàșźàș­àș‡àș„àș°àșšàș»àșšà»„àșźà»‰àșȘàșČàș"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ເàșžàș”່àșĄâ€‹àș„àș°â€‹àș”àș±àșšâ€‹àșàșČàș™â€‹à»€àșàș±àșšâ€‹àș›àș°â€‹àș«àș§àș±àș” Wi‑Fi, àșȘàș°â€‹à»àș”àș‡â€‹àș•à»à»ˆ SSID RSSI ​ໃàș™â€‹ Wi‑Fi Picker"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"àșȘàșžà»ˆàșĄàș—àș”່àșąàșč່ MAC ເàșĄàș·à»ˆàș­à»€àșŠàș·à»ˆàș­àșĄàș•à»à»ˆàș«àșČເàș„àș·àș­àș‚່àșČàș Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"àșĄàș”àșàșČàș™àș§àș±àș”ແàș—àș"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"àșšà»à»ˆà»„àș”້àș§àș±àș”ແàș—àș"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"àș‚àș°â€‹à»œàșČàș”​​àșšàș±àșšâ€‹à»€àșŸàș”ໂàș•â€‹àș„àș±àș­àș"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ເàș„àș·àș­àșâ€‹àș‚àș°â€‹à»œàșČàș”​àș„àș±àș­àșâ€‹àș•à»à»ˆâ€‹àșšàș±àșšâ€‹à»€àșŸàș”"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"àș„àș¶àșšàș„້àșČàș‡àșšà»ˆàș­àș™àșˆàș±àș”ເàșàș±àșšàș–àșČàș§àș­àș™àș‚àș­àș‡àș•àș»àș§àșšàș±àș™àș—àș¶àșàșšà»à»ˆ?"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 66912f6..4eef77d 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -197,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <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>
     <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-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index fa29adc..9547d90 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -114,8 +114,8 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ХлушалĐșĐ°"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ĐŸĐ”Ń€ĐžŃ„Đ”Ń€Đ”Đœ ĐČлДз"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ĐĄĐ” спаруĐČĐ° лДĐČ Đ°ĐżĐ°Ń€Đ°Ń‚ Đ·Đ° ŃĐ»ŃƒŃˆĐ°ŃšĐ”…"</string>
-    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ĐĄĐ” спаруĐČĐ° ĐŽĐ”ŃĐ”Đœ апарат Đ·Đ° ŃĐ»ŃƒŃˆĐ°ŃšĐ”…"</string>
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ĐĄĐ” спаруĐČĐ° лДĐČĐŸ ŃĐ»ŃƒŃˆĐœĐŸ ĐżĐŸĐŒĐ°ĐłĐ°Đ»ĐŸ…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ĐĄĐ” спаруĐČĐ° ĐŽĐ”ŃĐœĐŸ ŃĐ»ŃƒŃˆĐœĐŸ ĐżĐŸĐŒĐ°ĐłĐ°Đ»ĐŸ…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ЛДĐČĐŸ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> Đ±Đ°Ń‚Đ”Ń€ĐžŃ˜Đ°"</string>
     <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Đ”Đ”ŃĐœĐŸ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> Đ±Đ°Ń‚Đ”Ń€ĐžŃ˜Đ°"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi Đ” ОсĐșĐ»ŃƒŃ‡Đ”ĐœĐŸ."</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 8972733..f9d3495 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -197,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àŽŽàŽČà”àŽČàŽŸ Bluetooth HCI àŽȘàŽŸàŽ•à”àŽ•àŽ±à”àŽ±à”àŽ•àŽłà”àŽ‚ àŽ’àŽ°à” àŽ«àŽŻàŽČàŽżà”œ àŽ•à”àŽŻàŽŸàŽȘà”‌àŽšà”Œ àŽšà”†àŽŻà”àŽŻà”àŽ• (àŽˆ àŽ•à”àŽ°àŽźà”€àŽ•àŽ°àŽŁàŽ‚ àŽźàŽŸàŽ±à”àŽ±àŽżàŽŻ àŽ¶à”‡àŽ·àŽ‚ Bluetooth àŽźàŽŸàŽ±à”àŽ±à”àŽ•)"</string>
     <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/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index bc1d2e7..5bd034c 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-р Ń…ĐŸĐ»Đ±ĐŸĐłĐŽŃĐŸĐœ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s-р Đ±ĐŸĐ»ĐŸĐŒĐ¶Ń‚ĐŸĐč"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Đ„ĐŸĐ»Đ±ĐŸĐłĐŽŃĐŸĐœ хэЮоĐč ч ĐžĐœŃ‚Đ”Ń€ĐœĐ”Ń‚ алга"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Đ„ĐŸĐ»Đ±ĐŸĐłĐŽŃĐŸĐœ (утас баĐčŃ…ĐłÒŻĐč), батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Đ„ĐŸĐ»Đ±ĐŸĐłĐŽŃĐŸĐœ (ĐŒĐ”ĐŽĐžĐ° баĐčŃ…ĐłÒŻĐč), батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Đ„ĐŸĐ»Đ±ĐŸĐłĐŽŃĐŸĐœ (утас эсĐČŃĐ» ĐŒĐ”ĐŽĐžĐ° баĐčŃ…ĐłÒŻĐč), батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ИЮэĐČхтэĐč, батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"БатДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ИЮэĐČхтэĐč"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ĐœĐ”ĐŽĐžĐ° Đ°ŃƒĐŽĐžĐŸ"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ĐŁŃ‚Đ°ŃĐœŃ‹ ЎууЎлага"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ЀаĐčĐ» ĐŽĐ°ĐŒĐ¶ŃƒŃƒĐ»Đ°Đ»Ń‚"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ЧохэĐČч"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ĐŃĐŒŃĐ»Ń‚ ĐŸŃ€ĐŸĐ»Ń‚"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Đ—ÒŻÒŻĐœ Ń‚Đ°Đ»Ń‹Đœ ŃĐŸĐœŃĐłĐŸĐ»Ń‹Đœ Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ĐžĐčĐł Ń…ĐŸĐ»Đ±ĐŸĐ¶ баĐčĐœĐ°…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Đ‘Đ°Ń€ŃƒŃƒĐœ Ń‚Đ°Đ»Ń‹Đœ ŃĐŸĐœŃĐłĐŸĐ»Ń‹Đœ Ń‚Ó©Ń…Ó©Ó©Ń€Ó©ĐŒĐ¶ĐžĐčĐł Ń…ĐŸĐ»Đ±ĐŸĐ¶ баĐčĐœĐ°…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Đ—ÒŻÒŻĐœ - батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Đ‘Đ°Ń€ŃƒŃƒĐœ - батДрДĐč <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ŃƒĐœŃ‚Ń€Đ°Đ°Đ»Ń‚Ń‚Đ°Đč баĐčĐœĐ°."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi Ń…ĐŸĐ»Đ±ĐŸĐłĐŽĐŸĐŸĐłÒŻĐč баĐčĐœĐ°."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi ŃÒŻĐ»Đ¶ŃŃĐœĐžĐč ĐŽĐŸŃ…ĐžĐŸ ĐœŃĐł Đ±Đ°ĐłĐ°ĐœĐ°Ń‚Đ°Đč баĐčĐœĐ°."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"АĐČŃ‚ĐŸĐŒĐ°Ń‚"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"ЄуĐČĐžĐčĐœ DNS-Đœ ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃ ÒŻĐ·ÒŻÒŻĐ»ŃĐłŃ‡ĐžĐčĐœ Ń…ĐŸŃŃ‚Ń‹Đœ ĐœŃŃ€"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS-Đœ ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃ ÒŻĐ·ÒŻÒŻĐ»ŃĐłŃ‡ĐžĐčĐœ Ń…ĐŸŃŃ‚Ń‹Đœ ĐœŃŃ€ĐžĐčĐł ĐŸŃ€ŃƒŃƒĐ»Đ°Ń…"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Đ„ĐŸĐ»Đ±ĐŸĐłĐŽĐŸĐ¶ Ń‡Đ°ĐŽŃĐ°ĐœĐłÒŻĐč"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ĐŁŃ‚Đ°ŃĐłÒŻĐč ĐŽŃĐ»ĐłŃŃ†ĐžĐčĐœ сДртОфОĐșĐ°Ń‚Ń‹Đœ ŃĐŸĐœĐłĐŸĐ»Ń‚Ń‹Đł Ń…Đ°Ń€ŃƒŃƒĐ»Đ°Ń…"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi Đ»ĐŸĐł-Đœ Ń‚ÒŻĐČŃˆĐžĐœĐł ĐœŃĐŒŃĐłĐŽÒŻÒŻĐ»ŃŃ…, Wi‑Fi ĐĄĐŸĐœĐłĐŸĐłŃ‡ Юээрх SSID-ĐŽ ĐœĐŸĐłĐŽĐŸŃ… RSSI-Đł Ń…Đ°Ń€ŃƒŃƒĐ»Đ°Ń…"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi ŃÒŻĐ»Đ¶ŃŃĐœĐŽ Ń…ĐŸĐ»Đ±ĐŸĐłĐŽĐŸŃ… ÒŻĐ”ĐŽŃŃ ŃˆĐžĐœŃ ĐŽŃƒŃ€Ń‹Đœ (random) MAC хаяг ÒŻÒŻŃĐłŃŃ…"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Đ„ŃĐ·ĐłĐ°Đ°Ń€Ń‚Đ°Đč"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Đ„ŃĐ·ĐłĐ°Đ°Ń€ĐłÒŻĐč"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Đ›ĐŸĐłĐłĐ”Ń€Ń‹Đœ Đ±ŃƒŃ„Đ”Ń€Ń‹Đœ Ń…ŃĐŒĐ¶ŃŃ"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Đ›ĐŸĐł Đ±ŃƒŃ„Đ”Ń€ Đ±ÒŻŃ€Ń‚ ĐœĐŸĐłĐŽĐŸŃ… Đ»ĐŸĐłĐłĐ”Ń€Ń‹Đœ Ń…ŃĐŒĐ¶ŃŃĐł ŃĐŸĐœĐłĐŸĐœĐŸ уу"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"НэĐČтрэгчоĐčĐœ Ń‚ĐŸĐłŃ‚ĐŒĐŸĐ» ŃĐ°ĐœĐł устгах уу?"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index 64f745c..70d142b 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s à€Šà„à€”à€Ÿà€°à„‡ à€•à€šà„‡à€•à„‍à€Ÿ à€•à„‡à€Čà„‡"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s à€Šà„à€”à€Ÿà€°à„‡ à€‰à€Șà€Čà€Źà„‍à€§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"à€•à€šà„‡à€•à„‍à€Ÿ à€•à„‡à€Čà„‡, à€‡à€‚à€Ÿà€°à€šà„‡à€Ÿ à€šà€Ÿà€čà„€"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"à€•à€šà„‡à€•à„à€Ÿ à€•à„‡à€Čà„‡ (à€«à„‹à€š à€šà€Ÿà€čà„€), à€Źà„…à€Ÿà€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"à€•à€šà„‡à€•à„à€Ÿ à€•à„‡à€Čà„‡ (à€źà„€à€Ąà€żà€Żà€Ÿ à€šà€Ÿà€čà„€), à€Źà„…à€Ÿà€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"à€•à€šà„‡à€•à„à€Ÿ à€•à„‡à€Čà„‡ (à€«à„‹à€š à€•à€żà€‚à€”à€Ÿ à€źà„€à€Ąà€żà€Żà€Ÿ à€šà€Ÿà€čà„€), à€Źà„…à€Ÿà€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"à€…à„…à€•à„à€Ÿà€żà€”à„à€č, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„…à€Ÿà€°à„€"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„…à€Ÿà€°à„€"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"à€…à„…à€•à„à€Ÿà€żà€”à„à€č"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"à€źà„€à€Ąà€żà€Żà€Ÿ à€‘à€Ąà€żà€“"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"à€«à„‹à€š à€•à„‰à€Č"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"à€«à€Ÿà€‡à€Č à€žà„à€„à€Ÿà€šà€Ÿà€‚à€€à€°à€Ł"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"à€čà„‡à€Ąà€«à„‹à€š"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"à€‡à€šà€Șà„à€Ÿ à€Șà€°à€żà€§à„€à€Ż"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"à€Źà„à€Čà„‚à€Ÿà„‚à€„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"à€Ąà€Ÿà€”à„€à€•à€Ąà„€à€Č à€¶à„à€°à€”à€Ł à€Żà€‚à€€à„à€° à€œà„‹à€Ąà€€ à€†à€čà„‡…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"à€‰à€œà€”à„€à€•à€Ąà„€à€Č à€¶à„à€°à€”à€Ł à€Żà€‚à€€à„à€° à€œà„‹à€Ąà€€ à€†à€čà„‡…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"à€Ąà€Ÿà€”à„€ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„…à€Ÿà€°à„€"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"à€‰à€œà€”à„€ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à€Źà„…à€Ÿà€°à„€"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"à€”à€Ÿà€Ż à€«à€Ÿà€Ż à€Źà€‚à€Š."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"à€”à€Ÿà€Ż à€«à€Ÿà€Ż à€Ąà€żà€žà„à€•à€šà„‡à€•à„à€Ÿ à€à€Ÿà€Čà„‡."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"à€”à€Ÿà€Ż à€«à€Ÿà€Ż à€à€• à€Źà€Ÿà€°."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"à€«à€Ÿà€‡à€Čà€źà€§à„à€Żà„‡ à€žà€°à„à€” à€Źà„à€Čà„‚à€Ÿà„‚à€„ HCI à€Șà„…à€•à„‡à€Ÿà„à€ž à€•à„…à€Șà„à€šà€° à€•à€°à€Ÿ (à€čà„‡ à€žà„‡à€Ÿà€żà€‚à€— à€Źà€Šà€Čà€Čà„à€Żà€Ÿà€šà€‚à€€à€° à€Źà„à€Čà„à€Żà„‚à€Ÿà„‚à€„ à€Ÿà„‰à€—à€Č à€•à€°à€Ÿ)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"à€†à€Șà„‹à€†à€Ș"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"à€–à€Ÿà€œà€—à„€ DNS à€Șà„à€°à€”à€ à€Ÿà€Šà€Ÿà€° à€čà„‹à€žà„à€Ÿ à€šà€Ÿà€”"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS à€Șà„à€°à€”à€ à€Ÿà€Šà€Ÿà€°à€Ÿà€šà„‡ à€čà„‹à€žà„à€Ÿà€šà€Ÿà€” à€Ÿà€Ÿà€•à€Ÿ"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"à€•à€šà„‡à€•à„à€Ÿ à€•à€°à„‚ à€¶à€•à€Čà„‹ à€šà€Ÿà€čà„€"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"à€”à€Ÿà€Żà€°à€Čà„‡à€ž à€Ąà€żà€žà„à€Șà„à€Čà„‡ à€Șà„à€°à€źà€Ÿà€Łà€żà€•à€°à€Łà€Ÿà€šà„‡ à€Șà€°à„à€Żà€Ÿà€Ż à€Šà€Ÿà€–à€”à€Ÿ"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"à€”à€Ÿà€Ż-à€«à€Ÿà€Ż à€Čà„‰à€—à€żà€‚à€— à€žà„‍à€€à€° à€”à€Ÿà€ąà€”à€Ÿ, à€”à€Ÿà€Ż-à€«à€Ÿà€Ż à€žà€żà€Čà„‡à€•à„à€Ÿà€°à€źà€§à„‍à€Żà„‡ à€Șà„à€°à€€à€ż SSID RSSI à€Šà€°à„à€¶à€”à€Ÿ"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"à€”à€Ÿà€Ż-à€«à€Ÿà€Ż à€šà„‡à€Ÿà€”à€°à„à€•à€¶à„€ à€•à€šà„‡à€•à„à€Ÿ à€•à€°à€€à€Ÿà€šà€Ÿ MAC à€…‍à„…à€Ąà„à€°à„‡à€ž à€°à€à€Ąà€źà€Ÿà€‡à€ à€•à€°à€Ÿ"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"à€źà„€à€Ÿà€°à€šà„‡ à€źà„‹à€œà€Čà„‡à€Čà„‡"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"à€źà„€à€Ÿà€°à€šà„‡ à€š à€źà„‹à€œà€Čà„‡à€Čà„‡"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"à€Čà„‰à€—à€° à€Źà€«à€° à€†à€•à€Ÿà€°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"à€Șà„à€°à€€à€ż à€Čà„‰à€— à€Źà€«à€° à€Čà„‰à€—à€° à€†à€•à€Ÿà€° à€šà€żà€”à€Ąà€Ÿ"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"à€Čà„‰à€—à€°à€”à€° à€žà€€à€€ à€…à€žà€Łà€Ÿà€°à€Ÿ à€žà€‚à€šà€Ż à€žà€Ÿà€« à€•à€°à€Ÿà€Żà€šà€Ÿ?"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7f8e73e..2e78318 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Disambungkan melalui %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tersedia melalui %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Disambungkan, tiada Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Disambungkan (tiada telefon), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Disambungkan (tiada media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Disambungkan (tiada telefon atau media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktif, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktif"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Panggilan telefon"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Pemindahan fail"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Fon kepala"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Persisian Input"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Menggandingkan alat bantu pendengaran kiri…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Menggandingkan alat bantu pendengaran kanan…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Kiri - bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Kanan - bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi dimatikan."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi diputuskan sambungannya."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi satu bar."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatik"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nama hos pembekal DNS peribadi"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Masukkan nama hos pembekal DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Tidak dapat menyambung"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Rawakkan alamat MAC apabila menyambung ke rangkaian Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Bermeter"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Tidak bermeter"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Saiz penimbal pengelog"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Pilih saiz Pengelog bagi setiap penimbal log"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Kosongkan storan gigih pengelog?"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 1a80a06..22ea56c 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -114,7 +114,7 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"á€”á€Źá€žá€€á€Œá€•á€ș"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ချိတá€șဆကá€șá€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€›á€žá€Šá€·á€ș စကá€șပစá€čစညá€șသမျဏသ"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ဘလူှတုသá€ș"</string>
-    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ဘယá€șဘကá€ș á€”á€Źá€žá€€á€Œá€źá€žá€€á€­á€›á€­á€šá€Źá€€á€­á€Ż တလá€Čချိတá€șနေသညá€ș…"</string>
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ဘယá€șဘကá€ș á€”á€Źá€žá€€á€Œá€Źá€žá€€á€­á€›á€­á€šá€Źá€€á€­á€Ż တလá€Čချိတá€șနေသညá€ș…"</string>
     <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ညာဘကá€ș á€”á€Źá€žá€€á€Œá€Źá€žá€€á€­á€›á€­á€šá€Źá€€á€­á€Ż တလá€Čချိတá€șနေသညá€ș…"</string>
     <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ဘယá€șဘကá€ș − ဘကá€șထရြ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ညာဘကá€ș − ဘကá€șထရြ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
@@ -197,7 +197,7 @@
     <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>
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ဖိုငá€șတစá€șá€á€Żá€á€œá€„á€ș ဘလူှတုသá€ș HCI အစုလိုကá€șမျဏသကို သိမá€șှယူရနá€ș (ကဆကá€șတငá€șကို á€•á€Œá€±á€Źá€„á€șá€žá€•á€Œá€źá€žá€žá€Šá€·á€șဥခါ ဘလူှတုသá€ș ဖလင့á€ș/ပိတá€ș လုပá€șပါ)"</string>
     <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>
@@ -241,8 +241,8 @@
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"á€€á€Œá€­á€Żá€žá€™á€Č့ အခငá€șသဥကျငá€șှ á€Ąá€žá€­á€Ąá€™á€Ÿá€á€șá€•á€Œá€Żá€œá€€á€șမဟတá€șá€Ąá€á€œá€€á€ș ရလေသချယá€șá€…á€›á€Źá€™á€»á€Źá€žá€•á€Œá€›á€”á€ș"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi မဟတá€șတမá€șှတငá€șခဌငá€șှ á€”á€Ÿá€Żá€”á€șá€žá€Ąá€Źá€žá€™á€Œá€„á€·á€șကာ၊ Wi‑Fi á€›á€œá€±á€žá€›á€Źá€á€œá€„á€ș SSID RSSI ဖဌင့á€șပဌပါ"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi ကလနá€șရကá€șမျဏသသို့ ချိတá€șဆကá€șသည့á€șဥခါ MAC လိပá€șစာ ကျပနá€șá€žá€•á€Œá€Żá€œá€Żá€•á€șခဌငá€șှ"</string>
-    <string name="wifi_metered_label" msgid="4514924227256839725">"á€™á€­á€™á€­á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€™á€Ÿá€Żá€Ąá€œá€­á€Żá€€á€ș ကေဏကá€șခံထဏသသညá€ș"</string>
-    <string name="wifi_unmetered_label" msgid="6124098729457992931">"á€™á€­á€™á€­á€Ąá€žá€Żá€¶á€žá€•á€Œá€Żá€™á€Ÿá€Żá€Ąá€œá€­á€Żá€€á€ș ကေဏကá€șခံခဌငá€șသမရဟိပါ"</string>
+    <string name="wifi_metered_label" msgid="4514924227256839725">"အခမá€Č့ မဟုတá€șပါ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"အခမá€Č့"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"á€œá€±á€Źá€·á€‚á€«á€ž ဘာဖာှ ဆိုကá€șမျဏသ"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"á€œá€±á€Źá€· á€˜á€Źá€–á€Źá€žá€á€œá€€á€ș á€œá€±á€Źá€·á€‚á€«á€žá€†á€­á€Żá€€á€ș ရလေသ"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"မဟတá€șတမá€șှထိနá€șှသိမá€șသပေသသည့á€ș á€žá€­á€Żá€œá€Ÿá€±á€Źá€„á€șခနá€șှကို ရဟငá€șှလငá€șှမလာှ။"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index cdb7448..369d7d8 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Tilkoblet via %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tilgjengelig via %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Tilkoblet – ingen Internett-tilgang"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <string name="wifi_status_no_internet" msgid="5784710974669608361">"Ingen Internett-tilkobling"</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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Koblet til (ingen telefon), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Koblet til (ingen medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Koblet til (ingen telefon eller medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiv, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiv"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtaler"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverføring"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Øretelefoner"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Inndata fra ytre utstyrsenheter"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Tilkobler venstre høreapparat …"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Tilkobler høyre høreapparat …"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Venstre – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Høyre – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi er av."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi er frakoblet."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi-signal med én stolpe."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Vertsnavn for privat DNS-leverandør"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Skriv inn vertsnavnet til DNS-leverandøren"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Kunne ikke koble til"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Vis alternativer for sertifisering av trådløs skjerm"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Øk Wi-Fi-loggenivå – vis per SSID RSSI i Wi-Fi-velgeren"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Angi tilfeldig MAC-adresse når du kobler til Wi-Fi-nettverk"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Med datamåling"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Uten datamåling"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Bufferstørrelser for logg"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Velg loggstørrelse per loggbuffer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vil du tømme det varige logglageret?"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 0835c6c..2386d61 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s à€źà€Ÿà€°à„à€«à€€ à€œà€Ąà€żà€€"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s à€źà€Ÿà€°à„à€«à€€ à€‰à€Șà€Čà€Źà„à€§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"à€œà€Ąà€Ÿà€š à€—à€°à€żà€Żà„‹ à€€à€° à€‡à€šà„à€Ÿà€°à€šà„‡à€Ÿ à€›à„ˆà€š"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"à€œà€Ąà€Ÿà€š à€—à€°à€żà€Żà„‹ (à€«à„‹à€šà€Źà€Ÿà€čà„‡à„‡à€•), à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"à€œà€Ąà€Ÿà€š à€—à€°à€żà€Żà„‹ (à€źà€żà€Ąà€żà€Żà€Ÿà€Źà€Ÿà€čà„‡à€•), à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"à€œà€Ąà€Ÿà€š à€—à€°à€żà€Żà„‹ (à€«à„‹à€š à€”à€Ÿ à€źà€żà€Ąà€żà€Żà€Ÿà€Źà€Ÿà€čà„‡à€•), à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"à€žà€•à„à€°à€żà€Ż, à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€à€•à„‹ à€žà„à€€à€°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€à€•à„‹ à€žà„à€€à€°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"à€žà€•à„à€°à€żà€Ż"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"à€źà€żà€Ąà€żà€Żà€Ÿ à€…à€Ąà€żà€Żà„‹"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"à€«à„‹à€š à€•à€Čà€čà€°à„‚"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"à€«à€Ÿà€‡à€Č à€žà„à€„à€Ÿà€šà€Ÿà€šà„à€€à€°à€Ł"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"à€čà„‡à€Ąà€«à„‹à€š"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"à€‡à€šà€Șà„à€Ÿ à€žà€źà„à€Źà€šà„à€§à„€ à€Źà€Ÿà€čà„à€Ż à€Żà€šà„à€€à„à€°"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"à€Źà„à€Čà„à€Ÿà„à€„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"à€Šà€Ÿà€Żà€Ÿà€à€€à€°à„à€«à€•à„‹ à€¶à„à€°à€”à€Ł à€Żà€šà„à€€à„à€°à€•à„‹ à€œà„‹à€Ąà€Ÿ à€Źà€šà€Ÿà€‰à€à€Šà„ˆ…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"à€Źà€Ÿà€Żà€Ÿà€à€€à€°à„à€«à€•à„‹ à€¶à„à€°à€”à€Ł à€Żà€šà„à€€à„à€°à€•à„‹ à€œà„‹à€Ąà€Ÿ à€Źà€šà€Ÿà€‰à€à€Šà„ˆ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"à€Źà€Ÿà€Żà€Ÿà€ - à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€à€•à„‹ à€žà„à€€à€°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"à€Šà€Ÿà€Żà€Ÿà€ - à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€à€•à„‹ à€žà„à€€à€°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi à€Źà€šà„à€Šà„€"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi à€œà€Ąà€Ÿà€š à€”à€żà€šà„à€›à„‡à€Š à€­à€Żà„‹à„€"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi à€à€• à€Șà€Ÿà„à€Ÿà€żà„€"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"à€«à€Ÿà€‡à€Čà€•à€Ÿ à€žà€Źà„ˆ à€Źà„à€Čà„à€Ÿà„à€„ HCI à€Șà„à€Żà€Ÿà€•à„‡à€Ÿà€čà€°à„‚ à€žà€źà€Ÿà€”à„‡à€¶ à€—à€°à„à€šà„à€čà„‹à€žà„‌ (à€Żà„‹ à€žà„‡à€Ÿà€żà€™ à€Șà€°à€żà€”à€°à„à€€à€š à€—à€°à„‡à€Șà€›à€ż à€Źà„à€Čà„à€Ÿà„à€„ à€Ÿà€—à€Č à€—à€°à„à€šà„à€čà„‹à€žà„)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"à€žà„à€”à€šà€Ÿà€Čà€żà€€"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"à€šà€żà€œà„€ DNS à€Șà„à€°à€Šà€Ÿà€Żà€•à€•à„‹ à€čà„‹à€žà„à€Ÿà€šà€Ÿà€ź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS à€Șà„à€°à€Šà€Ÿà€Żà€•à€•à„‹ à€čà„‹à€žà„à€Ÿà€šà€Ÿà€ź à€Șà„à€°à€”à€żà€·à„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"à€œà€Ąà€Ÿà€š à€—à€°à„à€š à€žà€•à€żà€à€š"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"à€€à€Ÿà€°à€°à€čà€żà€€ à€Șà„à€°à€Šà€°à„à€¶à€š à€Șà„à€°à€źà€Ÿà€Łà„€à€•à€°à€Łà€•à€Ÿ à€Čà€Ÿà€—à€ż à€”à€żà€•à€Čà„à€Șà€čà€°à„‚ à€Šà„‡à€–à€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi à€Čà€— à€žà„à€€à€° à€Źà€ąà€Ÿà€‰à€šà„à€čà„‹à€žà„, Wi-Fi à€šà€Żà€šà€•à€°à„à€€à€Ÿà€źà€Ÿ à€Șà„à€°à€€à€ż SSID RSSI à€Šà„‡à€–à€Ÿà€‡à€šà„à€›"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi‑Fi à€šà„‡à€Ÿà€”à€°à„à€•à€čà€°à„‚à€źà€Ÿ à€œà€Ąà€Ÿà€š à€—à€°à„à€šà„‡ à€Źà„‡à€Čà€Ÿ MAC à€•à„‹ à€ à„‡à€—à€Ÿà€šà€Ÿ à€…à€šà€żà€Żà€źà€żà€€ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"à€źà€żà€Ÿà€° à€—à€°à€żà€à€•à„‹ à€œà€Ąà€Ÿà€š à€­à€šà„€ à€šà€żà€šà„à€č à€Čà€—à€Ÿà€‡à€à€•à„‹"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"à€źà€żà€Ÿà€° à€šà€—à€°à€żà€à€•à„‹"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"à€Čà€—à€° à€Źà€«à€° à€†à€•à€Ÿà€°à€čà€°à„‚"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"à€Čà€— à€Źà€«à€° à€Șà„à€°à€€à€ż à€Čà€—à€° à€†à€•à€Ÿà€° à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"à€Čà€—à€°à€•à„‹ à€šà€żà€°à€šà„à€€à€° à€­à€Łà„à€Ąà€Ÿà€°à€Łà€Čà€Ÿà€ˆ à€–à€Ÿà€Čà„€ à€—à€°à„à€šà„‡ à€čà„‹?"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 18d3a08..69e2301 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Verbonden via %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Beschikbaar via %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Verbonden, geen internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon of media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Actief, batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Actief"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-audio"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefoongesprekken"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Bestandsoverdracht"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hoofdtelefoon"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Randapparaat voor invoer"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Linker gehoorapparaat koppelen…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Rechter gehoorapparaat koppelen…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Links: batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Rechts: batterijniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi: uitgeschakeld."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi-verbinding verbroken."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi: één streepje."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisch"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Hostnaam van privé-DNS-provider"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Geef hostnaam van DNS-provider op"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Kan geen verbinding maken"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Opties weergeven voor certificering van draadloze weergave"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Een willekeurig MAC-adres bij het maken van verbinding met wifi-netwerken"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Betaald"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Gratis"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Logger-buffergrootten"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Kies Logger-grootten per logbuffer"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Persistente loggeropslag wissen?"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index d7b2dc9..4591872 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -206,8 +206,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àŹ—à­‹àŹŸàŹżàŹ àŹ«àŹŸàŹ‡àŹČ୍‌àŹ°à­‡ àŹžàŹźàŹžà­àŹ€ àŹŹà­àŹČୁ-àŹŸà­àŹ„à­‌ HCI àŹȘà­à­ŸàŹŸàŹ•à­‡àŹŸà­‌àŹ—à­àŹĄàŹżàŹ•à­ àŹ•à­à­ŸàŹŸàŹȘàŹšàŹ°à­‌ àŹ•àŹ°àŹšà­àŹ€à­ (àŹàŹčàŹż àŹžà­‡àŹŸàŹżàŹ™à­àŹ— àŹŹàŹŠàŹłàŹŸàŹ‡àŹŹàŹŸ àŹȘàŹ°à­‡ àŹŹà­àŹČୁ-àŹŸà­àŹ„à­‌àŹ•à­ àŹ…àŹšà­‌ àŹ•àŹżàŹźà­àŹŹàŹŸ àŹ…àŹ«à­‌ àŹ•àŹ°àŹšà­àŹ€à­)"</string>
     <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/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 313413a..21a3be0 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s àš°àšŸàščà©€àš‚ àš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸ"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s àš°àšŸàščà©€àš‚ àš‰àšȘàšČàšŹàš§"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"àš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸ, àš•à©‹àšˆ àš‡à©°àšŸàš°àššà©ˆà©±àšŸ àššàščà©€àš‚"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"àš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸ àščà©‹àš‡àš† (àš•à©‹àšˆ àš«àšŒà©‹àšš àššàščà©€àš‚), àšŹà©ˆàšŸàš°à©€ àšŠàšŸ àšȘà©±àš§àš° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"àš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸ àščà©‹àš‡àš† (àš•à©‹àšˆ àšźà©€àšĄà©€àš† àššàščà©€àš‚), àšŹà©ˆàšŸàš°à©€ àšŠàšŸ àšȘà©±àš§àš° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"àš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸ àščà©‹àš‡àš† (àš•à©‹àšˆ àš«àšŒà©‹àšš àšœàšŸàš‚ àšźà©€àšĄà©€àš† àššàščà©€àš‚), àšŹà©ˆàšŸàš°à©€ àšŠàšŸ àšȘà©±àš§àš° <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"àš•àšżàš°àšżàš†àšžàšŒà©€àšČ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àšŹà©ˆàšŸàš°à©€"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àšŹà©ˆàšŸàš°à©€"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"àš•àšżàš°àšżàš†àšžàšŒà©€àšČ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"àšźà©€àšĄà©€àš†  àš†àšĄà©€àš“"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"àš«àšŒà©‹àšš àš•àšŸàšČàšŸàš‚"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"àš«àšŸàšˆàšČ àšŸà©àš°àšŸàš‚àšžàš«àš°"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"àščà©ˆà©±àšĄàš«à©‹àšš"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"àš‡àššàšȘà©à©±àšŸ àšȘà©ˆàš°àšżàš«à©ˆàš°àšČ"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"àšŹàšČà©‚àšŸà©à©±àš„"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"àš–à©±àšŹà©‡ àšȘàšŸàšžà©‡ àšŠàšŸ àšžà©àšŁàšš àšŠàšŸ àšžàšŸàš§àšš àšœà©‹à©œàšŸàšŹà©±àš§ àš•à©€àš€àšŸ àšœàšŸ àš°àšżàščàšŸ àščੈ…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"àšžà©±àšœà©‡ àšȘàšŸàšžà©‡ àšŠàšŸ àšžà©àšŁàšš àšŠàšŸ àšžàšŸàš§àšš àšœà©‹à©œàšŸàšŹà©±àš§ àš•à©€àš€àšŸ àšœàšŸ àš°àšżàščàšŸ àščੈ…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"àš–à©±àšŹà©‡ àšȘàšŸàšžà©‡ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àšŹà©ˆàšŸàš°à©€"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"àšžà©±àšœà©‡ àšȘàšŸàšžà©‡ - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> àšŹà©ˆàšŸàš°à©€"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi àšŹà©°àšŠà„€"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi àšĄàšżàšžàš•àššà©ˆàš•àšŸ àš•à©€àš€àšŸà„€"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi àš‡à©±àš• àšŹàšŸàš°à„€"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àš‡à©±àš• àš«àšŒàšŸàšˆàšČ àš”àšżà©±àšš àšžàšŸàš°à©‡ àšŹàšČà©‚àšŸà©à©±àš„ HCI àšȘà©ˆàš•à©‡àšŸàšŸàš‚ àššà©‚à©° àš•à©ˆàšȘàššàš° àš•àš°à©‹ (àš‡àšč àšžà©ˆàšŸàšżà©°àš— àšŹàšŠàšČàšŁ àš€à©‹àš‚ àšŹàšŸàš…àšŠ àšŹàšČà©‚àšŸà©à©±àš„ àšŸà©Œàš—àšČ àš•àš°à©‹)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"àšžàš”à©ˆàššàšČàšżàš€"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"àššàšżà©±àšœà©€ DNS àšȘà©àš°àšŠàšŸàššàš• àščà©‹àšžàšŸàššàšŸàšź"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS àšȘà©àš°àšŠàšŸàššàš• àšŠàšŸ àščà©‹àšžàšŸàššàšŸàšź àšŠàšŸàš–àšČ àš•àš°à©‹"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"àš•àššà©ˆàš•àšŸ àššàščà©€àš‚ àš•à©€àš€àšŸ àšœàšŸ àšžàš•àšżàš†"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"àš”àšŸàš‡àš°àšČà©ˆà©±àšž àšĄàšżàšžàšȘàšČੇ àšȘà©àš°àšźàšŸàšŁà©€àš•àš°àšš àšČàšˆ àššà©‹àšŁàšŸàš‚ àšȘà©àš°àšŠàš°àšžàšŒàšżàš€ àš•àš°à©‹"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"àš”àšŸàšˆâ€‘àš«àšŸàšˆ àšČà©Œàš—àšżà©°àš— àšȘà©±àš§àš° àš”àš§àšŸàš“, àš”àšŸàšˆâ€‘àš«àšŸàšˆ Picker àš”àšżà©±àšš àšȘà©àš°àš€à©€ SSID RSSI àšŠàšżàš–àšŸàš“"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"àš”àšŸàšˆ-àš«àšŸàšˆ àššà©ˆà©±àšŸàš”àš°àš•àšŸàš‚ àššàšŸàšČ àš•àššà©ˆàš•àšŸ àščà©‹àšŁ \'àš€à©‡ MAC àšȘàš€àšŸ àšŹà©‡àš€àš°àš€à©€àšŹàš”àšŸàš° àššà©àšŁà©‹"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"àšźà©€àšŸàš°àšŹà©±àš§ àš•à©€àš€àšŸ àš—àšżàš†"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"àš—à©ˆàš°-àšźà©€àšŸàš°àšŹà©±àš§ àš•à©€àš€àšŸ àš—àšżàš†"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"àšČà©Œàš—àš° àšŹàš«àšŒàš° àš†àš•àšŸàš°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"àšȘà©àš°àš€à©€ àšČà©Œàš— àšŹàš«àšŒàš° àšČà©Œàš—àš° àš†àš•àšŸàš° àššà©àšŁà©‹"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"àš•à©€ àšČà©Œàš—àš° àšȘà©àš°àšžàšżà©±àšžàšŸà©ˆàš‚àšŸ àšžàšŸà©‹àš°à©‡àšœ àššà©‚à©° àšžàšŸàš«àšŒ àš•àš°àššàšŸ àščੈ?"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 3192719..fa396f2 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"PoƂączono przez %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Dostępne przez %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"PoƂączono, brak internetu"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"PoƂączono (bez telefonu), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"PoƂączono (bez multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"PoƂączono (bez telefonu i multimediów), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktywne, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naƂadowania baterii"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naƂadowania baterii"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Urządzenie aktywne"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"DĆșwięk multimediów"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"PoƂączenia telefoniczne"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"PrzesyƂanie pliku"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"SƂuchawki"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Peryferyjne urządzenie wejƛciowe"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Paruję lewy aparat sƂuchowy…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Paruję prawy aparat sƂuchowy…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Aparat lewy – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naƂadowania baterii"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Aparat prawy – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> naƂadowania baterii"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi wyƂączone."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi odƂączone."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: jeden pasek."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatyczny"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Nazwa hosta dostawcy prywatnego DNS"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Wpisz nazwę hosta dostawcy DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Nie udaƂo się poƂączyć"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"PokaĆŒ opcje certyfikacji wyƛwietlacza bezprzewodowego"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Zwiększ poziom rejestrowania Wi‑Fi, pokazuj wedƂug RSSI SSID w selektorze Wi‑Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wygeneruj losowo adres MAC podczas Ƃączenia z siecią Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"UĆŒycie danych jest mierzone"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"UĆŒycie danych nie jest mierzone"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Rozmiary bufora Rejestratora"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Wybierz rozmiary Rejestratora/bufor dziennika"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Wyczyƛcić pamięć trwaƂych dzienników?"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index f6352c06..434823f 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -116,8 +116,8 @@
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
     <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Se asociază aparatul auditiv stâng…"</string>
     <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Se asociază aparatul auditiv drept…"</string>
-    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Stâng - baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Drept - baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Stânga – baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Dreapta – baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi dezactivat."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi deconectat."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Semnal Wi-Fi: o bară."</string>
@@ -241,8 +241,8 @@
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Afișați opțiunile pentru certificarea Ecran wireless"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Măriți niv. de înr. prin Wi‑Fi, afișați în fcț. de SSID RSSI în Selectorul Wi‑Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Afișează aleatoriu adresa MAC când te conectezi la rețele Wi‑Fi"</string>
-    <string name="wifi_metered_label" msgid="4514924227256839725">"Contorizat"</string>
-    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Necontorizat"</string>
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Contorizată"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Necontorizată"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Dimensiunile tamponului jurnalului"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Dimensiuni jurnal / tampon jurnal"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ștergeți stocarea permanentă a jurnalului?"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index fdf8290..b0d65b66 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐŸ Đș %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Đ”ĐŸŃŃ‚ŃƒĐżĐœĐŸ чДрДз %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐŸ, бДз ĐŽĐŸŃŃ‚ŃƒĐżĐ° Đș Đ˜ĐœŃ‚Đ”Ń€ĐœĐ”Ń‚Ńƒ"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐŸ (ĐșŃ€ĐŸĐŒĐ” Đ·ĐČĐŸĐœĐșĐŸĐČ), ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€ŃĐŽĐ° батарДО: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐŸ (ĐșŃ€ĐŸĐŒĐ” Đ°ŃƒĐŽĐžĐŸ), ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€ŃĐŽĐ° батарДО: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐŸ (ĐșŃ€ĐŸĐŒĐ” Đ·ĐČĐŸĐœĐșĐŸĐČ Đž Đ°ŃƒĐŽĐžĐŸ), ŃƒŃ€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€ŃĐŽĐ° батарДО: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"АĐșтоĐČĐœĐŸ. ĐŁŃ€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€ŃĐŽĐ°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>."</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"ĐŁŃ€ĐŸĐČĐ”ĐœŃŒ Đ·Đ°Ń€ŃĐŽĐ°: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"АĐșтоĐČĐœĐŸ"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ĐŸŃ€ĐŸŃ„ĐžĐ»ŃŒ A2DP"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ЗĐČĐŸĐœĐșĐž"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ĐŸŃ€ĐŸŃ„ĐžĐ»ŃŒ OPP"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ĐĐ°ŃƒŃˆĐœĐžĐșĐž"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ĐŸĐ”Ń€ĐžŃ„Đ”Ń€ĐžĐčĐœĐŸĐ” ŃƒŃŃ‚Ń€ĐŸĐčстĐČĐŸ ĐČĐČĐŸĐŽĐ°"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ°Đ”ĐŒ лДĐČыĐč ŃĐ»ŃƒŃ…ĐŸĐČĐŸĐč аппарат…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ĐŸĐŸĐŽĐșĐ»ŃŽŃ‡Đ°Đ”ĐŒ праĐČыĐč ŃĐ»ŃƒŃ…ĐŸĐČĐŸĐč аппарат…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ЛДĐČыĐč ŃĐ»ŃƒŃ…ĐŸĐČĐŸĐč аппарат: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> Đ·Đ°Ń€ŃĐŽĐ°"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ПраĐČыĐč ŃĐ»ŃƒŃ…ĐŸĐČĐŸĐč аппарат: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> Đ·Đ°Ń€ŃĐŽĐ°"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ĐČыĐșĐ»ŃŽŃ‡Đ”Đœ"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi ĐŸŃ‚ĐșĐ»ŃŽŃ‡Đ”Đœ"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: ĐŸĐŽĐœĐŸ ĐŽĐ”Đ»Đ”ĐœĐžĐ”"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"АĐČŃ‚ĐŸĐŒĐ°Ń‚ĐžŃ‡Đ”ŃĐșĐžĐč Ń€Đ”Đ¶ĐžĐŒ"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Đ˜ĐŒŃ Ń…ĐŸŃŃ‚Đ° ĐżĐŸŃŃ‚Đ°ĐČщоĐșĐ° ĐżĐ”Ń€ŃĐŸĐœĐ°Đ»ŃŒĐœĐŸĐłĐŸ DNS-сДрĐČДра"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ВĐČДЎОтД ĐžĐŒŃ Ń…ĐŸŃŃ‚Đ° ĐżĐŸŃŃ‚Đ°ĐČщоĐșĐ° услуг DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"ĐžŃˆĐžĐ±ĐșĐ° ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžŃ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ĐŸĐŸĐșĐ°Đ·Ń‹ĐČать ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ сДртОфОĐșацоо Đ±Đ”ŃĐżŃ€ĐŸĐČĐŸĐŽĐœŃ‹Ń… ĐŒĐŸĐœĐžŃ‚ĐŸŃ€ĐŸĐČ"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Про ĐČŃ‹Đ±ĐŸŃ€Đ” Wi‑Fi уĐșĐ°Đ·Ń‹ĐČать ĐČ Đ¶ŃƒŃ€ĐœĐ°Đ»Đ” RSSI ĐŽĐ»Ń ĐșĐ°Đ¶ĐŽĐŸĐłĐŸ SSID"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Đ“Đ”ĐœĐ”Ń€ĐžŃ€ĐŸĐČать ŃĐ»ŃƒŃ‡Đ°ĐčĐœŃ‹Đ” MAC-аЎрДса про ĐżĐŸĐŽĐșĐ»ŃŽŃ‡Đ”ĐœĐžĐž Đș ŃĐ”Ń‚ŃĐŒ Wi-Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ĐĄĐ”Ń‚ŃŒ с тарофоĐșацОДĐč трафоĐșĐ°"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ĐĄĐ”Ń‚ŃŒ бДз тарофоĐșацоо трафоĐșĐ°"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Đ Đ°Đ·ĐŒĐ”Ń€ Đ±ŃƒŃ„Đ”Ń€Đ° Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ВыбДрОтД Ń€Đ°Đ·ĐŒĐ”Ń€ Đ±ŃƒŃ„Đ”Ń€Đ° Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Очостоть ĐżĐŸŃŃ‚ĐŸŃĐœĐœŃ‹Đč ЎОсĐș Đ¶ŃƒŃ€ĐœĐ°Đ»Đ°?"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 82bd3b3..8294383 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s හරහා සඞ්බන්ධ විà¶ș"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s හරහා ගබා ගැනීඞට හැකිà¶ș"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"සඞ්බන්ධà¶șි, à¶…à¶±à·Šà¶­à¶»à·Šà¶ąà·à¶œà¶ș නැත"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"සඞ්බන්ධිතà¶șි (à¶Żà·”à¶»à¶šà¶źà¶±à¶ș නැත), බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"සඞ්බන්ධිතà¶șි (ඞාධ්‍à¶ș නැත), බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"සඞ්බන්ධිතà¶șි (à¶Żà·”à¶»à¶šà¶źà¶±à¶ș හෝ ඞාධ්‍à¶ș නැත), බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"ක්‍රිà¶șාකාරී, බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"ක්‍රිà¶șාකාරී"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ඞාධ්‍à¶ș ශ්‍රව්‍à¶ș"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"à¶Żà·”à¶»à¶šà¶źà¶± ඇඞතුඞ්"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ගොනු හුවඞාරුව"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"හෙඩ්ෆෝන්"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"à¶†à¶Żà·à¶± උඎාංග"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"බ්ගූටූත්"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"වඞ් ශ්‍රවණාධාරකà¶ș à¶șුගග කරඞින්..."</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"à¶Żà¶šà·”à¶«à·” ශ්‍රවණාධාරකà¶ș à¶șුගග කරඞින්…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"වඞ් - බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"à¶Żà¶šà·”à¶«à·” - බැටරිà¶ș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi අක්‍රිà¶șà¶șි."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi සඞ්බන්ධ කර නොඞැත."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi තීරු එකà¶șි."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ස්වà¶șංක්‍රිà¶ș"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"à¶Žà·”à¶Żà·Šà¶œà¶œà·’à¶š DNS සැඎà¶șුඞ්කරු සත්කාරක නඞ"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS සැඎà¶șුඞ්කරුගේ සත්කාරක නඞ ඇතුළු කරන්න"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"සඞ්බන්ධ වීඞට නොහැකි විà¶ș"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"නොරැහැන් à·ƒà¶‚à¶Żà¶»à·Šà·à¶š සහතිකà¶ș à·ƒà¶łà·„à· විකග්ඎ ඎෙන්වන්න"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ගොග් ඞට්ටඞ වැඩි කරන්න, Wi‑Fi තෝරනà¶șෙහි SSID RSSI අනුව ඎෙන්වන්න"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi à¶ąà·à¶œà·€à¶œà¶§ සඞ්බන්ධ à·€à·“à¶žà·šà¶Żà·“ MAC ගිඎිනà¶ș සසඞ්භාවීකරණà¶ș"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"ඞනිනු ගැබේ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ඞනින්නේ නැත"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"ගෝගà¶șේ අන්තරාවක ඎ්‍රඞාණà¶ș"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ගොග අන්තරාවකට ගෝගà¶șේ ඎ්‍රඞාණà¶ș තෝරන්න"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ගොගකරු නොනවතින ගබඩාව හිස් à¶šà¶»à¶±à·Šà¶±à¶Ż?"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 0636816..2ee17e5 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"Anslutet via %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Tillgängligt via %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ansluten, inget internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ansluten (ingen mobil), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ansluten (inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ansluten (ingen mobil och inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Aktiv. <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Aktiv"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medialjud"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtal"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filöverföring"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Hörlur"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Inmatning från kringutrustning"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Parkopplar vänster hörapparat …"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Parkopplar höger hörapparat …"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Vänster – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Höger – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batteri"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi är inaktiverat."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Ingen Wi-Fi-anslutning."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: en stapel."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Automatisk"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Värdnamn för leverantör av privat DNS"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Ange värdnamn för DNS-leverantör"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Kan inte ansluta"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Visa certifieringsalternativ för Wi-Fi-skärmdelning"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Öka loggningsnivån för Wi-Fi, visa per SSID RSSI i Wi‑Fi Picker"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Generera en slumpmässig MAC-adress när du ansluter till Wi‑Fi-nätverk"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Med datapriser"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Utan datapriser"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Buffertstorlekar för logg"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Välj loggstorlekar per loggbuffert"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Vill du rensa lagringsutrymmet för loggar?"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index f3fe2e9..88800e9 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -206,8 +206,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"àź•àŻ‹àźȘàŻàźȘàźżàźČàŻ àź‰àźłàŻàźł àźȘàŻàźłàŻ‚àźŸàŻ‚àź€àŻ HCI àźȘàźŸàź•àŻàź•àŻ†àźŸàŻàźŸàŻàź•àźłàŻ àź…àź©àŻˆàź€àŻàź€àŻˆàźŻàŻàźźàŻ àźȘàźŸàźźàŻ†àźŸàŻàź•àŻàź•àŻàźźàŻ (àź‡àźšàŻàź€ àź…àźźàŻˆàźȘàŻàźȘàŻˆ àźźàźŸàź±àŻàź±àźżàźŻ àźȘàźżàź±àź•àŻ, àźȘàŻàźłàŻ‚àźŸàŻ‚àź€àŻ àźšàźżàźČàŻˆàźźàźŸàź±àŻàź±àźȘàŻàźȘàźŸàŻàźźàŻ)"</string>
     <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/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 5558e8d..090e3c5 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ఊ్ఔటరట కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ఊ్ఔటరట à°…à°‚à°Šà±à°Źà°Ÿà°Ÿà±à°Čో à°‰à°‚à°Šà°ż"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż, ఇంటర్చెట్ à°Čేఊు"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż (ఫోచ్ కటఊు), à°Źà±à°Żà°Ÿà°Ÿà°°à±€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż (à°źà±€à°Ąà°żà°Żà°Ÿ కటఊు), à°Źà±à°Żà°Ÿà°Ÿà°°à±€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż (ఫోచ్ à°Čేఊట à°źà±€à°Ąà°żà°Żà°Ÿ కటఊు), à°Źà±à°Żà°Ÿà°Ÿà°°à±€ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"à°Żà°Ÿà°•à±à°Ÿà°żà°”à±‌à°—à°Ÿ à°‰à°‚à°Šà°ż, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à°Źà±à°Żà°Ÿà°Ÿà°°à±€"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à°Źà±à°Żà°Ÿà°Ÿà°°à±€"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"à°Żà°Ÿà°•à±à°Ÿà°żà°”à±‌à°—à°Ÿ à°‰à°‚à°Šà°ż"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"à°źà±€à°Ąà°żà°Żà°Ÿ à°†à°Ąà°żà°Żà±‹"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ఫోచ్ à°•à°Ÿà°Č్‌à°Čు"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ఫైà°Č్ à°Źà°Šà°żà°Čీ"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"à°čà±†à°Ąà±‌ఫోచ్"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ఇచ్‌à°Șుట్ à°…à°šà±à°Źà°‚à°§ à°Șà°°à°żà°•à°°à°‚"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"à°Źà±à°Čూటూఀ్"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"à°Žà°Ąà°ź ఔైà°Șు à°”à°żà°šà°żà°•à°żà°Ąà°ż à°Șà°°à°żà°•à°°à°Ÿà°šà±à°šà°ż జఀ à°šà±‡à°žà±à°€à±‹à°‚à°Šà°ż…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"à°•à±à°Ąà°ż ఔైà°Șు à°”à°żà°šà°żà°•à°żà°Ąà°ż à°Șà°°à°żà°•à°°à°Ÿà°šà±à°šà°ż జఀ à°šà±‡à°žà±à°€à±‹à°‚à°Šà°ż…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"à°Žà°Ąà°ź ఔైà°Șు - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à°Źà±à°Żà°Ÿà°Ÿà°°à±€"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"à°•à±à°Ąà°ż ఔైà°Șు - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> à°Źà±à°Żà°Ÿà°Ÿà°°à±€"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ఆఫ్‌à°Čో à°‰à°‚à°Šà°ż."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wifi à°Ąà°żà°žà±‌కచెక్ట్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifi à°žà°żà°—à±à°šà°Č్ ఒక à°Źà°Ÿà°°à± à°‰à°‚à°Šà°ż."</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"ఫైà°Č్‌à°Čో à°…à°šà±à°šà°ż à°Źà±à°Čూటూఀ్ HCI à°Șà±à°Żà°Ÿà°•à±†à°Ÿà±‌à°Čచు à°•à±à°Żà°Ÿà°Ș్చర్ à°šà±‡à°žà±à°€à±à°‚à°Šà°ż (ఈ à°žà±†à°Ÿà±à°Ÿà°żà°‚à°—à±‌à°šà°ż à°źà°Ÿà°°à±à°šà°żà°š ఀర్ఔటఀ à°Źà±à°Čూటూఀ్‌à°šà°ż టోగుà°Č్ à°šà±‡à°Żà°‚à°Ąà°ż)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"à°†à°Ÿà±‹à°źà±‡à°Ÿà°żà°•à±"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"à°Ș్రైఔేట్ DNS à°Ș్రఊటఀ à°čోఞ్ట్‌à°Șేరు"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS à°Ș్రఊటఀ à°Żà±Šà°•à±à°• à°čోఞ్ట్‌à°Șేరుచు à°šà°źà±‹à°Šà± à°šà±‡à°Żà°‚à°Ąà°ż"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"కచెక్ట్ à°šà±‡à°Żà°Ąà°‚ à°žà°Ÿà°§à±à°Żà°Șà°Ąà°Čేఊు"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ఔైర్‌à°Čెఞ్ à°Ș్రఊర్శచ à°žà°°à±à°Ÿà°żà°«à°żà°•à±†à°Ÿà± కోఞం ఎంà°Șà°żà°•à°Čచు చూà°Șు"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi ఎంà°Șà°żà°•à°Čో SSID RSSI à°Ș్రకటరం చూà°Șà°Źà°Ąà±‡ Wi‑Fi à°Čà°Ÿà°—à°żà°‚à°—à± à°žà±à°„à°Ÿà°Żà°żà°šà°ż à°Șà±†à°‚à°šà°‚à°Ąà°ż"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi చెట్‌ఔర్క్‌కు కచెక్ట్ చేఞ్ఀుచ్చà°Ș్à°Șà±à°Ąà± MAC à°šà°żà°°à±à°šà°Ÿà°źà°Ÿà°šà± à°Żà°Ÿà°Šà±ƒà°šà±à°›à°żà°•à°‚ à°šà±‡à°Żà°‚à°Ąà°ż"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"à°—à°Łà°żà°‚à°šà°Źà°Ąà±à°€à±‹à°‚à°Šà°ż"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"à°—à°Łà°żà°‚à°šà°Źà°Ąà°Ÿà°‚ à°Čేఊు"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"à°Čటగర్ à°Źà°«à°°à± à°Șà°°à°żà°źà°Ÿà°Łà°Ÿà°Čు"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"à°Čటగ్ à°Źà°«à°°à±‌à°•à°ż à°Čటగర్ à°Șà°°à°żà°źà°Ÿ. à°Žà°‚à°šà±à°•à±‹à°‚à°Ąà°ż"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"à°Čటగర్ à°šà°żà°°à°‚à°€à°° à°šà°żà°Č్ఔà°Čà±‹à°šà°ż à°Ąà±‡à°Ÿà°Ÿà°šà± à°€à±€à°žà°żà°”à±‡à°Żà°Ÿà°Čà°Ÿ?"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index fac268b..8162a76 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"‏Ù…Ù†ŰłÙ„Ú© ŰšŰ°Ű±ÛŒŰčہ ‎%1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"‏ŰŻŰłŰȘÛŒŰ§Űš ŰšŰ°Ű±ÛŒŰčہ ‎%1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ù…Ù†ŰłÙ„Ú©ŰŒ Ű§Ù†ÙčŰ±Ù†ÛŒÙč نہیÚș ہے"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ù…Ù†ŰłÙ„Ú© ہے (فون کے ŰčÙ„Ű§ÙˆÛ)ی ŰšÛŒÙčŰ±ÛŒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ù…Ù†ŰłÙ„Ú© ہے (Ù…ÛŒÚˆÛŒŰ§ کے ŰčÙ„Ű§ÙˆÛ)ی ŰšÛŒÙčŰ±ÛŒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ù…Ù†ŰłÙ„Ú© ہے (فون ÛŒŰ§ Ù…ÛŒÚˆÛŒŰ§ کے ŰčÙ„Ű§ÙˆÛ)ی ŰšÛŒÙčŰ±ÛŒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"فŰčŰ§Ù„ŰŒ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ŰšÛŒÙčŰ±ÛŒ"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ŰšÛŒÙčŰ±ÛŒ"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"فŰčŰ§Ù„"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Ù…ÛŒÚˆÙŠŰ§ ŰąÚˆÛŒÙˆ"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"فون Ú©Ű§Ù„ŰČ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ÙŰ§ŰŠÙ„ کی منŰȘقلی"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ہیڈ فون"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Ű§Ù† ÙŸÙč ÙŸÛŒŰ±ÛŒÙŰ±Ù„"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ŰšÙ„ÙˆÙčوŰȘÚŸ"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"ŰšŰ§ŰŠÙŠÚș ŰŹŰ§Ù†Űš کے ŰłÙ…Ű§ŰčŰȘی ŰąÙ„Û کۧ ŰŹÙˆÚ‘Ű§ ŰšÙ†Ű§ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"ŰŻŰ§ŰŠÛŒÚș ŰŹŰ§Ù†Űš کے ŰłÙ…Ű§ŰčŰȘی ŰąÙ„Û کۧ ŰŹÙˆÚ‘Ű§ ŰšÙ†Ű§ÛŒŰ§ ۏۧ Ű±ÛŰ§ ہے…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ŰšŰ§ŰŠÙŠÚș - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ŰšÛŒÙčŰ±ÛŒ"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ŰŻŰ§ŰŠÙŠÚș - <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> ŰšÛŒÙčŰ±ÛŒ"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"‏Wifi ŰąÙ ہے۔"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"‏Wifi ŰșÛŒŰ± Ù…Ù†ŰłÙ„Ú© ہو ÚŻÛŒŰ§Û”"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"‏Wifi Ű§ÛŒÚ© ŰšŰ§Ű±Û”"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"‏ŰłŰšÚŸÛŒ ŰšÙ„ÙˆÙčوŰȘÚŸ HCI کے ٟیکÙčŰł Ű§ÛŒÚ© ÙŰ§ŰŠÙ„ میÚș Ú©ÛŒÙŸÚ†Ű± Ú©Ű±ÛŒÚș (ۧ۳ ŰȘ۱ŰȘÛŒŰš کو ŰȘŰšŰŻÛŒÙ„ Ú©Ű±Ù†Û’ کے ŰšŰčŰŻ ŰšÙ„ÙˆÙčوŰȘÚŸ ÙčÙˆÚŻÙ„ Ú©Ű±ÛŒÚș)"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"ŰźÙˆŰŻÚ©Ű§Ű±"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"‏Ù†ŰŹÛŒ DNS ÙŰ±Ű§ÛÙ… Ú©Ù†Ù†ŰŻÛ میŰČŰšŰ§Ù† کۧ Ù†Ű§Ù…"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"‏DNS ÙŰ±Ű§ÛÙ… Ú©Ù†Ù†ŰŻÛ کے میŰČŰšŰ§Ù† کۧ Ù†Ű§Ù… ۯ۱ۏ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ù…Ù†ŰłÙ„Ú© نہیÚș ہو ۳کۧ"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ÙˆŰ§ŰŠŰ±Ù„ÛŒŰł ÚˆŰłÙŸÙ„Û’ ۳۱ÙčÛŒÙÛŒÚ©ÛŒŰŽÙ† Ú©ÛŒÙ„ŰŠÛ’ ۧ۟ŰȘÛŒŰ§Ű±Ű§ŰȘ ŰŻÚ©ÚŸŰ§ŰŠÛŒÚș"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"‏Wi‑Fi Ù„Ű§ÚŻÙ†ÚŻ لیول میÚș Ű§Ű¶Ű§ÙÛ Ú©Ű±ÛŒÚșی Wi‑Fi منŰȘ۟ۚ Ú©Ù†Ù†ŰŻÛ میÚș فی SSID RSSI ŰŻÚ©ÚŸŰ§ŰŠÛŒÚș"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"‏Wi-Fi نیÙč ÙˆŰ±Ú©Űł ŰłÛ’ Ù…Ù†ŰłÙ„Ú© ک۱ŰȘے وقŰȘ MAC ÙŸŰȘے کو ŰșÛŒŰ± Ù…Ű±ŰȘŰš Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"میÙč۱ڈ"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"ŰșÛŒŰ± میÙč۱ ŰŽŰŻÛ"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Ù„Ű§ÚŻŰ± ŰšÙŰ± کے ۳ۧۊŰČ"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"فی Ù„Ű§ÚŻ ŰšÙŰ± Ù„Ű§ÚŻŰ± کے ۳ۧۊŰČ Ù…Ù†ŰȘ۟ۚ Ú©Ű±ÛŒÚș"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Ù„Ű§ÚŻŰ± Ù…ŰłŰȘقل ۧ۳ÙčÙˆŰ±ÛŒŰŹ Ű”Ű§Ù Ú©Ű±ÛŒÚș۟"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 648cda7..23ad2ca 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s orqali ulangan"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s orqali ishlaydi"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Ulangan, lekin internet aloqasi yo‘q"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefondan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefon yoki mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Faol, batariya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Faol"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon chaqiruvlari"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl uzatish"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Quloqchin"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Kiritish qurilmasi"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Chap eshitish apparati ulanmoqda…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"O‘ng eshitish apparati ulanmoqda…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Chap eshitish apparati – batariya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"O‘ng eshitish apparati – batariya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi o‘chiq."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi o‘chiq."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi: bitta ustun"</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Avtomatik"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Shaxsiy DNS provayderining host nomi"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS provayderining host nomini kiriting"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Ulanmadi"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Wi-Fi tarmoqlarga ulanishda MAC manzilini tasodifiy tanlash"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Trafik hisobi yuritiladigan tarmoq"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Trafik hisobi yuritilmaydigan tarmoq"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Jurnal buferi hajmi"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Jurnal xotirasi hajmini tanlang"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Jurnalning doimiy xotirasi tozalansinmi?"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 0599aea..b03e3a1 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ÄÆ°á»Łc káșżt nối qua %1$s"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"Có sáș”n qua %1$s"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"Đã káșżt nối, không có Internet"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Đã káșżt nối (không có điện thoáșĄi), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Đã káșżt nối (không có phÆ°ÆĄng tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Đã káșżt nối (không có điện thoáșĄi hoáș·c phÆ°ÆĄng tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"Đang hoáșĄt động, mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"Đang hoáșĄt động"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Âm thanh của phÆ°ÆĄng tiện"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Cuộc gọi điện thoáșĄi"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Chuyển tệp"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"Tai nghe"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"Thiáșżt bị ngoáșĄi vi vào"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"Bluetooth"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"Đang ghép nối thiáșżt bị trợ thính bên trái…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"Đang ghép nối thiáșżt bị trợ thính bên pháșŁi…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"Bên trái - Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"Bên pháșŁi - Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Đã táșŻt Wi-Fi."</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Đã ngáșŻt káșżt nối Wi-Fi."</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Tín hiệu Wi-Fi một váșĄch."</string>
@@ -246,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"Tự động"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"Tên máy chủ của nhà cung cáș„p DNS riêng tÆ°"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"Nháș­p tên máy chủ của nhà cung cáș„p DNS"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"Không thể káșżt nối"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Hiển thị tùy chọn chứng nháș­n hiển thị không dây"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Tăng mức ghi nháș­t ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"Lá»±a chọn ngáș«u nhiên địa chỉ MAC khi káșżt nối với máșĄng Wi‑Fi"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"Đo lÆ°á»Łng dữ liệu"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"Không đo lÆ°á»Łng dữ liệu"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"Kích cụ táșŁi trình ghi"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Chọn kích thước Trình ghi/láș§n táșŁi nháș­t ký"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Xóa bộ nhớ ổn định trong trình ghi nháș­t ký?"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 22ba3c3..db77946 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -40,10 +40,8 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ć·Čé€šèż‡%1$sèżžæŽ„"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"ćŻé€šèż‡%1$sèżžæŽ„"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ć·ČèżžæŽ„ïŒŒäœ†æ— æł•èźżé—źäș’联眑"</string>
-    <!-- no translation found for wifi_status_no_internet (5784710974669608361) -->
-    <skip />
-    <!-- no translation found for wifi_status_sign_in_required (123517180404752756) -->
-    <skip />
+    <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>
@@ -67,12 +65,9 @@
     <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ć·ČèżžæŽ„ïŒˆæ— æ‰‹æœșäżĄć·ïŒ‰ïŒŒç””é‡äžș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ć·ČèżžæŽ„ïŒˆæ— ćȘ’äœ“äżĄć·ïŒ‰ïŒŒç””量äžș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
     <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ć·ČèżžæŽ„ïŒˆæ— æ‰‹æœș或ćȘ’äœ“äżĄć·ïŒ‰ïŒŒç””量äžș <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
-    <!-- no translation found for bluetooth_active_battery_level (3149689299296462009) -->
-    <skip />
-    <!-- no translation found for bluetooth_battery_level (1447164613319663655) -->
-    <skip />
-    <!-- no translation found for bluetooth_active_no_battery_level (8380223546730241956) -->
-    <skip />
+    <string name="bluetooth_active_battery_level" msgid="3149689299296462009">"äœżç”šäž­ïŒŒç””æ± ç””é‡ïŒš<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_battery_level" msgid="1447164613319663655">"甔池甔量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_active_no_battery_level" msgid="8380223546730241956">"äœżç”šäž­"</string>
     <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ćȘ’äœ“éŸłéą‘"</string>
     <string name="bluetooth_profile_headset" msgid="7815495680863246034">"é€šèŻ"</string>
     <string name="bluetooth_profile_opp" msgid="9168139293654233697">"文件䌠蟓"</string>
@@ -119,14 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"è€łæœș"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ć€–ć›ŽèŸ“ć…„èźŸć€‡"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"蓝牙"</string>
-    <!-- no translation found for bluetooth_hearingaid_left_pairing_message (7378813500862148102) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_pairing_message (1550373802309160891) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_left_battery_level (8797811465352097562) -->
-    <skip />
-    <!-- no translation found for bluetooth_hearingaid_right_battery_level (7309476148173459677) -->
-    <skip />
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"æ­Łćœšé…ćŻčć·ŠäŸ§ćŠ©ćŹć™š…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"æ­Łćœšé…ćŻčćłäŸ§ćŠ©ćŹć™š…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ć·ŠäŸ§ - 甔池甔量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"ćłäŸ§ - 甔池甔量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"WLAN ć·Č慳闭。"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"WLAN èżžæŽ„ć·Čæ–­ćŒ€ă€‚"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"WLAN äżĄć·ćŒșćșŠäžșäž€æ Œă€‚"</string>
@@ -206,8 +197,7 @@
     <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>
-    <!-- no translation found for bt_hci_snoop_log_summary (366083475849911315) -->
-    <skip />
+    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"æ•èŽ·ć•äžȘ文件䞭的所有蓝牙 HCI ćŒ…ïŒˆæ›Žæ”čæ­€èźŸçœźäč‹ćŽćˆ‡æąè“ç‰™ćŒ€ć…łïŒ‰"</string>
     <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>
@@ -247,15 +237,12 @@
     <string name="private_dns_mode_opportunistic" msgid="8314986739896927399">"è‡Ș抹"</string>
     <string name="private_dns_mode_provider" msgid="8354935160639360804">"私äșș DNS æäŸ›ć•†äž»æœș損"</string>
     <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"èŸ“ć…„ DNS æäŸ›ć•†çš„äž»æœș損"</string>
-    <!-- no translation found for private_dns_mode_provider_failure (231837290365031223) -->
-    <skip />
+    <string name="private_dns_mode_provider_failure" msgid="231837290365031223">"æ— æł•èżžæŽ„"</string>
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"星ç€ș无çșżæ˜Ÿç€șèź€èŻé€‰éĄč"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"æć‡WLANæ—„ćż—èź°ćœ•çș§ćˆ«ïŒˆćœšWLANé€‰æ‹©ć™šäž­æ˜Ÿç€șæŻäžȘSSID的RSSI"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"èżžæŽ„ćˆ° WLAN 眑络时随æœș选择 MAC 朰杀"</string>
-    <!-- no translation found for wifi_metered_label (4514924227256839725) -->
-    <skip />
-    <!-- no translation found for wifi_unmetered_label (6124098729457992931) -->
-    <skip />
+    <string name="wifi_metered_label" msgid="4514924227256839725">"æŒ‰æ”é‡èźĄèŽč"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"äžæŒ‰æ”é‡èźĄèŽč"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"æ—„ćż—èź°ćœ•ć™šçŒ“ć†ČćŒșć€§ć°"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"é€‰æ‹©æŻäžȘæ—„ćż—çŒ“ć†ČćŒșçš„æ—„ćż—èź°ćœ•ć™šć€§ć°"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"芁枅陀氞äč…ć­˜ć‚šçš„æ—„ćż—èź°ćœ•ć™šæ•°æźć—ïŒŸ"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 887959d..0aa8383 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -40,7 +40,7 @@
     <string name="connected_via_passpoint" msgid="2826205693803088747">"ć·Č透過 %1$s 連線"</string>
     <string name="available_via_passpoint" msgid="1617440946846329613">"揯透過 %1$s 連線"</string>
     <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ć·Čé€Łç·šïŒŒäœ†æČ’æœ‰äș’èŻç¶Č"</string>
-    <string name="wifi_status_no_internet" msgid="5784710974669608361">"æČ’æœ‰ç¶Č際ç¶Čè·Żé€Łç·š"</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>
@@ -114,10 +114,10 @@
     <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"è€łæ©Ÿ"</string>
     <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"èŒžć…„ć‘šé‚Šèš­ć‚™"</string>
     <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"藍牙"</string>
-    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"æ­Łćœšé…ć°ć·ŠćŽćŠ©èœć™š…"</string>
-    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"æ­Łćœšé…ć°ćłćŽćŠ©èœć™š…"</string>
-    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"淊恎 - 電量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
-    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"揳恮 - 電量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_left_pairing_message" msgid="7378813500862148102">"æ­Łćœšé…ć°ć·Šé‚Šçš„ćŠ©èœć™š…"</string>
+    <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"æ­Łćœšé…ć°ćłé‚Šçš„ćŠ©èœć™š…"</string>
+    <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"ć·Šé‚Š - 電量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+    <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"揳邊 - 電量<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
     <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi ć·Č關閉。"</string>
     <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi 連線ć·Čäž­æ–·ă€‚"</string>
     <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi èšŠè™Ÿäž€æ Œă€‚"</string>
@@ -241,8 +241,8 @@
     <string name="wifi_display_certification_summary" msgid="1155182309166746973">"饯ç€șç„Ąç·šèžąćč•ćˆ†äș«èȘè­‰çš„遞項"</string>
     <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"èź“ Wi‑Fi èš˜éŒ„ćŠŸèƒœć‡çŽšïŒŒćœš Wi‑Fi éžæ“‡ć™šäž­äŸæŻć€‹ SSID RSSI 饯ç€ș Wi‑Fi è©łçŽ°çŽ€éŒ„"</string>
     <string name="wifi_connected_mac_randomization_summary" msgid="1743059848752201485">"é€Łç·šè‡ł Wi‑Fi ç¶Čç”Ąæ™‚éššæ©Ÿç”ąç”Ÿ MAC äœć€"</string>
-    <string name="wifi_metered_label" msgid="4514924227256839725">"蚈量付èČ»"</string>
-    <string name="wifi_unmetered_label" msgid="6124098729457992931">"非蚈量付èČ»"</string>
+    <string name="wifi_metered_label" msgid="4514924227256839725">"按甚量收èČ»"</string>
+    <string name="wifi_unmetered_label" msgid="6124098729457992931">"䞍限敞據甚量收èČ»"</string>
     <string name="select_logd_size_title" msgid="7433137108348553508">"èš˜éŒ„ć™šç·©èĄć€ç©ș間"</string>
     <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"éžć–æŻć€‹èš˜éŒ„ç·©èĄć€çš„èš˜éŒ„ć™šç©ș間"</string>
     <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"èŠæž…é™€èš˜éŒ„ć™šçš„æŒäč…ć„Č歘ç©șé–“ć—ŽïŒŸ"</string>
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 7b09ef7..cf4261c 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -33,6 +33,8 @@
     <dimen name="user_spinner_item_height">56dp</dimen>
 
     <dimen name="two_target_pref_small_icon_size">24dp</dimen>
+    <dimen name="two_target_pref_medium_icon_size">32dp</dimen>
+
     <!-- Lock icon for preferences locked by admin -->
     <dimen name="restricted_icon_size">16dp</dimen>
     <dimen name="restricted_icon_padding">4dp</dimen>
diff --git a/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java b/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
index 8b39f60..02b68d8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/TwoTargetPreference.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib;
 
+import android.annotation.IntDef;
 import android.content.Context;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceViewHolder;
@@ -24,10 +25,24 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 public class TwoTargetPreference extends Preference {
 
-    private boolean mUseSmallIcon;
+    @IntDef({ICON_SIZE_DEFAULT, ICON_SIZE_MEDIUM, ICON_SIZE_SMALL})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface IconSize {
+    }
+
+    public static final int ICON_SIZE_DEFAULT = 0;
+    public static final int ICON_SIZE_MEDIUM = 1;
+    public static final int ICON_SIZE_SMALL = 2;
+
+    @IconSize
+    private int mIconSize;
     private int mSmallIconSize;
+    private int mMediumIconSize;
 
     public TwoTargetPreference(Context context, AttributeSet attrs,
             int defStyleAttr, int defStyleRes) {
@@ -54,22 +69,30 @@
         setLayoutResource(R.layout.preference_two_target);
         mSmallIconSize = context.getResources().getDimensionPixelSize(
                 R.dimen.two_target_pref_small_icon_size);
+        mMediumIconSize = context.getResources().getDimensionPixelSize(
+                R.dimen.two_target_pref_medium_icon_size);
         final int secondTargetResId = getSecondTargetResId();
         if (secondTargetResId != 0) {
             setWidgetLayoutResource(secondTargetResId);
         }
     }
 
-    public void setUseSmallIcon(boolean useSmallIcon) {
-        mUseSmallIcon = useSmallIcon;
+    public void setIconSize(@IconSize int iconSize) {
+        mIconSize = iconSize;
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
-        if (mUseSmallIcon) {
-            ImageView icon = holder.itemView.findViewById(android.R.id.icon);
-            icon.setLayoutParams(new LinearLayout.LayoutParams(mSmallIconSize, mSmallIconSize));
+        final ImageView icon = holder.itemView.findViewById(android.R.id.icon);
+        switch (mIconSize) {
+            case ICON_SIZE_SMALL:
+                icon.setLayoutParams(new LinearLayout.LayoutParams(mSmallIconSize, mSmallIconSize));
+                break;
+            case ICON_SIZE_MEDIUM:
+                icon.setLayoutParams(
+                        new LinearLayout.LayoutParams(mMediumIconSize, mMediumIconSize));
+                break;
         }
         final View divider = holder.findViewById(R.id.two_target_divider);
         final View widgetFrame = holder.findViewById(android.R.id.widget_frame);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index 6c068ff..dc2ecea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -631,7 +631,7 @@
         }
         HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile();
         if (hearingAidProfile != null) {
-            mIsActiveDeviceHearingAid = hearingAidProfile.isActiveDevice(mDevice);
+            mIsActiveDeviceHearingAid = hearingAidProfile.getActiveDevices().contains(mDevice);
         }
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
index 920500f..6c5ecbf 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidProfile.java
@@ -136,13 +136,12 @@
 
     public boolean setActiveDevice(BluetoothDevice device) {
         if (mService == null) return false;
-        mService.setActiveDevice(device);
-        return true;
+        return mService.setActiveDevice(device);
     }
 
-    public boolean isActiveDevice(BluetoothDevice device) {
-        if (mService == null) return false;
-        return mService.isActiveDevice(device);
+    public List<BluetoothDevice> getActiveDevices() {
+        if (mService == null) return new ArrayList<>();
+        return mService.getActiveDevices();
     }
 
     public boolean isPreferred(BluetoothDevice device) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
new file mode 100644
index 0000000..941964a
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidDeviceProfile.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.bluetooth;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHidDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.util.Log;
+
+import com.android.settingslib.R;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * HidProfile handles Bluetooth HID profile.
+ */
+public class HidDeviceProfile implements LocalBluetoothProfile {
+    private static final String TAG = "HidDeviceProfile";
+    // Order of this profile in device profiles list
+    private static final int ORDINAL = 18;
+    // HID Device Profile is always preferred.
+    private static final int PREFERRED_VALUE = -1;
+    private static final boolean DEBUG = true;
+
+    private final LocalBluetoothAdapter mLocalAdapter;
+    private final CachedBluetoothDeviceManager mDeviceManager;
+    private final LocalBluetoothProfileManager mProfileManager;
+    static final String NAME = "HID DEVICE";
+
+    private BluetoothHidDevice mService;
+    private boolean mIsProfileReady;
+
+    HidDeviceProfile(Context context, LocalBluetoothAdapter adapter,
+            CachedBluetoothDeviceManager deviceManager,
+            LocalBluetoothProfileManager profileManager) {
+        mLocalAdapter = adapter;
+        mDeviceManager = deviceManager;
+        mProfileManager = profileManager;
+        adapter.getProfileProxy(context, new HidDeviceServiceListener(),
+                BluetoothProfile.HID_DEVICE);
+    }
+
+    // These callbacks run on the main thread.
+    private final class HidDeviceServiceListener
+            implements BluetoothProfile.ServiceListener {
+
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+            if (DEBUG) {
+                Log.d(TAG,"Bluetooth service connected :-)");
+            }
+            mService = (BluetoothHidDevice) proxy;
+            // We just bound to the service, so refresh the UI for any connected HID devices.
+            List<BluetoothDevice> deviceList = mService.getConnectedDevices();
+            for (BluetoothDevice nextDevice : deviceList) {
+                CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice);
+                // we may add a new device here, but generally this should not happen
+                if (device == null) {
+                    Log.w(TAG, "HidProfile found new device: " + nextDevice);
+                    device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice);
+                }
+                Log.d(TAG, "Connection status changed: " + device);
+                device.onProfileStateChanged(HidDeviceProfile.this,
+                        BluetoothProfile.STATE_CONNECTED);
+                device.refresh();
+            }
+            mIsProfileReady = true;
+        }
+
+        public void onServiceDisconnected(int profile) {
+            if (DEBUG) {
+                Log.d(TAG, "Bluetooth service disconnected");
+            }
+            mIsProfileReady = false;
+        }
+    }
+
+    @Override
+    public boolean isProfileReady() {
+        return mIsProfileReady;
+    }
+
+    @Override
+    public boolean isConnectable() {
+        return true;
+    }
+
+    @Override
+    public boolean isAutoConnectable() {
+        return false;
+    }
+
+    @Override
+    public boolean connect(BluetoothDevice device) {
+        return false;
+    }
+
+    @Override
+    public boolean disconnect(BluetoothDevice device) {
+        if (mService == null) {
+            return false;
+        }
+        return mService.disconnect(device);
+    }
+
+    @Override
+    public int getConnectionStatus(BluetoothDevice device) {
+        if (mService == null) {
+            return BluetoothProfile.STATE_DISCONNECTED;
+        }
+        List<BluetoothDevice> deviceList = mService.getConnectedDevices();
+
+        return !deviceList.isEmpty() && deviceList.contains(device)
+                ? mService.getConnectionState(device)
+                : BluetoothProfile.STATE_DISCONNECTED;
+    }
+
+    @Override
+    public boolean isPreferred(BluetoothDevice device) {
+        return getConnectionStatus(device) != BluetoothProfile.STATE_DISCONNECTED;
+    }
+
+    @Override
+    public int getPreferred(BluetoothDevice device) {
+        return PREFERRED_VALUE;
+    }
+
+    @Override
+    public void setPreferred(BluetoothDevice device, boolean preferred) {
+        // if set preferred to false, then disconnect to the current device
+        if (!preferred) {
+            mService.disconnect(device);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return NAME;
+    }
+
+    @Override
+    public int getOrdinal() {
+        return ORDINAL;
+    }
+
+    @Override
+    public int getNameResource(BluetoothDevice device) {
+        return R.string.bluetooth_profile_hid;
+    }
+
+    @Override
+    public int getSummaryResourceForDevice(BluetoothDevice device) {
+        final int state = getConnectionStatus(device);
+        switch (state) {
+            case BluetoothProfile.STATE_DISCONNECTED:
+                return R.string.bluetooth_hid_profile_summary_use_for;
+            case BluetoothProfile.STATE_CONNECTED:
+                return R.string.bluetooth_hid_profile_summary_connected;
+            default:
+                return Utils.getConnectionStateSummary(state);
+        }
+    }
+
+    @Override
+    public int getDrawableResource(BluetoothClass btClass) {
+        return R.drawable.ic_bt_misc_hid;
+    }
+
+    protected void finalize() {
+        if (DEBUG) {
+            Log.d(TAG, "finalize()");
+        }
+        if (mService != null) {
+            try {
+                BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.HID_DEVICE,
+                        mService);
+                mService = null;
+            } catch (Throwable t) {
+                Log.w(TAG, "Error cleaning up HID proxy", t);
+            }
+        }
+    }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
index 213002f..93c4017 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
@@ -48,7 +48,7 @@
     private static final int ORDINAL = 3;
 
     // These callbacks run on the main thread.
-    private final class InputDeviceServiceListener
+    private final class HidHostServiceListener
             implements BluetoothProfile.ServiceListener {
 
         public void onServiceConnected(int profile, BluetoothProfile proxy) {
@@ -86,7 +86,7 @@
         mLocalAdapter = adapter;
         mDeviceManager = deviceManager;
         mProfileManager = profileManager;
-        adapter.getProfileProxy(context, new InputDeviceServiceListener(),
+        adapter.getProfileProxy(context, new HidHostServiceListener(),
                 BluetoothProfile.HID_HOST);
     }
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
index 34a099c..6413aab 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java
@@ -22,6 +22,7 @@
 import android.bluetooth.BluetoothHeadset;
 import android.bluetooth.BluetoothHeadsetClient;
 import android.bluetooth.BluetoothHearingAid;
+import android.bluetooth.BluetoothHidDevice;
 import android.bluetooth.BluetoothHidHost;
 import android.bluetooth.BluetoothMap;
 import android.bluetooth.BluetoothMapClient;
@@ -86,6 +87,7 @@
     private MapProfile mMapProfile;
     private MapClientProfile mMapClientProfile;
     private final HidProfile mHidProfile;
+    private HidDeviceProfile mHidDeviceProfile;
     private OppProfile mOppProfile;
     private final PanProfile mPanProfile;
     private PbapClientProfile mPbapClientProfile;
@@ -123,7 +125,7 @@
             updateLocalProfiles(uuids);
         }
 
-        // Always add HID and PAN profiles
+        // Always add HID host, HID device, and PAN profiles
         mHidProfile = new HidProfile(context, mLocalAdapter, mDeviceManager, this);
         addProfile(mHidProfile, HidProfile.NAME,
                 BluetoothHidHost.ACTION_CONNECTION_STATE_CHANGED);
@@ -132,6 +134,10 @@
         addPanProfile(mPanProfile, PanProfile.NAME,
                 BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
 
+        mHidDeviceProfile = new HidDeviceProfile(context, mLocalAdapter, mDeviceManager, this);
+        addProfile(mHidDeviceProfile, HidDeviceProfile.NAME,
+                BluetoothHidDevice.ACTION_CONNECTION_STATE_CHANGED);
+
         if(DEBUG) Log.d(TAG, "Adding local MAP profile");
         if (mUseMapClient) {
             mMapClientProfile = new MapClientProfile(mContext, mLocalAdapter, mDeviceManager, this);
@@ -195,8 +201,10 @@
                 if (DEBUG) Log.d(TAG, "Adding local HEADSET profile");
                 mHeadsetProfile = new HeadsetProfile(mContext, mLocalAdapter,
                         mDeviceManager, this);
-                addProfile(mHeadsetProfile, HeadsetProfile.NAME,
-                        BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
+                addHeadsetProfile(mHeadsetProfile, HeadsetProfile.NAME,
+                        BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED,
+                        BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED,
+                        BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
             }
         } else if (mHeadsetProfile != null) {
             Log.w(TAG, "Warning: HEADSET profile was previously added but the UUID is now missing.");
@@ -208,8 +216,10 @@
                 if(DEBUG) Log.d(TAG, "Adding local HfpClient profile");
                 mHfpClientProfile =
                     new HfpClientProfile(mContext, mLocalAdapter, mDeviceManager, this);
-                addProfile(mHfpClientProfile, HfpClientProfile.NAME,
-                        BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
+                addHeadsetProfile(mHfpClientProfile, HfpClientProfile.NAME,
+                        BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED,
+                        BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED,
+                        BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED);
             }
         } else if (mHfpClientProfile != null) {
             Log.w(TAG,
@@ -277,6 +287,15 @@
         // There is no local SDP record for HID and Settings app doesn't control PBAP Server.
     }
 
+    private void addHeadsetProfile(LocalBluetoothProfile profile, String profileName,
+            String stateChangedAction, String audioStateChangedAction, int audioDisconnectedState) {
+        BluetoothEventManager.Handler handler = new HeadsetStateChangeHandler(
+                profile, audioStateChangedAction, audioDisconnectedState);
+        mEventManager.addProfileHandler(stateChangedAction, handler);
+        mEventManager.addProfileHandler(audioStateChangedAction, handler);
+        mProfileNameMap.put(profileName, profile);
+    }
+
     private final Collection<ServiceListener> mServiceListeners =
             new ArrayList<ServiceListener>();
 
@@ -323,18 +342,47 @@
                 cachedDevice = mDeviceManager.addDevice(mLocalAdapter,
                         LocalBluetoothProfileManager.this, device);
             }
+            onReceiveInternal(intent, cachedDevice);
+        }
+
+        protected void onReceiveInternal(Intent intent, CachedBluetoothDevice cachedDevice) {
             int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, 0);
             int oldState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, 0);
             if (newState == BluetoothProfile.STATE_DISCONNECTED &&
                     oldState == BluetoothProfile.STATE_CONNECTING) {
                 Log.i(TAG, "Failed to connect " + mProfile + " device");
             }
-
             cachedDevice.onProfileStateChanged(mProfile, newState);
             cachedDevice.refresh();
         }
     }
 
+    /** Connectivity and audio state change handler for headset profiles. */
+    private class HeadsetStateChangeHandler extends StateChangedHandler {
+        private final String mAudioChangeAction;
+        private final int mAudioDisconnectedState;
+
+        HeadsetStateChangeHandler(LocalBluetoothProfile profile, String audioChangeAction,
+                int audioDisconnectedState) {
+            super(profile);
+            mAudioChangeAction = audioChangeAction;
+            mAudioDisconnectedState = audioDisconnectedState;
+        }
+
+        @Override
+        public void onReceiveInternal(Intent intent, CachedBluetoothDevice cachedDevice) {
+            if (mAudioChangeAction.equals(intent.getAction())) {
+                int newState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, 0);
+                if (newState != mAudioDisconnectedState) {
+                    cachedDevice.onProfileStateChanged(mProfile, BluetoothProfile.STATE_CONNECTED);
+                }
+                cachedDevice.refresh();
+            } else {
+                super.onReceiveInternal(intent, cachedDevice);
+            }
+        }
+    }
+
     /** State change handler for NAP and PANU profiles. */
     private class PanStateChangedHandler extends StateChangedHandler {
 
@@ -505,6 +553,12 @@
             removedProfiles.remove(mHidProfile);
         }
 
+        if (mHidProfile != null && mHidDeviceProfile.getConnectionStatus(device)
+                != BluetoothProfile.STATE_DISCONNECTED) {
+            profiles.add(mHidDeviceProfile);
+            removedProfiles.remove(mHidDeviceProfile);
+        }
+
         if(isPanNapConnected)
             if(DEBUG) Log.d(TAG, "Valid PAN-NAP connection exists.");
         if ((BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.NAP) &&
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
index 835ff07..f7b16f8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatterySaverUtils.java
@@ -148,15 +148,32 @@
         Secure.putInt(context.getContentResolver(), Secure.LOW_POWER_WARNING_ACKNOWLEDGED, 1);
     }
 
+    /**
+     * Don't show the automatic battery suggestion notification in the future.
+     */
     public static void suppressAutoBatterySaver(Context context) {
         Secure.putInt(context.getContentResolver(),
                 Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, 1);
     }
 
-    public static void scheduleAutoBatterySaver(Context context, int level) {
+    /**
+     * Set the automatic battery saver trigger level to {@code level}.
+     */
+    public static void setAutoBatterySaverTriggerLevel(Context context, int level) {
+        if (level > 0) {
+            suppressAutoBatterySaver(context);
+        }
+        Global.putInt(context.getContentResolver(), Global.LOW_POWER_MODE_TRIGGER_LEVEL, level);
+    }
+
+    /**
+     * Set the automatic battery saver trigger level to {@code level}, but only when
+     * automatic battery saver isn't enabled yet.
+     */
+    public static void ensureAutoBatterySaver(Context context, int level) {
         if (Global.getInt(context.getContentResolver(), Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0)
                 == 0) {
-            Global.putInt(context.getContentResolver(), Global.LOW_POWER_MODE_TRIGGER_LEVEL, level);
+            setAutoBatterySaverTriggerLevel(context, level);
         }
     }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
index 7081678..06e2ee1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
+++ b/packages/SettingsLib/src/com/android/settingslib/fuelgauge/PowerWhitelistBackend.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.fuelgauge;
 
+import android.content.pm.PackageManager;
 import android.os.IDeviceIdleController;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -24,6 +25,8 @@
 import android.util.ArraySet;
 import android.util.Log;
 
+import com.android.internal.util.ArrayUtils;
+
 /**
  * Handles getting/changing the whitelist for the exceptions to battery saving features.
  */
@@ -68,6 +71,19 @@
         return mSysWhitelistedAppsExceptIdle.contains(pkg);
     }
 
+    public boolean isSysWhitelistedExceptIdle(String[] pkgs) {
+        if (ArrayUtils.isEmpty(pkgs)) {
+            return false;
+        }
+        for (String pkg : pkgs) {
+            if (isSysWhitelistedExceptIdle(pkg)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     public void addApp(String pkg) {
         try {
             mDeviceIdleService.addPowerSaveWhitelistApp(pkg);
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
index cc69e0e..c4ca339 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
@@ -86,7 +86,7 @@
      * @return List of {@code UserInfo} for each user that is not the current user.
      */
     public List<UserInfo> getAllUsersExcludesCurrentUser() {
-        List<UserInfo> others = mUserManager.getUsers(true);
+        List<UserInfo> others = getAllUsers();
 
         for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
             UserInfo userInfo = iterator.next();
@@ -98,6 +98,31 @@
         return others;
     }
 
+    /**
+     * Gets all the other users on the system that are not the system user.
+     *
+     * @return List of {@code UserInfo} for each user that is not the system user.
+     */
+    public List<UserInfo> getAllUsersExcludesSystemUser() {
+        List<UserInfo> others = getAllUsers();
+
+        for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
+            UserInfo userInfo = iterator.next();
+            if (userIsSystemUser(userInfo)) {
+                // Remove system user from the list.
+                iterator.remove();
+            }
+        }
+        return others;
+    }
+
+    /**
+     * Gets all the users on the system that are not currently being removed.
+     */
+    public List<UserInfo> getAllUsers() {
+        return mUserManager.getUsers(true /* excludeDying */);
+    }
+
     // User information accessors
 
     /**
@@ -224,7 +249,7 @@
      * @return {@code true} if user is successfully removed, {@code false} otherwise.
      */
     public boolean removeUser(UserInfo userInfo) {
-        if (userInfo.id == UserHandle.USER_SYSTEM) {
+        if (userIsSystemUser(userInfo)) {
             Log.w(TAG, "User " + userInfo.id + " is system user, could not be removed.");
             return false;
         }
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
index 8b3da39..de29030 100644
--- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java
@@ -144,7 +144,8 @@
                         FIFTEEN_MINUTES_MILLIS);
 
         // convert the time to a properly formatted string.
-        DateFormat fmt = DateFormat.getTimeInstance(DateFormat.SHORT);
+        String skeleton = android.text.format.DateFormat.getTimeFormatString(context);
+        DateFormat fmt = DateFormat.getInstanceForSkeleton(skeleton);
         Date date = Date.from(Instant.ofEpochMilli(roundedTimeOfDayMs));
         CharSequence timeString = fmt.format(date);
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
index 9347674..547cd9a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java
@@ -41,8 +41,9 @@
     private final WifiManager mWifiManager;
     private final NetworkScoreManager mNetworkScoreManager;
     private final ConnectivityManager mConnectivityManager;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
     private final WifiNetworkScoreCache.CacheListener mCacheListener =
-            new WifiNetworkScoreCache.CacheListener(new Handler(Looper.getMainLooper())) {
+            new WifiNetworkScoreCache.CacheListener(mHandler) {
                 @Override
                 public void networkCacheUpdated(List<ScoredNetwork> updatedNetworks) {
                     updateStatusLabel();
@@ -89,7 +90,8 @@
             mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
                     mWifiNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_CURRENT_NETWORK);
             mWifiNetworkScoreCache.registerListener(mCacheListener);
-            mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+            mConnectivityManager.registerNetworkCallback(
+                    mNetworkRequest, mNetworkCallback, mHandler);
         } else {
             mNetworkScoreManager.unregisterNetworkScoreCache(NetworkKey.TYPE_WIFI,
                     mWifiNetworkScoreCache);
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index a128b54..d8f0886 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -313,7 +313,8 @@
             mContext.registerReceiver(mReceiver, mFilter, null /* permission */, mWorkHandler);
             // NetworkCallback objects cannot be reused. http://b/20701525 .
             mNetworkCallback = new WifiTrackerNetworkCallback();
-            mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+            mConnectivityManager.registerNetworkCallback(
+                    mNetworkRequest, mNetworkCallback, mWorkHandler);
             mRegistered = true;
         }
     }
@@ -788,7 +789,7 @@
                 // We don't send a NetworkInfo object along with this message, because even if we
                 // fetch one from ConnectivityManager, it might be older than the most recent
                 // NetworkInfo message we got via a WIFI_STATE_CHANGED broadcast.
-                mWorkHandler.post(() -> updateNetworkInfo(null));
+                updateNetworkInfo(null);
             }
         }
     }
diff --git a/packages/SettingsLib/tests/integ/AndroidTest.xml b/packages/SettingsLib/tests/integ/AndroidTest.xml
index 96621eb..d7ee618 100644
--- a/packages/SettingsLib/tests/integ/AndroidTest.xml
+++ b/packages/SettingsLib/tests/integ/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.settingslib" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
index 325ef3a..3f1fcbb 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/UserManagerHelperTest.java
@@ -113,6 +113,54 @@
     }
 
     @Test
+    public void testGetAllUsersExcludesSystemUser() {
+        UserInfo otherUser1 = createUserInfoForId(10);
+        UserInfo otherUser2 = createUserInfoForId(11);
+        UserInfo otherUser3 = createUserInfoForId(12);
+
+        List<UserInfo> testUsers = new ArrayList<>();
+        testUsers.add(otherUser1);
+        testUsers.add(otherUser2);
+        testUsers.add(mSystemUser);
+        testUsers.add(otherUser3);
+
+        when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+        // Should return 3 users that don't have SYSTEM USER id.
+        assertThat(mHelper.getAllUsersExcludesSystemUser().size()).isEqualTo(3);
+        // Should not contain system user.
+        assertThat(mHelper.getAllUsersExcludesSystemUser()).doesNotContain(mSystemUser);
+        // Should contain non-system users.
+        assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser1);
+        assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser2);
+        assertThat(mHelper.getAllUsersExcludesSystemUser()).contains(otherUser3);
+    }
+
+    @Test
+    public void testGetAllUsers() {
+        int currentUser = UserHandle.myUserId();
+
+        UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
+        UserInfo otherUser2 = createUserInfoForId(currentUser - 1);
+        UserInfo otherUser3 = createUserInfoForId(currentUser + 2);
+
+        List<UserInfo> testUsers = new ArrayList<>();
+        testUsers.add(otherUser1);
+        testUsers.add(otherUser2);
+        testUsers.add(mCurrentUser);
+        testUsers.add(otherUser3);
+
+        when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+        // Should return 3 users that don't have currentUser id.
+        assertThat(mHelper.getAllUsers().size()).isEqualTo(4);
+        assertThat(mHelper.getAllUsers()).contains(mCurrentUser);
+        assertThat(mHelper.getAllUsers()).contains(otherUser1);
+        assertThat(mHelper.getAllUsers()).contains(otherUser2);
+        assertThat(mHelper.getAllUsers()).contains(otherUser3);
+    }
+
+    @Test
     public void testUserCanBeRemoved() {
         UserInfo testInfo = new UserInfo();
 
@@ -208,11 +256,6 @@
         // Cannot remove system user.
         assertThat(mHelper.removeUser(mSystemUser)).isFalse();
 
-        // Removing current user, calls "switch" to system user.
-        mHelper.removeUser(mCurrentUser);
-        verify(mActivityManager).switchUser(UserHandle.USER_SYSTEM);
-        verify(mUserManager).removeUser(mCurrentUser.id);
-
         // Removing non-current, non-system user, simply calls removeUser.
         UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
         mHelper.removeUser(userToRemove);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
index c5e93f0..480143a7 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/TwoTargetPreferenceTest.java
@@ -16,6 +16,9 @@
 
 package com.android.settingslib;
 
+import static com.android.settingslib.TwoTargetPreference.ICON_SIZE_DEFAULT;
+import static com.android.settingslib.TwoTargetPreference.ICON_SIZE_MEDIUM;
+import static com.android.settingslib.TwoTargetPreference.ICON_SIZE_SMALL;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
@@ -75,8 +78,8 @@
     }
 
     @Test
-    public void bind_smallIcon_shouldUseSmallIcon() {
-        mPreference.setUseSmallIcon(true);
+    public void bind_smallIcon_shouldUseSmallIconSize() {
+        mPreference.setIconSize(ICON_SIZE_SMALL);
 
         mPreference.onBindViewHolder(mViewHolder);
 
@@ -91,8 +94,24 @@
     }
 
     @Test
-    public void bind_normalIcon_shouldUseNormalIcon() {
-        mPreference.setUseSmallIcon(false);
+    public void bind_mediumIcon_shouldUseMediumIconSize() {
+        mPreference.setIconSize(ICON_SIZE_MEDIUM);
+
+        mPreference.onBindViewHolder(mViewHolder);
+
+        final int size = mContext.getResources().getDimensionPixelSize(
+                R.dimen.two_target_pref_medium_icon_size);
+        final LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mViewHolder
+                .findViewById(android.R.id.icon)
+                .getLayoutParams();
+
+        assertThat(layoutParams.width).isEqualTo(size);
+        assertThat(layoutParams.height).isEqualTo(size);
+    }
+
+    @Test
+    public void bind_defaultIcon_shouldUseDefaultIconSize() {
+        mPreference.setIconSize(ICON_SIZE_DEFAULT);
 
         mPreference.onBindViewHolder(mViewHolder);
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
index b33df30..ba5a2c5 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/BatterySaverUtilsTest.java
@@ -16,7 +16,9 @@
 
 package com.android.settingslib.fuelgauge;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
@@ -28,6 +30,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.PowerManager;
+import android.provider.Settings.Global;
 import android.provider.Settings.Secure;
 
 import com.android.settingslib.SettingsLibRobolectricTestRunner;
@@ -41,6 +44,9 @@
 
 @RunWith(SettingsLibRobolectricTestRunner.class)
 public class BatterySaverUtilsTest {
+    final int BATTERY_SAVER_THRESHOLD_1 = 15;
+    final int BATTERY_SAVER_THRESHOLD_2 = 20;
+
     @Mock
     Context mMockContext;
 
@@ -149,4 +155,37 @@
         assertEquals(-2,
                 Secure.getInt(mMockResolver, Secure.LOW_POWER_MANUAL_ACTIVATION_COUNT, -2));
     }
+
+    @Test
+    public void testEnsureAutoBatterysaver_setNewPositiveValue_doNotOverwrite() throws Exception {
+        Global.putString(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, "null");
+
+        BatterySaverUtils.ensureAutoBatterySaver(mMockContext, BATTERY_SAVER_THRESHOLD_1);
+
+        assertThat(Secure.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+                .isEqualTo(BATTERY_SAVER_THRESHOLD_1);
+
+        // Once a positive number is set, ensureAutoBatterySaver() won't overwrite it.
+        BatterySaverUtils.ensureAutoBatterySaver(mMockContext, BATTERY_SAVER_THRESHOLD_2);
+        assertThat(Secure.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+                .isEqualTo(BATTERY_SAVER_THRESHOLD_1);
+    }
+
+    @Test
+    public void testSetAutoBatterySaverTriggerLevel_setSuppressSuggestion() throws Exception {
+        Global.putString(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, "null");
+        Secure.putString(mMockResolver, Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, "null");
+
+        BatterySaverUtils.setAutoBatterySaverTriggerLevel(mMockContext, 0);
+        assertThat(Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+                .isEqualTo(0);
+        assertThat(Secure.getInt(mMockResolver, Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, -1))
+                .isEqualTo(-1); // not set.
+
+        BatterySaverUtils.setAutoBatterySaverTriggerLevel(mMockContext, BATTERY_SAVER_THRESHOLD_1 );
+        assertThat( Global.getInt(mMockResolver, Global.LOW_POWER_MODE_TRIGGER_LEVEL, -1))
+                .isEqualTo(BATTERY_SAVER_THRESHOLD_1);
+        assertThat(Secure.getInt(mMockResolver, Secure.SUPPRESS_AUTO_BATTERY_SAVER_SUGGESTION, -1))
+                .isEqualTo(1);
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
index 5a123af..f591781 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/fuelgauge/PowerWhitelistBackendTest.java
@@ -92,7 +92,7 @@
     }
 
     @Test
-    public void testIsSystemWhitelistedExceptIdle() throws Exception {
+    public void testIsSystemWhitelistedExceptIdle_onePackage() throws Exception {
         doReturn(new String[]{PACKAGE_TWO}).when(
                 mDeviceIdleService).getSystemPowerWhitelistExceptIdle();
         mPowerWhitelistBackend.refreshList();
@@ -100,4 +100,17 @@
         assertThat(mPowerWhitelistBackend.isSysWhitelistedExceptIdle(PACKAGE_ONE)).isFalse();
         assertThat(mPowerWhitelistBackend.isSysWhitelistedExceptIdle(PACKAGE_TWO)).isTrue();
     }
+
+    @Test
+    public void testIsSystemWhitelistedExceptIdle_packageArray() throws Exception {
+        doReturn(new String[]{PACKAGE_TWO}).when(
+                mDeviceIdleService).getSystemPowerWhitelistExceptIdle();
+        mPowerWhitelistBackend.refreshList();
+
+        final String[] idlePackages = {PACKAGE_ONE, PACKAGE_TWO};
+        final String[] normalPackages = {PACKAGE_ONE};
+
+        assertThat(mPowerWhitelistBackend.isSysWhitelistedExceptIdle(normalPackages)).isFalse();
+        assertThat(mPowerWhitelistBackend.isSysWhitelistedExceptIdle(idlePackages)).isTrue();
+    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
index 05247ba..dfd48cc 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java
@@ -42,8 +42,8 @@
     public static final long THIRTY_HOURS_MILLIS = Duration.ofHours(30).toMillis();
     public static final String NORMAL_CASE_EXPECTED_PREFIX = "Should last until about";
     public static final String ENHANCED_SUFFIX = " based on your usage";
-    // matches a time (ex: '1:15 PM', '2 AM')
-    public static final String TIME_OF_DAY_REGEX = " (\\d)+:?(\\d)* (AM)|(PM)";
+    // matches a time (ex: '1:15 PM', '2 AM', '23:00')
+    public static final String TIME_OF_DAY_REGEX = " (\\d)+:?(\\d)* ((AM)*)|((PM)*)";
     // matches a percentage with parenthesis (ex: '(10%)')
     public static final String PERCENTAGE_REGEX = " \\(\\d?\\d%\\)";
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index ad422d8..4c98bb8 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -144,10 +144,7 @@
         }
 
         try {
-            if (Settings.System.SCREEN_BRIGHTNESS.equals(name)) {
-                setBrightness(Integer.parseInt(value));
-                // fall through to the ordinary write to settings
-            } else if (Settings.System.SOUND_EFFECTS_ENABLED.equals(name)) {
+            if (Settings.System.SOUND_EFFECTS_ENABLED.equals(name)) {
                 setSoundEffects(Integer.parseInt(value) == 1);
                 // fall through to the ordinary write to settings
             } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) {
@@ -305,10 +302,6 @@
         }
     }
 
-    private void setBrightness(int brightness) {
-        mContext.getSystemService(DisplayManager.class).setTemporaryBrightness(brightness);
-    }
-
     /* package */ byte[] getLocaleData() {
         Configuration conf = mContext.getResources().getConfiguration();
         return conf.getLocales().toLanguageTags().getBytes();
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index f43e719..a2263b4 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -742,6 +742,9 @@
         dumpSetting(s, p,
                 Settings.Global.LOCATION_GLOBAL_KILL_SWITCH,
                 GlobalSettingsProto.Location.GLOBAL_KILL_SWITCH);
+        dumpSetting(s, p,
+                Settings.Global.GNSS_SATELLITE_BLACKLIST,
+                GlobalSettingsProto.Location.GNSS_SATELLITE_BLACKLIST);
         p.end(locationToken);
 
         final long lpmToken = p.start(GlobalSettingsProto.LOW_POWER_MODE);
@@ -2019,6 +2022,10 @@
                 SecureSettingsProto.Rotation.NUM_ROTATION_SUGGESTIONS_ACCEPTED);
         p.end(rotationToken);
 
+        dumpSetting(s, p,
+                Settings.Secure.RTT_CALLING_MODE,
+                SecureSettingsProto.RTT_CALLING_MODE);
+
         final long screensaverToken = p.start(SecureSettingsProto.SCREENSAVER);
         dumpSetting(s, p,
                 Settings.Secure.SCREENSAVER_ENABLED,
@@ -2224,6 +2231,12 @@
                 Settings.Secure.WAKE_GESTURE_ENABLED,
                 SecureSettingsProto.WAKE_GESTURE_ENABLED);
 
+        final long launcherToken = p.start(SecureSettingsProto.LAUNCHER);
+        dumpSetting(s, p,
+                Settings.Secure.SWIPE_UP_TO_SWITCH_APPS_ENABLED,
+                SecureSettingsProto.Launcher.SWIPE_UP_TO_SWITCH_APPS_ENABLED);
+        p.end(launcherToken);
+
         // Please insert new settings using the same order as in SecureSettingsProto.
         p.end(token);
 
@@ -2402,10 +2415,6 @@
                 SystemSettingsProto.Rotation.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY);
         p.end(rotationToken);
 
-        dumpSetting(s, p,
-                Settings.System.RTT_CALLING_MODE,
-                SystemSettingsProto.RTT_CALLING_MODE);
-
         final long screenToken = p.start(SystemSettingsProto.SCREEN);
         dumpSetting(s, p,
                 Settings.System.SCREEN_OFF_TIMEOUT,
diff --git a/packages/SettingsProvider/test/AndroidTest.xml b/packages/SettingsProvider/test/AndroidTest.xml
index 3a156895..46b8f94 100644
--- a/packages/SettingsProvider/test/AndroidTest.xml
+++ b/packages/SettingsProvider/test/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.providers.setting.test" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/Shell/res/values-ne/strings.xml b/packages/Shell/res/values-ne/strings.xml
index eadfeb9..77ef32a 100644
--- a/packages/Shell/res/values-ne/strings.xml
+++ b/packages/Shell/res/values-ne/strings.xml
@@ -25,9 +25,9 @@
     <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"à€‰à€•à„à€€ à€Źà€— à€žà€źà„à€Źà€šà„à€§à„€ à€°à€żà€Șà„‹à€°à„à€Ÿ à€šà€Ÿà€à€Ąà„ˆ à€šà„ˆ à€Żà€ž à€«à„‹à€šà€źà€Ÿ à€Šà„‡à€–à€Ÿ à€Șà€°à„à€šà„‡à€›"</string>
     <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"à€€à€Șà€Ÿà€ˆà€‚à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿ à€†à€Šà€Ÿà€š à€Șà„à€°à€Šà€Ÿà€š à€—à€°à„à€š à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"à€€à€Șà€Ÿà€ˆà€‚à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€Čà€Ÿà€ˆ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"à€€à€Șà€Ÿà€ˆà€‚à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€†à€Šà€Ÿà€š à€Șà„à€°à€Šà€Ÿà€š à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€šà„‡ à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"à€€à€Șà€Ÿà€ˆà€à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€Čà€Ÿà€ˆ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€š à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"à€€à€Șà€Ÿà€ˆà€à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€Čà€Ÿà€ˆ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€š à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"à€€à€Șà€Ÿà€ˆà€‚à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€†à€Šà€Ÿà€š à€Șà„à€°à€Šà€Ÿà€š à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€šà€Żà€š à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€šà„‡ à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"à€€à€Șà€Ÿà€ˆà€à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€Čà€Ÿà€ˆ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€š à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"à€€à€Șà€Ÿà€ˆà€à€•à„‹ à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€Čà€Ÿà€ˆ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Źà€żà€šà€Ÿ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„ à€”à€Ÿ à€žà„à€•à„à€°à€żà€šà€žà€Ÿ à€Čà€żà€šà„‡ à€Șà„à€°à€•à„à€°à€żà€Żà€Ÿ à€Șà„‚à€°à€Ÿ à€čà„à€š à€Șà„à€°à€€à„€à€•à„à€·à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="bugreport_confirm" msgid="5917407234515812495">"à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€čà€°à„‚à€źà€Ÿ à€Șà„à€°à€Łà€Ÿà€Čà„€à€•à€Ÿ à€”à€żà€­à€żà€šà„à€š à€Čà€— à€«à€Ÿà€‡à€Čà€čà€°à„‚à€•à„‹ à€Ąà„‡à€Ÿà€Ÿ à€čà„à€šà„à€› à€œà€žà€źà€Ÿ à€€à€Șà€Ÿà€ˆà€à€Čà„‡ à€žà€‚à€”à„‡à€Šà€šà€¶à„€à€Č à€źà€Ÿà€šà„‡à€•à„‹ à€Ąà„‡à€Ÿà€Ÿ à€žà€źà€Ÿà€”à„‡à€¶ à€čà„à€š à€žà€•à„à€› (à€œà€žà„à€€à„ˆ à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€•à„‹ à€Șà„à€°à€Żà„‹à€— à€° à€žà„à€„à€Ÿà€š à€žà€źà„à€Źà€šà„à€§à„€ à€Ąà„‡à€Ÿà€Ÿ)à„€ à€€à€Șà€Ÿà€ˆà€à€Čà„‡ à€”à€żà€¶à„à€”à€Ÿà€ž à€—à€°à„à€šà„‡ à€”à„à€Żà€•à„à€€à€ż à€° à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€čà€°à„‚à€žà€à€— à€źà€Ÿà€€à„à€° à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€čà€°à„‚à€Čà€Ÿà€ˆ à€žà€Ÿà€à„‡à€Šà€Ÿà€°à„€ à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"à€«à„‡à€°à€ż à€šà€Šà„‡à€–à€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="bugreport_storage_title" msgid="5332488144740527109">"à€Źà€— à€°à€żà€Șà„‹à€°à„à€Ÿà€čà€°à„‚"</string>
diff --git a/packages/Shell/tests/AndroidTest.xml b/packages/Shell/tests/AndroidTest.xml
index bd37712c..e592d82 100644
--- a/packages/Shell/tests/AndroidTest.xml
+++ b/packages/Shell/tests/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.shell.tests" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3488168..d6fab4c 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -220,7 +220,8 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.SystemUI"
         android:defaultToDeviceProtectedStorage="true"
-        android:directBootAware="true">
+        android:directBootAware="true"
+        android:appComponentFactory="android.support.v4.app.CoreComponentFactory">
         <!-- Keep theme in sync with SystemUIApplication.onCreate().
              Setting the theme on the application does not affect views inflated by services.
              The application theme is set again from onCreate to take effect for those views. -->
diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS
index 7c97ca61..e217ace 100644
--- a/packages/SystemUI/OWNERS
+++ b/packages/SystemUI/OWNERS
@@ -22,3 +22,6 @@
 twickham@google.com
 winsonc@google.com
 
+#Android Auto
+stenning@google.com
+
diff --git a/packages/SystemUI/proguard.flags b/packages/SystemUI/proguard.flags
index 5b8881c..4b5d10e 100644
--- a/packages/SystemUI/proguard.flags
+++ b/packages/SystemUI/proguard.flags
@@ -41,3 +41,4 @@
 -keep class com.android.systemui.plugins.** {
     public protected *;
 }
+-keep class android.support.v4.app.CoreComponentFactory
diff --git a/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
index 6edae4b..1f6b24b 100644
--- a/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
+++ b/packages/SystemUI/res-keyguard/drawable/ic_backspace_black_24dp.xml
@@ -21,5 +21,5 @@
         android:viewportHeight="24.0">
     <path
         android:fillColor="#FF000000"
-        android:pathData="M22,3H7C6.31,3 5.77,3.35 5.41,3.88l-5.04,7.57c-0.22,0.34 -0.22,0.77 0,1.11l5.04,7.56C5.77,20.64 6.31,21 7,21h15c1.1,0 2,-0.9 2,-2V5C24,3.9 23.1,3 22,3zM18.3,16.3L18.3,16.3c-0.39,0.39 -1.02,0.39 -1.41,0L14,13.41l-2.89,2.89c-0.39,0.39 -1.02,0.39 -1.41,0h0c-0.39,-0.39 -0.39,-1.02 0,-1.41L12.59,12L9.7,9.11c-0.39,-0.39 -0.39,-1.02 0,-1.41l0,0c0.39,-0.39 1.02,-0.39 1.41,0L14,10.59l2.89,-2.89c0.39,-0.39 1.02,-0.39 1.41,0v0c0.39,0.39 0.39,1.02 0,1.41L15.41,12l2.89,2.89C18.68,15.27 18.68,15.91 18.3,16.3z"/>
+        android:pathData="M9,15.59L12.59,12L9,8.41L10.41,7L14,10.59L17.59,7L19,8.41L15.41,12L19,15.59L17.59,17L14,13.41L10.41,17L9,15.59zM21,6H8l-4.5,6L8,18h13V6M21,4c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2H8c-0.63,0 -1.22,-0.3 -1.6,-0.8L1,12l5.4,-7.2C6.78,4.3 7.37,4 8,4H21L21,4z"/>
 </vector>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index cc98f8e..e337b4b 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -142,7 +142,7 @@
     <string name="fingerprint_not_recognized" msgid="348813995267914625">"à€Șà€čà€żà€šà€Ÿà€š à€­à€à€š"</string>
     <plurals name="kg_password_default_pin_message" formatted="false" msgid="6203676909479972943">
       <item quantity="other">SIM à€•à„‹ PIN à€Șà„à€°à€”à€żà€·à„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„ à€€à€Șà€Ÿà€ˆà€‚à€žà€à€— <xliff:g id="NUMBER_1">%d</xliff:g>  à€Șà„à€°à€Żà€Ÿà€žà€čà€°à„‚ à€Źà€Ÿà€à€•à„€ à€›à€šà„à„€</item>
-      <item quantity="one">SIM à€•à„‹ PIN à€Șà„à€°à€”à€żà€·à„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„, à€€à€Șà€Ÿà€ˆà€‚à€žà€à€— <xliff:g id="NUMBER_0">%d</xliff:g> à€Șà„à€°à€Żà€Ÿà€ž à€Źà€Ÿà€à€•à„€ à€›, à€€à„à€Żà€žà€Șà€›à€ż à€­à€šà„‡ à€†à€«à„à€šà„‹ à€Żà€šà„à€€à„à€° à€…à€šà€Čà€• à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€…à€šà€żà€”à€Ÿà€°à„à€Ż à€°à„‚à€Șà€źà€Ÿ à€†à€«à„à€šà„‹ à€žà„‡à€”à€Ÿ à€Șà„à€°à€Šà€Ÿà€Żà€•à€Čà€Ÿà€ˆ à€žà€źà„à€Șà€°à„à€• à€—à€°à„à€šà€Șà€°à„à€šà„‡ à€čà„à€šà„à€›à„€</item>
+      <item quantity="one">SIM à€•à„‹ PIN à€Șà„à€°à€”à€żà€·à„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„, à€€à€Șà€Ÿà€ˆà€‚à€žà€à€— <xliff:g id="NUMBER_0">%d</xliff:g> à€Șà„à€°à€Żà€Ÿà€ž à€Źà€Ÿà€à€•à„€ à€›, à€€à„à€Żà€žà€Șà€›à€ż à€­à€šà„‡ à€†à€«à„à€šà„‹ à€Żà€šà„à€€à„à€° à€…à€šà€Čà€• à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€€à€Șà€Ÿà€ˆà€‚à€Čà„‡ à€…à€šà€żà€”à€Ÿà€°à„à€Ż à€°à„‚à€Șà€źà€Ÿ à€†à€«à„à€šà„‹ à€žà„‡à€”à€Ÿ à€Șà„à€°à€Šà€Ÿà€Żà€•à€Čà€Ÿà€ˆ à€žà€źà„à€Șà€°à„à€• à€—à€°à„à€šà€Șà€°à„à€šà„‡ à€čà„à€šà„à€›à„€</item>
     </plurals>
     <plurals name="kg_password_default_puk_message" formatted="false" msgid="8744416410184198352">
       <item quantity="other">SIM à€Čà€Ÿà€ˆ à€…à€žà€•à„à€·à€ź à€Șà€Ÿà€°à€żà€à€•à„‹ à€›à„€ à€œà€Ÿà€°à„€ à€°à€Ÿà€–à„à€š PUK à€•à„‹à€Ą à€Șà„à€°à€”à€żà€·à„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„à„€ à€€à€Șà€Ÿà€ˆà€‚à€žà€à€— <xliff:g id="_NUMBER_1">%d</xliff:g> à€Șà„à€°à€Żà€Ÿà€žà€čà€°à„‚ à€Źà€Ÿà€à€•à„€ à€›à€šà„, à€€à„à€Żà€žà€Șà€›à€ż SIM à€žà€Šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€š à€šà€źà€żà€Čà„à€šà„‡ à€čà„à€šà„à€›à„€ à€”à€żà€”à€°à€Łà€čà€°à„‚à€•à€Ÿ à€Čà€Ÿà€—à€ż à€žà„‡à€”à€Ÿ à€Șà„à€°à€Šà€Ÿà€Żà€•à€Čà€Ÿà€ˆ à€žà€źà„à€Șà€°à„à€• à€—à€°à„à€šà„à€čà„‹à€žà„à„€</item>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 1c1c757..37de433 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -47,12 +47,14 @@
     <dimen name="widget_title_font_size">24sp</dimen>
     <!-- Slice subtitle  -->
     <dimen name="widget_label_font_size">16sp</dimen>
+    <!-- Slice offset when pulsing -->
+    <dimen name="widget_pulsing_bottom_padding">24dp</dimen>
     <!-- Clock without header -->
     <dimen name="widget_big_font_size">64dp</dimen>
     <!-- Clock with header -->
     <dimen name="widget_small_font_size">24dp</dimen>
     <!-- Dash between clock and header -->
-    <dimen name="widget_separator_width">16dp</dimen>
+    <dimen name="widget_separator_width">12dp</dimen>
     <dimen name="widget_separator_thickness">1dp</dimen>
     <dimen name="widget_vertical_padding">26dp</dimen>
     <dimen name="widget_icon_bottom_padding">14dp</dimen>
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 0615668..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 839e5ed..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 1480c865..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 66e11fb..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index d2fe0c3..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 5923269..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index d0196e5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index d3a2b39..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png
deleted file mode 100644
index 726643c..0000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png b/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png
deleted file mode 100644
index 31078f6..0000000
--- a/packages/SystemUI/res/drawable-xxxhdpi/ic_sysbar_accessibility_button_dark.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml
new file mode 100644
index 0000000..83c1949
--- /dev/null
+++ b/packages/SystemUI/res/drawable/fingerprint_dialog_error_to_fp.xml
@@ -0,0 +1,525 @@
+<?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
+  -->
+
+<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:viewportHeight="24"
+            android:viewportWidth="24">
+            <group android:name="_R_G">
+                <group
+                    android:name="_R_G_L_2_G"
+                    android:pivotX="-33"
+                    android:pivotY="-34"
+                    android:rotation="180"
+                    android:scaleX="0.738"
+                    android:scaleY="0.738"
+                    android:translateX="45"
+                    android:translateY="46.4">
+                    <path
+                        android:name="_R_G_L_2_G_D_0_P_0"
+                        android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_2_G_D_1_P_0"
+                        android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_2_G_D_2_P_0"
+                        android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="1" />
+                    <path
+                        android:name="_R_G_L_2_G_D_3_P_0"
+                        android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="1" />
+                    <path
+                        android:name="_R_G_L_2_G_D_4_P_0"
+                        android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                </group>
+                <group
+                    android:name="_R_G_L_1_G"
+                    android:rotation="10"
+                    android:translateX="12"
+                    android:translateY="12">
+                    <path
+                        android:name="_R_G_L_1_G_D_0_P_0"
+                        android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="2"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                </group>
+                <group
+                    android:name="_R_G_L_0_G"
+                    android:translateX="12"
+                    android:translateY="12">
+                    <group
+                        android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"
+                        android:pivotY="-0.012"
+                        android:rotation="0"
+                        android:scaleX="1"
+                        android:scaleY="1">
+                        <path
+                            android:name="_R_G_L_0_G_D_0_P_0"
+                            android:fillAlpha="1"
+                            android:fillColor="@color/fingerprint_dialog_error_color"
+                            android:fillType="nonZero"
+                            android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " />
+                    </group>
+                    <group
+                        android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"
+                        android:pivotY="-0.012"
+                        android:rotation="0"
+                        android:scaleX="1"
+                        android:scaleY="1">
+                        <path
+                            android:name="_R_G_L_0_G_D_0_P_1"
+                            android:fillAlpha="1"
+                            android:fillColor="@color/fingerprint_dialog_error_color"
+                            android:fillType="nonZero"
+                            android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " />
+                    </group>
+                </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="350"
+                    android:propertyName="trimPathEnd"
+                    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.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="350"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="350"
+                    android:valueFrom="0"
+                    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_2_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="267"
+                    android:propertyName="trimPathEnd"
+                    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.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="433"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="267"
+                    android:valueFrom="0"
+                    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_2_G_D_2_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathStart"
+                    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="250"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="250"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    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_2_G_D_3_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="350"
+                    android:propertyName="trimPathStart"
+                    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="117"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="350"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    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_2_G_D_4_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="417"
+                    android:propertyName="trimPathEnd"
+                    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.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="417"
+                    android:valueFrom="0"
+                    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_2_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="rotation"
+                    android:startOffset="0"
+                    android:valueFrom="180"
+                    android:valueTo="180"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="500"
+                    android:propertyName="rotation"
+                    android:startOffset="200"
+                    android:valueFrom="180"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,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="383"
+                    android:propertyName="trimPathEnd"
+                    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.4,0 0.2,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="33"
+                    android:propertyName="rotation"
+                    android:startOffset="0"
+                    android:valueFrom="10"
+                    android:valueTo="10"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="367"
+                    android:propertyName="rotation"
+                    android:startOffset="33"
+                    android:valueFrom="10"
+                    android:valueTo="-180"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="rotation"
+                    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.8,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="417"
+                    android:propertyName="rotation"
+                    android:startOffset="17"
+                    android:valueFrom="0"
+                    android:valueTo="-180"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    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 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    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 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleX"
+                    android:startOffset="117"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleY"
+                    android:startOffset="117"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="rotation"
+                    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.8,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="417"
+                    android:propertyName="rotation"
+                    android:startOffset="17"
+                    android:valueFrom="0"
+                    android:valueTo="-180"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    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 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    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 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleX"
+                    android:startOffset="117"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleY"
+                    android:startOffset="117"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c1,0 0.6,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/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml
new file mode 100644
index 0000000..f682f87
--- /dev/null
+++ b/packages/SystemUI/res/drawable/fingerprint_dialog_fp_to_error.xml
@@ -0,0 +1,854 @@
+<?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
+  -->
+
+<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:viewportHeight="24"
+            android:viewportWidth="24">
+            <group android:name="_R_G">
+                <group
+                    android:name="_R_G_L_3_G"
+                    android:pivotX="-33"
+                    android:pivotY="-34"
+                    android:rotation="0"
+                    android:scaleX="0.738"
+                    android:scaleY="0.738"
+                    android:translateX="45"
+                    android:translateY="46.4">
+                    <path
+                        android:name="_R_G_L_3_G_D_0_P_0"
+                        android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_3_G_D_1_P_0"
+                        android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_3_G_D_2_P_0"
+                        android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_3_G_D_3_P_0"
+                        android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_3_G_D_4_P_0"
+                        android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_fingerprint_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                </group>
+                <group
+                    android:name="_R_G_L_2_G"
+                    android:pivotX="-33"
+                    android:pivotY="-34"
+                    android:rotation="0"
+                    android:scaleX="0.738"
+                    android:scaleY="0.738"
+                    android:translateX="45"
+                    android:translateY="46.4">
+                    <path
+                        android:name="_R_G_L_2_G_D_0_P_0"
+                        android:pathData=" M-25.36 -24.41 C-25.93,-24.31 -26.49,-24.27 -26.81,-24.27 C-28.11,-24.27 -29.35,-24.62 -30.43,-25.4 C-32.11,-26.6 -33.2,-28.57 -33.2,-30.79 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_2_G_D_1_P_0"
+                        android:pathData=" M-36.14 -21.78 C-37.15,-22.98 -37.72,-23.7 -38.51,-25.29 C-39.33,-26.94 -39.82,-28.78 -39.82,-30.77 C-39.82,-34.43 -36.85,-37.4 -33.19,-37.4 C-29.52,-37.4 -26.55,-34.43 -26.55,-30.77 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_2_G_D_2_P_0"
+                        android:pathData=" M-42.19 -25.68 C-42.95,-27.82 -43.09,-29.54 -43.09,-30.8 C-43.09,-32.27 -42.84,-33.65 -42.27,-34.9 C-40.71,-38.35 -37.24,-40.75 -33.2,-40.75 C-27.71,-40.75 -23.26,-36.3 -23.26,-30.8 C-23.26,-28.97 -24.74,-27.49 -26.57,-27.49 C-28.4,-27.49 -29.89,-28.97 -29.89,-30.8 C-29.89,-32.64 -31.37,-34.12 -33.2,-34.12 C-35.04,-34.12 -36.52,-32.64 -36.52,-30.8 C-36.52,-28.23 -35.53,-25.92 -33.92,-24.22 C-32.69,-22.93 -31.48,-22.12 -29.44,-21.53 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                    <path
+                        android:name="_R_G_L_2_G_D_3_P_0"
+                        android:pathData=" M-44.06 -38.17 C-42.87,-39.94 -41.39,-41.41 -39.51,-42.44 C-37.62,-43.47 -35.46,-44.05 -33.16,-44.05 C-30.88,-44.05 -28.72,-43.47 -26.85,-42.45 C-24.97,-41.43 -23.48,-39.97 -22.29,-38.21 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="1" />
+                    <path
+                        android:name="_R_G_L_2_G_D_4_P_0"
+                        android:pathData=" M-25.72 -45.45 C-27.99,-46.76 -30.43,-47.52 -33.28,-47.52 C-36.13,-47.52 -38.51,-46.74 -40.62,-45.45 "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="1.45"
+                        android:trimPathEnd="0"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="0" />
+                </group>
+                <group
+                    android:name="_R_G_L_1_G"
+                    android:rotation="190"
+                    android:translateX="12"
+                    android:translateY="12">
+                    <path
+                        android:name="_R_G_L_1_G_D_0_P_0"
+                        android:pathData=" M0 -9 C4.97,-9 9,-4.97 9,0 C9,4.97 4.97,9 0,9 C-4.97,9 -9,4.97 -9,0 C-9,-4.97 -4.97,-9 0,-9c "
+                        android:strokeAlpha="1"
+                        android:strokeColor="@color/fingerprint_dialog_error_color"
+                        android:strokeLineCap="round"
+                        android:strokeLineJoin="round"
+                        android:strokeWidth="2"
+                        android:trimPathEnd="1"
+                        android:trimPathOffset="0"
+                        android:trimPathStart="1" />
+                </group>
+                <group
+                    android:name="_R_G_L_0_G"
+                    android:translateX="12"
+                    android:translateY="12">
+                    <group
+                        android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0"
+                        android:pivotY="-0.012"
+                        android:rotation="184"
+                        android:scaleX="0"
+                        android:scaleY="0">
+                        <path
+                            android:name="_R_G_L_0_G_D_0_P_0"
+                            android:fillAlpha="1"
+                            android:fillColor="@color/fingerprint_dialog_error_color"
+                            android:fillType="nonZero"
+                            android:pathData=" M1.1 3.94 C1.1,4.55 0.61,5.04 0,5.04 C-0.61,5.04 -1.1,4.55 -1.1,3.94 C-1.1,3.33 -0.61,2.84 0,2.84 C0.61,2.84 1.1,3.33 1.1,3.94c " />
+                    </group>
+                    <group
+                        android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0"
+                        android:pivotY="-0.012"
+                        android:rotation="184"
+                        android:scaleX="0"
+                        android:scaleY="0">
+                        <path
+                            android:name="_R_G_L_0_G_D_0_P_1"
+                            android:fillAlpha="1"
+                            android:fillColor="@color/fingerprint_dialog_error_color"
+                            android:fillType="nonZero"
+                            android:pathData=" M1 -4.06 C1,-4.06 1,-0.06 1,-0.06 C1,0.49 0.55,0.94 0,0.94 C-0.55,0.94 -1,0.49 -1,-0.06 C-1,-0.06 -1,-4.06 -1,-4.06 C-1,-4.61 -0.55,-5.06 0,-5.06 C0.55,-5.06 1,-4.61 1,-4.06c " />
+                    </group>
+                </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="150"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="0"
+                    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_3_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="33"
+                    android:propertyName="trimPathStart"
+                    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="150"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="33"
+                    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_3_G_D_2_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="trimPathStart"
+                    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="217"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="17"
+                    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_3_G_D_3_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="1"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="17"
+                    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_3_G_D_4_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="17"
+                    android:propertyName="trimPathStart"
+                    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="67"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="17"
+                    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_3_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="rotation"
+                    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.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="567"
+                    android:propertyName="rotation"
+                    android:startOffset="100"
+                    android:valueFrom="0"
+                    android:valueTo="-305"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 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="150"
+                    android:propertyName="trimPathStart"
+                    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.8,0 0.5,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="167"
+                    android:propertyName="trimPathStart"
+                    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.8,0 0.5,1 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="167"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    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_2_G_D_1_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="trimPathStart"
+                    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.8,0 0.5,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="133"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 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="17"
+                    android:propertyName="trimPathEnd"
+                    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.4,0 0.2,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="217"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="17"
+                    android:valueFrom="0"
+                    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_2_G_D_2_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="trimPathStart"
+                    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 0.833,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="200"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="133"
+                    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 0.833,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_2_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="250"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    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 0.833,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_3_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="167"
+                    android:propertyName="trimPathStart"
+                    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.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_3_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="trimPathEnd"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="117"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="117"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_4_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="trimPathStart"
+                    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.8,0 0.5,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="100"
+                    android:valueFrom="0"
+                    android:valueTo="1"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.8,0 0.5,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_2_G_D_4_P_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="133"
+                    android:propertyName="trimPathEnd"
+                    android:startOffset="0"
+                    android:valueFrom="0"
+                    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_2_G">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="100"
+                    android:propertyName="rotation"
+                    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.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="567"
+                    android:propertyName="rotation"
+                    android:startOffset="100"
+                    android:valueFrom="0"
+                    android:valueTo="-305"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,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="167"
+                    android:propertyName="trimPathStart"
+                    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="533"
+                    android:propertyName="trimPathStart"
+                    android:startOffset="167"
+                    android:valueFrom="1"
+                    android:valueTo="0"
+                    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">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="150"
+                    android:propertyName="rotation"
+                    android:startOffset="0"
+                    android:valueFrom="190"
+                    android:valueTo="190"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="550"
+                    android:propertyName="rotation"
+                    android:startOffset="150"
+                    android:valueFrom="190"
+                    android:valueTo="-6"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="rotation"
+                    android:startOffset="0"
+                    android:valueFrom="184"
+                    android:valueTo="184"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="rotation"
+                    android:startOffset="283"
+                    android:valueFrom="184"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleX"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleY"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleX"
+                    android:startOffset="283"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleY"
+                    android:startOffset="283"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="rotation"
+                    android:startOffset="0"
+                    android:valueFrom="184"
+                    android:valueTo="184"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="rotation"
+                    android:startOffset="283"
+                    android:valueFrom="184"
+                    android:valueTo="0"
+                    android:valueType="floatType">
+                    <aapt:attr name="android:interpolator">
+                        <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+            </set>
+        </aapt:attr>
+    </target>
+    <target android:name="_R_G_L_0_G_D_0_P_1_G_0_T_0">
+        <aapt:attr name="android:animation">
+            <set android:ordering="together">
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleX"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="283"
+                    android:propertyName="scaleY"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleX"
+                    android:startOffset="283"
+                    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.6,1 1.0,1.0" />
+                    </aapt:attr>
+                </objectAnimator>
+                <objectAnimator
+                    android:duration="317"
+                    android:propertyName="scaleY"
+                    android:startOffset="283"
+                    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.6,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/SystemUI/res/drawable/ic_account_circle.xml b/packages/SystemUI/res/drawable/ic_account_circle.xml
deleted file mode 100644
index 3c5f01b..0000000
--- a/packages/SystemUI/res/drawable/ic_account_circle.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="48.0dp"
-        android:height="48.0dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-    <path
-        android:pathData="M24,0C10.8,0 0,10.8 0,24s10.8,24 24,24s24,-10.8 24,-24S37.200001,0 24,0zM24,7.2c3.96,0 7.2,3.24 7.2,7.2s-3.24,7.2 -7.2,7.2s-7.2,-3.24 -7.2,-7.2S20.040001,7.2 24,7.2zM24,41.279999c-6,0 -11.28,-3.12 -14.4,-7.68c0.12,-4.8 9.6,-7.44 14.4,-7.44s14.28,2.64 14.4,7.44C35.279999,38.16 30,41.279999 24,41.279999z"
-        android:fillColor="?attr/wallpaperTextColor"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
index 8281836..6f3da75 100644
--- a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
+++ b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
@@ -18,10 +18,12 @@
         android:height="24dp"
         android:viewportWidth="24.0"
         android:viewportHeight="24.0">
+
     <path
-        android:pathData="m18.250000,12.000000a6.250000,6.250000 0.000000,1.000000 1.000000,-12.500000 0.000000,6.250000 6.250000,0.000000 1.000000,1.000000 12.500000,0.000000z"
-        android:fillColor="@android:color/transparent" />
+        android:pathData="M18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48z"
+        android:fillColor="?android:attr/colorPrimary" />
+
     <path
-        android:pathData="M20,8.69L20,5c0,-0.55 -0.45,-1 -1,-1h-3.69l-2.6,-2.6a0.996,0.996 0,0 0,-1.41 0L8.69,4L5,4c-0.55,0 -1,0.45 -1,1v3.69l-2.6,2.6a0.996,0.996 0,0 0,0 1.41L4,15.3L4,19c0,0.55 0.45,1 1,1h3.69l2.6,2.6c0.39,0.39 1.02,0.39 1.41,0l2.6,-2.6L19,20c0.55,0 1,-0.45 1,-1v-3.69l2.6,-2.6a0.996,0.996 0,0 0,0 -1.41L20,8.69zM12,18.08c-3.36,0 -6.08,-2.73 -6.08,-6.08S8.64,5.92 12,5.92s6.08,2.73 6.08,6.08 -2.72,6.08 -6.08,6.08zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"
+        android:pathData=" M20,8.69 V4h-4.69L12,0.69L8.69,4H4v4.69L0.69,12L4,15.31V20h4.69L12,23.31L15.31,20H20v-4.69L23.31,12L20,8.69z M18,14.48V18h-3.52L12,20.48L9.52,18H6v-3.52L3.52,12L6,9.52V6h3.52L12,3.52L14.48,6H18v3.52L20.48,12L18,14.48z M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5S14.76,7 12,7z"
         android:fillColor="?android:attr/colorControlActivated" />
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_signal_airplane.xml b/packages/SystemUI/res/drawable/ic_signal_airplane.xml
index 50dd436..0a4d752 100644
--- a/packages/SystemUI/res/drawable/ic_signal_airplane.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_airplane.xml
@@ -20,11 +20,11 @@
     android:viewportWidth="20.5"
     android:viewportHeight="20.5">
     <group
-        android:translateX="0.985"
-        android:translateY="1.10">
+        android:translateX="1.75"
+        android:translateY="1.4">
         <path
             android:pathData="M16.01,9.87l-6.24,-3.9v-4.7C9.77,0.57 9.21,0 8.5,0S7.23,0.57 7.23,1.28v4.7L0.99,9.88c-0.37,0.23 -0.6,0.64 -0.6,1.08v0.41c0,0.29 0.29,0.5 0.55,0.41l6.27,-1.97v4.7l-1.37,1.02c-0.21,0.16 -0.34,0.41 -0.34,0.68v0.57c0,0.15 0.12,0.23 0.27,0.2 1.67,-0.47 1.12,-0.31 2.73,-0.78 1.03,0.3 1.7,0.49 2.72,0.78 0.15,0.03 0.27,-0.06 0.27,-0.2v-0.57c0,-0.27 -0.13,-0.52 -0.34,-0.68l-1.37,-1.02v-4.7l6.27,1.97c0.28,0.09 0.55,-0.12 0.55,-0.41v-0.41c0.01,-0.45 -0.23,-0.87 -0.59,-1.09z"
-            android:fillColor="#FF0"/>
+            android:fillColor="#FFF"/>
     </group>
 </vector>
 
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
new file mode 100644
index 0000000..1603eba
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_sysbar_accessibility_button.xml
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<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="M20.5,6c-2.61,0.7 -5.67,1 -8.5,1S6.11,6.7 3.5,6L3,8c1.86,0.5 4,0.83 6,1v13h2v-6h2v6h2V9c2,-0.17 4.14,-0.5 6,-1L20.5,6zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"
+        android:fillColor="?attr/singleToneColor"/>
+</vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/rounded_ripple.xml b/packages/SystemUI/res/drawable/rounded_ripple.xml
index 5588eb2..d9ed823 100644
--- a/packages/SystemUI/res/drawable/rounded_ripple.xml
+++ b/packages/SystemUI/res/drawable/rounded_ripple.xml
@@ -23,7 +23,7 @@
     </item>
     <item android:id="@android:id/background">
         <shape android:shape="rectangle">
-            <solid android:color="#FFFFFFFF"/>
+            <solid android:color="?android:attr/colorBackgroundFloating"/>
             <corners android:radius="8dp"/>
         </shape>
     </item>
diff --git a/packages/SystemUI/res/drawable/stat_sys_ethernet.xml b/packages/SystemUI/res/drawable/stat_sys_ethernet.xml
index e765320..babaa9f 100644
--- a/packages/SystemUI/res/drawable/stat_sys_ethernet.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_ethernet.xml
@@ -20,11 +20,11 @@
         android:viewportWidth="53.0"
         android:viewportHeight="48.0">
     <path
-        android:fillColor="?attr/singleToneColor"
+        android:fillColor="#FFF"
         android:pathData="M15.54 13.52l-3.08-2.55L1.64 24l10.82 13.04 3.08-2.55L6.84 24l8.7-10.48zM14 26h4v-4h-4v4zm20-4h-4v4h4v-4zm-12 4h4v-4h-4v4zm13.54-15.04l-3.08 2.55L41.16 24l-8.7 10.48 3.08 2.55L46.36 24 35.54 10.96z"/>
     <path
-        android:fillColor="?attr/singleToneColor"
+        android:fillColor="#FFF"
         android:pathData="M49.000000,40.000000l4.000000,0.000000l0.000000,4.000000l-4.000000,0.000000z"/>
     <path
-        android:fillColor="?attr/singleToneColor"
+        android:fillColor="#FFF"
         android:pathData="M49.000000,20.000000l4.000000,0.000000l0.000000,16.100000l-4.000000,0.000000z"/></vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_ethernet_fully.xml b/packages/SystemUI/res/drawable/stat_sys_ethernet_fully.xml
index b7b154c..08a9993 100644
--- a/packages/SystemUI/res/drawable/stat_sys_ethernet_fully.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_ethernet_fully.xml
@@ -19,6 +19,6 @@
         android:viewportWidth="53.0"
         android:viewportHeight="48.0">
     <path
-        android:fillColor="?attr/singleToneColor"
+        android:fillColor="#FFF"
         android:pathData="M15.54 13.52l-3.08-2.55L1.64 24l10.82 13.04 3.08-2.55L6.84 24l8.7-10.48zM14 26h4v-4h-4v4zm20-4h-4v4h4v-4zm-12 4h4v-4h-4v4zm13.54-15.04l-3.08 2.55L41.16 24l-8.7 10.48 3.08 2.55L46.36 24 35.54 10.96z"/>
 </vector>
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
index 6f153c1..78304fd 100644
--- a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
@@ -41,16 +41,4 @@
 
     </FrameLayout>
 
-    <com.android.systemui.statusbar.policy.DeadZone
-        android:id="@+id/deadzone"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:layout_gravity="top"
-        systemui:minSize="@dimen/navigation_bar_deadzone_size"
-        systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
-        systemui:holdTime="@integer/navigation_bar_deadzone_hold"
-        systemui:decayTime="@integer/navigation_bar_deadzone_decay"
-        systemui:orientation="horizontal"
-        />
-
 </FrameLayout>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
index 0ee40d7..67f68d3 100644
--- a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
+++ b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml
@@ -15,40 +15,32 @@
      limitations under the License.
 -->
 
+
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:clipChildren="false"
     android:alpha="0"
-    android:layout_width="wrap_content"
-    android:layout_height="@dimen/car_fullscreen_user_pod_height"
-    android:layout_gravity="center_horizontal|bottom" >
+    android:layout_height="wrap_content"
+    android:layout_width="match_parent"
+    android:gravity="fill_horizontal"
+    android:layout_marginTop="@dimen/car_padding_5"
+    android:layout_marginStart="@dimen/car_padding_4">
 
     <ImageView android:id="@+id/user_avatar"
         android:layout_centerHorizontal="true"
-        android:layout_marginTop="@dimen/car_fullscreen_user_pod_margin_image_top"
         android:layout_width="@dimen/car_fullscreen_user_pod_image_avatar_width"
         android:layout_height="@dimen/car_fullscreen_user_pod_image_avatar_height"
-        android:layout_above="@id/user_name" />
+        />
 
     <TextView android:id="@+id/user_name"
-        android:layout_width="@dimen/car_fullscreen_user_pod_width"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/car_fullscreen_user_pod_margin_name_top"
-        android:layout_marginBottom="@dimen/car_fullscreen_user_pod_margin_name_bottom"
-        android:textSize="@dimen/car_fullscreen_user_pod_name_text_size"
+        android:layout_marginTop="@dimen/car_padding_4"
+        android:textSize="@dimen/car_body1_size"
         android:textColor="@color/qs_user_detail_name"
         android:ellipsize="end"
         android:singleLine="true"
-        android:gravity="center_horizontal"
-        android:layout_above="@id/device_name" />
+        android:gravity="center"
+        android:layout_below="@id/user_avatar"/>
 
-    <TextView android:id="@+id/device_name"
-        android:layout_width="@dimen/car_fullscreen_user_pod_width"
-        android:layout_height="wrap_content"
-        android:textSize="@dimen/car_fullscreen_user_pod_device_text_size"
-        android:textColor="@color/qs_user_detail_name"
-        android:ellipsize="end"
-        android:singleLine="true"
-        android:gravity="center_horizontal"
-        android:layout_alignParentBottom="true" />
 </RelativeLayout>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml b/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml
deleted file mode 100644
index d666a20..0000000
--- a/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:clipChildren="false"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="center" >
-
-    <!-- car_fullscreen_user_pods will be dynamically added here. -->
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
index bfabe52..22452b7 100644
--- a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
@@ -39,27 +39,34 @@
             android:theme="@android:style/Theme"
             android:layout_alignParentTop="true"/>
 
-        <com.android.systemui.statusbar.car.UserGridView
-            android:id="@+id/user_grid"
+        <RelativeLayout
+            android:id="@+id/fullscreen_user_switcher_container"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="@dimen/car_margin"
-            android:layout_marginRight="@dimen/car_margin"
-            android:layout_centerInParent="true"/>
+            android:layout_height="match_parent"
+            android:layout_marginStart="@dimen/car_margin"
+            android:layout_marginEnd="@dimen/car_margin">
 
-        <com.android.systemui.statusbar.car.PageIndicator
-            android:id="@+id/user_switcher_page_indicator"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/car_page_indicator_dot_diameter"
-            android:layout_below="@+id/user_grid" />
+            <RelativeLayout
+                android:id="@+id/fullscreen_user_switcher_container_inner"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_marginEnd="@dimen/car_padding_4">
 
-        <Button
-            android:id="@+id/start_driving"
-            android:layout_width="wrap_content"
-            android:layout_height="@dimen/car_start_driving_height"
-            android:text="@string/start_driving"
-            style="@style/CarUserSwitcher.StartDrivingButton"
-            android:layout_alignParentBottom="true"
-            android:layout_centerHorizontal="true" />
+                <com.android.systemui.statusbar.car.UserGridRecyclerView
+                    android:id="@+id/user_grid"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@+id/header"
+                    android:scrollbars="vertical"
+                    android:scrollbarFadeDuration="0"
+                    android:verticalScrollbarPosition="left"
+                    android:layout_centerHorizontal="true"
+                    android:layout_centerVertical="true"
+                    android:layout_alignParentRight="true"/>
+
+            </RelativeLayout>
+
+        </RelativeLayout>
+
     </RelativeLayout>
 </FrameLayout>
diff --git a/packages/SystemUI/res/layout/car_left_navigation_bar.xml b/packages/SystemUI/res/layout/car_left_navigation_bar.xml
index 18301a8..02be457 100644
--- a/packages/SystemUI/res/layout/car_left_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_left_navigation_bar.xml
@@ -40,7 +40,7 @@
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingTop="30dp"
diff --git a/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
index a65ff16..708f595 100644
--- a/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
+++ b/packages/SystemUI/res/layout/car_left_navigation_bar_unprovisioned.xml
@@ -40,7 +40,7 @@
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingTop="30dp"
diff --git a/packages/SystemUI/res/layout/car_navigation_bar.xml b/packages/SystemUI/res/layout/car_navigation_bar.xml
index 9ff16a2..d568d0d 100644
--- a/packages/SystemUI/res/layout/car_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_navigation_bar.xml
@@ -38,7 +38,7 @@
             android:id="@+id/home"
             android:layout_height="match_parent"
             android:layout_width="wrap_content"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingLeft="30dp"
diff --git a/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml
index b0488ae..4ba6c06 100644
--- a/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml
+++ b/packages/SystemUI/res/layout/car_navigation_bar_unprovisioned.xml
@@ -38,7 +38,7 @@
             android:id="@+id/home"
             android:layout_height="match_parent"
             android:layout_width="wrap_content"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingLeft="30dp"
diff --git a/packages/SystemUI/res/layout/car_qs_panel.xml b/packages/SystemUI/res/layout/car_qs_panel.xml
index 447970c..c01bbce 100644
--- a/packages/SystemUI/res/layout/car_qs_panel.xml
+++ b/packages/SystemUI/res/layout/car_qs_panel.xml
@@ -30,27 +30,29 @@
     <RelativeLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/user_switcher_container"
+        android:layout_marginStart="@dimen/car_margin"
+        android:layout_marginEnd="@dimen/car_margin"
         android:clipChildren="false"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/car_user_switcher_container_height"
-        android:layout_gravity="center_horizontal" >
+        android:layout_height="@dimen/car_user_switcher_container_height">
 
-        <com.android.systemui.statusbar.car.UserGridView
-            android:id="@+id/user_grid"
-            android:clipChildren="false"
+        <RelativeLayout
+            android:id="@+id/fullscreen_user_switcher_container_inner"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="@dimen/car_margin"
-            android:layout_marginRight="@dimen/car_margin"
-            android:layout_above="@id/user_switcher_page_indicator" />
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/car_padding_4">
 
-        <com.android.systemui.statusbar.car.PageIndicator
-            android:id="@+id/user_switcher_page_indicator"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/car_page_indicator_dot_diameter"
-            android:layout_marginBottom="@dimen/car_page_indicator_margin_bottom"
-            android:alpha="0"
-            android:layout_alignParentBottom="true" />
+            <com.android.systemui.statusbar.car.UserGridRecyclerView
+                android:id="@+id/user_grid"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:scrollbars="vertical"
+                android:verticalScrollbarPosition="left"
+                android:layout_centerHorizontal="true"
+                android:layout_centerVertical="true"
+                android:layout_alignParentRight="true"
+                android:scrollbarFadeDuration="0"/>
+        </RelativeLayout>
 
     </RelativeLayout>
 
diff --git a/packages/SystemUI/res/layout/car_right_navigation_bar.xml b/packages/SystemUI/res/layout/car_right_navigation_bar.xml
index 99bd23c..91ba026 100644
--- a/packages/SystemUI/res/layout/car_right_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_right_navigation_bar.xml
@@ -40,7 +40,7 @@
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingTop="30dp"
diff --git a/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml b/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
index a65ff16..708f595 100644
--- a/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
+++ b/packages/SystemUI/res/layout/car_right_navigation_bar_unprovisioned.xml
@@ -40,7 +40,7 @@
             android:id="@+id/home"
             android:layout_height="wrap_content"
             android:layout_width="match_parent"
-            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;end"
+            systemui:intent="intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;end"
             android:src="@drawable/car_ic_overview"
             android:background="?android:attr/selectableItemBackground"
             android:paddingTop="30dp"
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index 3e60794..d72021e 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -27,35 +27,28 @@
     <com.android.systemui.statusbar.phone.NearestTouchFrame
         android:id="@+id/nav_buttons"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:clipChildren="false"
+        android:clipToPadding="false">
 
         <LinearLayout
             android:id="@+id/ends_group"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:orientation="horizontal"
+            android:clipToPadding="false"
             android:clipChildren="false" />
 
         <LinearLayout
             android:id="@+id/center_group"
-            android:layout_width="match_parent"
+            android:layout_width="wrap_content"
             android:layout_height="match_parent"
+            android:layout_gravity="center"
             android:gravity="center"
             android:orientation="horizontal"
+            android:clipToPadding="false"
             android:clipChildren="false" />
 
     </com.android.systemui.statusbar.phone.NearestTouchFrame>
 
-    <com.android.systemui.statusbar.policy.DeadZone
-        android:id="@+id/deadzone"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:layout_gravity="top"
-        systemui:minSize="@dimen/navigation_bar_deadzone_size"
-        systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
-        systemui:holdTime="@integer/navigation_bar_deadzone_hold"
-        systemui:decayTime="@integer/navigation_bar_deadzone_decay"
-        systemui:orientation="horizontal"
-        />
-
 </FrameLayout>
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 39cdff4..0e17e5b5 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -46,16 +46,4 @@
 
     </com.android.systemui.statusbar.phone.NearestTouchFrame>
 
-    <com.android.systemui.statusbar.policy.DeadZone
-        android:id="@+id/deadzone"
-        android:layout_height="match_parent"
-        android:layout_width="match_parent"
-        android:layout_gravity="top"
-        systemui:minSize="@dimen/navigation_bar_deadzone_size"
-        systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
-        systemui:holdTime="@integer/navigation_bar_deadzone_hold"
-        systemui:decayTime="@integer/navigation_bar_deadzone_decay"
-        systemui:orientation="vertical"
-        />
-
 </FrameLayout>
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 72ff653..8c57ae8 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -57,6 +57,8 @@
         android:layout_marginBottom="@dimen/qs_footer_height"
         android:elevation="4dp"
         android:background="@android:color/transparent"
+        android:focusable="true"
+        android:accessibilityTraversalBefore="@id/qs_carrier_text"
     />
 
     <include layout="@layout/quick_status_bar_expanded_header" />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
index f38129f..388b633 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml
@@ -31,25 +31,23 @@
 
     <com.android.systemui.statusbar.policy.Clock
         android:id="@+id/clock"
-        android:textAppearance="@style/TextAppearance.StatusBar.Clock"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
-        android:singleLine="true"
+        android:gravity="center_vertical|start"
         android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
         android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
-        android:gravity="center_vertical|start"
-        systemui:showDark="false"
-    />
+        android:singleLine="true"
+        android:textAppearance="@style/TextAppearance.StatusBar.Clock"
+        systemui:showDark="false" />
 
     <com.android.systemui.statusbar.policy.DateView
         android:id="@+id/date"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:padding="4dp"
+        android:gravity="center_vertical"
         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" />
 
     <android.widget.Space
@@ -57,12 +55,11 @@
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1"
-        android:gravity="center_vertical|center_horizontal"
-    />
+        android:gravity="center_vertical|center_horizontal" />
 
-    <com.android.systemui.BatteryMeterView android:id="@+id/battery"
+    <com.android.systemui.BatteryMeterView
+        android:id="@+id/battery"
         android:layout_height="match_parent"
         android:layout_width="wrap_content"
-        android:gravity="center_vertical|end"
-        />
+        android:gravity="center_vertical|end" />
 </LinearLayout>
diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml
index e4ea08e..b5d48b4 100644
--- a/packages/SystemUI/res/layout/remote_input.xml
+++ b/packages/SystemUI/res/layout/remote_input.xml
@@ -51,12 +51,10 @@
 
         <ImageButton
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
+                android:layout_height="match_parent"
                 android:layout_gravity="center"
                 android:paddingStart="12dp"
                 android:paddingEnd="24dp"
-                android:paddingTop="16dp"
-                android:paddingBottom="16dp"
                 android:id="@+id/remote_input_send"
                 android:src="@drawable/ic_send"
                 android:contentDescription="@*android:string/ime_action_send"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
index 37a1a90..367c13c 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
@@ -59,7 +59,6 @@
             android:src="@drawable/screen_pinning_bg_circ" />
 
         <ImageView
-            android:id="@+id/screen_pinning_back_icon"
             android:layout_height="match_parent"
             android:layout_width="match_parent"
             android:scaleType="center"
@@ -141,6 +140,7 @@
             android:src="@drawable/screen_pinning_bg_circ" />
 
         <ImageView
+            android:id="@+id/screen_pinning_back_icon"
             android:layout_height="match_parent"
             android:layout_width="match_parent"
             android:scaleType="center"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 9d336e2..f0138a6 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -60,7 +60,11 @@
 
             <include layout="@layout/heads_up_status_bar_layout" />
 
+            <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the
+             individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and
+             DISABLE_NOTIFICATION_ICONS, respectively -->
             <LinearLayout
+                android:id="@+id/status_bar_left_side"
                 android:layout_height="match_parent"
                 android:layout_width="match_parent"
                 android:clipChildren="false"
@@ -76,8 +80,6 @@
                     android:gravity="center_vertical|start"
                 />
 
-                <!-- The alpha of this area is controlled from both PhoneStatusBarTransitions and
-                     PhoneStatusBar (DISABLE_NOTIFICATION_ICONS). -->
                 <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
                     android:id="@+id/notification_icon_area"
                     android:layout_width="0dp"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 792b642..a3462512 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Lui"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreer"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Demp"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om te ontdemp."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om op vibreer te stel. Toeganklikheidsdienste kan dalk gedemp wees."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index c3006889..e02de5b 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ጄáˆȘ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ንዘር"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ዔምጞ-ኹል አዔርግ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s፱ ዔምጞ-ኹል ለማዔሚግ መታ ያዔርጉ"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s፱ ወደ ንዝሚቔ ለማቀናበር መታ á‹«á‹”áˆ­áŒ‰áą ዚተደራሜነቔ አገልግሎቶቜ ዔምጞ-ኹል ሊደሹግባቾው á‹­á‰œáˆ‹áˆáą"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s፱ ዔምጞ-ኹል ለማዔሚግ መታ á‹«á‹”áˆ­áŒ‰áą ዚተደራሜነቔ አገልግሎቶቜ ዔምጞ-ኹል ሊደሹግባቾው á‹­á‰œáˆ‹áˆáą"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index fbbe502..567a7dd 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -543,6 +543,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ۧ۳ŰȘ۔ۯۧ۱ Ű±Ù†ÙŠÙ†"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Ű§Ù‡ŰȘŰČۧŰČ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"كŰȘم Ű§Ù„Ű”ÙˆŰȘ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"‏%1$s. Ű§Ù†Ù‚Ű± Ù„Ű„Ù„Űșۧۥ Ű§Ù„ŰȘŰŹŰ§Ù‡Ù„."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"‏%1$s. Ű§Ù†Ù‚Ű± للŰȘŰčيين Űčلى Ű§Ù„Ű§Ù‡ŰȘŰČۧŰČ. Ù‚ŰŻ يŰȘم ŰȘŰŹŰ§Ù‡Ù„ ŰźŰŻÙ…Ű§ŰȘ Ű„Ù…ÙƒŰ§Ù†ÙŠŰ© Ű§Ù„ÙˆŰ”ÙˆÙ„."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"‏%1$s. Ű§Ù†Ù‚Ű± للŰȘŰŹŰ§Ù‡Ù„. Ù‚ŰŻ يŰȘم ŰȘŰŹŰ§Ù‡Ù„ ŰźŰŻÙ…Ű§ŰȘ Ű„Ù…ÙƒŰ§Ù†ÙŠŰ© Ű§Ù„ÙˆŰ”ÙˆÙ„."</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 39f9e09..c830f79 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠ›à§‡àŠ­ àŠ•à§°àŠż àŠ„àŠ•àŠŸ àŠčà§ˆàŠ›à§‡…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠ›à§‡àŠ­ àŠ•à§°àŠŸ àŠč\'àŠČ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠšàŠŸàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠ›à§‡àŠ­ àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠ—\'àŠČ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠ†àŠ•à§Œ àŠČ\'àŠŹàŠČৈ àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•à§°àŠ•"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àŠžàŠžà§àŠšàŠŻàŠŒàŠŸàŠ—àŠŸà§°àŠ€ àŠžà§€àŠźàŠżàŠ€ àŠ–àŠŸàŠČী àŠ àŠŸàŠ‡ àŠ„àŠ•àŠŸà§° àŠŹàŠŸàŠŹà§‡ àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠ›à§‡àŠ­ àŠ•à§°àŠżàŠŹ àŠȘà§°àŠŸ àŠšàŠ—\'àŠČ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àŠàŠȘàŠŸà§‹à§±à§‡ àŠŹàŠŸ àŠ†àŠȘà§‹àŠšàŠŸà§° àŠȘà§à§°àŠ€àŠżàŠ·à§àŠ àŠŸàŠšà§‡ àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸ àŠČ\'àŠŹàŠČৈ àŠ…àŠšà§àŠźàŠ€àŠż àŠšàŠżàŠŠàŠżàŠŻàŠŒà§‡"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"àŠ‡àŠ‰àŠàŠ›àŠŹàŠżà§°à§‡ àŠ«àŠŸàŠ‡àŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€à§°àŠŁà§° àŠŹàŠżàŠ•àŠČ্àŠȘàŠžàŠźà§‚àŠč"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"àŠžà§‚à§°à§àŠŻàŠŸàŠžà§àŠ€àŠ€ àŠ…àŠš àŠ•à§°àŠ•"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àŠžà§‚à§°à§àŠŻà§‹àŠŠàŠŻàŠŒà§° àŠČà§ˆàŠ•à§‡"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>àŠ€ àŠ…àŠš àŠ•à§°àŠ•"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> àŠȘà§°à§àŠŻàŠšà§àŠ€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC àŠšàŠżàŠ·à§àŠ•à§à§°àŠżàŠŻàŠŒ àŠčৈ àŠ†àŠ›à§‡"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC àŠžàŠ•à§àŠ·àŠź àŠčৈ àŠ†àŠ›à§‡"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"àŠ†àŠȘà§‹àŠšàŠŸà§° àŠžà§àŠ•à§à§°à§€àŠŁàŠ€ àŠȘà§à§°àŠŠà§°à§àŠ¶àŠš àŠčà§‹à§±àŠŸ àŠžàŠ•àŠČো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> àŠ•à§‡àŠȘàŠ¶à§àŠŹàŠŸà§° àŠ•à§°àŠŸ àŠ†à§°àŠźà§àŠ­ àŠ•à§°àŠżàŠŹà„€"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àŠȘà§àŠšà§°àŠŸàŠ‡ àŠšà§‡àŠŠà§‡àŠ–à§à§±àŠŸàŠŹ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àŠžàŠ•àŠČো àŠźàŠšàŠ•"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àŠœàŠšàŠŸàŠšà§€àŠžàŠźà§‚àŠč àŠȘà§°àŠżàŠšàŠŸàŠČàŠšàŠŸ àŠ•à§°àŠ•"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"àŠ…àŠžà§àŠŹàŠżàŠ§àŠŸ àŠšàŠżàŠŠàŠżàŠŹ àŠź\'àŠĄà§‡ àŠœàŠŸàŠšàŠšà§€àŠžàŠźà§‚àŠč àŠČà§àŠ•àŠŸàŠ‡ à§°àŠŸàŠ–àŠżàŠ›à§‡"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àŠàŠ€àŠżàŠŻàŠŒàŠŸàŠ‡ àŠ†à§°àŠźà§àŠ­ àŠ•à§°àŠ•"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àŠ•à§‹àŠšà§‹ àŠœàŠŸàŠšàŠšà§€ àŠšàŠŸàŠ‡"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àŠȘ্ৰ\'àŠ«àŠŸàŠ‡àŠČ àŠšàŠżà§°à§€àŠ•à§àŠ·àŠŁ àŠ•à§°àŠŸ àŠč\'àŠŹ àŠȘàŠŸà§°à§‡"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à§°àŠżàŠ‚"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àŠ•àŠźà§àŠȘàŠš"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àŠźàŠżàŠ‰àŠŸ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ àŠ†àŠšàŠźàŠżàŠ‰àŠŸ àŠ•à§°àŠżàŠŹà§° àŠŹàŠŸàŠŹà§‡ àŠŸàŠżàŠȘàŠ•à„€"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ àŠ•àŠźà§àŠȘàŠšà§° àŠŹàŠŸàŠŹà§‡ àŠŸàŠżàŠȘàŠ•à„€ àŠŠàŠżàŠŹà§àŠŻàŠŒàŠŸàŠ‚àŠ—àŠžàŠ•àŠČৰ àŠŹàŠŸàŠŹà§‡ àŠ„àŠ•àŠŸ àŠžà§‡à§±àŠŸ àŠźàŠżàŠ‰àŠŸ àŠčৈ àŠ„àŠŸàŠ•àŠżàŠŹ àŠȘàŠŸà§°à§‡à„€"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ àŠźàŠżàŠ‰àŠŸ àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•à„€ àŠŠàŠżàŠŹà§àŠŻàŠŒàŠŸàŠ‚àŠ—àŠžàŠ•àŠČৰ àŠŹàŠŸàŠŹà§‡ àŠ„àŠ•àŠŸ àŠžà§‡à§±àŠŸ àŠźàŠżàŠ‰àŠŸ àŠčৈ àŠ„àŠŸàŠ•àŠżàŠŹ àŠȘàŠŸà§°à§‡à„€"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àŠœàŠŸàŠšàŠšà§€à§° àŠšàŠżàŠŻàŠŒàŠšà§àŠ€à§à§°àŠŁàŠžàŠźà§‚àŠč"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àŠœàŠŸàŠšàŠšà§€àŠ• àŠžà§àŠšà§àŠœ àŠ•à§°àŠŸà§° àŠŹàŠżàŠ•àŠČ্àŠȘàŠžàŠźà§‚àŠč"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"àŠžà§àŠšà§àŠœ àŠ•à§°àŠ•"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àŠ†àŠšàŠĄà§ àŠ•à§°àŠ•"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ àŠŹàŠŸàŠŹà§‡ àŠžà§àŠšà§àŠœ àŠ•à§°àŠ•"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àŠžà§àŠ•à§à§°à§€àŠŁàŠ¶à§àŠŹàŠŸàŠžàŠźà§‚àŠč"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àŠžàŠŸàŠ§àŠŸà§°àŠŁ àŠŹàŠŸàŠ°à§àŠ€àŠŸàŠžàŠźà§‚àŠč"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àŠžàŠžà§àŠšàŠŻàŠŒàŠŸàŠ—àŠŸà§°"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àŠ‡àŠ‚àŠ—àŠżàŠ€àŠŹà§‹à§°"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àŠ€àŠŸà§ŽàŠ•à§àŠ·àŠŁàŠżàŠ• àŠàŠȘàŠžàŠźà§‚àŠč"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àŠ€àŠŸà§ŽàŠ•à§àŠ·àŠŁàŠżàŠ• àŠàŠȘàŠžàŠźà§‚àŠčàŠ• àŠ‡àŠšàŠ·à§àŠŸàŠČ àŠ•à§°àŠŸà§° àŠȘà§à§°àŠŻàŠŒà§‹àŠœàŠš àŠšàŠŸàŠ‡à„€"</string>
     <string name="app_info" msgid="6856026610594615344">"àŠàŠȘ্ àŠžàŠźà§àŠȘà§°à§àŠ•à§€àŠŻàŠŒ àŠ€àŠ„à§àŠŻ"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>àŠ• àŠŻàŠżàŠ•à§‹àŠšà§‹ àŠàŠȘৰ àŠ…àŠ‚àŠ¶ àŠŠà§‡àŠ–à§àŠ“à§±àŠŸàŠŹàŠČৈ àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠŻàŠŒàŠ•"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠŻàŠŒàŠ•"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àŠ…àŠžà§àŠŹà§€àŠ•àŠŸà§° àŠ•à§°àŠ•"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àŠŹà§‡àŠŸàŠŸà§°àŠż àŠžàŠžà§àŠšàŠŻàŠŒàŠ•àŠŸà§°à§€à§° àŠžàŠźàŠŻàŠŒàŠžà§‚àŠšà§€ àŠžàŠ•à§à§°àŠżàŠŻàŠŒ àŠ•à§°àŠżàŠŹàŠČৈ àŠŸàŠżàŠȘàŠ•"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àŠŹà§‡àŠŸàŠŸà§°àŠżà§° àŠšà§àŠšàŠŸà§°à§àŠœ àŠžà§àŠ€à§° <xliff:g id="PERCENTAGE">%d</xliff:g>%% àŠčàŠ“àŠàŠ€à§‡ àŠžà§àŠŹàŠŻàŠŒàŠ‚àŠ•à§à§°àŠżàŠŻàŠŒàŠ­àŠŸà§±à§‡ àŠ…àŠš àŠ•à§°àŠ•"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àŠšàŠŸàŠČàŠŸàŠ—à§‡, àŠ§àŠšà§àŠŻàŠŹàŠŸàŠŠ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àŠŹà§‡àŠŸàŠŸà§°àŠż àŠžàŠžà§àŠšàŠŻàŠŒàŠ•àŠŸà§°à§€à§° àŠžàŠźàŠŻàŠŒàŠžà§‚àŠšà§€ àŠ…àŠš àŠ•à§°àŠŸ àŠ…à§±àŠžà§àŠ„àŠŸàŠ€ àŠ†àŠ›à§‡"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àŠŹà§‡àŠŸàŠŸà§°àŠż àŠšà§àŠšàŠŸà§°à§àŠœà§° àŠžà§àŠ€à§° <xliff:g id="PERCENTAGE">%d</xliff:g>%%àŠ€àŠ•à§ˆ àŠ•àŠź àŠčà§‹à§±àŠŸà§° àŠČàŠ—à§‡ àŠČàŠ—à§‡ àŠŹà§‡àŠŸàŠŸà§°àŠż àŠžàŠžà§àŠšàŠŻàŠŒàŠ•àŠŸà§°à§€ àŠžà§àŠŹàŠŻàŠŒàŠ‚àŠ•à§à§°àŠżàŠŻàŠŒàŠ­àŠŸà§±à§‡ àŠ…àŠš àŠč’àŠŹà„€"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àŠ›à§‡àŠŸàŠżàŠ‚àŠŹà§‹à§°"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àŠŹà§àŠœàŠż àŠȘàŠŸàŠČà§‹àŠ"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 2f8e77c..39450db 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zəng"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrasiya"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Susdurun"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Səsli etmək üçün tıklayın."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Vibrasiyanı ayarlamaq üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiƟ ola bilər."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiƟ ola bilər."</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 4719a30..08d7a3f 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -534,6 +534,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Aktiviraj zvono"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriraj"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Isključi zvuk"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste podesili na vibraciju. Zvuk usluga pristupačnosti će moĆŸda biti isključen."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će moĆŸda biti isključen."</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index f7d748d..a1ce0db 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -76,10 +76,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ЗахаĐČĐ°ĐœĐœĐ” сĐșŃ€Ń‹ĐœŃˆĐŸŃ‚Đ°..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Đ—ĐŽŃ‹ĐŒĐ°Đș эĐșŃ€Đ°ĐœĐ° Đ·Đ°Ń…Đ°ĐČĐ°ĐœŃ‹"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб ĐżŃ€Đ°ĐłĐ»Đ”ĐŽĐ·Đ”Ń†ŃŒ Đ·ĐŽŃ‹ĐŒĐ°Đș эĐșŃ€Đ°ĐœĐ°"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ĐĐ” Đ°Ń‚Ń€Ń‹ĐŒĐ°Đ»Đ°ŃŃ Đ·Ń€Đ°Đ±Ń–Ń†ŃŒ Đ·ĐŽŃ‹ĐŒĐ°Đș эĐșŃ€Đ°ĐœĐ°"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ĐŸĐ°ŃĐżŃ€Đ°Đ±ŃƒĐčцД Đ·Ń€Đ°Đ±Ń–Ń†ŃŒ Đ·ĐŽŃ‹ĐŒĐ°Đș эĐșŃ€Đ°ĐœĐ° яшчэ раз"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ĐĐ”ĐŒĐ°ĐłŃ‡Ń‹ĐŒĐ° Đ·Đ°Ń…Đ°ĐČаць Đ·ĐŽŃ‹ĐŒĐ°Đș эĐșŃ€Đ°ĐœĐ°, Đ±ĐŸ ĐŒĐ°Đ»Đ° ĐŒĐ”ŃŃ†Đ° ў ŃŃ…ĐŸĐČішчы"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Đ Đ°Đ±Ń–Ń†ŃŒ Đ·ĐŽŃ‹ĐŒĐșі эĐșŃ€Đ°ĐœĐ° ĐœĐ” ĐŽĐ°Đ·ĐČĐ°Đ»ŃĐ” ĐżŃ€Đ°ĐłŃ€Đ°ĐŒĐ° ці ĐČаша Đ°Ń€ĐłĐ°ĐœŃ–Đ·Đ°Ń†Ń‹Ń"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"ĐŸĐ°Ń€Đ°ĐŒ. пДраЎачы фаĐčлаў па USB"</string>
@@ -356,8 +354,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ĐŁĐșĐ»ŃŽŃ‡Đ°Ń†ŃŒ уĐČДчары"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Да ŃžŃŃ…ĐŸĐŽŃƒ ŃĐŸĐœŃ†Đ°"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ĐŁĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ у <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Да <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC Đ°ĐŽĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC уĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹"</string>
@@ -441,9 +438,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> Đ°Ń‚Ń€Ń‹ĐŒĐ°Đ” ĐŽĐŸŃŃ‚ŃƒĐż ĐŽĐ° ŃžŃŃĐłĐŸ, ŃˆŃ‚ĐŸ Đ°ĐŽĐ»ŃŽŃŃ‚Ń€ĐŸŃžĐČаДцца ĐœĐ° ĐČĐ°ŃˆŃ‹ĐŒ эĐșŃ€Đ°ĐœĐ”."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ĐĐ” паĐșĐ°Đ·ĐČаць Đ·ĐœĐŸŃž"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Ачысціць усё"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ĐŁ Ń€ŃĐ¶Ń‹ĐŒĐ” «ĐĐ” Ń‚ŃƒŃ€Đ±Đ°ĐČаць» апаĐČŃŃˆŃ‡ŃĐœĐœŃ– ĐœĐ” паĐșĐ°Đ·ĐČаюцца"</string>
+    <string name="manage_notifications_text" msgid="8035284146227267681">"КіраĐČĐ°ĐœĐœĐ” апаĐČŃŃˆŃ‡ŃĐœĐœŃĐŒŃ–"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ĐŁ Ń€ŃĐ¶Ń‹ĐŒĐ” \"ĐĐ” Ń‚ŃƒŃ€Đ±Đ°ĐČаць\" апаĐČŃŃˆŃ‡ŃĐœĐœŃ– ĐœĐ” паĐșĐ°Đ·ĐČаюцца"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Пачаць зараз"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"АпаĐČŃŃˆŃ‡ŃĐœĐœŃŃž ĐœŃĐŒĐ°"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"За ĐżŃ€ĐŸŃ„Ń–Đ»Đ”ĐŒ ĐŒĐŸĐłŃƒŃ†ŃŒ ĐœĐ°Đ·Ń–Ń€Đ°Ń†ŃŒ"</string>
@@ -543,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ЗĐČĐ°ĐœĐŸĐș"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Đ’Ń–Đ±Ń€Đ°Ń†Ń‹Ń"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ГуĐș ĐČыĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб уĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ гуĐș."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб уĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ ĐČібрацыю. ĐœĐŸĐ¶Đ° Đ±Ń‹Ń†ŃŒ Đ°ĐŽĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹ гуĐș ŃĐ»ŃƒĐ¶Đ±Đ°Ńž ŃĐżĐ”Ń†Ń‹ŃĐ»ŃŒĐœŃ‹Ń… ĐŒĐ°ĐłŃ‡Ń‹ĐŒĐ°ŃŃ†Đ”Đč."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ДаĐșŃ€Đ°ĐœŃ–Ń†Đ”ŃŃ, Đșаб Đ°ĐŽĐșĐ»ŃŽŃ‡Ń‹Ń†ŃŒ гуĐș. ĐœĐŸĐ¶Đ° Đ±Ń‹Ń†ŃŒ Đ°ĐŽĐșĐ»ŃŽŃ‡Đ°ĐœŃ‹ гуĐș ŃĐ»ŃƒĐ¶Đ±Đ°Ńž ŃĐżĐ”Ń†Ń‹ŃĐ»ŃŒĐœŃ‹Ń… ĐŒĐ°ĐłŃ‡Ń‹ĐŒĐ°ŃŃ†Đ”Đč."</string>
@@ -641,8 +641,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"ĐșіраĐČĐ°ĐœĐœĐ” апаĐČŃŃˆŃ‡ŃĐœĐœŃĐŒŃ–"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"ĐżĐ°Ń€Đ°ĐŒĐ”Ń‚Ń€Ń‹ Đ°ĐŽĐșлаЎĐČĐ°ĐœĐœŃ апаĐČŃŃˆŃ‡ŃĐœĐœŃŃž"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"АЎĐșласці"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"АДРАБІЩЬ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"АЎĐșĐ»Đ°ĐŽĐ·Đ”ĐœĐ° ĐœĐ° <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2b3157d..550f5ff 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ĐŸĐŸĐ·ĐČŃŠĐœŃĐČĐ°ĐœĐ”"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Đ’ĐžĐ±Ń€ĐžŃ€Đ°ĐœĐ”"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"БДз Đ·ĐČуĐș"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Đ”ĐŸĐșĐŸŃĐœĐ”Ń‚Đ”, Đ·Đ° ĐŽĐ° ĐČĐșлючОтД ĐŸŃ‚ĐœĐŸĐČĐŸ Đ·ĐČуĐșĐ°."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Đ”ĐŸĐșĐŸŃĐœĐ”Ń‚Đ”, Đ·Đ° ĐŽĐ° заЎаЎДтД ĐČĐžĐ±Ń€ĐžŃ€Đ°ĐœĐ”. Đ’ŃŠĐ·ĐŒĐŸĐ¶ĐœĐŸ Đ” Đ·ĐČуĐșът ĐœĐ° ŃƒŃĐ»ŃƒĐłĐžŃ‚Đ” Đ·Đ° ĐŽĐŸŃŃ‚ŃŠĐżĐœĐŸŃŃ‚ ĐŽĐ° бъЎД Đ·Đ°ĐłĐ»ŃƒŃˆĐ”Đœ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Đ”ĐŸĐșĐŸŃĐœĐ”Ń‚Đ”, Đ·Đ° ĐŽĐ° Đ·Đ°ĐłĐ»ŃƒŃˆĐžŃ‚Đ” Đ·ĐČуĐșĐ°. Đ’ŃŠĐ·ĐŒĐŸĐ¶ĐœĐŸ Đ” Đ·ĐČуĐșът ĐœĐ° ŃƒŃĐ»ŃƒĐłĐžŃ‚Đ” Đ·Đ° ĐŽĐŸŃŃ‚ŃŠĐżĐœĐŸŃŃ‚ ĐŽĐ° бъЎД Đ·Đ°ĐłĐ»ŃƒŃˆĐ”Đœ."</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index c12e069..05d3148 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸ àŠžà§‡àŠ­ àŠ•àŠ°àŠŸ àŠčàŠšà§àŠ›à§‡..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸ àŠžà§‡àŠ­ àŠ•àŠ°àŠŸ àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸàŠŸàŠż àŠŠà§‡àŠ–àŠ€à§‡ àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸ àŠžà§‡àŠ­ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŻàŠŒàŠšàŠż"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àŠ†àŠŹàŠŸàŠ° àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠšà§‡àŠ·à§àŠŸàŠŸ àŠ•àŠ°à§àŠš"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àŠŹà§‡àŠ¶àŠż àŠœàŠŸàŠŻàŠŒàŠ—àŠŸ àŠšà§‡àŠ‡ àŠ€àŠŸàŠ‡ àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸàŠŸàŠż àŠžà§‡àŠ­ àŠ•àŠ°àŠŸ àŠŻàŠŸàŠŹà§‡ àŠšàŠŸà§·"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àŠàŠ‡ àŠ…à§àŠŻàŠŸàŠȘ àŠŹàŠŸ àŠ†àŠȘàŠšàŠŸàŠ° àŠȘà§àŠ°àŠ€àŠżàŠ·à§àŠ àŠŸàŠš àŠžà§àŠ•à§àŠ°àŠżàŠšàŠ¶àŠŸ àŠšà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠ…àŠšà§àŠźàŠ€àŠż àŠŠà§‡àŠŻàŠŒàŠšàŠż"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB àŠ«àŠŸàŠ‡àŠČ àŠžà§àŠ„àŠŸàŠšàŠŸàŠšà§àŠ€àŠ°à§‡àŠ° àŠŹàŠżàŠ•àŠČ্àŠȘàŠ—à§àŠČàŠż"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"àŠžà§‚àŠ°à§àŠŻàŠŸàŠžà§àŠ€à§‡ àŠšàŠŸàŠČু àŠčàŠŹà§‡"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àŠžà§‚àŠ°à§àŠŻà§‹àŠŠàŠŻàŠŒ àŠȘàŠ°à§àŠŻàŠšà§àŠ€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> àŠ àŠšàŠŸàŠČু àŠčàŠŹà§‡"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> àŠȘàŠ°à§àŠŻàŠšà§àŠ€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC àŠ…àŠ•à§àŠ·àŠź àŠ•àŠ°àŠŸ àŠ†àŠ›à§‡"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC àŠžàŠ•à§àŠ·àŠź àŠ•àŠ°àŠŸ àŠ†àŠ›à§‡"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> àŠ†àŠȘàŠšàŠŸàŠ° àŠžà§àŠ•à§àŠ°à§€àŠšà§‡ àŠŠà§‡àŠ–àŠŸàŠšà§‹ àŠžàŠŹ àŠ•àŠżàŠ›à§ àŠ•à§àŠŻàŠŸàŠȘàŠšàŠŸàŠ° àŠ•àŠ°àŠŸ àŠ¶à§àŠ°à§ àŠ•àŠ°àŠŹà§‡à„€"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àŠ†àŠ° àŠŠà§‡àŠ–àŠŸàŠŹà§‡àŠš àŠšàŠŸ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àŠžàŠŹàŠ•àŠżàŠ›à§ àŠžàŠŸàŠ« àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àŠŹàŠżàŠœà§àŠžàŠȘà§àŠ€àŠż àŠȘàŠ°àŠżàŠšàŠŸàŠČàŠšàŠŸ àŠ•àŠ°à§àŠš"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'àŠŹàŠżàŠ°àŠ•à§àŠ€ àŠ•àŠ°àŠŹà§‡àŠš àŠšàŠŸ\' àŠźà§‹àŠĄ àŠšàŠŸàŠČু àŠ†àŠ›à§‡, àŠ€àŠŸàŠ‡ àŠŹàŠżàŠœà§àŠžàŠȘà§àŠ€àŠż àŠČà§àŠ•àŠżàŠŻàŠŒà§‡ àŠ«à§‡àŠČàŠŸ àŠčàŠšà§àŠ›à§‡"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àŠàŠ–àŠš àŠ¶à§àŠ°à§ àŠ•àŠ°à§àŠš"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àŠ•à§‹àŠšà§‹ àŠŹàŠżàŠœà§àŠžàŠȘà§àŠ€àŠż àŠšà§‡àŠ‡"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àŠȘà§àŠ°à§‹àŠ«àŠŸàŠ‡àŠČ àŠȘàŠ°à§àŠŻàŠŹà§‡àŠ•à§àŠ·àŠŁ àŠ•àŠ°àŠŸ àŠčàŠ€à§‡ àŠȘàŠŸàŠ°à§‡"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àŠ°àŠżàŠ‚"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àŠ­àŠŸàŠ‡àŠŹà§àŠ°à§‡àŠŸ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àŠźàŠżàŠ‰àŠŸ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ àŠžàŠ¶àŠŹà§àŠŠ àŠ•àŠ°àŠ€à§‡ àŠ†àŠČàŠ€à§‹ àŠšàŠŸàŠȘà§àŠšà„€"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ àŠ•àŠźà§àŠȘàŠš àŠ àŠžà§‡àŠŸ àŠ•àŠ°àŠ€à§‡ àŠ†àŠČàŠ€à§‹ àŠšàŠŸàŠȘà§àŠšà„€ àŠ…à§àŠŻàŠŸàŠ•à§àŠžà§‡àŠžàŠŻà§‹àŠ—à§àŠŻàŠ€àŠŸàŠ° àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸàŠ—à§àŠČàŠżàŠ•à§‡ àŠšàŠżàŠƒàŠ¶àŠŹà§àŠŠ àŠ•àŠ°àŠŸ àŠčàŠ€à§‡ àŠȘàŠŸàŠ°à§‡à„€"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ àŠšàŠżàŠƒàŠ¶àŠŹà§àŠŠ àŠ•àŠ°àŠ€à§‡ àŠ†àŠČàŠ€à§‹ àŠšàŠŸàŠȘà§àŠšà„€ àŠ…à§àŠŻàŠŸàŠ•à§àŠžà§‡àŠžàŠŻà§‹àŠ—à§àŠŻàŠ€àŠŸàŠ° àŠȘàŠ°àŠżàŠ·à§‡àŠŹàŠŸàŠ—à§àŠČàŠżàŠ•à§‡ àŠšàŠżàŠƒàŠ¶àŠŹà§àŠŠ àŠ•àŠ°àŠŸ àŠčàŠ€à§‡ àŠȘàŠŸàŠ°à§‡à„€"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àŠŹàŠżàŠœà§àŠžàŠȘà§àŠ€àŠżàŠ° àŠšàŠżàŠŻàŠŒàŠšà§àŠ€à§àŠ°àŠŁàŠ—à§àŠČàŠż"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àŠŹàŠżàŠœà§àŠžàŠȘà§àŠ€àŠż àŠźàŠšà§‡ àŠ•àŠ°àŠżàŠŻàŠŒà§‡ àŠŠà§‡àŠ“àŠŻàŠŒàŠŸàŠ° àŠŹàŠżàŠ•àŠČ্àŠȘàŠ—à§àŠČàŠż"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"àŠžà§àŠšà§àŠœ àŠ•àŠ°à§àŠš"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àŠȘà§‚àŠ°à§àŠŹàŠŸàŠŹàŠžà§àŠ„àŠŸàŠŻàŠŒ àŠ«àŠżàŠ°à§àŠš"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> àŠȘàŠ°à§‡ àŠ†àŠŹàŠŸàŠ° àŠźàŠšà§‡ àŠ•àŠ°àŠŸàŠšà§‹ àŠčàŠŹà§‡"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àŠžà§àŠ•à§àŠ°à§€àŠšàŠ¶àŠŸàŠž"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àŠžàŠŸàŠ§àŠŸàŠ°àŠŁ àŠŹàŠŸàŠ°à§àŠ€àŠŸàŠ—à§àŠČàŠż"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àŠžà§àŠŸà§‹àŠ°à§‡àŠœ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àŠčàŠżàŠšà§àŠŸ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àŠàŠŸàŠȘàŠŸ àŠ…à§àŠŻàŠŸàŠȘ"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àŠàŠŸàŠȘàŠŸ àŠ…à§àŠŻàŠŸàŠȘ àŠ‡àŠšàŠžà§àŠŸàŠČ àŠ•àŠ°àŠŸàŠ° àŠȘà§àŠ°àŠŻàŠŒà§‹àŠœàŠš àŠčàŠŻàŠŒ àŠšàŠŸà„€"</string>
     <string name="app_info" msgid="6856026610594615344">"àŠ…à§àŠŻàŠŸàŠȘà§‡àŠ° àŠ€àŠ„à§àŠŻ"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> àŠ…à§àŠŻàŠŸàŠȘàŠŸàŠżàŠ•à§‡ àŠŻà§‡àŠ•à§‹àŠšàŠ“ àŠ…à§àŠŻàŠŸàŠȘà§‡àŠ° àŠ…àŠ‚àŠ¶ àŠŠà§‡àŠ–àŠŸàŠ€à§‡ àŠŠàŠżàŠš"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àŠ…àŠšà§àŠźàŠ€àŠż àŠŠàŠżàŠš"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àŠ–àŠŸàŠ°àŠżàŠœ àŠ•àŠ°à§àŠš"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż àŠžà§‡àŠ­àŠŸàŠ° àŠšàŠŸàŠČু àŠčàŠ“àŠŻàŠŒàŠŸàŠ° àŠžàŠźàŠŻàŠŒ àŠžà§‡àŠŸ àŠ•àŠ°àŠ€à§‡ àŠŸà§àŠŻàŠŸàŠȘ àŠ•àŠ°à§àŠš"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àŠšàŠŸàŠ°à§àŠœ <xliff:g id="PERCENTAGE">%d</xliff:g>%% àŠčàŠŻàŠŒà§‡ àŠ—à§‡àŠČে àŠšàŠżàŠœà§‡ àŠ„à§‡àŠ•à§‡ àŠšàŠŸàŠČু àŠčàŠ€à§‡ àŠŠàŠżàŠš"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àŠšàŠŸ àŠ„àŠŸàŠ•"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àŠ†àŠ—à§‡ àŠžà§‡àŠŸ àŠ•àŠ°àŠŸ àŠžàŠźàŠŻàŠŒ àŠ…àŠšà§àŠŻàŠŸàŠŻàŠŒà§€ àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż àŠžà§‡àŠ­àŠŸàŠ° àŠšàŠŸàŠČু àŠčàŠŻàŠŒà§‡àŠ›à§‡"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àŠšàŠŸàŠ°à§àŠœ <xliff:g id="PERCENTAGE">%d</xliff:g>%%-àŠàŠ° àŠšàŠżàŠšà§‡ àŠšàŠČে àŠ—à§‡àŠČে àŠŹà§àŠŻàŠŸàŠŸàŠŸàŠ°àŠż àŠžà§‡àŠ­àŠŸàŠ° àŠšàŠżàŠœà§‡ àŠ„à§‡àŠ•à§‡àŠ‡ àŠšàŠŸàŠČু àŠčàŠŻàŠŒà§‡ àŠŻàŠŸàŠŹà§‡à„€"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àŠžà§‡àŠŸàŠżàŠ‚àŠž"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àŠŹà§àŠà§‡àŠ›àŠż"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index f47fad0..35e006e 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -504,7 +504,7 @@
     <string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi sada"</string>
     <string name="accessibility_volume_settings" msgid="4915364006817819212">"Postavke zvuka"</string>
     <string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string>
-    <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string>
+    <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Suzi"</string>
     <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promijenite izlazni uređaj"</string>
     <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je prikačen"</string>
     <string name="screen_pinning_description" msgid="8909878447196419623">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i drĆŸite dugme Nazad."</string>
@@ -534,6 +534,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvono"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Isključi zvuk"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <!-- String.format failed for translation -->
     <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) -->
     <skip />
@@ -761,9 +765,9 @@
     <string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"Gore 50%"</string>
     <string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"Gore 30%"</string>
     <string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"Donji ekran kao cijeli ekran"</string>
-    <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Pozicija <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Dvaput dodirnite za uređivanje."</string>
-    <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g> Dvaput dodirnite za dodavanje."</string>
-    <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"Pozicija <xliff:g id="POSITION">%1$d</xliff:g>. Dvaput dodirnite za odabir."</string>
+    <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"Pozicija <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>. Dodirnite dvaput za uređivanje."</string>
+    <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g> Dodirnite dvaput za dodavanje."</string>
+    <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"Pozicija <xliff:g id="POSITION">%1$d</xliff:g>. Dodirnite dvaput za odabir."</string>
     <string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"Pomjeri <xliff:g id="TILE_NAME">%1$s</xliff:g>"</string>
     <string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"Ukloni <xliff:g id="TILE_NAME">%1$s</xliff:g>"</string>
     <string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g> je dodan na poziciju <xliff:g id="POSITION">%2$d</xliff:g>"</string>
@@ -852,7 +856,7 @@
     <string name="slice_permission_allow" msgid="2340244901366722709">"Dozvoli"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Odbij"</string>
     <string name="auto_saver_title" msgid="1217959994732964228">"Dodirnite da zakaĆŸete Uštedu baterije"</string>
-    <string name="auto_saver_text" msgid="6324376061044218113">"Automatski uključite kada je baterija ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Automatski uključiti kada je baterija ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, hvala"</string>
     <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Zakazivanje Uštede baterije je uključeno"</string>
     <string name="auto_saver_enabled_text" msgid="874711029884777579">"Kada je baterija ispod <xliff:g id="PERCENTAGE">%d</xliff:g>%%, Ušteda baterije se automatski uključuje."</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index a08c559..586a292 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"S\'està desant la captura de pantalla..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"S\'ha desat la captura de pantalla"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Toca per veure la captura de pantalla"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"No s\'ha pogut desar la captura de pantalla"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Prova de tornar a fer una captura de pantalla"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"La captura de pantalla no es pot desar perquè no hi ha prou espai d\'emmagatzematge"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'aplicació o la teva organització no permeten fer captures de pantalla"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opcions transf. fitxers USB"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"A la posta de sol"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fins a l\'alba"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"S\'activarà a les <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fins a les <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"L\'NFC està desactivada"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"L\'NFC està activada"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> començarà a gravar tot el que es mostri a la pantalla."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"No ho tornis a mostrar"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Esborra-ho tot"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Gestiona les notificacions"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"El mode No molestis està amagant notificacions"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Comença ara"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Cap notificació"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Fes sonar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibra"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silencia"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca per activar el so."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca per activar la vibració. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"controls de notificació"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcions per posposar la notificació"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Posposa"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"DESFÉS"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"S\'ha posposat <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f76ae67..a9f0f22 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -539,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Vyzvánění"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrace"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ztlumení"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnete zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujete reĆŸim vibrací. SluĆŸby pƙístupnosti mohou být ztlumeny."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnete zvuk. SluĆŸby pƙístupnosti mohou být ztlumeny."</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 131163e..155b326 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Gemmer screenshot..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshottet blev gemt"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Tryk for at se dit screenshot"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Screenshottet kunne ikke gemmes"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Prøv at tage et screenshot igen"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Screenshottet kan ikke gemmes, fordi der er begrænset lagerplads"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller din organisation tillader ikke, at du tager screenshots"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Muligheder for USB-filoverførsel"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Tænd ved solnedgang"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Indtil solopgang"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Tænd kl. <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Indtil <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er deaktiveret"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er aktiveret"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vil begynde at optage alt, hvad der vises på din skærm."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Vis ikke igen"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Ryd alt"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Administrer underretninger"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Forstyr ikke skjuler underretninger"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Start nu"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Ingen underretninger"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Slå lyden fra"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryk for at slå lyden til."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryk for at konfigurere til at vibrere. Tilgængelighedstjenester kan blive deaktiveret."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrolelementer til underretninger"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Indstillinger for udsættelse"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Udsæt"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"FORTRYD"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Udsat i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 3a03c41..cb05035 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot gespeichert"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Tippe, um deinen Screenshot anzusehen"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Screenshot konnte nicht gespeichert werden"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Versuche noch einmal, den Screenshot zu erstellen"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Speichern des Screenshots aufgrund von zu wenig Speicher nicht möglich"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Die App oder deine Organisation lässt das Erstellen von Screenshots nicht zu"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string>
@@ -352,8 +350,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"An bei Sonnenuntergang"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Bis Sonnenaufgang"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"An um <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Bis <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ist deaktiviert"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ist aktiviert"</string>
@@ -437,8 +434,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nimmt alle auf deinem Bildschirm angezeigten Aktivitäten auf."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Nicht erneut anzeigen"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Alle löschen"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Benachrichtigungen verwalten"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Benachrichtigungen werden durch \"Bitte nicht stören\" ausgeblendet"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Jetzt starten"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Keine Benachrichtigungen"</string>
@@ -539,6 +535,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Klingeln lassen"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrieren"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Stummschalten"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Zum Aufheben der Stummschaltung tippen."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tippen, um Vibrieren festzulegen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
@@ -633,8 +633,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> – <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Benachrichtigungseinstellungen"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Optionen für spätere Erinnerung bei Benachrichtigungen"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Schlummern"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"RÜCKGÄNGIG"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Erinnerung in <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index b7823b3..fb5543f 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Κουδούνισμα"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Δόνηση"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ΣÎŻγαση"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ΠατÎźστε για κατÎŹργηση σÎŻγασης."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ΠατÎźστε για ενεργοποιÎźσετε τη δόνηση. Οι υπηρεσÎŻες προσβασιμότητας ενδέχεται να τεθούν σε σÎŻγαση."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ΠατÎźστε για σÎŻγαση. Οι υπηρεσÎŻες προσβασιμότητας ενδέχεται να τεθούν σε σÎŻγαση."</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index d329fbc..0876e54 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrate"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Mute"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 3ba2cff..6020606 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrate"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Mute"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index d329fbc..0876e54 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrate"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Mute"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index d329fbc..0876e54 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrate"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Mute"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tap to unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 11e6b34..b4de7f6 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -531,14 +531,15 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‏‏‎‎‏‎‏‎‎‎‎‏‎‎‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‏‏‎‎‎‎Ring‎‏‎‎‏‎"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎Vibrate‎‏‎‎‏‎"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎Mute‎‏‎‎‏‎"</string>
+    <string name="qs_status_phone_vibrate" msgid="204362991135761679">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎Phone on vibrate‎‏‎‎‏‎"</string>
+    <string name="qs_status_phone_muted" msgid="5437668875879171548">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‎Phone muted‎‏‎‎‏‎"</string>
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‏‎‏‎‎‎‏‎‎‏‎%1$s. Tap to unmute.‎‏‎‎‏‎"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‎‎‎‏‎‏‎‎%1$s. Tap to set to vibrate. Accessibility services may be muted.‎‏‎‎‏‎"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‏‏‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎%1$s. Tap to mute. Accessibility services may be muted.‎‏‎‎‏‎"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‎%1$s. Tap to set to vibrate.‎‏‎‎‏‎"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‎‏‏‎‎%1$s. Tap to mute.‎‏‎‎‏‎"</string>
     <string name="volume_dialog_title" msgid="7272969888820035876">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‎‎%s volume controls‎‏‎‎‏‎"</string>
-    <!-- no translation found for volume_dialog_ringer_guidance_ring (3360373718388509040) -->
-    <skip />
+    <string name="volume_dialog_ringer_guidance_ring" msgid="3360373718388509040">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‏‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‎‎Calls and notifications will ring (‎‏‎‎‏‏‎<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>‎‏‎‎‏‏‏‎)‎‏‎‎‏‎"</string>
     <string name="output_title" msgid="5355078100792942802">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎Media output‎‏‎‎‏‎"</string>
     <string name="output_calls_title" msgid="8717692905017206161">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‏‎Phone call output‎‏‎‎‏‎"</string>
     <string name="output_none_found" msgid="5544982839808921091">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‎‎‎‎‏‏‎No devices found‎‏‎‎‏‎"</string>
@@ -689,8 +690,7 @@
     <string name="battery" msgid="7498329822413202973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‏‏‎‏‎Battery‎‏‎‎‏‎"</string>
     <string name="clock" msgid="7416090374234785905">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎Clock‎‏‎‎‏‎"</string>
     <string name="headset" msgid="4534219457597457353">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎Headset‎‏‎‎‏‎"</string>
-    <!-- no translation found for accessibility_long_click_tile (6687350750091842525) -->
-    <skip />
+    <string name="accessibility_long_click_tile" msgid="6687350750091842525">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‎‎‏‏‏‏‎‏‏‏‎‏‎Open settings‎‏‎‎‏‎"</string>
     <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‎‎‎‎‎‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‎‏‎‏‎Headphones connected‎‏‎‎‏‎"</string>
     <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎Headset connected‎‏‎‎‏‎"</string>
     <string name="data_saver" msgid="5037565123367048522">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‏‎‏‎‎‏‎‏‎‎Data Saver‎‏‎‎‏‎"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 644eb30..02dfa659 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando la captura de pantalla..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Se guardó la captura de pantalla"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Presiona para ver la captura de pantalla"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"No se pudo guardar la captura de pantalla"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Vuelve a hacer una captura de pantalla"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"No se puede guardar la captura de pantalla debido a que no hay suficiente espacio de almacenamiento"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"La app o tu organización no permiten las capturas de pantalla"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"A la(s) <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La tecnología NFC está inhabilitada"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La tecnología NFC está habilitada"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comenzará la captura de todo lo que se muestre en la pantalla."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Administrar notificaciones"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"No interrumpir oculta las notificaciones"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Comenzar ahora"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hacer sonar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Presiona para dejar de silenciar."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Presiona para establecer el modo vibración. Es posible que los servicios de accesibilidad estén silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"controles de notificación"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"opciones para posponer notificaciones"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Posponer"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Posponer <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 8eb35e6..1d767c5 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Guardando captura..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Se ha guardado la captura de pantalla"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Toca para ver la captura de pantalla"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"No se ha podido guardar la captura de pantalla"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Vuelve a intentar hacer la captura de pantalla"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"No se puede guardar la captura de pantalla porque no hay espacio de almacenamiento suficiente"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"La aplicación o tu organización no permiten realizar capturas de pantalla"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opciones de transferencia de archivos por USB"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Hora: <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hasta: <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La conexión NFC está inhabilitada"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La conexión NFC está habilitada"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"No volver a mostrar"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Borrar todo"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Gestionar notificaciones"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"El modo No molestar oculta las notificaciones"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Iniciar ahora"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"No hay notificaciones"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hacer sonar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar el sonido."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para poner el dispositivo en vibración. Los servicios de accesibilidad pueden silenciarse."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Controles de las notificaciones"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Opciones para posponer las notificaciones"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Posponer"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Volverá a mostrarse en <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1013c4a..f93da21 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Kuvatõmmise salvestamine ..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Ekraanipilt salvestati"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Puudutage ekraanipildi vaatamiseks"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Ekraanipilti ei õnnestunud salvestada"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Proovige ekraanipilt uuesti jäädvustada"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Piiratud salvestusruumi tõttu ei saa ekraanipilti salvestada"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Rakendus või teie organisatsioon ei luba ekraanipilte jäädvustada"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB-failiedastuse valikud"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Sissel. päikeselooj."</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuni päikesetõusuni"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Sisselülitam. kell <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Kuni <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on keelatud"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on lubatud"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> hakkab jäädvustama kõike, mida ekraanil kuvatakse."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ära kuva uuesti"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Tühjenda kõik"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Märguannete haldamine"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ReĆŸiim Mitte segada peidab märguandeid"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Alusta kohe"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Märguandeid pole"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Helisemine"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreerimine"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Vaigistatud"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Puudutage vaigistuse tühistamiseks."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Puudutage värinareĆŸiimi määramiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"märguannete juhtnupud"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"märguannete edasilükkamise valikud"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Lükka edasi"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"VÕTA TAGASI"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Edasi lükatud <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index dc9ba53..b671dfe 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Pantaila-argazkia gordetzen…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Gorde da pantaila-argazkia"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Sakatu pantaila-argazkia ikusteko"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Ezin izan da gorde pantaila-argazkia"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Saiatu berriro pantaila-argazkia ateratzen"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ezin da gorde pantaila-argazkia ez delako gelditzen tokirik"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikazioak edo erakundeak ez du onartzen pantaila-argazkiak ateratzea"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB fitxategiak transferitzeko aukerak"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ilunabarrean"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ilunabarrera arte"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aktibatze-ordua: <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> arte"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Desgaituta dago NFC"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Gaituta dago NFC"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak pantailan bistaratzen den guztia grabatuko du."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ez erakutsi berriro"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztiak"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Kudeatu jakinarazpenak"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"Ez molestatu\" modua jakinarazpenak ezkutatzen ari da"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Hasi"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Ez dago jakinarazpenik"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Jo tonua"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dardara"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ez jo tonua"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sakatu audioa aktibatzeko."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Sakatu dardara ezartzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"jakinarazpena kontrolatzeko aukerak"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"jakinarazpena atzeratzeko aukerak"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Atzeratu"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"DESEGIN"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>z atzeratu da"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -852,7 +851,7 @@
     <string name="auto_saver_title" msgid="1217959994732964228">"Sakatu bateria-aurrezlea noiz aktibatu antolatzeko"</string>
     <string name="auto_saver_text" msgid="6324376061044218113">"Aktibatu automatikoki bateriaren %% <xliff:g id="PERCENTAGE">%d</xliff:g> gelditzen denean"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"Ez"</string>
-    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Bateria-aurrezle aktibatu da"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Bateria-aurrezlea aktibatu da"</string>
     <string name="auto_saver_enabled_text" msgid="874711029884777579">"Bateria-aurrezlea automatikoki aktibatuko da bateriaren %% <xliff:g id="PERCENTAGE">%d</xliff:g> gelditzen denean."</string>
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Ezarpenak"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ados"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index a52c3474..96899cf 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ŰČÙ†ÚŻ ŰČŰŻÙ†"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Ù„Ű±ŰČŰŽ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ŰšÛŒ‌۔ۯۧ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"‏%1$s. ŰšŰ±Ű§ÛŒ ۚۧ۔ۯۧ Ú©Ű±ŰŻÙ† Ű¶Ű±ŰšÙ‡ ŰšŰČÙ†ÛŒŰŻ."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"‏%1$s. ŰšŰ±Ű§ÛŒ ŰȘÙ†ŰžÛŒÙ… Ű±ÙˆÛŒ Ù„Ű±ŰČŰŽ Ű¶Ű±ŰšÙ‡ ŰšŰČÙ†ÛŒŰŻ. ممکن ۧ۳ŰȘ ŰłŰ±ÙˆÛŒŰł‌Ù‡Ű§ÛŒ ŰŻŰłŰȘ۱۳‌ÙŸŰ°ÛŒŰ±ÛŒ ŰšÛŒ‌۔ۯۧ ŰŽÙˆÙ†ŰŻ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"‏%1$s. ŰšŰ±Ű§ÛŒ ŰšÛŒ‌۔ۯۧ Ú©Ű±ŰŻÙ† Ű¶Ű±ŰšÙ‡ ŰšŰČÙ†ÛŒŰŻ. ممکن ۧ۳ŰȘ ŰłŰ±ÙˆÛŒŰł‌Ù‡Ű§ÛŒ ŰŻŰłŰȘ۱۳‌ÙŸŰ°ÛŒŰ±ÛŒ ŰšÛŒ‌۔ۯۧ ŰŽÙˆÙ†ŰŻ."</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 477a9e7..23e64db 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Tallennetaan kuvakaappausta..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Kuvakaappaus tallennettu"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Napauta katsoaksesi kuvakaappausta"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Kuvakaappauksen tallennus epäonnistui"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Yritä ottaa kuvakaappaus uudelleen."</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kuvakaappauksen tallennus epäonnistui, sillä tallennustilaa ei ole riittävästi"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Sovellus tai organisaatio ei salli kuvakaappauksien tallentamista."</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB-tiedostonsiirtoasetukset"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Auringon laskiessa"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Auringonnousuun"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Käyttöön klo <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> saakka"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC on poistettu käytöstä"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC on käytössä"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkaa tallentaa kaiken näytölläsi näkyvän."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Älä näytä uudelleen"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Poista kaikki"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Hallinnoi ilmoituksia"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Älä häiritse ‑tila piilottaa ilmoitukset"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Aloita nyt"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Ei ilmoituksia"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Soittoääni"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Värinä"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Äänetön"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Poista mykistys koskettamalla."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Siirry värinätilaan koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Ilmoitusten hallinta"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Ilmoitusten torkkuasetukset"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Siirrä myöhemmäksi"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"KUMOA"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Torkku: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 0353868..6b12d4f 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement capture écran…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Capture d\'écran enregistrée"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Touchez pour afficher votre capture d\'écran"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Impossible d\'enregistrer la capture d\'écran"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Essayez de faire une autre capture d\'écran"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'application ou votre organisation n\'autorise pas les saisies d\'écran"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Au coucher du soleil"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'au lev. soleil"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string>
@@ -435,10 +432,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> commencer à enregistrer tout ce qui s\'affiche sur votre écran."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Gérer les notifications"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Le mode Ne pas déranger masque les notifications"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"le profil peut être contrôlé"</string>
@@ -538,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonnerie"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Sonnerie désactivée"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Touchez pour réactiver le son."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Touchez pour activer les vibrations. Il est possible de couper le son des services d\'accessibilité."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string>
@@ -632,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"paramètres des notifications"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"options de répétition des notifications"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Reporter"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -822,8 +820,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"Saisies d\'écran"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"Messages généraux"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"Stockage"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"Conseils"</string>
     <string name="instant_apps" msgid="6647570248119804907">"Applications instantanées"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"Les applications instantanées ne nécessitent pas d\'installation."</string>
     <string name="app_info" msgid="6856026610594615344">"Détails de l\'application"</string>
@@ -851,18 +848,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des tranches de n\'importe quelle application"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"Toucher pour activer la fonction Économie d\'énergie"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Activer automatiquement lorsque la pile est à <xliff:g id="PERCENTAGE">%d</xliff:g> %%"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"Non merci"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"La fonction Économie d\'énergie est activée"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"La fonction Économie d\'énergie s\'activera automatiquement une fois que la pile sera en dessous de <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index cf032ba..4828c20 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Enregistrement de la capture d\'écran…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Capture d\'écran enregistrée"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Appuyez pour afficher votre capture d\'écran"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Impossible d\'enregistrer la capture d\'écran"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Essayez de nouveau de faire une capture d\'écran"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossible d\'enregistrer la capture d\'écran, car l\'espace de stockage est limité"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Les captures d\'écran ne sont pas autorisées par l\'application ni par votre organisation"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Options transfert fichiers USB"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activé au crépuscule"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activé à <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va commencer à capturer tous les contenus affichés à l\'écran."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne plus afficher"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Tout effacer"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Gérer les notifications"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Le mode Ne pas déranger masque les notifications"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Commencer"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Aucune notification"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonnerie"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibreur"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silencieux"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Appuyez pour ne plus ignorer."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Appuyez pour mettre en mode vibreur. Vous pouvez ignorer les services d\'accessibilité."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> : <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"paramètres des notifications"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"options de répétition des notifications"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Répéter"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 5e5184f..b7d6486 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -533,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Facer soar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Silenciar"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toca para activar o son."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toca para establecer a vibración. Pódense silenciar os servizos de accesibilidade."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 967ed18..c42206a 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‹àȘŸ àȘžàȘŸàȘšàȘ”ી àȘ°àȘč્àȘŻà«àȘ‚ àȘ›à«‡…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ àȘžàȘŸàȘšàȘ”્àȘŻà«‹"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àȘ€àȘźàȘŸàȘ°àȘŸ àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸàȘšà«‡ àȘœà«‹àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ àȘžàȘŸàȘšàȘ”ી àȘ¶àȘ•à«àȘŻàȘŸàȘ‚ àȘšàȘ„ી"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àȘ«àȘ°à«€àȘ„ી àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ àȘČેàȘ”àȘŸàȘšà«‹ àȘȘ્àȘ°àȘŻàȘŸàȘž àȘ•àȘ°à«‹"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àȘźàȘ°à«àȘŻàȘŸàȘŠàȘżàȘ€ àȘžà«àȘŸà«‹àȘ°à«‡àȘœ àȘžà«àȘȘેàȘžàȘšà«‡ àȘ•àȘŸàȘ°àȘŁà«‡ àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ àȘžàȘŸàȘšàȘ”ી àȘ¶àȘ•àȘŸàȘ€à«‹ àȘšàȘ„ી"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘš àȘ•à«‡ àȘ€àȘźàȘŸàȘ°à«€ àȘžàȘ‚àȘžà«àȘ„àȘŸ àȘŠà«àȘ”àȘŸàȘ°àȘŸ àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ àȘČેàȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘšàȘ„ી"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB àȘ«àȘŸàȘ‡àȘČ àȘŸà«àȘ°àȘŸàȘšà«àȘžàȘ«àȘ° àȘ”àȘżàȘ•àȘČ્àȘȘો"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"àȘžà«‚àȘ°à«àȘŻàȘŸàȘžà«àȘ€ àȘ”àȘ–àȘ€à«‡"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àȘžà«‚àȘ°à«àȘŻà«‹àȘŠàȘŻ àȘžà«àȘ§à«€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> àȘ”àȘŸàȘ—્àȘŻà«‡"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> àȘžà«àȘ§à«€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC àȘ…àȘ•à«àȘ·àȘź àȘ•àȘ°à«‡àȘČ àȘ›à«‡"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC àȘžàȘ•à«àȘ·àȘź àȘ•àȘ°à«‡àȘČ àȘ›à«‡"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> àȘ€àȘźàȘŸàȘ°à«€ àȘžà«àȘ•à«àȘ°à«€àȘš àȘȘàȘ° àȘœà«‡ àȘȘ્àȘ°àȘŠàȘ°à«àȘ¶àȘżàȘ€ àȘ„àȘŸàȘŻ àȘ›à«‡ àȘ€à«‡ àȘŠàȘ°à«‡àȘ• àȘ”àȘžà«àȘ€à«àȘšà«‡ àȘ•à«‡àȘȘ્àȘšàȘ° àȘ•àȘ°àȘ”àȘŸàȘšà«àȘ‚ àȘȘ્àȘ°àȘŸàȘ°àȘ‚àȘ­ àȘ•àȘ°àȘ¶à«‡."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àȘ«àȘ°à«€àȘ„ી àȘŹàȘ€àȘŸàȘ”àȘ¶à«‹ àȘšàȘčીàȘ‚"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àȘŹàȘ§à« àȘžàȘŸàȘ« àȘ•àȘ°à«‹"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àȘžà«‚àȘšàȘšàȘŸàȘ“àȘšà«‡ àȘźà«‡àȘšà«‡àȘœ àȘ•àȘ°à«‹"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"àȘ–àȘČેàȘČ àȘȘàȘŸàȘĄàȘ¶à«‹ àȘšàȘčીàȘ‚ àȘšà«‹àȘŸàȘżàȘ«àȘżàȘ•à«‡àȘ¶àȘš àȘ›à«àȘȘàȘŸàȘ”ી àȘ°àȘč્àȘŻà«àȘ‚ àȘ›à«‡"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àȘčàȘ”ે àȘȘ્àȘ°àȘŸàȘ°àȘ‚àȘ­ àȘ•àȘ°à«‹"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àȘ•à«‹àȘˆ àȘžà«‚àȘšàȘšàȘŸàȘ“ àȘšàȘ„ી"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àȘȘ્àȘ°à«‹àȘ«àȘŸàȘ‡àȘČ àȘźà«‰àȘšàȘżàȘŸàȘ° àȘ•àȘ°à«€ àȘ¶àȘ•àȘŸàȘŻ àȘ›à«‡"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àȘ°àȘżàȘ‚àȘ— àȘ•àȘ°à«‹"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àȘ”àȘŸàȘ‡àȘŹà«àȘ°à«‡àȘŸ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àȘźà«àȘŻà«‚àȘŸ àȘ•àȘ°à«‹"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. àȘ…àȘšàȘźà«àȘŻà«‚àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. àȘ”àȘŸàȘ‡àȘŹà«àȘ°à«‡àȘŸ àȘȘàȘ° àȘžà«‡àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹. àȘàȘ•à«àȘžà«‡àȘžàȘżàȘŹàȘżàȘČàȘżàȘŸà«€ àȘžà«‡àȘ”àȘŸàȘ“ àȘźà«àȘŻà«‚àȘŸ àȘ•àȘ°àȘ”àȘŸàȘźàȘŸàȘ‚ àȘ†àȘ”ી àȘ¶àȘ•à«‡ àȘ›à«‡."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. àȘźà«àȘŻà«‚àȘŸ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹. àȘàȘ•à«àȘžà«‡àȘžàȘżàȘŹàȘżàȘČàȘżàȘŸà«€ àȘžà«‡àȘ”àȘŸàȘ“ àȘźà«àȘŻà«‚àȘŸ àȘ•àȘ°àȘ”àȘŸàȘźàȘŸàȘ‚ àȘ†àȘ”ી àȘ¶àȘ•à«‡ àȘ›à«‡."</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àȘžà«‚àȘšàȘšàȘŸ àȘšàȘżàȘŻàȘ‚àȘ€à«àȘ°àȘŁà«‹"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àȘžà«‚àȘšàȘšàȘŸ àȘžà«àȘšà«‚àȘ àȘ•àȘ°àȘ”àȘŸàȘšàȘŸ àȘ”àȘżàȘ•àȘČ્àȘȘો"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"àȘžà«àȘšà«‚àȘ àȘ•àȘ°à«‹"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àȘȘૂàȘ°à«àȘ”àȘ”àȘ€à« àȘ•àȘ°à«‹"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> àȘźàȘŸàȘŸà«‡ àȘžà«àȘšà«‚àȘ àȘ•àȘ°à«‹"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àȘžà«àȘ•à«àȘ°à«€àȘšàȘ¶à«‰àȘŸ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àȘžàȘŸàȘźàȘŸàȘšà«àȘŻ àȘžàȘ‚àȘŠà«‡àȘ¶àȘŸ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àȘžà«àȘŸà«‹àȘ°à«‡àȘœ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àȘčàȘżàȘšà«àȘŸ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àȘàȘŸàȘȘàȘŸ àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšà«‹"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àȘàȘŸàȘȘàȘŸ àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘšà«‹ àȘźàȘŸàȘŸà«‡ àȘ‡àȘšà«àȘžà«àȘŸà«‰àȘČેàȘ¶àȘšàȘšà«€ àȘœàȘ°à«‚àȘ° àȘšàȘ„ી."</string>
     <string name="app_info" msgid="6856026610594615344">"àȘàȘȘ્àȘČàȘżàȘ•à«‡àȘ¶àȘš àȘźàȘŸàȘčàȘżàȘ€à«€"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g>àȘšà«‡ àȘ•à«‹àȘˆàȘȘàȘŁ àȘàȘȘàȘšàȘŸ àȘžà«àȘČàȘŸàȘ‡àȘž àȘŹàȘ€àȘŸàȘ”àȘ”àȘŸàȘšà«€ àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘો"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àȘźàȘ‚àȘœà«‚àȘ°à«€ àȘ†àȘȘો"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àȘšàȘ•àȘŸàȘ°à«‹"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àȘŹà«…àȘŸàȘ°à«€ àȘžà«‡àȘ”àȘ° àȘ¶à«‡àȘĄà«àȘŻà«‚àȘČ àȘ•àȘ°àȘ”àȘŸ àȘźàȘŸàȘŸà«‡ àȘŸà«…àȘȘ àȘ•àȘ°à«‹"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àȘŹà«…àȘŸàȘ°à«€àȘšà«àȘ‚ àȘžà«àȘ€àȘ° <xliff:g id="PERCENTAGE">%d</xliff:g>%% àȘȘàȘ° àȘčોàȘŻ àȘ€à«àȘŻàȘŸàȘ°à«‡ àȘ†àȘȘàȘźà«‡àȘłà«‡ àȘšàȘŸàȘČુ àȘ•àȘ°à«‹"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àȘšàȘŸ, àȘ†àȘ­àȘŸàȘ°"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àȘŹà«…àȘŸàȘ°à«€ àȘžà«‡àȘ”àȘ° àȘ¶à«‡àȘĄà«àȘŻà«‚àȘČ àȘšàȘŸàȘČુ àȘ„àȘŻà«àȘ‚"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àȘŹà«…àȘŸàȘ°à«€àȘšà«àȘ‚ àȘžà«àȘ€àȘ° àȘàȘ•àȘ”àȘŸàȘ° <xliff:g id="PERCENTAGE">%d</xliff:g>%% àȘ•àȘ°àȘ€àȘŸàȘ‚ àȘ“àȘ›à«àȘ‚ àȘ„àȘŸàȘŻ àȘ€à«‡ àȘȘàȘ›à«€ àȘŹà«…àȘŸàȘ°à«€ àȘžà«‡àȘ”àȘ° àȘ†àȘȘàȘźà«‡àȘłà«‡ àȘšàȘŸàȘČુ àȘ„àȘ¶à«‡."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àȘžà«‡àȘŸàȘżàȘ‚àȘ—"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àȘžàȘźàȘœàȘŸàȘˆ àȘ—àȘŻà«àȘ‚"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 6498cb3..13c49f7 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà€čà„‡à€œà€Ÿ à€œà€Ÿ à€°à€čà€Ÿ à€čà„ˆ..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€” à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"à€…à€Șà€šà€Ÿ à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€Šà„‡à€–à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€” à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€Ÿ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€Šà„‹à€Źà€Ÿà€°à€Ÿ à€Čà„‡à€šà„‡ à€•à„€ à€•à„‹à€¶à€żà€¶ à€•à€°à„‡à€‚"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"à€źà„‡à€źà„‹à€°à„€ à€•à€ź à€čà„‹à€šà„‡ à€•à„€ à€”à€œà€č à€žà„‡ à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€” à€šà€čà„€à€‚ à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€Ÿ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€Żà€Ÿ à€†à€Șà€•à€Ÿ à€žà€‚à€—à€ à€š à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€Čà„‡à€šà„‡ à€•à„€ à€…à€šà„à€źà€€à€ż à€šà€čà„€à€‚ à€Šà„‡à€€à€Ÿ"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB à€«à€Œà€Ÿà€‡à€Č à€žà„à€„à€Ÿà€šà€Ÿà€‚à€€à€°à€Ł à€”à€żà€•à€Čà„à€Ș"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"à€¶à€Ÿà€ź à€•à„‹ à€šà€Ÿà€Čà„‚ à€•à„€ à€œà€Ÿà€à€—à„€"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"à€žà„à€Źà€č à€€à€• à€šà€Ÿà€Čà„‚ à€°à€čà„‡à€—à„€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> à€Șà€° à€šà€Ÿà€Čà„‚ à€•à„€ à€œà€Ÿà€à€—à„€"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> à€€à€•"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC à€Źà€‚à€Š à€čà„ˆ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC à€šà€Ÿà€Čà„‚ à€čà„ˆ"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> à€†à€Șà€•à„‡ à€žà„à€•à„à€°à„€à€š à€Șà€° à€Šà€żà€–à€Ÿà€ˆ à€Šà„‡à€šà„‡ à€”à€Ÿà€Čà„€ à€čà€° à€žà€Ÿà€źà€—à„à€°à„€ à€•à„‹ à€•à„ˆà€Șà„à€šà€° à€•à€°à€šà€Ÿ à€¶à„à€°à„‚ à€•à€° à€Šà„‡à€—à„€."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"à€«à€żà€° à€žà„‡ à€š à€Šà€żà€–à€Ÿà€à€‚"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"à€žà€­à„€ à€žà€Ÿà€«à€Œ à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"à€žà„‚à€šà€šà€Ÿà€à€‚ à€Șà„à€°à€Źà€‚à€§à€żà€€ à€•à€°à„‡à€‚"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"à€Șà€°à„‡à€¶à€Ÿà€š à€š à€•à€°à„‡à€‚ à€žà„à€”à€żà€§à€Ÿ à€šà€Ÿà€Čà„‚ à€čà„‹à€šà„‡ à€•à„€ à€”à€œà€č à€žà„‡ à€žà„‚à€šà€šà€Ÿà€à€‚ à€šà€čà„€à€‚ à€Šà€żà€–à€Ÿà€ˆ à€œà€Ÿ à€°à€čà„€ à€čà„ˆà€‚"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"à€…à€Ź à€¶à„à€°à„‚ à€•à€°à„‡à€‚"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"à€•à„‹à€ˆ à€žà„‚à€šà€šà€Ÿ à€šà€čà„€à€‚ à€źà€żà€Čà„€"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"à€Șà„à€°à„‹à€«à€Œà€Ÿà€‡à€Č à€•à„‹ à€źà„‰à€šà„€à€Ÿà€° à€•à€żà€Żà€Ÿ à€œà€Ÿ à€žà€•à€€à€Ÿ à€čà„ˆ"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à€†à€”à€Ÿà€œà€Œ à€šà€Ÿà€Čà„‚ à€čà„ˆ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"à€•à€‚à€Șà€š (à€”à€Ÿà€‡à€Źà„à€°à„‡à€¶à€š)"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"à€†à€”à€Ÿà€œà€Œ à€Źà€‚à€Š à€čà„ˆ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. à€…à€šà€źà„à€Żà„‚à€Ÿ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. à€•à€‚à€Șà€š à€Șà€° à€žà„‡à€Ÿ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚. à€žà„à€Čà€­à€€à€Ÿ à€žà„‡à€”à€Ÿà€à€‚ à€źà„à€Żà„‚à€Ÿ à€čà„‹ à€žà€•à€€à„€ à€čà„ˆà€‚."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. à€źà„à€Żà„‚à€Ÿ à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚. à€žà„à€Čà€­à€€à€Ÿ à€žà„‡à€”à€Ÿà€à€‚ à€źà„à€Żà„‚à€Ÿ à€čà„‹ à€žà€•à€€à„€ à€čà„ˆà€‚."</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"à€žà„‚à€šà€šà€Ÿ à€šà€żà€Żà€‚à€€à„à€°à€Ł"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"à€žà„‚à€šà€šà€Ÿ à€•à„‹ à€žà„à€šà„‚à€œà€Œ (à€„à„‹à€Ąà€Œà„€ à€Šà„‡à€° à€•à„‡ à€Čà€żà€ à€šà„à€Ș à€•à€°à€šà€Ÿ) à€•à€°à€šà„‡ à€•à„‡ à€”à€żà€•à€Čà„à€Ș"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"à€žà„à€šà„‚à€œà€Œ à€•à€°à„‡à€‚"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"à€Șà€čà€Čà„‡ à€œà„ˆà€žà€Ÿ à€•à€°à„‡à€‚"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> à€•à„‡ à€Čà€żà€ à€Żà€Ÿà€Š à€Šà€żà€Čà€Ÿà€Żà€Ÿ à€—à€Żà€Ÿ"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"à€žà„‍à€•à„à€°à„€à€šà€¶à„‰à€Ÿ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"à€žà€Ÿà€źà€Ÿà€šà„à€Ż à€žà€‚à€Šà„‡à€¶"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"à€œà€—à€č"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"à€žà€‚à€•à„‡à€€"</string>
     <string name="instant_apps" msgid="6647570248119804907">"à€à€Ÿà€Șà€Ÿ à€à€Șà„à€ž"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"à€à€Ÿà€Șà€Ÿ à€à€Șà„à€ž à€•à„‡ à€Čà€żà€ à€‡à€‚à€žà„à€Ÿà„‰à€Čà„‡à€¶à€š à€œà€Œà€°à„‚à€°à„€ à€šà€čà„€à€‚ à€čà„ˆ."</string>
     <string name="app_info" msgid="6856026610594615344">"à€à€Ș à€•à„€ à€œà€Ÿà€šà€•à€Ÿà€°à„€"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> à€•à„‹ à€•à€żà€žà„€ à€­à„€ à€à€Șà„à€Čà€żà€•à„‡à€¶à€š à€•à„‡ à€čà€żà€žà„à€žà„‡ (à€žà„à€Čà€Ÿà€‡à€ž) à€Šà€żà€–à€Ÿà€šà„‡ à€•à„€ à€źà€‚à€œà€Œà„‚à€°à„€ à€Šà„‡à€‚"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"à€źà€‚à€œà€Œà„‚à€°à„€ à€Šà„‡à€‚"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"à€šà€Ÿà€źà€‚à€œà€Œà„‚à€° à€•à€°à„‡à€‚"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"à€Źà„ˆà€Ÿà€°à„€ à€žà„‡à€”à€° à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€°à€šà„‡ à€•à„‡ à€Čà€żà€ à€Ÿà„ˆà€Ș à€•à€°à„‡à€‚"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"à€Źà„ˆà€Ÿà€°à„€ à€•à„‡ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€čà„‹à€šà„‡ à€Șà€° à€…à€Șà€šà„‡ à€†à€Ș à€šà€Ÿà€Čà„‚ à€•à€żà€Żà€Ÿ à€œà€Ÿà€"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"à€œà„€ à€šà€čà„€à€‚, à€¶à„à€•à„à€°à€żà€Żà€Ÿ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€żà€Żà€Ÿ à€—à€Żà€Ÿ à€Źà„ˆà€Ÿà€°à„€ à€žà„‡à€”à€° à€šà€Ÿà€Čà„‚ à€čà„‹ à€—à€Żà€Ÿ"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"à€Źà„ˆà€Ÿà€°à„€ à€•à„‡ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€žà„‡ à€•à€ź à€čà„‹à€šà„‡ à€Șà€° à€Źà„ˆà€Ÿà€°à„€ à€žà„‡à€”à€° à€…à€Șà€šà„‡ à€†à€Ș à€šà€Ÿà€Čà„‚ à€čà„‹ à€œà€Ÿà€à€—à€Ÿ."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"à€žà„‡à€Ÿà€żà€‚à€—"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"à€ à„€à€• à€čà„ˆ"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index c0dad6b..938bd02 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -75,10 +75,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Spremanje snimke zaslona..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Snimka zaslona spremljena"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Dodirnite da biste vidjeli snimku zaslona"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Snimka zaslona nije spremljena"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Pokušajte ponovo napraviti snimku zaslona"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Zaslon nije snimljen zbog ograničenog prostora za pohranu"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Aplikacija ili vaša organizacija ne dopuštaju snimanje zaslona"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opcije USB prijenosa datoteka"</string>
@@ -351,8 +349,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Uključuje se u <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC je onemogućen"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC je omogućen"</string>
@@ -436,8 +433,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> počet će snimati sve što se prikazuje na zaslonu."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne prikazuj ponovo"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Izbriši sve"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Upravljanje obavijestima"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Način Ne uznemiravaj sakriva obavijesti"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Započni sad"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Nema obavijesti"</string>
@@ -538,6 +534,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvonjenje"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Zvuk je isključen"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dodirnite da biste uključili zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dodirnite da biste postavili na vibraciju. Usluge pristupačnosti moĆŸda neće imati zvuk."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti moĆŸda neće imati zvuk."</string>
@@ -634,8 +634,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g> za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"kontrole obavijesti"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcije odgode obavijesti"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Odgoda"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"PONIŠTI"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 6766e4c..056c525 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"KépernyƑkép mentése..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"A képernyƑkép mentése sikerült"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Koppintson a képernyƑkép megtekintéséhez"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Nem sikerült a képernyƑkép mentése"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Próbálja meg újra elkészíteni a képernyƑképet"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Nem menthet képernyƑképet, mert kevés a tárhely"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Az alkalmazás vagy az Ön szervezete nem engedélyezi képernyƑkép készítését"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB-fájlátvitel beállításai"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Be: naplemente"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Napfelkeltéig"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Bekapcsolás: <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Eddig: <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Az NFC ki van kapcsolva"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Az NFC be van kapcsolva"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkalmazás rögzíteni fog mindent, ami megjelenik a képernyƑn."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ne jelenjen meg többé"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Az összes törlése"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Az értesítések kezelése"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"A Ne zavarjanak mód elrejti az értesítéseket"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Indítás most"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Nincs értesítés"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Csörgés"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Rezgés"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Néma"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Koppintson a némítás megszüntetéséhez."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Koppintson a rezgés beállításához. ElƑfordulhat, hogy a kisegítƑ lehetƑségek szolgáltatásai le vannak némítva."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Koppintson a némításhoz. ElƑfordulhat, hogy a kisegítƑ lehetƑségek szolgáltatásai le vannak némítva."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> – <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"értesítésvezérlƑk"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"értesítések halasztási beállításai"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Halasztás"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"VISSZAVONÁS"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Elhalasztva: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 7037215..39b6cd6 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Ô·ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Őš ŐșŐĄŐ°ŐŸŐžÖ‚ŐŽ Ő§..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Ô·ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Őš ŐșŐĄŐ°ŐŸŐ„Ö"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ՀŐșŐ„Ö„Ő Ő§ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Őš ŐżŐ„ŐœŐ¶Ő„ŐŹŐžÖ‚ հածար"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Ő‰Ő°ŐĄŐ»ŐžŐČŐŸŐ„Ö ŐșŐĄŐ°Ő„ŐŹ Ő§ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Őš"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Ő“ŐžÖ€Ő±Ő„Ö„ ն՞րից"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ő‰Ő°ŐĄŐ»ŐžŐČŐŸŐ„Ö ŐșŐĄŐ°Ő„ŐŹ Ő§ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Őš ŐĄŐ¶ŐąŐĄŐŸŐĄÖ€ŐĄÖ€ Ő°Ő«Ő·ŐžŐČŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐșŐĄŐżŐłŐĄŐŒŐžŐŸ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ő€ŐĄŐŸŐ„ŐŹŐŸŐĄŐźŐš ŐŻŐĄŐŽ Ő±Ő„Ö€ ŐŻŐĄŐŠŐŽŐĄŐŻŐ„Ö€ŐșŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Őš ŐčŐ« Ő©ŐžÖ‚Ő”ŐŹŐĄŐżÖ€ŐžÖ‚ŐŽ Ő§ŐŻÖ€ŐĄŐ¶Ő« ŐșŐĄŐżŐŻŐ„Ö€Ő« ŐœŐżŐĄÖŐžÖ‚ŐŽŐš"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB Ö†ŐĄŐ”ŐŹŐ„Ö€Ő« փ՞խենցՎեն ŐšŐ¶ŐżÖ€ŐĄŐ¶Ö„Ő¶Ő„Ö€"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ÔżŐŽŐ«ŐĄÖŐŸŐ« ŐŽŐĄŐ”Ö€ŐĄŐŽŐžÖ‚ŐżŐ«Ő¶"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ő„Ő«Ő¶Őčև ŐŹŐžÖ‚ŐœŐĄŐąŐĄÖ"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ÔżŐŽŐ«ŐĄÖŐŸŐ« ŐȘŐĄŐŽŐš <xliff:g id="TIME">%s</xliff:g>-Ő«Ő¶"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Ő„Ő«Ő¶Őčև <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-Ő¶ ŐĄŐ¶Ő»ŐĄŐżŐŸŐĄŐź Ő§"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-Ő¶ ŐŽŐ«ŐĄÖŐŸŐĄŐź Ő§"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ŐźÖ€ŐĄŐŁŐ«Ö€Őš ŐŻŐœŐŻŐœŐ« Ő°ŐĄŐŸŐĄÖ„Ő„ŐŹ ŐĄŐ”Ő¶ ŐĄŐŽŐ„Ő¶Ő¶ Ő«Ő¶Őč ÖŐžÖ‚ÖŐĄŐ€Ö€ŐŸŐžÖ‚ŐŽ Ő§ Ő±Ő„Ö€ Ő§ŐŻÖ€ŐĄŐ¶Ő«Ő¶:"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ô±Ő”ŐŹÖ‡Őœ ց՞ւՔց ŐčŐżŐĄŐŹ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Ő„ŐĄÖ„Ö€Ő„ŐŹ ձվլվրչ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"ÔżŐĄŐŒŐĄŐŸŐĄÖ€Ő„ŐŹ ՟են՞ւց՞ւՎնՄր՚"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"«Ő‰ŐĄŐ¶Ő°ŐĄŐ¶ŐŁŐœŐżŐĄÖŐ¶Ő„ŐŹ» ŐŒŐ„ŐȘŐ«ŐŽŐžÖ‚ŐŽ ՟են՞ւց՞ւՎնՄր՚ Ő©ŐĄÖ„ÖŐŸŐžÖ‚ŐŽ Ő„Ő¶"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ŐŐŻŐœŐ„ŐŹ Ő°Ő«ŐŽŐĄ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"ÔŸŐĄŐ¶ŐžÖ‚ÖŐžÖ‚ŐŽŐ¶Ő„Ö€ ŐčŐŻŐĄŐ¶"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ŐŐžŐŸŐžÖ€ŐĄŐŻŐĄŐ¶"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ÔčÖ€Ő©ŐŒŐĄŐŠŐĄŐ¶ŐŁ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ô±Ő¶Ő±ŐĄŐ”Ő¶"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s: ՀŐșŐ„Ö„Ő Ő±ŐĄŐ”Ő¶Őš ՎիեցնՄՏ՞ւ հածար:"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s: ՀŐșŐ„Ö„Ő Ő©Ö€Ő©ŐŒŐžÖ‚ŐŽŐš ՎիեցնՄՏ՞ւ հածար: ՄատŐčŐ„ŐŹŐ«ŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Ő¶Ő„Ö€Ő« Ő±ŐĄŐ”Ő¶Őš կարվŐČ Ő§ ŐĄŐ¶Ő»ŐĄŐżŐŸŐ„ŐŹ:"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s: ՀŐșŐ„Ö„Ő Ő±ŐĄŐ”Ő¶Ő¶ ŐĄŐ¶Ő»ŐĄŐżŐ„ŐŹŐžÖ‚ հածար: ՄատŐčŐ„ŐŹŐ«ŐžÖ‚Ő©Ő”ŐĄŐ¶ ŐźŐĄŐŒŐĄŐ”ŐžÖ‚Ő©Ő”ŐžÖ‚Ő¶Ő¶Ő„Ö€Ő« Ő±ŐĄŐ”Ő¶Őš կարվŐČ Ő§ ŐĄŐ¶Ő»ŐĄŐżŐŸŐ„ŐŹ:"</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"՟են՞ւցՎեն ŐŻŐĄŐŒŐĄŐŸŐĄÖ€Ő¶Ő„Ö€"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"՟են՞ւցՎեն Ő°Ő„ŐżŐĄŐ±ŐŁŐŽŐĄŐ¶ ŐšŐ¶ŐżÖ€ŐĄŐ¶Ö„Ő¶Ő„Ö€"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Ő€Ő„ŐżŐĄŐ±ŐŁŐ„ŐŹ"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"Ő€Ô”ŐÔ±ŐÔżÔ”ÔŒ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Ő€Ő„ŐżŐĄŐ±ŐŁŐŸŐ„ŐŹ Ő§ <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ŐžŐŸ"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index d497c5c..4c2aec5 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dering"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Getar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Nonaktifkan"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketuk untuk menyuarakan."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 8fdb4e7..7a19ad0 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Vistar skjámynd…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Skjámynd vistuð"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Ýttu til skoða skjámyndina"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Ekki var hægt að vista skjámynd"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Prófaðu að taka skjámynd aftur"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Ekki tókst að vista skjámynd vegna takmarkaðs geymslupláss"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Forritið eða fyrirtækið þitt leyfir ekki skjámyndatöku"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Valkostir USB-skráaflutnings"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kveikt við sólsetur"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til sólarupprásar"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Kveikt klukkan <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til klukkan <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Slökkt á NFC"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Kveikt á NFC"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun fanga allt sem birtist á skjánum."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ekki sýna þetta aftur"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Hreinsa allt"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Stjórna tilkynningum"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"„Ónáðið ekki“ felur tilkynningar"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Byrja núna"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Engar tilkynningar"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Hringing"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Titringur"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Hljóð af"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ýttu til að hætta að þagga."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ýttu til að stilla á titring. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"tilkynningastýringar"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"þöggunarstillingar tilkynninga"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Fresta"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"AFTURKALLA"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Þaggað í <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 67f6942..02b285f 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -53,8 +53,8 @@
     <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth con tethering"</string>
     <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Configura metodi di immissione"</string>
     <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Tastiera fisica"</string>
-    <string name="usb_device_permission_prompt" msgid="1825685909587559679">"Vuoi consentire a <xliff:g id="APPLICATION">%1$s</xliff:g> di accedere a <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
-    <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"Vuoi consentire a <xliff:g id="APPLICATION">%1$s</xliff:g> di accedere a <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
+    <string name="usb_device_permission_prompt" msgid="1825685909587559679">"Consentire a <xliff:g id="APPLICATION">%1$s</xliff:g> di accedere a <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
+    <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"Consentire a <xliff:g id="APPLICATION">%1$s</xliff:g> di accedere a <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
     <string name="usb_device_confirm_prompt" msgid="7440562274256843905">"Vuoi aprire <xliff:g id="APPLICATION">%1$s</xliff:g> per gestire <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string>
     <string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"Vuoi aprire <xliff:g id="APPLICATION">%1$s</xliff:g> per gestire <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string>
     <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Nessuna app installata funziona con questo accessorio USB. Altre info su <xliff:g id="URL">%1$s</xliff:g>."</string>
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Salvataggio screenshot..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot salvato"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Tocca per visualizzare lo screenshot"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Impossibile salvare lo screenshot"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Riprova ad acquisire lo screenshot"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Impossibile salvare lo screenshot a causa dello spazio di archiviazione limitato"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"L\'acquisizione di screenshot non è consentita dall\'app o dall\'organizzazione"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opzioni trasferimento file USB"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Attivata al tramonto"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fino all\'alba"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Attivata alle ore <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Fino alle ore <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC non attiva"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC attiva"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> inizierà ad acquisire tutto ciò che è visualizzato sul tuo schermo."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Non mostrare più"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Cancella tutto"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Gestisci le notifiche"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"La modalità Non disturbare nasconde le notifiche"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Avvia adesso"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Nessuna notifica"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Attiva suoneria"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Attiva vibrazione"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Disattiva suoneria"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tocca per riattivare l\'audio."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"gestione delle notifiche"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"opzioni di posticipazione notifiche"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Posticipa"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ANNULLA"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Posticipato di <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 5973b43..8d3a954 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -76,10 +76,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Ś©Ś•ŚžŚš ŚŠŚ™ŚœŚ•Ś ŚžŚĄŚš..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ŚŠŚ™ŚœŚ•Ś Ś”ŚžŚĄŚš Ś Ś©ŚžŚš"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ŚŚ€Ś©Śš ŚœŚ”Ś§Ś™Ś© Ś›Ś“Ś™ ŚœŚ”ŚŠŚ™Ś’ ŚŚȘ ŚŠŚ™ŚœŚ•Ś Ś”ŚžŚĄŚš"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ŚœŚ Ś Ś™ŚȘŚŸ Ś”Ś™Ś” ŚœŚ©ŚžŚ•Śš ŚŠŚ™ŚœŚ•Ś ŚžŚĄŚš"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Ś™Ś© ŚœŚ ŚĄŚ•ŚȘ Ś©Ś•Ś‘ ŚœŚ‘ŚŠŚą ŚŠŚ™ŚœŚ•Ś ŚžŚĄŚš"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ŚœŚ Ś”Ś™Ś” ŚžŚĄŚ€Ś™Ś§ ŚžŚ§Ś•Ś ŚœŚ©ŚžŚ•Śš ŚŚȘ ŚŠŚ™ŚœŚ•Ś Ś”ŚžŚĄŚš"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ś”ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś” ŚŚ• Ś”ŚŚšŚ’Ś•ŚŸ Ś©ŚœŚš ŚŚ™Ś Ś ŚžŚȘŚ™ŚšŚ™Ś ŚœŚ™ŚŠŚ•Śš ŚŠŚ™ŚœŚ•ŚžŚ™ ŚžŚĄŚš"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"‏ŚŚ€Ś©ŚšŚ•Ś™Ś•ŚȘ Ś”ŚąŚ‘ŚšŚȘ Ś§Ś‘ŚŠŚ™Ś Ś‘-USB"</string>
@@ -354,8 +352,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ŚžŚ•Ś€ŚąŚœ Ś‘Ś©Ś§Ś™ŚąŚ”"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ŚąŚ“ Ś”Ś–ŚšŚ™Ś—Ś”"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ŚžŚ•Ś€ŚąŚœ Ś‘Ś©ŚąŚ” <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"ŚąŚ“ <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"‏NFC ŚžŚ•Ś©Ś‘ŚȘ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"‏NFC ŚžŚ•Ś€ŚąŚœ"</string>
@@ -439,10 +436,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> Ś™ŚȘŚ—Ś™Śœ ŚœŚ”Ś§ŚœŚ™Ś˜ ŚŚȘ Ś›Śœ Ś”ŚȘŚ•Ś›ŚŸ Ś”ŚžŚ•ŚŠŚ’ Ś‘ŚžŚĄŚš Ś©ŚœŚš."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ŚŚœ ŚȘŚŠŚ™Ś’ Ś©Ś•Ś‘"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Ś Ś§Ś” Ś”Ś›Śœ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Ś Ś™Ś”Ś•Śœ Ś”ŚȘŚšŚŚ•ŚȘ"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ŚžŚŠŚ‘ \'Ś Ś ŚœŚ ŚœŚ”Ś€ŚšŚ™Śą\' ŚžŚĄŚȘŚ™Śš Ś”Ś•Ś“ŚąŚ•ŚȘ"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Ś”ŚȘŚ—Śœ Ś›ŚąŚȘ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"ŚŚ™ŚŸ Ś”Ś•Ś“ŚąŚ•ŚȘ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"Ś™Ś™ŚȘŚ›ŚŸ Ś©Ś”Ś€ŚšŚ•Ś€Ś™Śœ Ś ŚȘŚ•ŚŸ ŚœŚžŚąŚ§Ś‘"</string>
@@ -542,6 +537,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ŚŠŚœŚŠŚ•Śœ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ŚšŚ˜Ś˜"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ś”Ś©ŚȘŚ§Ś”"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"‏%1$s. Ś”Ś§Ś© Ś›Ś“Ś™ ŚœŚ‘Ś˜Śœ ŚŚȘ Ś”Ś”Ś©ŚȘŚ§Ś”."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"‏%1$s. Ś”Ś§Ś© Ś›Ś“Ś™ ŚœŚ”Ś’Ś“Ś™Śš ŚšŚ˜Ś˜. Ś™Ś™ŚȘŚ›ŚŸ Ś©Ś©Ś™ŚšŚ•ŚȘŚ™ Ś”Ś Ś’Ś™Ś©Ś•ŚȘ ŚžŚ•Ś©ŚȘŚ§Ś™Ś."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"‏%1$s. Ś”Ś§Ś© Ś›Ś“Ś™ ŚœŚ”Ś©ŚȘŚ™Ś§. Ś™Ś™ŚȘŚ›ŚŸ Ś©Ś©Ś™ŚšŚ•ŚȘŚ™ Ś”Ś Ś’Ś™Ś©Ś•ŚȘ ŚžŚ•Ś©ŚȘŚ§Ś™Ś."</string>
@@ -640,8 +639,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Ś‘Ś§ŚšŚȘ Ś”Ś•Ś“ŚąŚ•ŚȘ"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"ŚŚ€Ś©ŚšŚ•Ś™Ś•ŚȘ Ś©Śœ Ś“Ś—Ś™Ś™ŚȘ Ś”Ś•Ś“ŚąŚ•ŚȘ ŚœŚ˜Ś™Ś€Ś•Śœ Ś‘Ś”ŚžŚ©Śš"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Ś”Ś€ŚąŚœŚȘ Ś Ś•Ś“Ś Ś™Ś§"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"Ś‘Ś™Ś˜Ś•Śœ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Ś Ś“Ś—Ś” ŚœŚ˜Ś™Ś€Ś•Śœ Ś‘ŚąŚ•Ś“ <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -834,8 +832,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"ŚŠŚ™ŚœŚ•ŚžŚ™ ŚžŚĄŚš"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"Ś”Ś•Ś“ŚąŚ•ŚȘ Ś›ŚœŚœŚ™Ś•ŚȘ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"ŚŚ—ŚĄŚ•ŚŸ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"Ś˜Ś™Ś€Ś™Ś"</string>
     <string name="instant_apps" msgid="6647570248119804907">"ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś•ŚȘ ŚŚ™Ś ŚĄŚ˜Ś Ś˜"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś•ŚȘ ŚŚ™Ś ŚĄŚ˜Ś Ś˜ ŚœŚ Ś“Ś•ŚšŚ©Ś•ŚȘ Ś”ŚȘŚ§Ś Ś”."</string>
     <string name="app_info" msgid="6856026610594615344">"Ś€ŚšŚ˜Ś™ ŚŚ€ŚœŚ™Ś§ŚŠŚ™Ś”"</string>
@@ -863,18 +860,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"Ś™Ś© ŚœŚŚ©Śš Śœ-<xliff:g id="APP">%1$s</xliff:g> ŚœŚ”ŚšŚŚ•ŚȘ Ś—ŚœŚ§Ś™Ś ŚžŚ›Śœ ŚŚ€ŚœŚ™ŚŠŚ™Ś” Ś©Ś”Ś™Ś"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"ŚŚ Ś™ ŚšŚ•ŚŠŚ” ŚœŚŚ©Śš"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"ŚŚ Ś™ ŚœŚ ŚžŚšŚ©Ś”"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"Ś™Ś© ŚœŚ”Ś§Ś™Ś© Ś›Ś“Ś™ ŚœŚȘŚ–ŚžŚŸ ŚŚȘ ŚžŚŠŚ‘ Ś”Ś—Ś™ŚĄŚ›Ś•ŚŸ Ś‘ŚĄŚ•ŚœŚœŚ”"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Ś”Ś€ŚąŚœŚ” ŚŚ•Ś˜Ś•ŚžŚ˜Ś™ŚȘ Ś›Ś©Ś”ŚĄŚ•ŚœŚœŚ” Ś‘ŚšŚžŚȘ Ś˜ŚąŚ™Ś Ś” Ś©Śœ <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"ŚœŚ ŚȘŚ•Ś“Ś”"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Ś”Ś•Ś€ŚąŚœ ŚȘŚ–ŚžŚ•ŚŸ Ś©Śœ Ś—Ś™ŚĄŚ›Ś•ŚŸ Ś‘ŚĄŚ•ŚœŚœŚ”"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"ŚžŚŠŚ‘ Ś—Ś™ŚĄŚ›Ś•ŚŸ Ś‘ŚĄŚ•ŚœŚœŚ” Ś™Ś•Ś€ŚąŚœ Ś‘ŚŚ•Ś€ŚŸ ŚŚ•Ś˜Ś•ŚžŚ˜Ś™ Ś›Ś©ŚšŚžŚȘ Ś˜ŚąŚ™Ś ŚȘ Ś”ŚĄŚ•ŚœŚœŚ” ŚȘŚ”Ś™Ś” Ś ŚžŚ•Ś›Ś” Śž-<xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"Ś”Ś’Ś“ŚšŚ•ŚȘ"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ś”Ś‘Ś ŚȘŚ™"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index b962972..259b9bd 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’äżć­˜ă—ăŠă„ăŸă™..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’äżć­˜ă—ăŸă—ăŸ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"タップするべă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆăŒèĄšç€șă•ă‚ŒăŸă™"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆäżć­˜ă‚šăƒ©ăƒŒ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’æ’źă‚Šç›Žă—ăŠăă ă•ă„"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ç©șきćźčé‡ăŒè¶łă‚ŠăȘいため、ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆă‚’äżć­˜ă§ăăŸă›ă‚“"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ă‚čクăƒȘăƒŒăƒłă‚·ăƒ§ăƒƒăƒˆăźäœœæˆăŻă‚ąăƒ—ăƒȘăŸăŸăŻç”„çč”ă§èš±ćŻă•ă‚ŒăŠă„ăŸă›ă‚“"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USBăƒ•ă‚Ąă‚€ăƒ«è»ąé€ă‚Șăƒ—ă‚·ăƒ§ăƒł"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"æ—„ăźć…„ă‚Šă« ON"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"æ—„ăźć‡șăŸă§"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ăŸă§"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無ćŠčです"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ăŻæœ‰ćŠčです"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ă§ă€ç”»éąă«èĄšç€șă•ă‚ŒăŠă„ă‚‹ă‚łăƒłăƒ†ăƒłăƒ„ăźă‚­ăƒŁăƒ—ăƒăƒŁă‚’é–‹ć§‹ă—ăŸă™ă€‚"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"æŹĄć›žă‹ă‚‰èĄšç€șしăȘい"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"すăčăŠæ¶ˆćŽ»"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"é€šçŸ„ă‚’çźĄç†ă™ă‚‹"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ăƒžăƒŠăƒŒăƒąăƒŒăƒ‰ă§ăŻé€šçŸ„ăŒéžèĄšç€șにăȘă‚ŠăŸă™"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"今すぐ開構"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"é€šçŸ„ăŻă‚ă‚ŠăŸă›ă‚“"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"着信音"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ăƒă‚€ăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒł"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ăƒŸăƒ„ăƒŒăƒˆ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$să€‚ă‚żăƒƒăƒ—ă—ăŠăƒŸăƒ„ăƒŒăƒˆă‚’è§Łé™€ă—ăŸă™ă€‚"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$să€‚ă‚żăƒƒăƒ—ă—ăŠăƒă‚€ăƒ–ăƒŹăƒŒă‚·ăƒ§ăƒłă«èš­ćźšă—ăŸă™ă€‚ăƒŠăƒŒă‚¶ăƒŒèŁœćŠ©æ©Ÿèƒœă‚”ăƒŒăƒ“ă‚čăŒăƒŸăƒ„ăƒŒăƒˆă•ă‚Œă‚‹ć ŽćˆăŒă‚ă‚ŠăŸă™ă€‚"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$să€‚ă‚żăƒƒăƒ—ă—ăŠăƒŸăƒ„ăƒŒăƒˆă—ăŸă™ă€‚ăƒŠăƒŒă‚¶ăƒŒèŁœćŠ©æ©Ÿèƒœă‚”ăƒŒăƒ“ă‚čăŒăƒŸăƒ„ăƒŒăƒˆă•ă‚Œă‚‹ć ŽćˆăŒă‚ă‚ŠăŸă™ă€‚"</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"é€šçŸ„çźĄç†"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"通矄ă‚čăƒŒăƒŒă‚șèš­ćźš"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ă‚čăƒŒăƒŒă‚ș"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ć…ƒă«æˆ»ă™"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"ă‚čăƒŒăƒŒă‚ș: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index f198fdf..d3705ee 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ეკრანის სურათის ჹენაჼვა…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ეკრანის ანაბეჭდი ჹენაჼულია"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ჹეეჼეთ ეკრანის ანაბეჭდის სანაჼავად"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ეკრანის ანაბეჭდის ჹენაჼვა ვერ მოჼერჼდა"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ჼელაჼლა áƒȘადეთ ეკრანის ანაბეჭდის გაკეთება"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ეკრანის ანაბეჭდის ჹენაჼვა ვერ მოჼერჼდა ჹეზჩუდული მეჼსიერების გამო"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ეკრანის ანაბეჭდების ლეჄმნა არ არიქ ნებადართული აპის ან თჄვენი ორგანიზაáƒȘიიქ მიერ"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB áƒ€áƒáƒ˜áƒšáƒ˜áƒĄ áƒąáƒ áƒáƒœáƒĄáƒ€áƒ”áƒ áƒ˜áƒĄ პარამეჱრები"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"áƒ©áƒáƒ˜áƒ áƒ—áƒáƒĄ მზის áƒ©áƒáƒĄáƒ•áƒšáƒ˜áƒĄáƒáƒĄ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"მზის ამოსვლამდე"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"áƒ©áƒáƒ˜áƒ áƒ—áƒáƒĄ <xliff:g id="TIME">%s</xliff:g>-ზე"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>-მდე"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC გათიჹულია"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC áƒ©áƒáƒ áƒ—áƒŁáƒšáƒ˜áƒ"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> დაიწყებს იმ áƒ§áƒ•áƒ”áƒšáƒáƒ€áƒ áƒ˜áƒĄ აჩბეჭდვას, რაáƒȘ áƒ—áƒ„áƒ•áƒ”áƒœáƒĄ ეკრანზე áƒ©áƒáƒœáƒĄ."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ა჊არ მაჩვენო"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"ყველას áƒ’áƒáƒĄáƒŁáƒ€áƒ—áƒáƒ•áƒ”áƒ‘áƒ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"ჹეჱყობინებების მართვა"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"„არ ჹემაწუჼოთ“ რეჟიმი მალავს ჹეჱყობინებებს"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"დაწყება აჼლავე"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"ჹეჱყობინებები არ არის."</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"დარეკვა"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ვიბრაáƒȘია"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"დადუმება"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ჹეეჼეთ დადუმების áƒ’áƒáƒĄáƒáƒŁáƒ„áƒ›áƒ”áƒ‘áƒšáƒáƒ“."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ჹეეჼეთ ვიბრაáƒȘიაზე დასაყენებლად. ლეიძლება დადუმდეს მარჱივი წვდომის სერვისებიáƒȘ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ჹეეჼეთ დასადუმებლად. ლეიძლება დადუმდეს მარჱივი წვდომის სერვისებიáƒȘ."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"ჹეჱყობინებების მართვის საჹუალებები"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"ჹეჱყობინებების áƒ©áƒáƒ©áƒŁáƒ›áƒ”áƒ‘áƒ˜áƒĄ ვარიანჱები"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"áƒ©áƒáƒ©áƒŁáƒ›áƒ”áƒ‘áƒ"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"áƒ›áƒáƒ„áƒ›áƒ”áƒ“áƒ”áƒ‘áƒ˜áƒĄ áƒ’áƒáƒŁáƒ„áƒ›áƒ”áƒ‘áƒ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"áƒ©áƒáƒ©áƒŁáƒ›áƒ”áƒ‘áƒŁáƒšáƒ˜ იჄნება <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 54ccf3c..6c94b29 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚Ń‚Ń‹ ŃĐ°Ò›Ń‚Đ°ŃƒĐŽĐ°…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ ŃĐ°Ò›Ń‚Đ°Đ»ĐŽŃ‹"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚Ń‚Ń‹ ĐșÓ©Ń€Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ ŃĐ°Ò›Ń‚Đ°Đ»ĐŒĐ°ĐŽŃ‹"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ÒšĐ°Đčта сĐșŃ€ĐžĐœŃˆĐŸŃ‚ жасап ĐșÓ©Ń€Ń–ÒŁŃ–Đ·"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Đ–Đ°ĐŽŃ‚Đ°Ò“Ń‹ шДĐșŃ‚Đ”ŃƒĐ»Ń– Đ±ĐŸŃ ĐŸŃ€Ń‹ĐœÒ“Đ° баĐčĐ»Đ°ĐœŃ‹ŃŃ‚Ń‹ сĐșŃ€ĐžĐœŃˆĐŸŃ‚ ŃĐ°Ò›Ń‚Đ°Đ»ĐŒĐ°ĐčЮы"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ÒšĐŸĐ»ĐŽĐ°ĐœĐ±Đ° ĐœĐ”ĐŒĐ”ŃĐ” Ò±ĐčŃ‹ĐŒ сĐșŃ€ĐžĐœŃˆĐŸŃ‚Ń‚Đ°Ń€ Ń‚ÒŻŃŃ–Ń€ŃƒĐłĐ” Ń€Ò±Ò›ŃĐ°Ń‚ ДтпДĐčЮі"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB фаĐčĐ»Ń‹Đœ Đ¶Ń–Đ±Đ”Ń€Ńƒ ĐŸĐżŃ†ĐžŃĐ»Đ°Ń€Ń‹"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ĐšÒŻĐœ Đ±Đ°Ń‚Ò›Đ°ĐœĐŽĐ° Ò›ĐŸŃŃƒ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ĐšÒŻĐœ ŃˆŃ‹Ò›Ò›Đ°ĐœÒ“Đ° ĐŽĐ”ĐčŃ–Đœ"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ÒšĐŸŃŃ‹Đ»Ńƒ ŃƒĐ°Ò›Ń‹Ń‚Ń‹: <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ĐŽĐ”ĐčŃ–Đœ"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC Ó©ŃˆŃ–Ń€ŃƒĐ»Ń–"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC Ò›ĐŸŃŃƒĐ»Ń‹"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> эĐșŃ€Đ°ĐœĐŽĐ° ĐșÓ©Ń€ŃĐ”Ń‚Ń–Đ»ĐłĐ”ĐœĐœŃ–ÒŁ Đ±Đ°Ń€Đ»Ń‹Ò“Ń‹Đœ Ń‚ÒŻŃŃ–Ń€Đ” бастаĐčЮы."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ÒšĐ°Đčта ĐșÓ©Ń€ŃĐ”Ń‚ĐżĐ”Ńƒ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Đ‘Đ°Ń€Đ»Ń‹Ò“Ń‹Đœ Ń‚Đ°Đ·Đ°Đ»Đ°Ńƒ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Đ„Đ°Đ±Đ°Ń€Đ»Đ°ĐœĐŽŃ‹Ń€ŃƒĐ»Đ°Ń€ĐŽŃ‹ Đ±Đ°ŃÒ›Đ°Ń€Ńƒ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"ĐœĐ°Đ·Đ°Đ»Đ°ĐŒĐ°Ńƒ\" Ń€Đ”Đ¶ĐžĐŒŃ– Ń…Đ°Đ±Đ°Ń€Đ»Đ°ĐœĐŽŃ‹Ń€ŃƒĐ»Đ°Ń€ĐŽŃ‹ Đ¶Đ°ŃŃ‹Ń€ŃƒĐŽĐ°"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ÒšĐ°Đ·Ń–Ń€ Đ±Đ°ŃŃ‚Đ°Ńƒ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Đ„Đ°Đ±Đ°Ń€Đ»Đ°ĐœĐŽŃ‹Ń€ŃƒĐ»Đ°Ń€ Đ¶ĐŸÒ›"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ĐšŃ‹Đ»ĐŽŃ‹Ń€Đ»Đ°Ńƒ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Діріл"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Đ”Ń‹Đ±Ń‹ŃŃ‹Đœ Ó©ŃˆŃ–Ń€Ńƒ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Đ”Ń‹Đ±Ń‹ŃŃ‹Đœ Ò›ĐŸŃŃƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Діріл Ń€Đ”Đ¶ĐžĐŒŃ–Đœ ĐŸŃ€ĐœĐ°Ń‚Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·. ĐŃ€ĐœĐ°Đčы ĐŒÒŻĐŒĐșŃ–ĐœĐŽŃ–Đș Ò›Ń‹Đ·ĐŒĐ”Ń‚Ń‚Đ”Ń€Ń–ĐœŃ–ÒŁ Ўыбысы Ó©ŃˆŃƒŃ– ĐŒÒŻĐŒĐșŃ–Đœ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Đ”Ń‹Đ±Ń‹ŃŃ‹Đœ Ó©ŃˆŃ–Ń€Ńƒ ÒŻŃˆŃ–Đœ Ń‚ÒŻŃ€Ń‚Ń–ÒŁŃ–Đ·. ĐŃ€ĐœĐ°Đčы ĐŒÒŻĐŒĐșŃ–ĐœĐŽŃ–Đș Ò›Ń‹Đ·ĐŒĐ”Ń‚Ń‚Đ”Ń€Ń–ĐœŃ–ÒŁ Ўыбысы Ó©ŃˆŃƒŃ– ĐŒÒŻĐŒĐșŃ–Đœ."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Ń…Đ°Đ±Đ°Ń€Đ»Đ°ĐœĐŽŃ‹Ń€ŃƒĐ»Đ°Ń€ĐŽŃ‹ Đ±Đ°ŃÒ›Đ°Ń€Ńƒ ŃĐ»Đ”ĐŒĐ”ĐœŃ‚Ń‚Đ”Ń€Ń–"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Ń…Đ°Đ±Đ°Ń€Đ»Đ°ĐœĐŽŃ‹Ń€ŃƒĐŽŃ‹ ĐșіЮірту ĐŸĐżŃ†ĐžŃĐ»Đ°Ń€Ń‹"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"КіЮірту"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"КЕРІ ÒšĐĐ™ĐąĐĐ ĐŁ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ĐșіЎіртілЎі"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index a886e32..ab10679 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"រោទ៍"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ញ័រ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"áž”áž·áž‘ážŸáŸ†ážĄáŸáž„"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s។ áž”áŸ‰áŸ‡ážŠážŸáž˜áŸ’áž”ážžáž”ážŸáž€ážŸáŸ†ážĄáŸáž„áŸ”"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s។ ប៉ះដសម្បឞកំណត់ážČ្យញ័រ។ ážŸáŸážœáž¶áž€áž˜áŸ’áž˜áž›áž‘áŸ’áž’áž—áž¶áž–áž”áŸ’ážšážŸáž”áŸ’ážšáž¶ážŸáŸ‹ážąáž¶áž…áž“ážčáž„ážáŸ’ážšážŒážœáž”áž¶áž“áž”áž·áž‘ážŸáŸ†ážĄáŸáž„áŸ”"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s។ áž”áŸ‰áŸ‡ážŠážŸáž˜áŸ’áž”ážžáž”áž·áž‘ážŸáŸ†ážĄáŸáž„áŸ” ážŸáŸážœáž¶áž€áž˜áŸ’áž˜áž›áž‘áŸ’áž’áž—áž¶áž–áž”áŸ’ážšážŸáž”áŸ’ážšáž¶ážŸáŸ‹ážąáž¶áž…áž“ážčáž„ážáŸ’ážšážŒážœáž”áž¶áž“áž”áž·áž‘ážŸáŸ†ážĄáŸáž„áŸ”"</string>
@@ -846,7 +850,7 @@
     <string name="auto_saver_text" msgid="6324376061044218113">"បសក​ដោយ​ស្វ័យ​ប្រវត្តិ​ នៅ​ពេល​ដែល​ថ្ម​នៅ​ត្រážčម <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"ទេ ឹរគុណ"</string>
     <string name="auto_saver_enabled_title" msgid="6726474226058316862">"កាលវិភាគ​កម្មវិធឞ​សន្សំ​ថ្ម​បាន​បសក​ហសយ"</string>
-    <string name="auto_saver_enabled_text" msgid="874711029884777579">"កម្មវិធឞ​សន្សំ​ថ្ម​នážčង​បសក​ដោយ​ស្វ័យ​ប្រវត្តិ​ បន្ទាប់​ពឞ​ថ្ម​នៅ​សល់​តិច​ជាង <xliff:g id="PERCENTAGE">%d</xliff:g>%% ។"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"កម្មវិធឞ​សន្សំ​ថ្ម​នážčង​បសក​ដោយ​ស្វ័យ​ប្រវត្តិ​ នៅពេល​ថ្ម​នៅ​សល់​តិច​ជាង <xliff:g id="PERCENTAGE">%d</xliff:g>%% ។"</string>
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ការកំណត់"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"យល់ហសយ"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 76343c3..f1bd012 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -431,8 +431,7 @@
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àČźàČ€àłàČ€àłŠàČźàłàČźàł† àČ€àł‹àČ°àČżàČžàČŠàČżàČ°àł"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àȎàČČàłàČČàČ”àČšàłàČšàł‚ àČ€àł†àČ°àČ”àłàČ—àłŠàČłàČżàČžàł"</string>
     <string name="manage_notifications_text" msgid="8035284146227267681">"àȅàȧàČżàČžàł‚àȚàČšàł†àȗàČłàČšàłàČšàł àČšàČżàČ°àłàČ”àČčàČżàČžàČż"</string>
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"àȅàČĄàȚàČŁàł† àČźàČŸàČĄàČŹàł‡àČĄàČż\" àČźàł‹àČĄàł àȅàȧàČżàČžàł‚àȚàČšàł†àȗàČłàČšàłàČšàł àČźàČ°àł†àČźàČŸàČĄàłàČ€àłàČ€àČżàČŠàł†"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àȈàȗ àČȘàłàČ°àČŸàČ°àȂàČ­àČżàČžàČż"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àČŻàČŸàČ”àłàČŠàł‡ àȅàȧàČżàČžàł‚àȚàČšàł†àȗàČłàČżàČČàłàČČ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àČȘàłàČ°àłŠàČ«àłˆàČČàł àȅàČšàłàČšàł àČȘàČ°àČżàČ”àł€àČ•àłàČ·àČżàČžàČŹàČčàłàČŠàČŸàȗàČżàČŠàł†"</string>
@@ -532,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àČ°àČżàȂàČ—àł"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àČ”àłˆàČŹàłàČ°àł‡àČŸàł‌"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àČźàłàČŻàł‚àČŸàł"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. àȅàČšàł‌àČźàłàČŻàł‚àČŸàł‌ àČźàČŸàČĄàłàČ”àłàČŠàČ•àłàȕàČŸàȗàČż àČŸàłàČŻàČŸàČȘàł àČźàČŸàČĄàČż."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. àȕàȂàČȘàČšàČ•àłàČ•àł† àČčàłŠàȂàČŠàČżàČžàČČàł àČŸàłàČŻàČŸàČȘàł àČźàČŸàČĄàČż. àČȘàłàČ°àČ”àł‡àȶàČżàČžàłàČ”àČżàČ•àł† àČžàł‡àČ”àł†àȗàČłàČšàłàČšàł àČźàłàČŻàł‚àČŸàł‌ àČźàČŸàČĄàČŹàČčàłàČŠàł."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. àČźàłàČŻàł‚àČŸàł àČźàČŸàČĄàČČàł àČŸàłàČŻàČŸàČȘàł àČźàČŸàČĄàČż. àČȘàłàČ°àČ”àł‡àȶàČżàČžàłàČ”àČżàČ•àł† àČžàł‡àČ”àł†àȗàČłàČšàłàČšàł àČźàłàČŻàł‚àČŸàł‌ àČźàČŸàČĄàČŹàČčàłàČŠàł."</string>
@@ -815,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àČžàłàČ•àłàČ°àł€àČšàł‌àȶàČŸàČŸàł‌àȗàČłàł"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àČžàČŸàČźàČŸàČšàłàČŻ àČžàȂàČŠàł‡àȶàȗàČłàł"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àČžàȂàČ—àłàČ°àČčàČŁàł†"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àČžàłàČłàČżàČ”àłàȗàČłàł"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àČ€àČ€àł‌àČ•àłàČ·àČŁ àȆàČȘàł‌àȗàČłàł"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àČ€àČ€àł‌àČ•àłàČ·àČŁ àȆàČȘàł‌àȗàČłàČżàČ—àł† àČžàłàČ„àČŸàČȘàČšàł†àČŻ àȅàȗàČ€àłàČŻàČ”àČżàČČàłàČČ."</string>
     <string name="app_info" msgid="6856026610594615344">"àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł àČźàČŸàČčàČżàČ€àČż"</string>
@@ -844,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"àČŻàČŸàČ”àłàČŠàł‡ àȅàČȘàłàČČàČżàČ•àł‡àȶàČšàł‌àČšàČżàȂàČŠ àČžàłàČČàłˆàČžàł‌àȗàČłàČšàłàČšàł àČ€àł‹àČ°àČżàČžàČČàł <xliff:g id="APP">%1$s</xliff:g> àȅàČšàłàČšàł àȅàČšàłàČźàČ€àČżàČžàČż"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àȅàČšàłàČźàČ€àČżàČžàČż"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àČšàČżàČ°àČŸàȕàČ°àČżàČžàČż"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àČŹàłàČŻàČŸàȟàČ°àČż àČžàł‡àČ”àČ°àł‌ àȅàČšàłàČšàł àČšàČżàȗàČŠàČżàČ—àłŠàČłàČżàČžàČČàł àČŸàłàČŻàČŸàČȘàł‌ àČźàČŸàČĄàČż"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àČŹàłàČŻàČŸàȟàČ°àČż <xliff:g id="PERCENTAGE">%d</xliff:g>%% àČ°àČ·àłàČŸàł àȇàČ°àłàČ”àČŸàȗ àČžàłàČ”àČŻàȂàȚàČŸàČČàČżàČ€àČ”àČŸàȗàČż àȆàČšàł‌ àȆàČ—àłàČ€àłàČ€àČŠàł†"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àČŹàł‡àČĄ àȧàČšàłàČŻàČ”àČŸàČŠàȗàČłàł"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àČŹàłàČŻàČŸàȟàČ°àČż àČžàł‡àČ”àČ°àł àČšàČżàȗàČŠàČżàČŻàČšàłàČšàł àȆàČšàł àČźàČŸàČĄàČČàČŸàȗàČżàČŠàł†"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àČŹàłàČŻàČŸàȟàČ°àČż <xliff:g id="PERCENTAGE">%d</xliff:g>%% àȗàČżàȂàČ€ àȕàČĄàČżàČźàł† àȆàČŠàČŸàȗ àČŹàłàČŻàČŸàȟàČ°àČż àČžàł‡àČ”àČ°àł‌ àČžàłàČ”àČŻàȂàȚàČŸàČČàČżàČ€àČ”àČŸàȗàČż àȆàČšàł‌ àȆàČ—àłàČ€àłàČ€àČŠàł†."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àČžàł†àČŸàłàȟàČżàȂàČ—àł‌àȗàČłàł"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àȅàČ°àłàČ„àČ”àČŸàČŻàČżàČ€àł"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index d830f90..9c58c89 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ìșĄìłí™”ë©Ž 저임 쀑..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ìŠ€íŹëŠ°ìƒ· 저임됚"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ìŠ€íŹëŠ°ìƒ·ì„ 확읞하렀멎 탭하섞요"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ìŠ€íŹëŠ°ìƒ·ì„ 저임할 수 없음"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ìŠ€íŹëŠ°ìƒ·ì„ 닀시 찍얎 ëłŽì„žìš”."</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"저임용량읎 ë¶€ìĄ±í•˜ì—Ź ìŠ€íŹëŠ°ìƒ·ì„ 저임할 수 없슔니닀"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"앱읎나 ìĄ°ì§ì—ì„œ ìŠ€íŹëŠ°ìƒ· ìŽŹì˜ì„ 허용하지 않슔니닀."</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB 파음 ì „ì†Ą 옔션"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"음ëȘ°ì—"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"음출êčŒì§€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>에"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g>êčŒì§€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ì‚Źìš© 쀑지됚"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ì‚Źìš© 섀정됚"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>에서 화멎에 표시된 ëȘšë“  êČƒì„ ìșĄìČ˜í•˜êž° 시작합니닀."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"닀시 표시 안핚"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"ëȘšë‘ 지우Ʞ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"알늌 êŽ€ëŠŹ"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"알늌 음시쀑지 êž°ëŠ„ìœŒëĄœ 알늌 숚Ʞ는 쀑"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"시작하Ʞ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"알늌 없음"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ëČšì†ŒëŠŹ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"진동"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"음소거"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. íƒ­í•˜ì—Ź 음소거넌 핎제하섞요."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. íƒ­í•˜ì—Ź ì§„ë™ìœŒëĄœ 섀정하섞요. 접귌성 서ëč„슀가 음소거될 수 있슔니닀."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. íƒ­í•˜ì—Ź ìŒì†Œê±°ëĄœ 섀정하섞요. 접귌성 서ëč„슀가 음소거될 수 있슔니닀."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"알늌 êŽ€ëŠŹ"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"알늌 음시 쀑지 옔션"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"음시 쀑지"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"싀행췚소"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> 동안 음시 쀑지됚"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 5cb4fd7..504ceeb 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ саĐșŃ‚Đ°Đ»ŃƒŃƒĐŽĐ°..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ саĐșталЎы"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ŃƒÒŁŃƒĐ·ĐŽŃƒ ĐșÓ©Ń€ÒŻÒŻ ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ саĐșŃ‚Đ°Đ»ĐłĐ°Đœ Đ¶ĐŸĐș"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚Ń‚Ńƒ ĐșĐ°Đčра тартып ĐșÓ©Ń€ÒŻÒŁÒŻĐ·"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ĐĄĐ°Đșтагычта Đ±ĐŸŃˆ ĐŸŃ€ŃƒĐœ Đ°Đ· Đ±ĐŸĐ»ĐłĐŸĐœĐŽŃƒĐșŃ‚Đ°Đœ сĐșŃ€ĐžĐœŃˆĐŸŃ‚ саĐșталбаĐč жатат"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ĐĄĐșŃ€ĐžĐœŃˆĐŸŃ‚ тартууга ĐșĐŸĐ»ĐŽĐŸĐœĐŒĐŸ жД ОшĐșĐ°ĐœĐ°ÒŁŃ‹Đ· тыюу ŃĐ°Đ»ĐłĐ°Đœ."</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB ĐŒĐ”ĐœĐ”Đœ фаĐčĐ» Ó©Ń‚ĐșÓ©Ń€ÒŻÒŻ ĐŒÒŻĐŒĐșÒŻĐœŃ‡ÒŻĐ»ÒŻĐșŃ‚Ó©Ń€ÒŻ"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ĐšÒŻĐœ батĐșĐ°ĐœĐŽĐ° ĐșÒŻĐčÓ©Ń‚"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ĐšÒŻĐœ чыĐșĐșĐ°ĐœĐłĐ° чДĐčĐžĐœ"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Саат <xliff:g id="TIME">%s</xliff:g> ĐșÒŻĐčÓ©Ń‚"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> чДĐčĐžĐœ"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC Ó©Ń‡ÒŻŃ€ÒŻĐ»ĐłÓ©Đœ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ĐžŃˆŃ‚Đ”Ń‚ĐžĐ»ĐłĐ”Đœ"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> эĐșŃ€Đ°ĐœĐłĐ° чыĐșĐșĐ°Đœ ĐœĐ”Ń€ŃĐ”ĐœĐžĐœ Đ±Đ°Đ°Ń€Ń‹Đœ ŃÒŻŃ€Ó©Ń‚ĐșÓ© тарта Đ±Đ°ŃˆŃ‚Đ°Đčт."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Đ­ĐșĐžĐœŃ‡Đž ĐșÓ©Ń€ŃÓ©Ń‚ÒŻĐ»Đ±Ó©ŃÒŻĐœ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Đ‘Đ°Ń€ĐŽŃ‹ĐłŃ‹Đœ тазалап салуу"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"ЭсĐșĐ”Ń€Ń‚ĐŒĐ”Đ»Đ”Ń€ĐŽĐž башĐșаруу"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"ĐąŃ‹ĐœŃ‡Ń‹ĐŒĐŽŃ‹ алба\" Ń€Đ”Đ¶ĐžĐŒĐž эсĐșĐ”Ń€Ń‚ĐŒĐ”Đ»Đ”Ń€ĐŽĐž Đ¶Đ°ŃˆŃ‹Ń€ŃƒŃƒĐŽĐ°"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Азыр Đ±Đ°ŃˆŃ‚ĐŸĐŸ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"ЭсĐșĐ”Ń€Ń‚ĐŒĐ”Đ»Đ”Ń€ Đ¶ĐŸĐș"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ĐšŃ‹ÒŁĐłŃ‹Ń€Đ°Ń‚ŃƒŃƒ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ДОрОлЎөө"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ÒźĐœŃÒŻĐ·"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ÒźĐœÒŻĐœ чыгаруу ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ДОрОлЎөөгө ĐșĐŸŃŽŃƒ ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·. АтаĐčŃ‹Đœ ĐŒÒŻĐŒĐșÒŻĐœŃ‡ÒŻĐ»ÒŻĐșŃ‚Ó©Ń€ ĐșŃ‹Đ·ĐŒĐ°Ń‚Ń‹ĐœŃ‹Đœ ÒŻĐœÒŻĐœ Ó©Ń‡ÒŻŃ€ÒŻĐż ĐșĐŸĐčŃĐŸ Đ±ĐŸĐ»ĐŸŃ‚."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ÒźĐœÒŻĐœ Ó©Ń‡ÒŻŃ€ÒŻÒŻ ÒŻŃ‡ÒŻĐœ таптап ĐșĐŸŃŽÒŁŃƒĐ·. АтаĐčŃ‹Đœ ĐŒÒŻĐŒĐșÒŻĐœŃ‡ÒŻĐ»ÒŻĐșŃ‚Ó©Ń€ ĐșŃ‹Đ·ĐŒĐ°Ń‚Ń‹ĐœŃ‹Đœ ÒŻĐœÒŻĐœ Ó©Ń‡ÒŻŃ€ÒŻĐż ĐșĐŸĐčŃĐŸ Đ±ĐŸĐ»ĐŸŃ‚."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"эсĐșĐ”Ń€Ń‚ĐŒĐ”Đ»Đ”Ń€ĐŽĐž башĐșаруу Đșаражаттары"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"эсĐșĐ”Ń€Ń‚ĐŒĐ”ĐœĐž Ń‚Ń‹ĐœĐŽŃ‹Ń€ŃƒŃƒ ĐŸĐżŃ†ĐžŃĐ»Đ°Ń€Ń‹"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ĐąŃ‹ĐœĐŽŃ‹Ń€ŃƒŃƒ"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"КАЙбАРУУ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> Ń‚Ń‹ĐœĐŽŃ‹Ń€Ń‹Đ»ĐŽŃ‹"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-land/config.xml b/packages/SystemUI/res/values-land/config.xml
index f7e2344..63bbe62 100644
--- a/packages/SystemUI/res/values-land/config.xml
+++ b/packages/SystemUI/res/values-land/config.xml
@@ -28,4 +28,7 @@
 
     <!-- We have only space for one notification on phone landscape layouts. -->
     <integer name="keyguard_max_notification_count">1</integer>
+
+    <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+    <integer name="navigation_bar_deadzone_orientation">1</integer>
 </resources>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 5f5ba00..e30f7f1 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àșàșłàș„àș±àș‡àșšàș±àș™àș—àș¶àșàșžàșČàșšà»œà»‰àșČàșˆà»..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àșšàș±àș™àș—àș¶àșàșźàșčàșšà»œà»‰àșČàșˆà»à»„àș§à»‰à»àș„້àș§"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ແàș•àș°à»€àșžàș·à»ˆàș­à»€àșšàșŽà»ˆàș‡àșžàșČàșšàș–່àșČàșà»œà»‰àșČàșˆà»àș‚àș­àș‡àș—່àșČàș™"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àșšà»à»ˆàșȘàșČàșĄàșČàș”àșšàș±àș™àș—àș¶àșàșźàșčàșšà»œà»‰àșČàșˆà»à»„àș”້"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àșàș°àș„àșžàș™àșČàș„àș­àș‡àș–່àșČàșàșźàșčàșšà»œà»‰àșČàșˆà»àș­àș”àșàș„àș±à»‰àș‡"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àșšà»à»ˆàșȘàșČàșĄàșČàș”àș–່àșČàșàșźàșčàșšà»œà»‰àșČàșˆà»à»„àș”້ເàș™àș·à»ˆàș­àș‡àșˆàșČàșàșžàș·à»‰àș™àș—àș”່àșˆàș±àș”ເàșàș±àșšàș‚ໍ້àșĄàșčàș™àșĄàș”àșˆàșłàșàș±àș”"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ແàș­àș±àșš àș«àșŒàș· àș­àș»àș‡àșàș­àș™àș‚àș­àș‡àș—່àșČàș™àșšà»à»ˆàș­àș°àș™àșžàșàșČàș”ໃàș«à»‰àș–່àșČàșàșźàșčàșšà»œà»‰àșČàșˆà»"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB ໂàș•à»€àș„àș·àș­àșàșàșČàș™àșà»‰àșČàșà»„àșŸàș„໌"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ເàș›àș”àș”àș•àș­àș™àș•àșČເàș§àș±àș™àș•àș»àș"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àșˆàș»àș™àșàș§à»ˆàșČàș•àșČເàș§àș±àș™àș‚àș¶à»‰àș™"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ເàș›àș”àș”àș•àș­àș™ <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"àșˆàș»àș™àșàș§à»ˆàșČàșˆàș°àșźàș­àș” <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is disabled"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is enabled"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ​àșˆàș°â€‹à»€àș„àș”່àșĄâ€‹àșšàș±àș™â€‹àș—àș¶àșâ€‹àș—àșžàșâ€‹àșąà»ˆàșČàș‡â€‹àș—àș”່​àșȘàș°â€‹à»àș”àș‡â€‹àșœàș»àș™â€‹à»ƒàș™â€‹à»œà»‰àșČ​àșˆà»â€‹àș—່àșČàș™."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àșšà»à»ˆâ€‹àș•à»‰àș­àș‡â€‹àșȘàș°â€‹à»àș”àș‡â€‹àș­àș”àș"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àș„àș¶àșšàș„້àșČàș‡àș—àș±àș‡à»àș»àș”"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àșˆàș±àș”àșàșČàș™àșàșČàș™à»àșˆà»‰àș‡à»€àș•àș·àș­àș™"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ໂໝàș”àș«à»‰àșČàșĄàș„àș»àșšàșàș§àș™àșˆàș°à»€àșŠàș·à»ˆàș­àș‡àșàșČàș™à»àșˆà»‰àș‡à»€àș•àș·àș­àș™à»„àș§à»‰"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ເàș„àș”່àșĄàș”àșœàș§àș™àș”້"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àșšà»à»ˆàșĄàș”àșàșČàș™à»àșˆà»‰àș‡à»€àș•àș·àș­àș™"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"ໂàș›àșŁâ€‹à»„àșŸàș„໌​àș­àșČàș”​àș–àș·àșâ€‹à»€àșàș»à»‰àșČ​àș•àșŽàș”​àș•àșČàșĄâ€‹àșąàșč່"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"​ເàș•àș·àș­àș™â€‹àș”້àș§àșâ€‹àșȘàșœàș‡"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àșȘàș±à»ˆàș™à»€àș•àș·àș­àș™"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àș›àșŽàș”"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ແàș•àș°à»€àșžàș·à»ˆàș­à»€àșŠàș»àșČàș›àșŽàș”àșȘàșœàș‡."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ແàș•àș°à»€àșžàș·à»ˆàș­àș•àș±à»‰àș‡à»€àș›àș±àș™àșȘàș±à»ˆàș™. àșšà»àș„àșŽàșàșČàș™àșŠà»ˆàș§àșà»€àș‚àș»à»‰àșČເàș–àșŽàș‡àș­àșČàș”àș–àș·àșàș›àșŽàș”àșȘàșœàș‡à»„àș§à»‰."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ແàș•àș°à»€àșžàș·à»ˆàș­àș›àșŽàș”àșȘàșœàș‡. àșšà»àș„àșŽàșàșČàș™àșŠà»ˆàș§àșà»€àș‚àș»à»‰àșČເàș–àșŽàș‡àș­àșČàș”àș–àș·àșàș›àșŽàș”àșȘàșœàș‡à»„àș§à»‰."</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àșàșČàș™àș„àș§àșšàș„àșžàșĄàșàșČàș™à»àșˆà»‰àș‡à»€àș•àș·àș­àș™"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àș•àș»àș§à»€àș„àș·àș­àșàșàșČàș™à»€àș„àș·à»ˆàș­àș™àșàșČàș™à»àșˆà»‰àș‡à»€àș•àș·àș­àș™"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ເàș„àș·à»ˆàș­àș™"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àșàș»àșà»€àș„àș”àș"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"ເàș„àș·à»ˆàș­àș™à»„àș› <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> àș™àșČàș—àș”ແàș„້àș§"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àșźàșčàșšàș–່àșČàșà»œà»‰àșČàșˆà»"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àș‚ໍ້àș„àș§àșČàșĄàș—àș»à»ˆàș§à»„àș›"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àșšà»ˆàș­àș™à»€àșàș±àșšàș‚ໍ້àșĄàșčàș™"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àș„àșłà»ƒàșšà»‰"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àș­àșŽàș™àșȘàș°à»àș•àș™à»àș­àș±àșš"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àș­àșŽàș™àșȘàș°à»àș•àș™à»àș­àș±àșšàșšà»à»ˆàșˆàșłà»€àș›àș±àș™àș•à»‰àș­àș‡àșĄàș”àșàșČàș™àș•àșŽàș”àș•àș±à»‰àș‡."</string>
     <string name="app_info" msgid="6856026610594615344">"àș‚ໍ້àșĄàșčàș™à»àș­àș±àșš"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"àș­àș°àș™àșžàșàșČàș” <xliff:g id="APP">%1$s</xliff:g> ເàșžàș·à»ˆàș­àșȘàș°à»àș”àș‡àșȘàș°à»„àș„້àșˆàșČàșà»àș­àș±àșš"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àș­àș°àș™àșžàșàșČàș”"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àș›àș°àș•àșŽà»€àșȘàș”"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"ແàș•àș°à»€àșžàș·à»ˆàș­àș•àș±à»‰àș‡àșàșČàș™à»€àș›àș”àș”àș•àș»àș§àș›àș°àșąàș±àș”ແàșšàș±àș”ເàș•àș”àșŁàș”"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àș•àș»àș§àș›àș°àșąàș±àș”ແàșšàș±àș”ເàș•àș”àșŁàș”àșˆàș°à»€àș›àș”àș”àș‚àș¶à»‰àș™àșĄàșČໂàș”àșàș­àș±àș”àș•àș°à»‚àș™àșĄàș±àș”ເàșĄàș·à»ˆàș­à»àșšàș±àș”ເàș•àș”àșŁàș”àșąàșč່àș—àș”່àș„àș°àș”àș±àșš <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àșšà»à»ˆ, àș‚àș­àșšà»ƒàșˆ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àș•àș±à»‰àș‡à»ƒàș«à»‰à»€àș›àș”àș”àș•àș»àș§àș›àș°àșąàș±àș”ແàșšàș±àș”ເàș•àș”àșŁàș”ແàș„້àș§"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àș•àș»àș§àș›àș°àșąàș±àș”ແàșšàș±àș”ເàș•àș”àșŁàș”àșˆàș°à»€àș›àș”àș”àș‚àș¶à»‰àș™àșĄàșČໂàș”àșàș­àș±àș”àș•àș°à»‚àș™àșĄàș±àș”ເàșĄàș·à»ˆàș­à»àșšàș±àș”ເàș•àș”àșŁàș”àș•à»ˆàșłàșàș§à»ˆàșČ <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àșàșČàș™àș•àș±à»‰àș‡àș„່àșČ"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"ເàș‚àș»à»‰àșČໃàșˆà»àș„້àș§"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index d7e0899..de0fdc1 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -437,8 +437,7 @@
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Daugiau neberodyti"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Viską išvalyti"</string>
     <string name="manage_notifications_text" msgid="8035284146227267681">"PranešimĆł tvarkymas"</string>
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Netrukdymo reĆŸimu slepiami pranešimai"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Pradėti dabar"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Nėra įspėjimƳ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"Profilis gali bƫti stebimas"</string>
@@ -538,6 +537,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Skambinti"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibruoti"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Nutildyti"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Palieskite, kad įjungtumėte garsą."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Palieskite, kad nustatytumėte vibravimą. Gali bĆ«ti nutildytos pritaikymo neÄŻgaliesiems paslaugos."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Palieskite, kad nutildytumėte. Gali bĆ«ti nutildytos pritaikymo neÄŻgaliesiems paslaugos."</string>
@@ -829,8 +832,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekrano kopijos"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"Bendrieji pranešimai"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"Saugykla"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"UĆŸuominos"</string>
     <string name="instant_apps" msgid="6647570248119804907">"Akimirksniu įkeliamos programėlės"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"Akimirksniu įkeliamƳ programėliƳ nereikia įdiegti."</string>
     <string name="app_info" msgid="6856026610594615344">"Programos informacija"</string>
@@ -858,18 +860,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"Leisti „<xliff:g id="APP">%1$s</xliff:g>“ rodyti bet kurios programos fragmentus"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"Leisti"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Neleisti"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"Palietę planuokite akumuliatoriaus tausojimo priemonės veikimą"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Äźjunkite automatiškai akumuliatoriaus ÄŻkrovai pasiekus <xliff:g id="PERCENTAGE">%d</xliff:g> proc."</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"Ne, ačiĆ«"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Akumuliatoriaus tausojimo priemonės veikimas suplanuotas"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"Akumuliatoriaus tausojimo priemonė bus ÄŻjungta automatiškai akumuliatoriaus ÄŻkrovai pasiekus maĆŸiau nei <xliff:g id="PERCENTAGE">%d</xliff:g> proc."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"Nustatymai"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"Supratau"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index d898ef6..0909cc7 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -534,6 +534,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvanīt"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrēt"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Izslēgt skaƆu"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Pieskarieties, lai ieslēgtu skaƆu."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Pieskarieties, lai iestatītu uz vibrozvanu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Pieskarieties, lai izslēgtu skaƆu. Var tikt izslēgti pieejamÄ«bas pakalpojumu signāli."</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index ad6cb883..e22d9e4 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ЅĐČĐŸĐœĐž"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ВОбрацОО"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ИсĐșĐ»ŃƒŃ‡Đž Đ·ĐČуĐș"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Đ”ĐŸĐżŃ€Đ”Ń‚Đ” Đ·Đ° ĐŽĐ° ĐČĐșĐ»ŃƒŃ‡ĐžŃ‚Đ” Đ·ĐČуĐș."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Đ”ĐŸĐżŃ€Đ”Ń‚Đ” Đ·Đ° ĐŽĐ° ĐżĐŸŃŃ‚Đ°ĐČОтД ĐœĐ° ĐČОбрацОО. ĐœĐŸĐ¶Đ”Đ±Đž ŃœĐ” сД ОсĐșĐ»ŃƒŃ‡Đž Đ·ĐČуĐșĐŸŃ‚ ĐœĐ° ŃƒŃĐ»ŃƒĐłĐžŃ‚Đ” Đ·Đ° ĐŽĐŸŃŃ‚Đ°ĐżĐœĐŸŃŃ‚."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Đ”ĐŸĐżŃ€Đ”Ń‚Đ” Đ·Đ° ĐŽĐ° ОсĐșĐ»ŃƒŃ‡ĐžŃ‚Đ” Đ·ĐČуĐș. ĐœĐŸĐ¶Đ”Đ±Đž ŃœĐ” сД ОсĐșĐ»ŃƒŃ‡Đž Đ·ĐČуĐșĐŸŃ‚ ĐœĐ° ŃƒŃĐ»ŃƒĐłĐžŃ‚Đ” Đ·Đ° ĐŽĐŸŃŃ‚Đ°ĐżĐœĐŸŃŃ‚."</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index aa6eecb..1532d82 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -431,8 +431,7 @@
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àŽ”à”€àŽŁà”àŽŸà”àŽ‚ àŽ•àŽŸàŽŁàŽżàŽ•à”àŽ•àŽ°à”àŽ€à”"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àŽŽàŽČà”àŽČàŽŸàŽ‚ àŽźàŽŸàŽŻà”‌àŽ•à”àŽ•à”àŽ•"</string>
     <string name="manage_notifications_text" msgid="8035284146227267681">"àŽ…àŽ±àŽżàŽŻàŽżàŽȘà”àŽȘà”àŽ•à”Ÿ àŽźàŽŸàŽšà”‡àŽœà” àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"àŽ…àŽ±àŽżàŽŻàŽżàŽȘà”àŽȘà”àŽ•àŽłà”† \'àŽ¶àŽČà”àŽŻàŽȘà”àŽȘà”†àŽŸà”àŽ€à”àŽ€àŽ°à”àŽ€à”\' àŽ…àŽŠà”ƒàŽ¶à”àŽŻàŽźàŽŸàŽ•à”àŽ•à”àŽšà”àŽšà”"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àŽ‡àŽȘà”àŽȘà”‹à”Ÿ àŽ†àŽ°àŽ‚àŽ­àŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àŽ…àŽ±àŽżàŽŻàŽżàŽȘà”àŽȘà”àŽ•à”Ÿ àŽ’àŽšà”àŽšà”àŽźàŽżàŽČà”àŽČ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àŽȘà”àŽ°à”ŠàŽ«à”ˆà”œ àŽšàŽżàŽ°à”€àŽ•à”àŽ·àŽżàŽ•à”àŽ•àŽȘà”àŽȘà”†àŽŸàŽŸàŽ‚"</string>
@@ -532,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àŽ±àŽżàŽ‚àŽ—à” àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àŽ”à”ˆàŽŹà”àŽ°à”‡àŽ±à”àŽ±à” àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àŽźà”àŽŻà”‚àŽŸà”àŽŸà” àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. àŽ…à”șàŽźà”àŽŻà”‚àŽŸà”àŽŸà”àŽšà”†àŽŻà”àŽŻà”àŽšà”àŽšàŽ€àŽżàŽšà” àŽŸàŽŸàŽȘà”àŽȘà”àŽšà”†àŽŻà”àŽŻà”àŽ•."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. àŽ”à”ˆàŽŹà”àŽ°à”‡àŽ±à”àŽ±àŽżàŽČà”‡àŽ•à”àŽ•à” àŽžàŽœà”àŽœàŽźàŽŸàŽ•à”àŽ•à”àŽšà”àŽšàŽ€àŽżàŽšà” àŽŸàŽŸàŽȘà”àŽȘà”àŽšà”†àŽŻà”àŽŻà”àŽ•. àŽ‰àŽȘàŽŻà”‹àŽ—àŽžàŽčàŽŸàŽŻàŽż àŽžà”‡àŽ”àŽšàŽ™à”àŽ™à”Ÿ àŽźà”àŽŻà”‚àŽŸà”àŽŸà”àŽšà”†àŽŻà”àŽŻàŽȘà”àŽȘà”†àŽŸà”àŽŸà”‡àŽ•à”àŽ•àŽŸàŽ‚."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. àŽźà”àŽŻà”‚àŽŸà”àŽŸà”àŽšà”†àŽŻà”àŽŻà”àŽšà”àŽšàŽ€àŽżàŽšà” àŽŸàŽŸàŽȘà”àŽȘà”àŽšà”†àŽŻà”àŽŻà”àŽ•. àŽ‰àŽȘàŽŻà”‹àŽ—àŽžàŽčàŽŸàŽŻàŽż àŽžà”‡àŽ”àŽšàŽ™à”àŽ™à”Ÿ àŽźà”àŽŻà”‚àŽŸà”àŽŸà”àŽšà”†àŽŻà”àŽŻàŽȘà”àŽȘà”†àŽŸà”àŽŸà”‡àŽ•à”àŽ•àŽŸàŽ‚."</string>
@@ -815,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àŽžà”‌àŽ•à”àŽ°à”€à”»àŽ·à”‹àŽŸà”àŽŸà”àŽ•à”Ÿ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àŽȘà”ŠàŽ€à”àŽ”àŽŸàŽŻ àŽžàŽšà”àŽŠà”‡àŽ¶àŽ™à”àŽ™à”Ÿ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àŽžà”àŽ±à”àŽ±à”‹àŽ±à”‡àŽœà”"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àŽžà”‚àŽšàŽšàŽ•à”Ÿ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àŽ‡à”»àŽžà”àŽ±à”àŽ±àŽšà”àŽ±à” àŽ†àŽȘà”àŽȘà”"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àŽ‡à”»àŽžà”‌àŽ±à”àŽ±‌àŽšà”àŽ±à” àŽ†àŽȘà”àŽȘàŽżàŽšà” àŽ‡à”»àŽžà”‌àŽ±à”àŽ±àŽČà”‡àŽ·à”» àŽ†àŽ”àŽ¶à”àŽŻàŽźàŽżàŽČà”àŽČ."</string>
     <string name="app_info" msgid="6856026610594615344">"àŽ†àŽȘà”àŽȘà” àŽ”àŽżàŽ”àŽ°àŽ‚"</string>
@@ -844,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"àŽàŽ€à” àŽ†àŽȘà”àŽȘàŽżà”œ àŽšàŽżàŽšà”àŽšà”àŽ‚ àŽžà”àŽČà”ˆàŽžà”àŽ•à”Ÿ àŽ•àŽŸàŽŁàŽżàŽ•à”àŽ•àŽŸà”» <xliff:g id="APP">%1$s</xliff:g>-àŽšà”† àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àŽ…àŽšà”àŽ”àŽŠàŽżàŽ•à”àŽ•à”àŽ•"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àŽšàŽżàŽ°àŽžàŽżàŽ•à”àŽ•à”àŽ•"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àŽŹàŽŸàŽ±à”àŽ±àŽ±àŽż àŽČàŽŸàŽ­àŽżàŽ•à”àŽ•à”œ àŽ·à”†àŽĄà”àŽŻà”‚à”Ÿ àŽšà”†àŽŻà”àŽŻàŽŸà”» àŽŸàŽŸàŽȘà”àŽȘà” àŽšà”†àŽŻà”àŽŻà”àŽ•"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àŽŹàŽŸàŽ±à”àŽ±àŽ±àŽż <xliff:g id="PERCENTAGE">%d</xliff:g>%% àŽ†àŽ•à”àŽźà”àŽȘà”‹à”Ÿ àŽžà”àŽ”àŽźà”‡àŽ§àŽŻàŽŸ àŽ“àŽŁàŽŸàŽ•à”àŽ•à”àŽ•"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àŽ”à”‡àŽŁà”àŽŸ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àŽŹàŽŸàŽ±à”àŽ±àŽ±àŽż àŽČàŽŸàŽ­àŽżàŽ•à”àŽ•à”œ àŽ·à”†àŽĄà”àŽŻà”‚à”Ÿ àŽ“àŽŁàŽŸàŽ•à”àŽ•à”àŽ•"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àŽŹàŽŸàŽ±à”àŽ±àŽ±àŽż <xliff:g id="PERCENTAGE">%d</xliff:g>%%-à”œ àŽ€àŽŸàŽŽà”†àŽŻàŽŸàŽ•à”àŽźà”àŽȘà”‹à”Ÿ, àŽŹàŽŸàŽ±à”àŽ±àŽ±àŽż àŽČàŽŸàŽ­àŽżàŽ•à”àŽ•à”œ àŽžà”àŽ”àŽźà”‡àŽ§àŽŻàŽŸ àŽ“àŽŁàŽŸàŽ•à”àŽ‚."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àŽ•à”àŽ°àŽźà”€àŽ•àŽ°àŽŁàŽ‚"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àŽźàŽšàŽžà”àŽžàŽżàŽČàŽŸàŽŻàŽż"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index ffc18f0..8429b58 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -72,10 +72,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Đ”ŃĐ»ĐłŃŃ†ĐžĐčĐœ Đ°ĐłŃˆĐžĐœĐł хаЎгалж баĐčĐœĐ°…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Đ”ŃĐ»ĐłŃŃ†ŃŃŃ ĐŽĐ°Ń€ŃĐ°Đœ Đ·ŃƒŃ€ĐłĐžĐčĐł Ń…Đ°ĐŽĐłĐ°Đ»ŃĐ°Đœ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Đ”ŃĐ»ĐłŃŃ†ŃŃŃ ĐŽĐ°Ń€ŃĐ°Đœ Đ·ŃƒŃ€ĐłĐžĐčĐł харах Đ±ĐŸĐ» Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Đ”ŃĐ»ĐłŃŃ†ŃŃŃ ĐŽĐ°Ń€ŃĐ°Đœ Đ·ŃƒŃ€ĐłĐžĐčĐł хаЎгалж Ń‡Đ°ĐŽŃĐ°ĐœĐłÒŻĐč"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Đ”ŃĐ»ĐłŃŃ†ĐžĐčĐœ Đ·ŃƒŃ€ĐłĐžĐčĐł ĐŽĐ°Ń…ĐžĐœ Ўарж ÒŻĐ·ĐœŃ ÒŻÒŻ"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ĐĄĐ°ĐœĐłĐžĐčĐœ Đ±Đ°ĐłŃ‚Đ°Đ°ĐŒĐ¶ бага баĐčгаа Ń‚ŃƒĐ» ĐŽŃĐ»ĐłŃŃ†ŃŃŃ ĐŽĐ°Ń€ŃĐ°Đœ Đ·ŃƒŃ€ĐłĐžĐčĐł хаЎгалах Đ±ĐŸĐ»ĐŸĐŒĐ¶ĐłÒŻĐč баĐčĐœĐ°"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"ĐąĐ°ĐœŃ‹ апп, баĐčгууллагаЎ ĐŽŃĐ»ĐłŃŃ†ĐžĐčĐœ Đ·ŃƒŃ€Đ°Đł Đ°ĐČахыг Đ·Ó©ĐČŃˆÓ©Ó©Ń€ĐŽÓ©ĐłĐłÒŻĐč"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB фаĐčĐ» ŃˆĐžĐ»Đ¶ÒŻÒŻĐ»ŃŃ… ŃĐŸĐœĐłĐŸĐ»Ń‚"</string>
@@ -346,8 +344,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Нар жаргах ÒŻĐ”ĐŽ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Нар ĐŒĐ°ĐœĐŽĐ°Ń… Ń…ÒŻŃ€Ń‚ŃĐ»"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>-ĐŽ"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> Ń…ÒŻŃ€Ń‚ŃĐ»"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC-Đł Ń†ŃƒŃ†Đ°Đ»ŃĐ°Đœ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC-Đł оЮэĐČŃ…Đ¶ÒŻÒŻĐ»ŃŃĐœ"</string>
@@ -431,8 +428,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> Ń‚Đ°ĐœŃ‹ ĐŽŃĐ»ĐłŃŃ† Юээр ĐłĐ°Ń€ĐłĐ°ŃĐ°Đœ Đ±ÒŻŃ… Đ·ÒŻĐčлОĐčĐœ Đ·ŃƒŃ€ĐłĐžĐčĐł Đ°ĐČч ŃŃ…ŃĐ»ĐœŃ."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ДахОж ÒŻĐ» Ń…Đ°Ń€ŃƒŃƒĐ»Đ°Ń…"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Đ‘ÒŻĐłĐŽĐžĐčĐł арОлгах"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"ĐœŃĐŽŃĐłĐŽĐ»ĐžĐčĐł уЮорЮах"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Đ‘ÒŻÒŻ сааЎ Đ±ĐŸĐ» ĐłĐŸŃ€ĐžĐŒ ĐŒŃĐŽŃĐłĐŽĐ»ĐžĐčĐł ĐœŃƒŃƒĐ¶ баĐčĐœĐ°"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ĐžĐŽĐŸĐŸ ŃŃ…Đ»ÒŻÒŻĐ»ŃŃ…"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"ĐœŃĐŽŃĐłĐŽŃĐ» баĐčŃ…ĐłÒŻĐč"</string>
@@ -533,6 +529,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Đ„ĐŸĐœŃ… Юуугаргах"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Чочоргэх"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Đ„Đ°Đ°Ń…"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Дууг ĐœŃŒ ĐœŃŃŃ…ĐžĐčĐœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Đ§ĐžŃ‡ĐžŃ€ĐłŃŃĐœĐŽ Ń‚ĐŸŃ…ĐžŃ€ŃƒŃƒĐ»Đ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу. Đ„ÒŻŃ€Ń‚ŃŃĐŒĐ¶ĐžĐčĐœ ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃĐœĐžĐč Ўууг Ń…Đ°Đ°ŃĐ°Đœ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дууг ĐœŃŒ Ń…Đ°Đ°Ń…Ń‹Đœ Ń‚ŃƒĐ»ĐŽ Ń‚ĐŸĐČŃˆĐžĐœĐŸ уу. Đ„ÒŻŃ€Ń‚ŃŃĐŒĐ¶ĐžĐčĐœ ÒŻĐčĐ»Ń‡ĐžĐ»ĐłŃŃĐœĐžĐč Ўууг Ń…Đ°Đ°ŃĐ°Đœ."</string>
@@ -627,8 +627,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"ĐŒŃĐŽŃĐłĐŽĐ»ĐžĐčĐœ ŃƒĐŽĐžŃ€ĐŽĐ»Đ°ĐłĐ°"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"ĐŒŃĐŽŃĐłĐŽŃĐ» Ń‚ÒŻŃ€ Ń…ĐŸĐčŃˆĐ»ŃƒŃƒĐ»Đ°ĐłŃ‡ĐžĐčĐœ ŃĐŸĐœĐłĐŸĐ»Ń‚"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"ĐąÒŻŃ€ Ń…ĐŸĐčŃˆĐ»ŃƒŃƒĐ»Đ°Ń…"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"БУЊААЄ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>-ĐŽ Ń‚ÒŻŃ€ Ń…ĐŸĐčŃˆĐ»ŃƒŃƒĐ»ŃĐ°Đœ"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 13030ff..8e61ca9 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€œà€€à€š à€•à€°à€€ à€†à€čà„‡…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€”à„à€č à€•à„‡à€Čà€Ÿ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"à€€à„à€źà€šà€Ÿ à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€Șà€Ÿà€čà€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€”à„à€č à€•à€°à„‚ à€¶à€•à€Čà„‹ à€šà€Ÿà€čà„€"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€Șà„à€šà„à€čà€Ÿ à€˜à„‡à€Łà„à€Żà€Ÿà€šà€Ÿ à€Șà„à€°à€Żà€€à„à€š à€•à€°à€Ÿ"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"à€źà€°à„à€Żà€Ÿà€Šà€żà€€ à€žà„à€Ÿà„‹à€°à„‡à€œ à€œà€Ÿà€—à„‡à€źà„à€łà„‡ à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€žà„‡à€”à„à€č à€•à€°à„‚ à€¶à€•à€€ à€šà€Ÿà€čà„€"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"à€…‍à„…à€Ș à€•à€żà€‚à€”à€Ÿ à€†à€Șà€Čà„à€Żà€Ÿ à€žà€‚à€žà„à€„à„‡à€Šà„à€”à€Ÿà€°à„‡ à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ à€˜à„‡à€Łà„à€Żà€Ÿà€šà„€ à€…à€šà„à€źà€€à„€ à€šà€Ÿà€čà„€"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB à€«à€Ÿà€ˆà€Č à€žà„à€„à€Ÿà€šà€Ÿà€‚à€€à€°à€Ł à€Șà€°à„à€Żà€Ÿà€Ż"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"à€žà€‚à€§à„à€Żà€Ÿà€•à€Ÿà€łà„€ à€šà€Ÿà€Čà„‚ à€…à€žà€€à„‡"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"à€žà„‚à€°à„à€Żà„‹à€Šà€Żà€Ÿà€Șà€°à„à€Żà€‚à€€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> à€”à€Ÿà€œà€€à€Ÿ à€šà€Ÿà€Čà„‚"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> à€Șà€°à„à€Żà€‚à€€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC à€…à€•à„à€·à€ź à€•à„‡à€Čà„‡ à€†à€čà„‡"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC à€žà€•à„à€·à€ź à€•à„‡à€Čà„‡ à€†à€čà„‡"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> à€†à€Șà€Čà„‍à€Żà€Ÿ à€žà„‍à€•à„à€°à„€à€šà€”à€° à€Șà„à€°à€Šà€°à„à€¶à€żà€€ à€čà„‹à€Łà€Ÿà€°à„€ à€Șà„à€°à€€à„‍à€Żà„‡à€• à€—à„‹à€·à„‍à€Ÿ à€•à„…à€Șà„‍à€šà€° à€•à€°à€Łà„‡ à€Șà„à€°à€Ÿà€°à€‚à€­ à€•à€°à„‡à€Č."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"à€Șà„à€šà„à€čà€Ÿ à€Šà€°à„à€¶à€”à„‚ à€šà€•à€Ÿ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"à€žà€°à„à€” à€žà€Ÿà€« à€•à€°à€Ÿ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"à€žà„‚à€šà€šà€Ÿ à€”à„à€Żà€”à€žà„à€„à€Ÿà€Șà€żà€€ à€•à€°à€Ÿ"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"à€”à„à€Żà€€à„à€Żà€Ż à€†à€Łà„‚ à€šà€•à€Ÿ à€žà„‚à€šà€šà€Ÿ à€Čà€Șà€”à€€ à€†à€čà„‡"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"à€†à€€à€Ÿ à€žà„à€°à„‚ à€•à€°à€Ÿ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"à€žà„‚à€šà€šà€Ÿ à€šà€Ÿà€čà„€à€€"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"à€Șà„à€°à„‹à€«à€Ÿà€ˆà€Čà€šà„‡ à€Șà€°à„€à€•à„à€·à€Ł à€•à„‡à€Čà„‡ à€œà€Ÿà€Š à€¶à€•à€€à„‡"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à€°à€żà€‚à€— à€•à€°à€Ÿ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"à€•à€‚à€Șà€š"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"à€źà„à€Żà„à€Ÿ à€•à€°à€Ÿ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. à€žà€¶à€Źà„à€Š à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. à€•à€‚à€Șà€š à€žà„‡à€Ÿ à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ. à€Șà„à€°à€”à„‡à€¶à€Żà„‹à€—à„à€Żà€€à€Ÿ à€žà„‡à€”à€Ÿ à€šà€ż:à€¶à€Źà„à€Š à€•à„‡à€Čà„à€Żà€Ÿ à€œà€Ÿà€Š à€¶à€•à€€à€Ÿà€€."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. à€šà€ż:à€¶à€Źà„à€Š à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ. à€Șà„à€°à€”à„‡à€¶à€•à„à€·à€źà€€à€Ÿ à€žà„‡à€”à€Ÿ à€šà€ż:à€¶à€Źà„à€Š à€•à„‡à€Čà„à€Żà€Ÿ à€œà€Ÿà€Š à€¶à€•à€€à€Ÿà€€."</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"à€žà„‚à€šà€šà€Ÿ à€šà€żà€Żà€‚à€€à„à€°à€Łà„‡"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"à€žà„‚à€šà€šà€Ÿ à€žà„à€šà„‚à€ à€Șà€°à„à€Żà€Ÿà€Ż"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"à€žà„à€šà„‚à€ à€•à€°à€Ÿ"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"à€Șà„‚à€°à„à€”à€”à€€ à€•à€°à€Ÿ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> à€žà€Ÿà€ à„€ à€žà„à€šà„‚à€ à€•à€°à€Ÿ"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"à€žà„à€•à„à€°à„€à€šà€¶à„‰à€Ÿ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"à€žà€°à„à€”à€žà€Ÿà€§à€Ÿà€°à€Ł à€žà€‚à€Šà„‡à€¶"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"à€žà€‚à€šà€Ż"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"à€žà„‚à€šà€šà€Ÿ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"à€‡à€šà„à€žà€Ÿà€‚à€Ÿ à€…‍à„…à€Șà„à€ž"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"à€‡à€šà„à€žà€Ÿà€‚à€Ÿ à€…à„…à€Șà„à€žà€šà€Ÿ à€žà„à€„à€Ÿà€Șà€šà„‡à€šà„€ à€†à€”à€¶à„à€Żà€•à€€à€Ÿ à€šà€žà€€à„‡."</string>
     <string name="app_info" msgid="6856026610594615344">"à€…à„…à€Ș à€źà€Ÿà€čà€żà€€à„€"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> à€Čà€Ÿ à€•à„à€ à€Čà„à€Żà€Ÿà€čà„€ à€…‍à„…à€Șà€źà€§à„€à€Č à€€à„à€•à€Ąà„‡ à€Šà€Ÿà€–à€”à€Łà„à€Żà€Ÿà€šà„€ à€…à€šà„à€źà€€à„€ à€Šà„à€Żà€Ÿ"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"à€…à€šà„à€źà€€à„€ à€Šà„à€Żà€Ÿ"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"à€šà€•à€Ÿà€° à€Šà„à€Żà€Ÿ"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"à€Źà„…à€Ÿà€°à„€ à€Źà€šà€€à€•à€°à„à€€à€Ÿ à€¶à„‡à€Ąà„à€Żà„‚à€Č à€•à€°à€Łà„à€Żà€Ÿà€žà€Ÿà€ à„€ à€Ÿà„…à€Ș à€•à€°à€Ÿ"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"à€Źà„…à€Ÿà€°à„€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€…à€žà€€à€Ÿà€šà€Ÿ à€†à€Șà„‹à€†à€Ș à€žà„à€°à„‚ à€•à€°à€Ÿ"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"à€šà€Ÿà€čà„€ à€šà€•à„‹"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"à€Źà„…à€Ÿà€°à„€ à€Źà€šà€€à€•à€°à„à€€à€Ÿ à€¶à„‡à€Ąà„à€Żà„‚à€Č à€žà„à€°à„‚ à€•à„‡à€Čà„‡ à€†à€čà„‡"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"à€Źà„…à€Ÿà€°à„€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€Șà„‡à€•à„à€·à€Ÿ à€–à€Ÿà€Čà„€ à€—à„‡à€Čà„à€Żà€Ÿà€ž à€Źà„…à€Ÿà€°à„€ à€žà„‡à€”à„à€čà€° à€†à€Șà„‹à€†à€Ș à€žà„à€°à„‚ à€čà„‹à€ˆà€Č."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"à€žà„‡à€Ÿà€żà€‚à€—à„à€œ"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"à€žà€źà€œà€Čà„‡"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 2b5c049..87d7b4d 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Menyimpan tangkapan skrin..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Tangkapan skrin disimpan"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Ketik untuk melihat tangkapan skrin anda"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Tidak dapat menyimpan tangkapan skrin"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Cuba ambil tangkapan skrin sekali lagi"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Tidak dapat menyimpan tangkapan skrin kerana ruang storan terhad"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Pengambilan tangkapan skrin tidak dibenarkan oleh apl atau organisasi anda"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Pilihan pemindahan fail USB"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Dihidupkan pd senja"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hingga matahari terbit"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Dihidupkan pada <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Hingga <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC dilumpuhkan"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC didayakan"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mula mengabadikan semua yang dipaparkan pada skrin anda.."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Jangan tunjukkan lagi"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Kosongkan semua"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Urus pemberitahuan"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Jangan Ganggu menyembunyikan pemberitahuan"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Mulakan sekarang"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Tiada pemberitahuan"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dering"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Getar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Redam"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ketik untuk menyahredam."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Ketik untuk menetapkan pada getar. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"kawalan pemberitahuan"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"pilihan tunda pemberitahuan"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Tunda"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"BUAT ASAL"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 6080a99..3647dd0 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"á€Ąá€žá€¶á€™á€Œá€Šá€șသညá€ș"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"တုနá€șခါသညá€ș"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ဥသံတိတá€șသညá€ș"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s။ á€Ąá€žá€¶á€•á€Œá€”á€șဖလင့á€șရနá€ș တို့ပါ။"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s။ တုနá€șá€á€«á€™á€Ÿá€Żá€€á€­á€Ż သတá€șမဟတá€șရနá€ș တို့ပါ။ á€Ąá€™á€»á€Źá€žá€žá€Żá€¶á€žá€…á€œá€Čနိုငá€șá€™á€Ÿá€Ż ဝနá€șဆေဏငá€șá€™á€Ÿá€Żá€™á€»á€Źá€žá€€á€­á€Ż ဥသံပိတá€șထာှနိုငá€șပါသညá€ș။"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s။ ဥသံပိတá€șရနá€ș တို့ပါ။ á€Ąá€™á€»á€Źá€žá€žá€Żá€¶á€žá€…á€œá€Čနိုငá€șá€™á€Ÿá€Ż ဝနá€șဆေဏငá€șá€™á€Ÿá€Żá€™á€»á€Źá€žá€€á€­á€Ż ဥသံပိတá€șထာှနိုငá€șပါသညá€ș။"</string>
@@ -846,7 +850,7 @@
     <string name="auto_saver_text" msgid="6324376061044218113">"ဘကá€șထရြ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ရေဏကá€șသည့á€șဥခါ á€Ąá€œá€­á€Żá€Ąá€œá€»á€±á€Źá€€á€ș ဖလင့á€șပါ"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"á€™á€œá€­á€Żá€•á€«"</string>
     <string name="auto_saver_enabled_title" msgid="6726474226058316862">"\'ဘကá€șထရြ အာှထိနá€șှ\' အစြအစဉá€ș ဖလင့á€șထာှသညá€ș"</string>
-    <string name="auto_saver_enabled_text" msgid="874711029884777579">"ဘကá€șထရြ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ဥေဏကá€ș နညá€șá€žá€žá€œá€Źá€žá€žá€Šá€șနဟင့á€ș \'ဘကá€șထရြ အာှထိနá€șှ\' á€Ąá€œá€­á€Żá€Ąá€œá€»á€±á€Źá€€á€ș ဖလင့á€șပါမညá€ș။"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"ဘကá€șထရြ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ဥေဏကá€ș ရေဏကá€șá€žá€œá€Źá€žá€žá€Šá€șနဟင့á€ș \'ဘကá€șထရြ အာှထိနá€șှ\' á€Ąá€œá€­á€Żá€Ąá€œá€»á€±á€Źá€€á€ș ဖလင့á€șပါမညá€ș။"</string>
     <string name="open_saver_setting_action" msgid="8314624730997322529">"ဆကá€șတငá€șမျဏသ"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"á€›á€•á€«á€•á€Œá€ź"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 7654b06..0ea1171 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Lagrer skjermdumpen …"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Skjermdumpen er lagret"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Trykk for å se skjermdumpen"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Kunne ikke lagre skjermdump"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Prøv å ta skjermdump på nytt"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kan ikke lagre skjermdumpen på grunn av begrenset lagringsplass"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller organisasjonen din tillater ikke at du tar skjermdumper"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Altern. for USB-filoverføring"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På ved solnedgang"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til soloppgang"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På kl. <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Til <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC er slått av"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC er slått på"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar opp alt som vies på skjermen din."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Ikke vis igjen"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Fjern alt"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Administrer varsler"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"«Ikke forstyrr» skjuler varsler"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Start nå"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Ingen varsler"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrer"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorer"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trykk for å slå på lyden."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trykk for å angi vibrasjon. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"varselinnstillinger"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"slumrealternativer for varsler"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Slumre"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ANGRE"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Slumrer i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index e30d8c3..2861d6b 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -358,7 +358,7 @@
     <string name="recents_launch_error_message" msgid="2969287838120550506">"à€žà„à€°à„ à€—à€°à„à€š à€žà€•à€żà€à€š <xliff:g id="APP">%s</xliff:g>à„€"</string>
     <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> à€Čà€Ÿà€ˆ à€žà„à€°à€•à„à€·à€żà€€-à€źà„‹à€Ąà€źà€Ÿ à€…à€žà€•à„à€·à€ź à€—à€°à€żà€à€•à„‹ à€›à„€"</string>
     <string name="recents_stack_action_button_label" msgid="6593727103310426253">"à€žà€Źà„ˆ à€čà€Ÿà€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
-    <string name="recents_drag_hint_message" msgid="2649739267073203985">"à€”à€żà€­à€Ÿà€œà€żà€€ à€žà„à€•à„à€°à€żà€šà€•à„‹ à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Żà€čà€Ÿà€ à€€à€Ÿà€šà„à€šà„à€čà„‹à€žà„"</string>
+    <string name="recents_drag_hint_message" msgid="2649739267073203985">"à€”à€żà€­à€Ÿà€œà€żà€€ à€žà„à€•à„à€°à€żà€šà€•à„‹ à€Șà„à€°à€Żà„‹à€— à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Żà€čà€Ÿà€ à€€à€Ÿà€šà„à€šà„à€čà„‹à€žà„"</string>
     <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"à€€à„‡à€°à„à€žà„‹ à€°à„‚à€Șà€źà€Ÿ à€”à€żà€­à€Ÿà€œà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"à€ à€Ÿà€Ąà„‹ à€°à„‚à€Șà€źà€Ÿ à€”à€żà€­à€Ÿà€œà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"à€†à€«à„‚ à€…à€šà„à€•à„‚à€Č à€”à€żà€­à€Ÿà€œà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
@@ -431,8 +431,7 @@
     <string name="media_projection_remember_text" msgid="3103510882172746752">"à€«à„‡à€°à€ż à€šà€Šà„‡à€–à€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"à€žà€Źà„ˆ à€čà€Ÿà€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="manage_notifications_text" msgid="8035284146227267681">"à€žà„‚à€šà€šà€Ÿà€čà€°à„‚ à€”à„à€Żà€”à€žà„à€„à€Ÿà€Șà€š à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"à€Źà€Ÿà€§à€Ÿ à€šà€Șà„à€°à„‍à€Żà€Ÿà€‰à€šà„à€čà„‹à€žà„ à€šà€Ÿà€źà€• à€źà„‹à€Ąà€Čà„‡ à€žà„‚à€šà€šà€Ÿà€čà€°à„‚ à€Čà„à€•à€Ÿà€‡à€°à€čà„‡à€•à„‹ à€›"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"à€…à€čà€żà€Čà„‡ à€žà„à€°à„ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"à€•à„à€šà„ˆ à€žà„‚à€šà€šà€Ÿà€čà€°à„‚ à€›à„ˆà€šà€šà„"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"à€Șà„à€°à„‹à€«à€Ÿà€‡à€Č à€…à€šà„à€—à€źà€š à€čà„à€š à€žà€•à„à€›"</string>
@@ -532,9 +531,13 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à€˜à€šà„à€Ÿà„€"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"à€•à€źà„à€Șà€š"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"à€źà„à€Żà„à€Ÿ à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
-    <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ à€…à€šà€źà„à€Żà„‚à€Ÿ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
-    <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ à€•à€źà„à€Șà€šà€źà€Ÿ à€žà„‡à€Ÿ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€ à€Șà€čà„à€à€š à€žà€źà„à€Źà€šà„à€§à„€ à€žà„‡à€”à€Ÿà€čà€°à„‚ à€źà„à€Żà„‚à€Ÿ à€čà„à€š à€žà€•à„à€›à€šà„à„€"</string>
-    <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ à€źà„à€Żà„‚à€Ÿ à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€ à€Șà€čà„à€à€š à€žà€źà„à€Źà€šà„à€§à„€ à€žà„‡à€”à€Ÿà€čà€°à„‚ à€źà„à€Żà„‚à€Ÿ à€čà„à€š à€žà€•à„à€›à€šà„à„€"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
+    <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ à€…à€šà€źà„à€Żà„‚à€Ÿ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
+    <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ à€•à€źà„à€Șà€šà€źà€Ÿ à€žà„‡à€Ÿ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€ à€Șà€čà„à€à€š à€žà€źà„à€Źà€šà„à€§à„€ à€žà„‡à€”à€Ÿà€čà€°à„‚ à€źà„à€Żà„‚à€Ÿ à€čà„à€š à€žà€•à„à€›à€šà„à„€"</string>
+    <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ à€źà„à€Żà„‚à€Ÿ à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€ à€Șà€čà„à€à€š à€žà€źà„à€Źà€šà„à€§à„€ à€žà„‡à€”à€Ÿà€čà€°à„‚ à€źà„à€Żà„‚à€Ÿ à€čà„à€š à€žà€•à„à€›à€šà„à„€"</string>
     <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$sà„€ à€•à€źà„à€Șà€š à€źà„‹à€Ąà€źà€Ÿ à€žà„‡à€Ÿ à€—à€°à„à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$sà„€ à€źà„à€Żà„‚à€Ÿ à€—à€°à„à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="volume_dialog_title" msgid="7272969888820035876">"%s à€­à„‹à€Čà„à€Żà„à€źà€•à€Ÿ à€šà€żà€Żà€šà„à€€à„à€°à€Łà€čà€°à„‚"</string>
@@ -753,9 +756,9 @@
     <string name="accessibility_action_divider_top_50" msgid="6385859741925078668">"à€źà€Ÿà€„à€żà€Čà„à€Čà„‹ à€­à€Ÿà€— à„«à„Š%"</string>
     <string name="accessibility_action_divider_top_30" msgid="6201455163864841205">"à€źà€Ÿà€„à€żà€Čà„à€Čà„‹ à€­à€Ÿà€— à„©à„Š%"</string>
     <string name="accessibility_action_divider_bottom_full" msgid="301433196679548001">"à€€à€Čà„à€Čà„‹ à€­à€Ÿà€— à€Șà„‚à€°à„à€Ł à€žà„à€•à„à€°à€żà€š"</string>
-    <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"à€žà„à€„à€żà€€à€ż <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>à„€ à€žà€źà„à€Șà€Ÿà€Šà€š à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ąà€Źà€Č à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
+    <string name="accessibility_qs_edit_tile_label" msgid="8374924053307764245">"à€žà„à€„à€żà€€à€ż <xliff:g id="POSITION">%1$d</xliff:g>, <xliff:g id="TILE_NAME">%2$s</xliff:g>à„€ à€žà€źà„à€Șà€Ÿà€Šà€š à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ąà€Źà€Č à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="accessibility_qs_edit_add_tile_label" msgid="8133209638023882667">"<xliff:g id="TILE_NAME">%1$s</xliff:g>à„€ à€„à€Șà„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ąà€Źà€Č à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
-    <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"à€žà„à€„à€żà€€à€ż <xliff:g id="POSITION">%1$d</xliff:g>à„€ à€šà€Żà€š à€—à€°à„à€šà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ąà€Źà€Č à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
+    <string name="accessibility_qs_edit_position_label" msgid="5055306305919289819">"à€žà„à€„à€żà€€à€ż <xliff:g id="POSITION">%1$d</xliff:g>à„€ à€šà€Żà€š à€—à€°à„à€šà€Ÿà€•à€Ÿ à€Čà€Ÿà€—à€ż à€Ąà€Źà€Č à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„à„€"</string>
     <string name="accessibility_qs_edit_move_tile" msgid="2461819993780159542">"<xliff:g id="TILE_NAME">%1$s</xliff:g> à€Čà€Ÿà€ˆ à€žà€Ÿà€°à„à€šà„à€čà„‹à€žà„"</string>
     <string name="accessibility_qs_edit_remove_tile" msgid="7484493384665907197">"<xliff:g id="TILE_NAME">%1$s</xliff:g> à€Čà€Ÿà€ˆ à€čà€Ÿà€Ÿà€‰à€šà„à€čà„‹à€žà„"</string>
     <string name="accessibility_qs_edit_tile_added" msgid="8050200862063548309">"<xliff:g id="TILE_NAME">%1$s</xliff:g> à€Čà€Ÿà€ˆ à€žà„à€„à€żà€€à€ż <xliff:g id="POSITION">%2$d</xliff:g> à€źà€Ÿ à€„à€Șà€żà€Żà„‹"</string>
@@ -815,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"à€žà„à€•à„à€°à€żà€šà€¶à€Ÿà€čà€°à„‚"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"à€žà€Ÿà€źà€Ÿà€šà„à€Ż à€žà€šà„à€Šà„‡à€¶à€čà€°à„‚"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"à€­à€Łà„à€Ąà€Ÿà€°à€Ł"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"à€žà€™à„à€•à„‡à€€à€čà€°à„‚"</string>
     <string name="instant_apps" msgid="6647570248119804907">"à€€à€Ÿà€€à„à€•à€Ÿà€Čà€żà€• à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€čà€°à„‚"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"à€€à€Ÿà€€à„à€•à€Ÿà€Čà€żà€• à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€čà€°à„‚à€Čà€Ÿà€ˆ à€žà„à€„à€Ÿà€Șà€šà€Ÿ à€—à€°à„à€šà„ à€Șà€°à„à€Šà„ˆà€š|"</string>
     <string name="app_info" msgid="6856026610594615344">"à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€•à€Ÿ à€Źà€Ÿà€°à„‡ à€œà€Ÿà€šà€•à€Ÿà€°à„€"</string>
@@ -844,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"à€…à€šà„à€Ż à€…à€šà„à€Șà„à€°à€Żà„‹à€—à€Źà€Ÿà€Ÿ <xliff:g id="APP">%1$s</xliff:g> à€źà€Ÿ à€žà„à€Čà€Ÿà€‡à€žà€čà€°à„‚ à€Šà„‡à€–à€Ÿà€‰à€š à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€čà„‹à€žà„"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"à€…à€šà„à€źà€€à€ż à€Šà€żà€šà„à€čà„‹à€žà„"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"à€…à€žà„à€”à„€à€•à€Ÿà€° à€—à€°à„à€šà„…"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà„‡à€­à€°à€•à„‹ à€žà€źà€Żà€€à€Ÿà€Čà€żà€•à€Ÿ à€Źà€šà€Ÿà€‰à€š à€Ÿà„à€Żà€Ÿà€Ș à€—à€°à„à€šà„à€čà„‹à€žà„"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€­à€à€•à„‹ à€Źà„‡à€Čà€Ÿ à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà„‡à€­à€° à€žà„à€”à€€à€ƒ à€žà€•à„à€°à€żà€Ż à€—à€°à„à€šà„à€čà„‹à€žà„‌"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"à€Șà€°à„à€Šà„ˆà€š à€§à€šà„à€Żà€”à€Ÿà€Š"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà„‡à€­à€°à€•à„‹ à€žà€źà€Żà€€à€Ÿà€Čà€żà€•à€Ÿ à€žà€•à„à€°à€żà€Ż à€—à€°à€żà€Żà„‹"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% à€­à€šà„à€Šà€Ÿ à€•à€ź à€­à€à€•à„‹ à€Źà„‡à€Čà€Ÿ à€Źà„à€Żà€Ÿà€Ÿà„à€°à„€ à€žà„‡à€­à€° à€žà„à€”à€€à€ƒ à€žà€•à„à€°à€żà€Ż à€čà„à€šà„‡ à€›à„€"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"à€žà„‡à€Ÿà€żà€™à€čà€°à„‚"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"à€Źà„à€à„‡à€"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 6d74cc6..8dff676 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot opslaan..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Screenshot opgeslagen"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Tik om je screenshot te bekijken"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Kan screenshot niet opslaan"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Probeer opnieuw een screenshot te maken"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Kan screenshot niet opslaan vanwege beperkte opslagruimte"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Het maken van screenshots wordt niet toegestaan door de app of je organisatie"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Opties voor USB-bestandsoverdracht"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan bij zonsondergang"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot zonsopgang"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Aan om <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Tot <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC is uitgeschakeld"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC is ingeschakeld"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> gaat alles vastleggen dat wordt weergegeven op je scherm."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Niet opnieuw weergeven"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Alles wissen"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Meldingen beheren"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'Niet storen\' verbergt meldingen"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Nu starten"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Geen meldingen"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Bellen"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Trillen"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Dempen"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tik om dempen op te heffen."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tik om in te stellen op trillen. Toegankelijkheidsservices kunnen zijn gedempt."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"beheeropties voor meldingen"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"snooze-opties voor meldingen"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Snoozen"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ONGEDAAN MAKEN"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Snoozefunctie <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> actief"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index e25f0b1..eff2a09 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­‍ àŹžà­‡àŹ­à­‍ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‰àŹ›àŹż…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­ àŹžà­‡àŹ­à­ àŹčà­‹àŹ‡àŹ›àŹż"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­‍ àŹŠà­‡àŹ–àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àŹžà­àŹ•à­àŹ°à­€àŹšà­‍àŹ¶àŹŸà­ àŹžà­‡àŹ­à­ àŹ•àŹ°àŹżàŹčà­‡àŹŹ àŹšàŹŸàŹčàŹżàŹ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àŹȘà­àŹŁàŹżàŹ„àŹ°à­‡ àŹžà­àŹ•à­àŹ°à­€àŹšà­‌àŹ¶àŹŸà­ àŹšà­‡àŹŹàŹŸàŹ•à­ àŹšà­‡àŹ·à­àŹŸàŹŸ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àŹžà­€àŹźàŹżàŹ€ àŹ·à­àŹŸà­‹àŹ°à­‡àŹœà­‍ àŹžà­àŹȘà­‡àŹžà­‍ àŹčà­‡àŹ€à­ àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­‍ àŹžà­‡àŹ­à­‍ àŹčà­‹àŹ‡àŹȘàŹŸàŹ°àŹżàŹŹ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àŹ†àŹȘ୍‍ àŹ•àŹżàŹźà­àŹŹàŹŸ àŹžàŹ‚àŹžà­àŹ„àŹŸ àŹŠà­à­±àŹŸàŹ°àŹŸ àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­‍ àŹšà­‡àŹŹàŹŸàŹ•à­ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ†àŹŻàŹŸàŹ‡ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB àŹ«àŹŸàŹ‡àŹČ୍‌ àŹŸà­àŹ°àŹŸàŹšà­àŹžàŹ«àŹ°à­‌àŹ° àŹŹàŹżàŹ•àŹłà­àŹȘ"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"àŹžà­‚àŹ°à­àŹŻà­à­ŸàŹŸàŹžà­àŹ€ àŹŹà­‡àŹłà­‡ àŹ…àŹšà­ àŹčà­‡àŹŹ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àŹžà­‚àŹ°à­àŹŻà­à­Ÿà­‹àŹŠà­Ÿ àŹȘàŹ°à­àŹŻà­à­ŸàŹšà­àŹ€"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>àŹ°à­‡ àŹ…àŹšà­ àŹčà­‡àŹŹ"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> àŹȘàŹ°à­àŹŻà­à­ŸàŹšà­àŹ€"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC àŹ…àŹ•à­àŹ·àŹź àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹ›àŹż"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC àŹžàŹ•à­àŹ·àŹź àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹ›àŹż"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> àŹ†àŹȘàŹŁàŹ™à­àŹ• àŹžà­àŹ•à­àŹ°à­€àŹšà­‌àŹ°à­‡ àŹȘà­àŹ°àŹŠàŹ°à­àŹ¶àŹżàŹ€ àŹčà­‡àŹ‰àŹ„àŹżàŹŹàŹŸ àŹžàŹźàŹžà­àŹ€ àŹŹàŹžà­àŹ€à­àŹ•à­ àŹ•à­à­ŸàŹŸàŹȘàŹšàŹ°à­ àŹ•àŹ°àŹżàŹŹàŹŸ àŹ†àŹ°àŹźà­àŹ­ àŹčà­‹àŹ‡àŹŻàŹżàŹŹà„€"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àŹȘà­àŹŁàŹż àŹŠà­‡àŹ–àŹŸàŹšà­àŹ€à­ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àŹžàŹźàŹžà­àŹ€ àŹ–àŹŸàŹČàŹż àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àŹŹàŹżàŹœà­àŹžàŹȘà­àŹ€àŹż àŹȘàŹ°àŹżàŹšàŹŸàŹłàŹšàŹŸ àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\"àŹŹàŹżàŹ°àŹ•à­àŹ€ àŹ•àŹ°àŹšà­àŹ€à­ àŹšàŹŸàŹčàŹżàŹ\" àŹźà­‹àŹĄà­‌ àŹ…àŹšà­‌ àŹ„àŹżàŹŹàŹŸàŹŻà­‹àŹ—à­àŹ àŹŹàŹżàŹœà­àŹžàŹȘà­àŹ€àŹż àŹČà­àŹšàŹŸàŹ‡ àŹŠàŹżàŹ†àŹŻàŹŸàŹ‰àŹ›àŹż"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àŹŹàŹ°à­àŹ€à­àŹ€àŹźàŹŸàŹš àŹ†àŹ°àŹźà­àŹ­ àŹ•àŹ°àŹšà­àŹ€à­"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àŹ•à­ŒàŹŁàŹžàŹż àŹŹàŹżàŹœà­àŹžàŹȘà­àŹ€àŹż àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àŹȘà­àŹ°à­‹àŹ«àŹŸàŹ‡àŹČ୍ àŹšàŹżàŹ°à­€àŹ•à­àŹ·àŹŁ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹȘàŹŸàŹ°à­‡à„€"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àŹ°àŹżàŹ™à­àŹ—"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àŹ­àŹŸàŹ‡àŹŹà­àŹ°à­‡àŹŸà­‌"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àŹźà­à­Ÿà­àŹŸà­"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ àŹ…àŹšàŹźà­à­Ÿà­àŹŸà­‍ àŹ•àŹ°àŹżàŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­à„€"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ àŹ­àŹŸàŹ‡àŹŹà­àŹ°à­‡àŹŸà­‍ àŹžà­‡àŹŸà­‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­à„€ àŹ†àŹ•à­àŹžà­‡àŹžàŹżàŹŹàŹżàŹČàŹżàŹŸà­€ àŹžàŹ°à­àŹ­àŹżàŹžà­‌ àŹźà­à­Ÿà­àŹŸà­‍ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹȘàŹŸàŹ°à­‡à„€"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ àŹźà­à­Ÿà­àŹŸà­‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‍ àŹ•àŹ°àŹšà­àŹ€à­à„€ àŹ†àŹ•à­àŹžà­‡àŹžàŹżàŹŹàŹżàŹČàŹżàŹŸà­€ àŹžàŹ°à­àŹ­àŹżàŹžà­‌ àŹźà­à­Ÿà­àŹŸà­‍ àŹ•àŹ°àŹŸàŹŻàŹŸàŹ‡àŹȘàŹŸàŹ°à­‡à„€"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àŹŹàŹżàŹœà­àŹžàŹȘà­àŹ€àŹż àŹšàŹżà­ŸàŹšà­àŹ€à­àŹ°àŹŁ"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àŹŹàŹżàŹœà­àŹžàŹȘà­àŹ€àŹż àŹžà­àŹšà­àŹœà­‍ àŹŹàŹżàŹ•àŹłà­àŹȘ"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"àŹžà­àŹšà­àŹœà­"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àŹȘà­‚àŹ°à­àŹŹàŹŸàŹŹàŹžà­àŹ„àŹŸàŹ•à­ àŹ«à­‡àŹ°àŹŸàŹ‡ àŹ†àŹŁàŹšà­àŹ€à­"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> àŹȘàŹŸàŹ‡àŹ àŹžà­àŹšà­àŹœà­‍ àŹ•àŹ°àŹŸàŹ—àŹČàŹŸ"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àŹžà­àŹ•à­àŹ°à­€àŹšàŹ¶àŹŸà­‍"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àŹžàŹŸàŹ§àŹŸàŹ°àŹŁ àŹźà­‡àŹžà­‡àŹœà­"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àŹ·à­àŹŸà­‹àŹ°à­‡àŹœà­‌"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àŹčàŹżàŹŁà­àŹŸ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àŹ‡àŹšàŹ·à­àŹŸàŹŸàŹŁà­àŹŸ àŹ†àŹȘ୍‌"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àŹ‡àŹšàŹ·à­àŹŸàŹŸàŹŁà­àŹŸ àŹ†àŹȘ୍‌ àŹ‡àŹšàŹ·à­àŹŸàŹČ୍‍ àŹ•àŹ°àŹżàŹŹàŹŸàŹ° àŹ†àŹŹàŹ¶à­à­ŸàŹ•àŹ€àŹŸ àŹšàŹŸàŹčàŹżàŹ"</string>
     <string name="app_info" msgid="6856026610594615344">"àŹ†àŹȘ୍‍ àŹžà­‚àŹšàŹšàŹŸ"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"àŹŻà­‡àŹ•à­ŒàŹŁàŹžàŹż àŹ†àŹȘ୍‌àŹ°à­‡ àŹžà­àŹČàŹŸàŹ‡àŹžà­‌àŹ•à­ àŹŠà­‡àŹ–àŹŸàŹ‡àŹŹàŹŸ àŹȘàŹŸàŹ‡àŹ <xliff:g id="APP">%1$s</xliff:g>àŹ•à­ àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ…àŹšà­àŹ€à­"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àŹ…àŹšà­àŹźàŹ€àŹż àŹŠàŹżàŹ…àŹšà­àŹ€à­"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àŹ…àŹžà­àŹ”à­€àŹ•àŹŸàŹ° àŹ•àŹ°àŹšà­àŹ€à­"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àŹŹà­à­ŸàŹŸàŹŸà­‡àŹ°à­€ àŹžà­‡àŹ­àŹ°à­‌ àŹ…àŹšà­‌ àŹčà­‡àŹŹàŹŸàŹ° àŹžàŹźà­Ÿ àŹžà­‡àŹŸà­‌ àŹ•àŹ°àŹżàŹŹàŹŸàŹ•à­ àŹŸàŹŸàŹȘ୍‌ àŹ•àŹ°àŹšà­àŹ€à­"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àŹŹà­à­ŸàŹŸàŹŸà­‡àŹ°à­€ <xliff:g id="PERCENTAGE">%d</xliff:g>%%àŹ°à­ àŹ•àŹźà­‌ àŹčେàŹČେ àŹ†àŹȘେ àŹ…àŹšà­‌ àŹčà­‹àŹ‡àŹŻàŹżàŹŹ"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àŹšàŹŸàŹčàŹżàŹ, àŹ„àŹŸàŹ‰"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àŹ†àŹ—àŹ°à­ àŹžà­‡àŹŸà­‌ àŹ•àŹ°àŹżàŹ„àŹżàŹŹàŹŸ àŹžàŹźà­Ÿ àŹ…àŹšà­àŹžàŹŸàŹ°à­‡ àŹŹà­à­ŸàŹŸàŹŸà­‡àŹ°à­€ àŹžà­‡àŹ­àŹ°à­‌ àŹ…àŹšà­‌ àŹčà­‹àŹ‡àŹ›àŹż"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àŹšàŹŸàŹ°à­àŹœ <xliff:g id="PERCENTAGE">%d</xliff:g>%%àŹ°à­ àŹ•àŹźà­‌ àŹčେàŹČେ àŹŹà­à­ŸàŹŸàŹŸà­‡àŹ°à­€ àŹžà­‡àŹ­àŹ°à­‌ àŹ†àŹȘେ àŹ…àŹšà­‌ àŹčà­‹àŹ‡àŹŻàŹżàŹŹà„€"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àŹžà­‡àŹŸàŹżàŹ™à­àŹ—"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àŹŹà­àŹàŹżàŹČàŹż"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3489132..98185bb 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àšžà©àš°à©±àš–àšżàš…àš€ àš•àš° àš°àšżàščàšŸ àščੈ…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àš°à©±àš–àšżàš…àš€ àš•à©€àš€àšŸ àš—àšżàš†"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àš†àšȘàšŁàšŸ àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àšŠà©‡àš–àšŁ àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àš°à©±àš–àšżàš…àš€ àššàščà©€àš‚ àš•à©€àš€àšŸ àšœàšŸ àšžàš•àšżàš†"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àšŠà©àšŹàšŸàš°àšŸ àšČੈ àš•à©‡ àšŠà©‡àš–à©‹"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àšžà©€àšźàšżàš€ àšžàšŸà©‹àš°à©‡àšœ àščà©‹àšŁ àš•àšŸàš°àšš àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àš°à©±àš–àšżàš…àš€ àššàščà©€àš‚ àš•à©€àš€àšŸ àšœàšŸ àšžàš•àšŠàšŸ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àšàšȘ àšœàšŸàš‚ àš€à©àščàšŸàšĄà©€ àšžà©°àšžàš„àšŸ àš”à©±àšČà©‹àš‚ àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ àšČà©ˆàšŁ àšŠà©€ àš‡àšœàšŸàšœàšŒàš€ àššàščà©€àš‚ àšŠàšżà©±àš€à©€ àš—àšˆ àščੈ"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB àš«àšŸàšˆàšČ àšŸà©àš°àšŸàš‚àšžàš«àš° àššà©‹àšŁàšŸàš‚"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"àšžà©‚àš°àšœ àš›àšżàšȘàšŁ \'àš€à©‡ àššàšŸàšČੂ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"àšžà©‚àš°àšœ àššà©œà©àščàšš àš€à©±àš•"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> àš”àšœà©‡ àššàšŸàšČੂ"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> àš€à©±àš•"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC àššà©‚à©° àš…àšŻà©‹àš— àšŹàšŁàšŸàš‡àš† àš—àšżàš† àščੈ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC àššà©‚à©° àšŻà©‹àš— àšŹàšŁàšŸàš‡àš† àš—àšżàš† àščੈ"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> àš‰àšč àšžàš­ àš•à©àš àš•à©ˆàšȘàššàš° àš•àš°àššàšŸ àšžàšŒà©àš°à©‚ àš•àš° àšŠà©‡àš”à©‡àš—àšŸ, àšœà©‹ àš€à©àščàšŸàšĄà©€ àšžàš•à©àš°à©€àšš àš€à©‡ àšĄàšżàšžàšȘàšČੇ àš•à©€àš€àšŸ àšœàšŸàš‚àšŠàšŸ àščà©ˆà„€"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"àšŠà©àšŹàšŸàš°àšŸ àššàšŸ àšŠàšżàš–àšŸàš“"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àšžàš­ àš•àšČà©€àš…àš° àš•àš°à©‹"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"àšžà©‚àššàššàšŸàš”àšŸàš‚ àšŠàšŸ àšȘà©àš°àšŹà©°àš§àšš àš•àš°à©‹"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'àšȘàš°à©‡àšžàšŒàšŸàšš àššàšŸ àš•àš°à©‹\' àšźà©‹àšĄ àšžà©‚àššàššàšŸàš”àšŸàš‚ àššà©‚à©° àšČà©àš•àšŸ àš°àšżàščàšŸ àščੈ"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àščà©àšŁ àššàšŸàšČੂ àš•àš°à©‹"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àš•à©‹àšˆ àšžà©‚àššàššàšŸàš”àšŸàš‚ àššàščà©€àš‚"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àšȘà©àš°à©‹àš«àšŸàšˆàšČ àšŠàšŸ àššàšżàš°à©€àš–àšŁ àš•à©€àš€àšŸ àšœàšŸ àšžàš•àšŠàšŸ àščੈ"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àš˜à©°àšŸà©€"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àš„àš°àš„àš°àšŸàščàšŸ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àšźàšżàšŠàšŸ"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$sà„€ àš…àšŁàšźàšżàšŠàšŸ àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹à„€"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$sà„€ àš„àš°àš„àš°àšŸàščàšŸ àšžà©ˆà©±àšŸ àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹à„€ àšȘàščà©à©°àššàšŻà©‹àš—àš€àšŸ àšžà©‡àš”àšŸàš”àšŸàš‚ àšźàšżàšŠàšŸ àščੋ àšžàš•àšŠà©€àš†àš‚ àščàššà„€"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$sà„€ àšźàšżàšŠàšŸ àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹à„€ àšȘàščà©à©°àššàšŻà©‹àš—àš€àšŸ àšžà©‡àš”àšŸàš”àšŸàš‚ àšźàšżàšŠàšŸ àščੋ àšžàš•àšŠà©€àš†àš‚ àščàššà„€"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"àšžà©‚àššàššàšŸ àš•à©°àšŸàš°à©‹àšČ"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"àšžà©‚àššàššàšŸ àšžàššà©‚àšœàšŒ àš”àšżàš•àšČàšȘ"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"àšžàššà©‚àšœàšŒ àš•àš°à©‹"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"àš…àšŁàš•à©€àš€àšŸ àš•àš°à©‹"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> àšČàšˆ àšžàššà©‚àšœàšŒ àš•à©€àš€àšŸ àš—àšżàš†"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àšžàš•à©àš°à©€àššàšžàšŒàšŸàšŸ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àš†àšź àšžà©àššà©‡àščੇ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àšžàšŸà©‹àš°à©‡àšœ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àšžà©°àš•à©‡àš€"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àš€àš€àš•àšŸàšČ àšàšȘàšŸàš‚"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àš€àš€àš•àšŸàšČ àšàšȘàšŸàš‚ àššà©‚à©° àšžàš„àšŸàšȘàššàšŸ àšŠà©€ àšČੋੜ àššàščà©€àš‚ àščà©ˆà„€"</string>
     <string name="app_info" msgid="6856026610594615344">"àšàšȘ àšœàšŸàšŁàš•àšŸàš°à©€"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> àššà©‚à©° àš•àšżàšžà©‡ àš”à©€ àšàšȘ àš”àšżà©±àššà©‹àš‚ àščàšżà©±àšžà©‡ àšŠàšżàš–àšŸàš‰àšŁ àšŠàšżàš“"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àš•àš°àšš àšŠàšżàš“"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àš…àšžàš”à©€àš•àšŸàš° àš•àš°à©‹"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àšŹà©ˆàšŸàš°à©€ àšžà©‡àš”àš° àšŠà©€ àšžàšźàšŸàš‚-àšžà©‚àššà©€ àš€àšżàš†àš° àš•àš°àšš àšČàšˆ àšŸà©ˆàšȘ àš•àš°à©‹"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àšŹà©ˆàšŸàš°à©€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% àščà©‹àšŁ \'àš€à©‡ àšžàš”à©ˆàššàšČàšżàš€ àš€à©Œàš° \'àš€à©‡ àššàšŸàšČੂ àščà©à©°àšŠàšŸ àščੈ"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àššàščà©€àš‚ àš§à©°àššàš”àšŸàšŠ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àšŹà©ˆàšŸàš°à©€ àšžà©‡àš”àš° àšžàšźàšŸàš‚-àšžà©‚àššà©€ àššàšŸàšČੂ àš•à©€àš€à©€ àš—àšˆ"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àšŹà©ˆàšŸàš°à©€ àšŠàšŸ àšȘà©±àš§àš° <xliff:g id="PERCENTAGE">%d</xliff:g>%% àš€à©‹àš‚ àš˜à©±àšŸ àščੋ àšœàšŸàšŁ \'àš€à©‡ àšŹà©ˆàšŸàš°à©€ àšžà©‡àš”àš° àšžàš”à©ˆàššàšČàšżàš€ àš€à©Œàš° \'àš€à©‡ àššàšŸàšČੂ àščੋ àšœàšŸàš”à©‡àš—àšŸà„€"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àšžà©ˆàšŸàšżà©°àš—àšŸàš‚"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àšžàšźàš àšČàšżàš†"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index f1767a2..3c5be10 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -76,10 +76,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Zapisywanie zrzutu ekranu..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Zrzut ekranu zostaƂ zapisany"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Kliknij, by zobaczyć zrzut ekranu"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Nie udaƂo się zapisać zrzutu ekranu"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Spróbuj jeszcze raz wykonać zrzut ekranu"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Nie moĆŒna zapisać zrzutu ekranu, bo brakuje miejsca w pamięci"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Nie moĆŒesz wykonać zrzutu ekranu, bo nie zezwala na to aplikacja lub Twoja organizacja."</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB – opcje przesyƂania plików"</string>
@@ -354,8 +352,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"WƂącz o zachodzie"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do wschodu sƂoƄca"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"WƂącz o <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Do <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"Komunikacja NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"Komunikacja NFC jest wyƂączona"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"Komunikacja NFC jest wƂączona"</string>
@@ -439,8 +436,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> będzie zapisywać wszystko, co wyƛwietli się na ekranie."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Nie pokazuj ponownie"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Ukryj wszystkie"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Zarządzanie powiadomieniami"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"W trybie Nie przeszkadzać powiadomienia są ukrywane"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Rozpocznij teraz"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Brak powiadomieƄ"</string>
@@ -541,6 +537,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Dzwonek"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Wibracje"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Wyciszenie"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Kliknij, by wyƂączyć wyciszenie."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Kliknij, by wƂączyć wibracje. UƂatwienia dostępu mogą być wyciszone."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Kliknij, by wyciszyć. UƂatwienia dostępu mogą być wyciszone."</string>
@@ -639,8 +639,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"sterowanie powiadomieniami"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"opcje odkƂadania powiadomieƄ"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"OdƂóĆŒ"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"COFNIJ"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"OdƂoĆŒono na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index b01e155..c56bc91 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -533,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Tocar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorar"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 8653c11..de39f4b 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -74,7 +74,7 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"A guardar captura de ecrã..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Captura de ecrã guardada"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Toque para ver a captura de ecrã."</string>
-    <string name="screenshot_failed_title" msgid="7612509838919089748">"Não foi possível gravar a captura de ecrã"</string>
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Não foi possível guardar a captura de ecrã"</string>
     <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Experimente voltar a efetuar a captura de ecrã."</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Não é possível guardar a captura de ecrã devido a espaço de armazenamento limitado."</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"A aplicação ou a sua entidade não permitem tirar capturas de ecrã"</string>
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Toque"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Desativar som"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para reativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para ativar a vibração. Os serviços de acessibilidade podem ser silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index b01e155..c56bc91 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -533,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Tocar"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrar"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ignorar"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Toque para ativar o som."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 24bcd97..a553f3f 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -536,6 +536,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Sonerie"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibrații"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Blocați"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Atingeți pentru a activa sunetul."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Atingeți pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8b21901..bf48c26 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -358,7 +358,7 @@
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"ĐœĐŸĐŽŃƒĐ»ŃŒ NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"ĐœĐŸĐŽŃƒĐ»ŃŒ NFC ĐŸŃ‚ĐșĐ»ŃŽŃ‡Đ”Đœ"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"ĐœĐŸĐŽŃƒĐ»ŃŒ NFC ĐČĐșĐ»ŃŽŃ‡Đ”Đœ"</string>
-    <string name="recents_empty_message" msgid="808480104164008572">"ĐĐ”ĐŽĐ°ĐČĐœĐžŃ… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč ĐœĐ”Ń‚"</string>
+    <string name="recents_empty_message" msgid="808480104164008572">"Đ—ĐŽĐ”ŃŃŒ ĐżĐŸĐșĐ° ĐœĐžŃ‡Đ”ĐłĐŸ ĐœĐ”Ń‚."</string>
     <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Вы ĐŸŃ‡ĐžŃŃ‚ĐžĐ»Đž ĐČсё"</string>
     <string name="recents_app_info_button_label" msgid="2890317189376000030">"ĐĄĐČĐ”ĐŽĐ”ĐœĐžŃ ĐŸ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž"</string>
     <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"Đ—Đ°Đ±Đ»ĐŸĐșĐžŃ€ĐŸĐČать ĐČ ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž"</string>
@@ -539,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ĐĄĐŸ Đ·ĐČуĐșĐŸĐŒ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Đ’ĐžĐ±Ń€Đ°Ń†ĐžŃ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"БДз Đ·ĐČуĐșĐ°"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ĐĐ°Đ¶ĐŒĐžŃ‚Đ”, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ Đ·ĐČуĐș."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ĐĐ°Đ¶ĐŒĐžŃ‚Đ”, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ ĐČОбрацОю. ĐĄĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đ” ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž ĐŒĐŸĐłŃƒŃ‚ прДĐșратоть Ń€Đ°Đ±ĐŸŃ‚Ńƒ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ĐĐ°Đ¶ĐŒĐžŃ‚Đ”, Ń‡Ń‚ĐŸĐ±Ń‹ ĐČыĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ Đ·ĐČуĐș. ĐĄĐżĐ”Ń†ĐžĐ°Đ»ŃŒĐœŃ‹Đ” ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸŃŃ‚Đž ĐŒĐŸĐłŃƒŃ‚ прДĐșратоть Ń€Đ°Đ±ĐŸŃ‚Ńƒ."</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 63b14d7..a0bed4f4 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"තිර රුව සුරැකෙඞින් ඎවතී…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"තිර රුව සුරකින à¶œà¶Żà·“"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ඔබගේ තිර රුව බැගීඞට තට්ටු කරන්න"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"තිර රුව සුරැකිà¶ș නොහැකි විà¶ș"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"තිර රුව නැවත ගැනීඞට උත්සාහ කරන්න"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"සීඞිත ගබඩා ඉඩ නිසා තිර රුව සුරැකිà¶ș නොහැකිà¶ș"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"තිර රූ ගැනීඞට à¶șà·™à¶Żà·”à¶ž හෝ ඔබගේ සංවිධානà¶ș ඉඩ à¶±à·œà¶Żà·š"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB ගොනු හුවඞාරු විකග්ඎ"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"හිරු à¶¶à·à·ƒà·“à¶žà·šà¶Żà·“ ක්‍රි."</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"හිරු නගින තෙක්"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g>ට ක්‍රිà¶șාත්ඞකà¶șි"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> තෙක්"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC අබගà¶șි"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC සබගà¶șි"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"ඔබගේ තීරà¶șේ à¶Żà¶»à·Šà·à¶±à¶ș වන සෑඞ à¶Żà·™à¶șඞ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ගබාගැනීඞ ආරඞ්භ කරන à¶œà¶Żà·’."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"නැවත නොඎෙන්වන්න"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"සිà¶șග්ග හිස් කරන්න"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"à¶Żà·à¶±à·”à¶žà·Š à¶Żà·“à¶žà·Š කළඞනාකරණà¶ș කරන්න"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"බාධා නොකරන්න à¶Żà·à¶±à·”à¶žà·Šà¶Żà·“à¶žà·Š සඟවඞින්"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"à¶Żà·à¶±à·Š අරà¶čන්න"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"à¶Żà·à¶±à·”à¶žà·Šà¶Żà·“à¶žà·Š නැත"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à¶±à·à¶Ż කරන්න"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"කඞ්ඎනà¶ș කරන්න"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"à¶±à·’à·„à¶Ź කරන්න"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. à¶±à·’à·„à¶Ź කිරීඞ ඉවත් කිරීඞට තට්ටු කරන්න."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. කඞ්ඎනà¶ș කිරීඞට තට්ටු කරන්න. ඎ්‍රවේශ්‍à¶șතා සේවා à¶±à·’à·„à¶Ź කළ හැකිà¶ș."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. à¶±à·’à·„à¶Ź කිරීඞට තට්ටු කරන්න. ඎ්‍රවේශ්‍à¶șතා සේවා à¶±à·’à·„à¶Ź කළ හැකිà¶ș."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"à¶Żà·à¶±à·”à¶žà·Šà¶Żà·“à¶žà·Š ඎාගන"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"à¶Żà·à¶±à·”à¶žà·Šà¶Żà·“à¶žà·Š à¶žà¶Żà¶šà·Š නතර කිරීඞේ විකග්ඎ"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"à¶șළි සිහි à¶šà·à¶łà·€à¶±à·Šà¶±"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"අස් කරන්න"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ක් à¶žà¶Żà¶šà·Š නතර කරන à¶œà¶Żà·“"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d2e9d3c..36b217a 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -539,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"PrezvoniƄ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"VibrovaƄ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"VypnúĆ„ zvuk"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Klepnutím zapnite zvuk."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Klepnutím aktivujte reĆŸim vibrovania. SluĆŸby dostupnosti je moĆŸné stlmiĆ„."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnite zvuk. SluĆŸby dostupnosti je moĆŸné stlmiĆ„."</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index b983d96..138e50b 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -539,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zvonjenje"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibriranje"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Utišano"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Dotaknite se, če ĆŸelite vklopiti zvok."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Dotaknite se, če ĆŸelite nastaviti vibriranje. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dotaknite se, če ĆŸelite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 5519a27..fd8ca7e 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Bjeri ziles"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dridhje"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Pa zë"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Trokit për të aktivizuar."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index dd35850..06e5d0f 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -534,6 +534,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"АĐșтоĐČорај Đ·ĐČĐŸĐœĐŸ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Đ’ĐžĐ±Ń€ĐžŃ€Đ°Ń˜"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ИсĐșључо Đ·ĐČуĐș"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Đ”ĐŸĐŽĐžŃ€ĐœĐžŃ‚Đ” ĐŽĐ° бОстД уĐșŃ™ŃƒŃ‡ĐžĐ»Đž Đ·ĐČуĐș."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Đ”ĐŸĐŽĐžŃ€ĐœĐžŃ‚Đ” ĐŽĐ° бОстД ĐżĐŸĐŽĐ”ŃĐžĐ»Đž ĐœĐ° ĐČĐžĐ±Ń€Đ°Ń†ĐžŃ˜Ńƒ. ЗĐČуĐș услуга ĐżŃ€ĐžŃŃ‚ŃƒĐżĐ°Ń‡ĐœĐŸŃŃ‚Đž ћД ĐŒĐŸĐ¶ĐŽĐ° бОтО ОсĐșŃ™ŃƒŃ‡Đ”Đœ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Đ”ĐŸĐŽĐžŃ€ĐœĐžŃ‚Đ” ĐŽĐ° бОстД ОсĐșŃ™ŃƒŃ‡ĐžĐ»Đž Đ·ĐČуĐș. ЗĐČуĐș услуга ĐżŃ€ĐžŃŃ‚ŃƒĐżĐ°Ń‡ĐœĐŸŃŃ‚Đž ћД ĐŒĐŸĐ¶ĐŽĐ° бОтО ОсĐșŃ™ŃƒŃ‡Đ”Đœ."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e1fb706..1860676 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Skärmdumpen sparas ..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Skärmdumpen har sparats"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Visa skärmdumpen genom att trycka här"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Det gick inte att spara skärmdumpen"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Testa att ta en skärmdump igen"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Det går inte att spara skärmdumpen eftersom lagringsutrymmet inte räcker"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Appen eller organisationen tillåter inte att du tar skärmdumpar"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Överföringsalternativ"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På från solnedgången"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Till soluppgången"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"På från <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Till <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC är inaktiverat"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC är aktiverat"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar en bild av allt som visas på skärmen."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Visa inte igen"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Rensa alla"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Hantera aviseringar"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Aviseringar döljs av Stör ej"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Starta nu"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Inga aviseringar"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ringsignal"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Vibration"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Dölj"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Tryck här om du vill slå på ljudet."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tryck här om du vill sätta på vibrationen. Tillgänglighetstjänster kanske inaktiveras."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"inställningar för aviseringar"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"alternativ för att snooza aviseringar"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Pausa"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"ÅNGRA"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Snoozad i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 570234e..0197e7e 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Piga"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Tetema"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Zima sauti"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Gusa ili urejeshe."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Gusa ili uweke mtetemo. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
@@ -843,9 +847,9 @@
     <string name="slice_permission_allow" msgid="2340244901366722709">"Ruhusu"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Kataa"</string>
     <string name="auto_saver_title" msgid="1217959994732964228">"Gusa ili uratibu wakati wa kuwasha Kiokoa Betri"</string>
-    <string name="auto_saver_text" msgid="6324376061044218113">"Weka kiokoa betri kiwake kiotomatiki wakati chaji ya betri imefika <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Washa kiokoa betri kiotomatiki chaji ya betri inapofika <xliff:g id="PERCENTAGE">%d</xliff:g>%%"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"Hapana, asante"</string>
-    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Imewasha Kiokoa Betri kilichoratibiwa"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Ratiba ya Kiokoa Betri imewashwa"</string>
     <string name="auto_saver_enabled_text" msgid="874711029884777579">"Kiokoa Betri kitawaka kiotomatiki baada ya chaji ya betri kufika chini ya <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string>
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Mipangilio"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"Nimeelewa"</string>
diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml
index 67dabdb..f91af03 100644
--- a/packages/SystemUI/res/values-sw600dp/config.xml
+++ b/packages/SystemUI/res/values-sw600dp/config.xml
@@ -35,4 +35,7 @@
     <!-- Animation duration when using long press on recents to dock -->
     <integer name="long_press_dock_anim_duration">290</integer>
 
+    <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+    <integer name="navigation_bar_deadzone_orientation">0</integer>
+
 </resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 419c288..4beedd1 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -435,8 +435,7 @@
     <string name="clear_all_notifications_text" msgid="814192889771462828">"àźŽàźČàŻàźČàźŸàź”àź±àŻàź±àŻˆàźŻàŻàźźàŻ àź…àźŽàźż"</string>
     <!-- no translation found for manage_notifications_text (8035284146227267681) -->
     <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'àź€àŻŠàźšàŻàź€àź°àź”àŻ àźšàŻ†àźŻàŻàźŻ àź”àŻ‡àźŁàŻàźŸàźŸàźźàŻ\' àźȘàźŻàź©àŻàźźàŻàź±àŻˆàźŻàźŸàź©àź€àŻ àź…àź±àźżàź”àźżàźȘàŻàźȘàŻàź•àźłàŻˆàź•àŻ àź•àźŸàźŸàŻàźŸàźŸàźźàźČàŻ àźźàź±àŻˆàź•àŻàź•àźżàź±àź€àŻ"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"àź‡àźȘàŻàźȘàŻ‹àź€àŻ àź€àŻŠàźŸàź™àŻàź•àŻ"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"àź…àź±àźżàź”àźżàźȘàŻàźȘàŻàź•àźłàŻ àź‡àźČàŻàźČàŻˆ"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"àźšàŻàźŻàź”àźżàź”àź°àźźàŻ àź•àźŁàŻàź•àźŸàźŁàźżàź•àŻàź•àźȘàŻàźȘàźŸàźČàźŸàźźàŻ"</string>
@@ -536,6 +535,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àź’àźČàźż"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àź…àź€àźżàź°àŻàź”àŻ"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àź…àźźàŻˆàź€àźż"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. àź’àźČàźż àź‡àźŻàź•àŻàź•, àź€àźŸàŻàźŸàź”àŻàźźàŻ."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. àź…àź€àźżàź°àŻàź”àźżàź±àŻàź•àŻ àź…àźźàŻˆàź•àŻàź•, àź€àźŸàŻàźŸàź”àŻàźźàŻ. àź…àźŁàŻàź•àźČàŻàź€àź©àŻàźźàŻˆ àźšàŻ‡àź”àŻˆàź•àźłàŻ àź’àźČàźżàźŻàźŸàź•àŻàź•àźȘàŻàźȘàźŸàź•àŻàź•àŻ‚àźŸàŻàźźàŻ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. àź’àźČàźżàźŻàźŸàź•àŻàź•, àź€àźŸàŻàźŸàź”àŻàźźàŻ. àź…àźŁàŻàź•àźČàŻàź€àź©àŻàźźàŻˆ àźšàŻ‡àź”àŻˆàź•àźłàŻ àź’àźČàźżàźŻàźŸàź•àŻàź•àźȘàŻàźȘàźŸàź•àŻàź•àŻ‚àźŸàŻàźźàŻ."</string>
@@ -820,8 +823,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"àźžàŻàź•àźżàź°àŻ€àź©àŻ àź·àźŸàźŸàŻàźŸàŻàź•àźłàŻ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"àźȘàŻŠàź€àŻàźšàŻ àźšàŻ†àźŻàŻàź€àźżàź•àźłàŻ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"àźšàŻ‡àźźàźżàźȘàŻàźȘàźżàźŸàźźàŻ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"àź•àŻàź±àźżàźȘàŻàźȘàŻàź•àźłàŻ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"àź‡àź©àŻàźžàŻàźŸàźŁàŻàźŸàŻ àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàź•àźłàŻ"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"àź‡àź©àŻàźžàŻàźŸàźŁàŻàźŸàŻ àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàź•àźłàŻàź•àŻàź•àŻ àźšàźżàź±àŻàź”àźČàŻ àź€àŻ‡àź”àŻˆàźŻàźżàźČàŻàźČàŻˆ."</string>
     <string name="app_info" msgid="6856026610594615344">"àź†àźȘàŻàźžàŻ àź€àź•àź”àźČàŻ"</string>
@@ -849,18 +851,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"àźŽàźČàŻàźČàźŸ àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàźżàźČàźżàź°àŻàźšàŻàź€àŻàźźàŻ àź”àźżàźŽàźżàźȘàŻàźȘàŻ‚àźŸàŻàźŸàźČàŻàź•àźłàŻˆàź•àŻ àź•àźŸàźŁàŻàźȘàźżàź•àŻàź•, <xliff:g id="APP">%1$s</xliff:g> àźȘàźŻàź©àŻàźȘàźŸàźŸàŻàźŸàŻˆ àź…àź©àŻàźźàź€àźż"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"àź…àź©àŻàźźàź€àźż"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"àźšàźżàź°àźŸàź•àź°àźż"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"àźȘàŻ‡àźŸàŻàźŸàź°àźż àźšàŻ‡àźźàźżàźȘàŻàźȘàźŸàź©àŻˆ àź†àź©àŻ àźšàŻ†àźŻàŻàź”àź€àŻ àź€àŻŠàźŸàź°àŻàźȘàźŸàź•àź€àŻ àź€àźżàźŸàŻàźŸàźźàźżàźŸ, àź€àźŸàŻàźŸàź”àŻàźźàŻ"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"àźȘàŻ‡àźŸàŻàźŸàź°àźżàźŻàźżàź©àŻ àź…àźłàź”àŻ <xliff:g id="PERCENTAGE">%d</xliff:g>%% àź†àź• àź‡àź°àŻàź•àŻàź•àŻàźźàŻàźȘàŻ‹àź€àŻ, àź€àźŸàź©àźŸàź• àź†àź©àŻ àźšàŻ†àźŻàŻ"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"àź”àŻ‡àźŁàŻàźŸàźŸàźźàŻ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"àź€àźżàźŸàŻàźŸàźźàźżàźŸàŻàźŸ àźȘàŻ‡àźŸàŻàźŸàź°àźż àźšàŻ‡àźźàźżàźȘàŻàźȘàźŸàź©àŻ àź†àź©àŻ àźšàŻ†àźŻàŻàźŻàźȘàŻàźȘàźŸàŻàźŸàź€àŻ"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"àźȘàŻ‡àźŸàŻàźŸàź°àźżàźŻàźżàź©àŻ àź…àźłàź”àŻ <xliff:g id="PERCENTAGE">%d</xliff:g>%%àź•àŻàź•àŻàź•àŻ àź•àŻ€àźŽàŻ àź•àŻàź±àŻˆàźŻàŻàźźàŻàźȘàŻ‹àź€àŻ, àźȘàŻ‡àźŸàŻàźŸàź°àźż àźšàŻ‡àźźàźżàźȘàŻàźȘàźŸàź©àŻ àź€àźŸàź©àźŸàź•àź”àŻ‡ àź†àź©àŻ àźšàŻ†àźŻàŻàźŻàźȘàŻàźȘàźŸàŻàźźàŻ."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"àź…àźźàŻˆàźȘàŻàźȘàŻàź•àźłàŻ"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"àźšàź°àźż"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 5f71c99..1bc990d 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -431,8 +431,7 @@
     <string name="media_projection_remember_text" msgid="3103510882172746752">"à°źà°łà±à°Čీ చూà°Șఔఊ్ఊు"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"అచ్చీ క్à°Čà°żà°Żà°°à± à°šà±‡à°Żà°‚à°Ąà°ż"</string>
     <string name="manage_notifications_text" msgid="8035284146227267681">"à°šà±‹à°Ÿà°żà°«à°żà°•à±‡à°·à°šà±‌à°Čచు à°šà°żà°°à±à°”à°čà°żà°‚à°šà°‚à°Ąà°ż"</string>
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"à°…à°‚à°€à°°à°Ÿà°Żà°‚ కà°Čà°żà°—à°żà°‚à°šà°”à°Šà±à°Šà± à°šà±‹à°Ÿà°żà°«à°żà°•à±‡à°·à°šà±‌à°Čచు à°Šà°Ÿà°žà±à°€à±‹à°‚à°Šà°ż"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ఇà°Ș్à°Șà±à°Ąà±‡ à°Șà±à°°à°Ÿà°°à°‚à°­à°żà°‚à°šà±"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"à°šà±‹à°Ÿà°żà°«à°żà°•à±‡à°·à°šà±‌à°Čు à°Čేఔు"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"à°Ș్రొఫైà°Č్‌à°šà°ż à°Șà°°à±à°Żà°”à±‡à°•à±à°·à°żà°‚à°šà°”à°šà±à°šà±"</string>
@@ -532,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"à°°à°żà°‚à°—à±"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"à°”à±ˆà°Źà±à°°à±‡à°Ÿà±"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"à°źà±à°Żà±‚à°Ÿà±"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. అచ్‌à°źà±à°Żà±‚à°Ÿà± à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°šà±Šà°•à±à°•à°‚à°Ąà°ż."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. à°”à±ˆà°Źà±à°°à±‡à°·à°šà±‌కు ఞెట్ à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°šà±Šà°•à±à°•à°‚à°Ąà°ż. à°Żà°Ÿà°•à±à°žà±†à°žà± à°žà°Ÿà°źà°°à±à°„à±à°Ż ఞేఔà°Čు à°źà±à°Żà±‚à°Ÿà± à°šà±‡à°Żà°Źà°Ąà°”à°šà±à°šà±."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. à°źà±à°Żà±‚à°Ÿà± à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°šà±Šà°•à±à°•à°‚à°Ąà°ż. à°Żà°Ÿà°•à±à°žà±†à°žà± à°žà°Ÿà°źà°°à±à°„à±à°Ż ఞేఔà°Čు à°źà±à°Żà±‚à°Ÿà± à°šà±‡à°Żà°Źà°Ąà°”à°šà±à°šà±."</string>
@@ -815,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"ఞ్క్రీచ్‌షటట్‌à°Čు"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"à°žà°Ÿà°§à°Ÿà°°à°Ł ఞంఊేశటà°Čు"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"à°šà°żà°Č్ఔ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"ఞూచచà°Čు"</string>
     <string name="instant_apps" msgid="6647570248119804907">"à°€à°•à±à°·à°Ł అచుఔర్ఀచటà°Čు"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"à°€à°•à±à°·à°Ł అచుఔర్ఀచటà°Čకు ఇచ్‌ఞ్టటà°Čేషచ్ అఔఞరం à°Čేఊు."</string>
     <string name="app_info" msgid="6856026610594615344">"à°Żà°Ÿà°Ș్ à°žà°źà°Ÿà°šà°Ÿà°°à°‚"</string>
@@ -844,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"ఏ à°Żà°Ÿà°Ș్ à°šà±à°‚à°Ąà°ż à°…à°Żà°żà°šà°Ÿ ఞ్à°Čైఞ్‌à°Čచు చూà°Șà°żà°‚à°šà°Ąà°Ÿà°šà°żà°•à°ż <xliff:g id="APP">%1$s</xliff:g>à°šà°ż à°…à°šà±à°źà°€à°żà°‚à°šà°‚à°Ąà°ż"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"à°…à°šà±à°źà°€à°żà°‚à°šà±"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"à°€à°żà°°à°žà±à°•à°°à°żà°‚à°šà±"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"à°Źà±à°Żà°Ÿà°Ÿà°°à±€ ఞేఔర్‌à°šà°ż à°·à±†à°Ąà±à°Żà±‚à°Č్ à°šà±‡à°Żà°Ąà°Ÿà°šà°żà°•à°ż à°šà±Šà°•à±à°•à°‚à°Ąà°ż"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"à°Źà±à°Żà°Ÿà°Ÿà°°à±€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ఉచ్చà°Ș్à°Șà±à°Ąà± à°†à°Ÿà±‹à°źà±‡à°Ÿà°żà°•à±‌à°—à°Ÿ ఆచ్ à°…à°”à±à°€à±à°‚à°Šà°ż"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"ఔఊ్ఊు, à°§à°šà±à°Żà°”à°Ÿà°Šà°Ÿà°Čు"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"à°Źà±à°Żà°Ÿà°Ÿà°°à±€ ఞేఔర్ à°·à±†à°Ąà±à°Żà±‚à°Č్ ఆచ్ à°šà±‡à°Żà°Źà°Ąà°żà°‚à°Šà°ż"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"à°Źà±à°Żà°Ÿà°Ÿà°°à±€ <xliff:g id="PERCENTAGE">%d</xliff:g>%% కంటే à°€à°—à±à°—à°żà°šà°Ș్à°Șà±à°Ąà± à°Źà±à°Żà°Ÿà°Ÿà°°à±€ ఞేఔర్ à°†à°Ÿà±‹à°źà±‡à°Ÿà°żà°•à±‌à°—à°Ÿ ఆచ్ à°…à°”à±à°€à±à°‚à°Šà°ż."</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"à°žà±†à°Ÿà±à°Ÿà°żà°‚à°—à±‌à°Čు"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"à°…à°°à±à°„à°źà±ˆà°‚à°Šà°ż"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 6794a09..142f667 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -75,7 +75,7 @@
     <string name="screenshot_saved_title" msgid="5637073968117370753">"àžšàž±àž™àž—àž¶àžàž àžČàžžàž«àž™àč‰àžČàžˆàž­àčàž„àč‰àž§"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"àčàž•àž°àč€àžžàž·àčˆàž­àž”àžčàž àžČàžžàž«àž™àč‰àžČàžˆàž­"</string>
     <string name="screenshot_failed_title" msgid="7612509838919089748">"àžšàž±àž™àž—àž¶àžàž àžČàžžàž«àž™àč‰àžČàžˆàž­àč„àžĄàčˆàč„àž”àč‰"</string>
-    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àž„àž­àž‡àž–àčˆàžČàžąàž àžČàžžàž«àž™àč‰àžČàžˆàž­àž­àž”àžàž„àžŁàž±àč‰àž‡"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"àž„àž­àž‡àžšàž±àž™àž—àž¶àžàž àžČàžžàž«àž™àč‰àžČàžˆàž­àž­àž”àžàž„àžŁàž±àč‰àž‡"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"àžšàž±àž™àž—àž¶àžàž àžČàžžàž«àž™àč‰àžČàžˆàž­àč„àžĄàčˆàč„àž”àč‰àč€àž™àž·àčˆàž­àž‡àžˆàžČàžàžžàž·àč‰àž™àž—àž”àčˆàč€àžàč‡àžšàž‚àč‰àž­àžĄàžčàž„àžĄàž”àžˆàžłàžàž±àž”"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"àčàž­àž›àž«àžŁàž·àž­àž­àž‡àž„àčŒàžàžŁàž‚àž­àž‡àž„àžžàž“àč„àžĄàčˆàž­àž™àžžàžàžČàž•àčƒàž«àč‰àžˆàž±àžšàž àžČàžžàž«àž™àč‰àžČàžˆàž­"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"àž•àž±àž§àč€àž„àž·àž­àžàžàžČàžŁàž–àčˆàžČàžąàč‚àž­àž™àč„àžŸàž„àčŒ USB"</string>
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"àž—àžłàčƒàž«àč‰àžȘàčˆàž‡àč€àžȘàž”àžąàž‡"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"àžȘàž±àčˆàž™"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"àž›àžŽàž”àč€àžȘàž”àžąàž‡"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s àčàž•àž°àč€àžžàž·àčˆàž­àč€àž›àžŽàž”àč€àžȘàž”àžąàž‡"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s àčàž•àž°àč€àžžàž·àčˆàž­àž•àž±àč‰àž‡àž„àčˆàžČàčƒàž«àč‰àžȘàž±àčˆàž™ àž­àžČàžˆàžĄàž”àžàžČàžŁàž›àžŽàž”àč€àžȘàž”àžąàž‡àžšàžŁàžŽàžàžČàžŁàžàžČàžŁàč€àž‚àč‰àžČàž–àž¶àž‡"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s àčàž•àž°àč€àžžàž·àčˆàž­àž›àžŽàž”àč€àžȘàž”àžąàž‡ àž­àžČàžˆàžĄàž”àžàžČàžŁàž›àžŽàž”àč€àžȘàž”àžąàž‡àžšàžŁàžŽàžàžČàžŁàžàžČàžŁàč€àž‚àč‰àžČàž–àž¶àž‡"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index f812956..1f7f8f0 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ipa-ring"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"I-vibrate"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"I-mute"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. I-tap upang i-unmute."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. I-tap upang itakda na mag-vibrate. Maaaring i-mute ang mga serbisyo sa Accessibility."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 06d0500..69b8df3 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Zili çaldır"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"TitreƟim"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Sesi kapat"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Sesi açmak için dokunun."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. TitreƟime ayarlamak için dokunun. EriƟilebilirlik hizmetlerinin sesi kapatılabilir."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için dokunun. EriƟilebilirlik hizmetlerinin sesi kapatılabilir."</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 0be01d6..0a521a9 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -539,6 +539,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"ДзĐČŃ–ĐœĐŸĐș"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Đ’Ń–Đ±Ń€ĐŸŃĐžĐłĐœĐ°Đ»"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"БДз Đ·ĐČуĐșу"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ĐąĐŸŃ€ĐșĐœŃ–Ń‚ŃŒŃŃ, Ń‰ĐŸĐ± уĐČŃ–ĐŒĐșĐœŃƒŃ‚Đž Đ·ĐČуĐș."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ĐąĐŸŃ€ĐșĐœŃ–Ń‚ŃŒŃŃ, Ń‰ĐŸĐ± ĐœĐ°Đ»Đ°ŃˆŃ‚ŃƒĐČато ĐČŃ–Đ±Ń€ĐŸŃĐžĐłĐœĐ°Đ». ĐĄĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČĐžĐŒĐșĐœĐ”ĐœĐŸ."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ĐąĐŸŃ€ĐșĐœŃ–Ń‚ŃŒŃŃ, Ń‰ĐŸĐ± ĐČĐžĐŒĐșĐœŃƒŃ‚Đž Đ·ĐČуĐș. ĐĄĐżĐ”Ń†Ń–Đ°Đ»ŃŒĐœŃ– ĐŒĐŸĐ¶Đ»ĐžĐČĐŸŃŃ‚Ń– ĐŒĐŸĐ¶Đ” Đ±ŃƒŃ‚Đž ĐČĐžĐŒĐșĐœĐ”ĐœĐŸ."</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index dede878..cb215c1 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč Ù…Ű­ÙÙˆŰž ہو Ű±ÛŰ§ ہے…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč Ù…Ű­ÙÙˆŰž ہو ÚŻÛŒŰ§"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Ű§ÙŸÙ†Ű§ Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč ŰŻÛŒÚ©ÚŸÙ†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč کو Ù…Ű­ÙÙˆŰž نہیÚș Ú©ÛŒŰ§ ۏۧ ۳کۧ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"ŰŻÙˆŰšŰ§Ű±Û Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč لینے کی Ú©ÙˆŰŽŰŽ Ú©Ű±ÛŒÚș"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"ۧ۳ÙčÙˆŰ±ÛŒŰŹ کی Ù…Ű­ŰŻÙˆŰŻ ŰŹÚŻÛ کی ÙˆŰŹÛ ŰłÛ’ Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙč کو Ù…Ű­ÙÙˆŰž نہیÚș Ú©ÛŒŰ§ ۏۧ ŰłÚ©ŰȘۧ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ű§ÛŒÙŸ ÛŒŰ§ ŰąÙŸ کی ŰȘÙ†ŰžÛŒÙ… کی ŰŹŰ§Ù†Űš ŰłÛ’ Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙčŰł لینے کی ۧۏۧŰČŰȘ نہیÚș ہے"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"‏USB ÙŰ§ŰŠÙ„ منŰȘقل Ú©Ű±Ù†ÛŒÚ©Û’ ۧ۟ŰȘÛŒŰ§Ű±Ű§ŰȘ"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ŰșŰ±ÙˆŰš ŰąÙŰȘۧۚ کے وقŰȘ ŰąÙ† ÛÙˆÚŻÛŒ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ű·Ù„ÙˆŰč ŰąÙŰȘۧۚ ŰȘÚ©"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"ŰąÙ† ÛÙˆÚŻÛŒ ŰšÙˆÙ‚ŰȘ <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> ŰȘÚ©"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"‏NFC ŰșÛŒŰ± فŰčŰ§Ù„ ہے"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"‏NFC فŰčŰ§Ù„ ہے"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ŰąÙŸ کی Ű§ŰłÚ©Ű±ÛŒÙ† ÙŸŰ± ÚˆŰłÙŸÙ„Û’ ہونے ÙˆŰ§Ù„ÛŒ ÛŰ± چیŰČ Ú©Ùˆ Ú©ÛŒÙŸÚ†Ű± Ú©Ű±Ù†Ű§ ŰŽŰ±ÙˆŰč ک۱ ŰŻÛŒÚŻÛŒÛ”"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"ŰŻÙˆŰšŰ§Ű±Û نہ ŰŻÚ©ÚŸŰ§ŰŠÛŒÚș"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"ŰłŰšÚŸÛŒ کو Ű”Ű§Ù Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Ű§Ű·Ù„Ű§ŰčۧŰȘ کۧ Ù†ŰžÙ… Ú©Ű±ÛŒÚș"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"\'ڈ۳Ùč۱ۚ نہ Ú©Ű±ÛŒÚș\' Ű§Ű·Ù„Ű§ŰčۧŰȘ کو Ú†ÚŸÙŸŰ§ Ű±ÛÛŒ ہے"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Ű§ŰšÚŸÛŒ ŰŽŰ±ÙˆŰč Ú©Ű±ÛŒÚș"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Ú©ÙˆŰŠÛŒ Ű§Ű·Ù„Ű§ŰčۧŰȘ نہیÚș ہیÚș"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"ÙŸŰ±ÙˆÙŰ§ŰŠÙ„ کو Ù…Ű§Ù†ÛŒÙč۱ Ú©ÛŒŰ§ ۏۧ ŰłÚ©ŰȘۧ ہے"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Ű±ÙÙ†ÚŻ Ú©Ű±ÛŒÚș"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"ÙˆŰ§ŰŠŰšŰ±ÛŒÙč"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"ŰźŰ§Ù…ÙˆŰŽ Ú©Ű±ÛŒÚș"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"‏‎%1$s۔ ŰąÙˆŰ§ŰČ Ú†Ű§Ù„Ùˆ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș۔"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"‏‎%1$s۔ ۧ۱ŰȘŰčۧێ ÙŸŰ± ŰłÛŒÙč Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș۔ Ű§ÛŒÚ©ŰłÛŒŰłŰšÛŒÙ„Ùčی ŰłŰ±ÙˆŰłŰČ ŰŽŰ§ÛŒŰŻ ŰźŰ§Ù…ÙˆŰŽ ہوÚș۔"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"‏‎%1$s۔ ŰźŰ§Ù…ÙˆŰŽ Ú©Ű±Ù†Û’ Ú©ÛŒÙ„ŰŠÛ’ ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș۔ Ű§ÛŒÚ©ŰłÛŒŰłŰšÛŒÙ„Ùčی ŰłŰ±ÙˆŰłŰČ ŰŽŰ§ÛŒŰŻ ŰźŰ§Ù…ÙˆŰŽ ہوÚș۔"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"Ű§Ű·Ù„Ű§Űč کے کنÙčŰ±ÙˆÙ„ŰČ"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Ű§Ű·Ù„Ű§Űč Ű§ŰłÙ†ÙˆŰČ Ú©Ű±Ù†Û’ کے ۧ۟ŰȘÛŒŰ§Ű±Ű§ŰȘ"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Ű§ŰłÙ†ÙˆŰČ Ú©Ű±ÛŒÚș"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"Ú©Ű§Ù„ŰčŰŻÙ… Ú©Ű±ÛŒÚș"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> Ú©ÛŒÙ„ŰŠÛ’ Ű§ŰłÙ†ÙˆŰČ Ú©ÛŒŰ§ ÚŻÛŒŰ§"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ű§ŰłÚ©Ű±ÛŒÙ† ێۧÙčŰł"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"Űčمومی ÙŸÛŒŰșŰ§Ù…Ű§ŰȘ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"ۧ۳ÙčÙˆŰ±ÛŒŰŹ"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"ۧێۧ۱ۧŰȘ"</string>
     <string name="instant_apps" msgid="6647570248119804907">"ÙÙˆŰ±ÛŒ Ű§ÛŒÙŸŰł"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"ÙÙˆŰ±ÛŒ Ű§ÛŒÙŸŰł کو Ű§Ù†ŰłÙčŰ§Ù„ÛŒŰŽÙ† کی Ű¶Ű±ÙˆŰ±ŰȘ نہیÚș ہے۔"</string>
     <string name="app_info" msgid="6856026610594615344">"Ű§ÛŒÙŸ کی مŰčÙ„ÙˆÙ…Ű§ŰȘ"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> کو Ú©ŰłÛŒ ŰšÚŸÛŒ Ű§ÛŒÙŸ ŰłÛ’ ŰłÙ„Ű§ŰŠŰłŰČ ŰŻÚ©ÚŸŰ§Ù†Û’ کی ۧۏۧŰČŰȘ ŰŻÛŒÚș"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"ۧۏۧŰČŰȘ ŰŻÛŒÚș"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Ù…ŰłŰȘ۱ۯ Ú©Ű±ÛŒÚș"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"ŰšÛŒÙčŰ±ÛŒ ŰłÛŒÙˆŰ± ŰŽÛŒÚˆÙˆÙ„ Ú©Ű±Ù†Û’ کے لیے ŰȘÚŸÙŸŰȘÚŸÙŸŰ§ŰŠÛŒÚș"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"ŰŹŰš ŰšÛŒÙčŰ±ÛŒ <xliff:g id="PERCENTAGE">%d</xliff:g>%% ہو ŰŹŰ§ŰŠÛ’ ŰȘو ŰźÙˆŰŻÚ©Ű§Ű± Ű·ÙˆŰ± ÙŸŰ± ŰąÙ† Ú©Ű±ÛŒÚș"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"نہیÚș ŰŽÚ©Ű±ÛŒÛ"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"ŰšÛŒÙčŰ±ÛŒ ŰłÛŒÙˆŰ± ŰŽÛŒÚˆÙˆÙ„ ŰąÙ† ہو ÚŻÛŒŰ§"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"ŰšÛŒÙčŰ±ÛŒ کے <xliff:g id="PERCENTAGE">%d</xliff:g>%% ŰłÛ’ کم ہونے ÙŸŰ± ŰšÛŒÙčŰ±ÛŒ ŰłÛŒÙˆŰ± ŰźÙˆŰŻÚ©Ű§Ű± Ű·ÙˆŰ± ÙŸŰ± ŰąÙ† ہو ŰŹŰ§ŰŠÛ’ ÚŻŰ§Û”"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"ŰȘ۱ŰȘÛŒŰšŰ§ŰȘ"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"ŰłÙ…ŰŹÚŸ Űą ÚŻŰŠÛŒ"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index a923151..002e10c 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Skrinshot saqlanmoqda…"</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Skrinshot saqlandi"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Skrinshotni ochish uchun bosing"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Skrinshot saqlanmadi"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Qayta skrinshot olib ko‘ring"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Xotirada joy kamligi uchun skrinshot saqlanmadi"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ilova yoki tashkilotingiz skrinshot olishni taqiqlagan"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB fayl ko‘chirish moslamalari"</string>
@@ -350,8 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kunbotarda yoqish"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Quyosh chiqqunicha"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> da yoqish"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"<xliff:g id="TIME">%s</xliff:g> gacha"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC o‘chiq"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC yoniq"</string>
@@ -435,8 +432,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilovasi qurilma ekranidagi har qanday tasvirni ko‘rishni boshlaydi."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Boshqa ko‘rsatilmasin"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Hammasini tozalash"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"Bildirishnomalarni boshqarish"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Bezovta qilinmasin rejimi bildirishnomalarni berkitmoqda"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"Boshlash"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Bildirishnomalar yo‘q"</string>
@@ -537,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Jiringlatish"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Tebranish"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Ovozsiz"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Ovozini yoqish uchun ustiga bosing."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Tebranishni yoqish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
@@ -631,8 +631,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"bildirishnoma sozlamalari"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"bildirishnomalarni kechiktirish parametrlari"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Kechiktirish"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"BEKOR QILISH"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> muddatga kechiktirildi"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -850,10 +849,10 @@
     <string name="slice_permission_allow" msgid="2340244901366722709">"Ruxsat"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"Rad etish"</string>
     <string name="auto_saver_title" msgid="1217959994732964228">"Quvvat tejash rejimini rejalashtirish uchun bosing"</string>
-    <string name="auto_saver_text" msgid="6324376061044218113">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% bo‘lganda avtomatik yoqish"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% ga tushganda avtomatik yoqish"</string>
     <string name="no_auto_saver_action" msgid="8086002101711328500">"Kerak emas"</string>
-    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Quvvat tejash rejimi jadvali yoqildi"</string>
-    <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% bo‘lganda, quvvat tejash rejimi avtomatik ravishda yoqiladi."</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"Quvvat tejash rejimi jadvali faollashtirildi"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"Batareya quvvati <xliff:g id="PERCENTAGE">%d</xliff:g>%% ga tushganda, quvvat tejash rejimi avtomatik ravishda yoqiladi."</string>
     <string name="open_saver_setting_action" msgid="8314624730997322529">"Sozlamalar"</string>
     <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 97a36dd..480a1ba 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"Đang lÆ°u áșŁnh chỄp màn hình..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"Đã lÆ°u áșŁnh chỄp màn hình"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"Nháș„n để xem áșŁnh chỄp màn hình của báșĄn"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"Không thể lÆ°u áșŁnh chỄp màn hình"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"Hãy thá»­ chỄp láșĄi màn hình"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"Không thể lÆ°u áșŁnh chỄp màn hình do giới háșĄn dung lÆ°á»Łng bộ nhớ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"Ớng dỄng hoáș·c tổ chức của báșĄn không cho phép chỄp áșŁnh màn hình"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"Tùy chọn truyền tệp USB"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Báș­t khi trời tối"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Cho đáșżn khi trời sáng"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Báș­t vào lúc <xliff:g id="TIME">%s</xliff:g>"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"Cho đáșżn <xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC đã Ä‘Æ°á»Łc táșŻt"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC đã Ä‘Æ°á»Łc báș­t"</string>
@@ -433,8 +430,7 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sáșœ báșŻt đáș§u chỄp mọi thứ hiển thị trên màn hình."</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"Không hiển thị láșĄi"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"Xóa táș„t cáșŁ"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"QuáșŁn lý thông báo"</string>
     <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"Cháșż độ Không làm phiền đang áș©n thông báo"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"BáșŻt đáș§u ngay"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"Không có thông báo nào"</string>
@@ -535,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Đổ chuông"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Rung"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"TáșŻt tiáșżng"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Nháș„n để báș­t tiáșżng."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Nháș„n để đáș·t cháșż độ rung. BáșĄn có thể táșŻt tiáșżng dịch vỄ trợ năng."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Nháș„n để táșŻt tiáșżng. BáșĄn có thể táșŻt tiáșżng dịch vỄ trợ năng."</string>
@@ -629,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"điều khiển thông báo"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"Tùy chọn báo láșĄi thông báo"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"Báo láșĄi"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"HOÀN TÁC"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"Báo láșĄi sau <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b5f7088..df6e131 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -74,10 +74,8 @@
     <string name="screenshot_saving_title" msgid="8242282144535555697">"æ­Łćœšäżć­˜ć±ćč•æˆȘć›Ÿ..."</string>
     <string name="screenshot_saved_title" msgid="5637073968117370753">"ć·Čäżć­˜ć±ćč•æˆȘć›Ÿ"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"ç‚čæŒ‰ćłćŻæŸ„çœ‹æ‚šçš„ć±ćč•æˆȘć›Ÿ"</string>
-    <!-- no translation found for screenshot_failed_title (7612509838919089748) -->
-    <skip />
-    <!-- no translation found for screenshot_failed_to_save_unknown_text (3637758096565605541) -->
-    <skip />
+    <string name="screenshot_failed_title" msgid="7612509838919089748">"æ— æł•äżć­˜ć±ćč•æˆȘć›Ÿ"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"èŻ·ć†æŹĄć°èŻ•æˆȘć±"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"由äșŽć­˜ć‚šç©șé—Žæœ‰é™ïŒŒæ— æł•äżć­˜ć±ćč•æˆȘć›Ÿ"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"æ­€ćș”ç”šæˆ–æ‚šæ‰€ćœšçš„ć•äœäžć…èźžèż›èĄŒć±ćč•æˆȘć›Ÿ"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB文件䌠蟓选éĄč"</string>
@@ -348,8 +346,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ćœšæ—„èœæ—¶ćŒ€ćŻ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ćœšæ—„ć‡șæ—¶ć…łé—­"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"朹<xliff:g id="TIME">%s</xliff:g> ćŒ€ćŻ"</string>
-    <!-- no translation found for quick_settings_secondary_label_until (2749196569462600150) -->
-    <skip />
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"目戰<xliff:g id="TIME">%s</xliff:g>"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ć·Č恜甹"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ć·Č搯甹"</string>
@@ -433,10 +430,8 @@
     <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ć°†ćŒ€ć§‹æˆȘć–æ‚šçš„ć±ćč•äžŠæ˜Ÿç€șçš„æ‰€æœ‰ć†…ćźč。"</string>
     <string name="media_projection_remember_text" msgid="3103510882172746752">"äžć†æ˜Ÿç€ș"</string>
     <string name="clear_all_notifications_text" msgid="814192889771462828">"ć…šéƒšæž…é™€"</string>
-    <!-- no translation found for manage_notifications_text (8035284146227267681) -->
-    <skip />
-    <!-- no translation found for dnd_suppressing_shade_text (5179021215370153526) -->
-    <skip />
+    <string name="manage_notifications_text" msgid="8035284146227267681">"çźĄç†é€šçŸ„"</string>
+    <string name="dnd_suppressing_shade_text" msgid="5179021215370153526">"ć‹żæ‰°æšĄćŒæ­Łćœšéšè—é€šçŸ„"</string>
     <string name="media_projection_action_text" msgid="8470872969457985954">"ç«‹ćłćŒ€ć§‹"</string>
     <string name="empty_shade_text" msgid="708135716272867002">"æČĄæœ‰é€šçŸ„"</string>
     <string name="profile_owned_footer" msgid="8021888108553696069">"è”„æ–™ćŻèƒœäŒšć—ćˆ°ç›‘æŽ§"</string>
@@ -536,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"操铃"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"æŒŻćŠš"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"静音"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s。ç‚čæŒ‰ćłćŻć–æ¶ˆé™éŸłă€‚"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s。ç‚čæŒ‰ćłćŻèźŸäžșæŒŻćŠšïŒŒäœ†ćŻèƒœäŒšćŒæ—¶ć°†æ— éšœçąæœćŠĄèźŸäžș静音。"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。ç‚čæŒ‰ćłćŻèźŸäžșé™éŸłïŒŒäœ†ćŻèƒœäŒšćŒæ—¶ć°†æ— éšœçąæœćŠĄèźŸäžș静音。"</string>
@@ -630,8 +629,7 @@
     <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g><xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
     <string name="notification_menu_gear_description" msgid="2204480013726775108">"é€šçŸ„èźŸçœź"</string>
     <string name="notification_menu_snooze_description" msgid="3653669438131034525">"é€šçŸ„ć»¶ćŽé€‰éĄč"</string>
-    <!-- no translation found for notification_menu_snooze_action (1112254519029621372) -->
-    <skip />
+    <string name="notification_menu_snooze_action" msgid="1112254519029621372">"滶搎"</string>
     <string name="snooze_undo" msgid="6074877317002985129">"撀消"</string>
     <string name="snoozed_for_time" msgid="2390718332980204462">"ć·Č滶搎 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2124335842674413030">
@@ -820,8 +818,7 @@
     <string name="notification_channel_screenshot" msgid="6314080179230000938">"ć±ćč•æˆȘć›Ÿ"</string>
     <string name="notification_channel_general" msgid="4525309436693914482">"ćžžè§„æ¶ˆæŻ"</string>
     <string name="notification_channel_storage" msgid="3077205683020695313">"歘悹ç©ș问"</string>
-    <!-- no translation found for notification_channel_hints (7323870212489152689) -->
-    <skip />
+    <string name="notification_channel_hints" msgid="7323870212489152689">"提ç€ș"</string>
     <string name="instant_apps" msgid="6647570248119804907">"ć…ćź‰èŁ…ćș”甚"</string>
     <string name="instant_apps_message" msgid="8116608994995104836">"ć…ćź‰èŁ…ćș”ç”šæ— éœ€ćź‰èŁ…ć°±èƒœäœżç”šă€‚"</string>
     <string name="app_info" msgid="6856026610594615344">"ćș”ç”šäżĄæŻ"</string>
@@ -849,18 +846,11 @@
     <string name="slice_permission_checkbox" msgid="7986504458640562900">"ć…èźž“<xliff:g id="APP">%1$s</xliff:g>”星ç€ș任䜕ćș”ç”šçš„ć›Ÿć—"</string>
     <string name="slice_permission_allow" msgid="2340244901366722709">"ć…èźž"</string>
     <string name="slice_permission_deny" msgid="7683681514008048807">"拒绝"</string>
-    <!-- no translation found for auto_saver_title (1217959994732964228) -->
-    <skip />
-    <!-- no translation found for auto_saver_text (6324376061044218113) -->
-    <skip />
-    <!-- no translation found for no_auto_saver_action (8086002101711328500) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_title (6726474226058316862) -->
-    <skip />
-    <!-- no translation found for auto_saver_enabled_text (874711029884777579) -->
-    <skip />
-    <!-- no translation found for open_saver_setting_action (8314624730997322529) -->
-    <skip />
-    <!-- no translation found for auto_saver_okay_action (2701221740227683650) -->
-    <skip />
+    <string name="auto_saver_title" msgid="1217959994732964228">"ç‚čæŒ‰ćłćŻéą„èźŸçœç””æšĄćŒ"</string>
+    <string name="auto_saver_text" msgid="6324376061044218113">"ćœ“ç””æ± ç””é‡ć‰©äœ™ <xliff:g id="PERCENTAGE">%d</xliff:g>%% 时è‡ȘćŠšćŒ€ćŻ"</string>
+    <string name="no_auto_saver_action" msgid="8086002101711328500">"侍甹äș†"</string>
+    <string name="auto_saver_enabled_title" msgid="6726474226058316862">"éą„èźŸçš„çœç””æšĄćŒć·ČćŒ€ćŻ"</string>
+    <string name="auto_saver_enabled_text" msgid="874711029884777579">"äž€æ—Šç””æ± ç””é‡é™ćˆ° <xliff:g id="PERCENTAGE">%d</xliff:g>%% ä»„äž‹ïŒŒçœç””æšĄćŒć°±äŒšè‡ȘćŠšćŒ€ćŻă€‚"</string>
+    <string name="open_saver_setting_action" msgid="8314624730997322529">"èźŸçœź"</string>
+    <string name="auto_saver_okay_action" msgid="2701221740227683650">"矄道äș†"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 338f6ab..302de93 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -75,7 +75,7 @@
     <string name="screenshot_saved_title" msgid="5637073968117370753">"èžąćč•æ“·ć–ç•«éąć·Čć„Č歘"</string>
     <string name="screenshot_saved_text" msgid="7574667448002050363">"èŒ•æŒ‰ćłćŻæŸ„çœ‹èžąćč•æ“·ć–ç•«éą"</string>
     <string name="screenshot_failed_title" msgid="7612509838919089748">"ç„Ąæł•ć„Čć­˜èžąćč•æ“·ć–ç•«éą"</string>
-    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"è«‹ć†æŹĄć˜—è©Šæ‹æ”èžąćč•æ“·ć–ç•«éą"</string>
+    <string name="screenshot_failed_to_save_unknown_text" msgid="3637758096565605541">"è«‹ć†ć˜—è©Šæ‹æ”èžąćč•æ“·ć–ç•«éą"</string>
     <string name="screenshot_failed_to_save_text" msgid="3041612585107107310">"由斌ć„Č歘ç©șé–“æœ‰é™ïŒŒć› æ­€ç„Ąæł•ć„Čć­˜èžąćč•æ“·ć–ç•«éą"</string>
     <string name="screenshot_failed_to_capture_text" msgid="173674476457581486">"æ‡‰ç”šçš‹ćŒæˆ–æ‚šçš„æ©Ÿæ§‹äžć…èš±æ“·ć–èžąćč•ç•«éą"</string>
     <string name="usb_preference_title" msgid="6551050377388882787">"USB æȘ”æĄˆć‚łèŒžéžé …"</string>
@@ -348,7 +348,7 @@
     <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ćœšæ—„èœæ™‚é–‹ć•Ÿ"</string>
     <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ćœšæ—„ć‡ș時關閉"</string>
     <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"朹<xliff:g id="TIME">%s</xliff:g>開敟"</string>
-    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"甐束時間<xliff:g id="TIME">%s</xliff:g>"</string>
+    <string name="quick_settings_secondary_label_until" msgid="2749196569462600150">"朹<xliff:g id="TIME">%s</xliff:g>關閉"</string>
     <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
     <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC ć·Č恜甹"</string>
     <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC ć·Č敟甹"</string>
@@ -533,6 +533,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"鈎èČ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"震拕"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"靜音"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$să€‚èŒ•æŒ‰ćłćŻć–æ¶ˆéœéŸłă€‚"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$să€‚èŒ•æŒ‰ćłćŻèš­ç‚șéœ‡ć‹•ă€‚ç„Ąéšœç€™ćŠŸèƒœæœć‹™ćŻèƒœć·Č經蚭ç‚ș靜音。"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$să€‚èŒ•æŒ‰ćłćŻèš­ç‚șéœéŸłă€‚ç„Ąéšœç€™ćŠŸèƒœæœć‹™ćŻèƒœć·Č經蚭ç‚ș靜音。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index ad6b52e..9709dd0c 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"鈎èČ"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"震拕"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"靜音"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$să€‚èŒ•è§žćłćŻć–æ¶ˆéœéŸłă€‚"</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$să€‚èŒ•è§žćłćŻèš­ç‚șéœ‡ć‹•ïŒŒäœ†çł»ç”±ćŻèƒœæœƒć°‡ç„Ąéšœç€™æœć‹™äž€äœ”èš­ç‚ș靜音。"</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$să€‚èŒ•è§žćłćŻèš­ç‚șéœéŸłïŒŒäœ†çł»ç”±ćŻèƒœæœƒć°‡ç„Ąéšœç€™æœć‹™äž€äœ”èš­ç‚ș靜音。"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 0319d12..ec98b95 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -531,6 +531,10 @@
     <string name="volume_ringer_status_normal" msgid="4273142424125855384">"Khalisa"</string>
     <string name="volume_ringer_status_vibrate" msgid="1825615171021346557">"Dlidlizela"</string>
     <string name="volume_ringer_status_silent" msgid="6896394161022916369">"Thulisa"</string>
+    <!-- no translation found for qs_status_phone_vibrate (204362991135761679) -->
+    <skip />
+    <!-- no translation found for qs_status_phone_muted (5437668875879171548) -->
+    <skip />
     <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. Thepha ukuze ususe ukuthula."</string>
     <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. Thepha ukuze usethe ukudlidliza. Amasevisi okufinyelela angathuliswa."</string>
     <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string>
diff --git a/packages/SystemUI/res/values/attrs_car.xml b/packages/SystemUI/res/values/attrs_car.xml
index 5e4bd79..335ae44 100644
--- a/packages/SystemUI/res/values/attrs_car.xml
+++ b/packages/SystemUI/res/values/attrs_car.xml
@@ -19,6 +19,8 @@
     <declare-styleable name="CarFacetButton">
         <!-- icon to be rendered (drawable) -->
         <attr name="icon" format="reference"/>
+        <!-- icon to be rendered when in selected state -->
+        <attr name="selectedIcon" format="reference"/>
         <!-- intent to start when button is click -->
         <attr name="intent" format="string"/>
         <!-- intent to start when a long press has happened -->
@@ -45,6 +47,12 @@
         <attr name="longIntent" format="string"/>
         <!-- start the intent as a broad cast instead of an activity if true-->
         <attr name="broadcast" format="boolean"/>
+        <!-- Alpha value to used when in selected state.  Defaults 1f  -->
+        <attr name="selectedAlpha" format="float" />
+        <!-- Alpha value to used when in un-selected state.  Defaults 0.7f  -->
+        <attr name="unselectedAlpha" format="float" />
+        <!-- icon to be rendered when in selected state -->
+        <attr name="selectedIcon" format="reference"/>
     </declare-styleable>
 
     <!-- Custom attributes to configure hvac values -->
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 906ca4a..3c1f995 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -158,8 +158,8 @@
     <color name="fingerprint_dialog_text_dark_color">#dd000000</color> <!-- 87% black -->
     <color name="fingerprint_dialog_text_light_color">#89000000</color> <!-- 54% black -->
     <color name="fingerprint_dialog_dim_color">#80000000</color> <!-- 50% black -->
-    <color name="fingerprint_dialog_error_message_color">#ffd93025</color> <!-- google red 600 -->
-    <color name="fingerprint_dialog_fingerprint_color">#ff008577</color> <!-- google blue 600 -->
+    <color name="fingerprint_dialog_error_color">#fff44336</color> <!-- red -->
+    <color name="fingerprint_dialog_fingerprint_color">#ff008577</color> <!-- teal -->
 
     <!-- Logout button -->
     <color name="logout_button_bg_color">#ccffffff</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 711d550..f49d3de4 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -93,6 +93,9 @@
     <integer name="navigation_bar_deadzone_hold">333</integer>
     <integer name="navigation_bar_deadzone_decay">333</integer>
 
+    <!-- orientation of the dead zone when touches have recently occurred elsewhere on screen -->
+    <integer name="navigation_bar_deadzone_orientation">0</integer>
+
     <bool name="config_dead_zone_flash">false</bool>
 
     <!-- Whether to enable dimming navigation buttons when wallpaper is not visible, should be
diff --git a/packages/SystemUI/res/values/dimens_car.xml b/packages/SystemUI/res/values/dimens_car.xml
index 6caed61..2b91891 100644
--- a/packages/SystemUI/res/values/dimens_car.xml
+++ b/packages/SystemUI/res/values/dimens_car.xml
@@ -17,18 +17,14 @@
 -->
 <resources>
     <dimen name="car_margin">148dp</dimen>
+    <dimen name="car_margin_standard">112dp</dimen>
 
-    <dimen name="car_fullscreen_user_pod_margin_image_top">24dp</dimen>
-    <dimen name="car_fullscreen_user_pod_margin_name_top">24dp</dimen>
-    <dimen name="car_fullscreen_user_pod_margin_name_bottom">20dp</dimen>
-    <dimen name="car_fullscreen_user_pod_margin_between">24dp</dimen>
-    <dimen name="car_fullscreen_user_pod_icon_text_size">96dp</dimen>
-    <dimen name="car_fullscreen_user_pod_image_avatar_width">192dp</dimen>
-    <dimen name="car_fullscreen_user_pod_image_avatar_height">192dp</dimen>
-    <dimen name="car_fullscreen_user_pod_width">264dp</dimen>
+    <!-- TODO replace with car support lib sizes when available -->
+    <dimen name="car_fullscreen_user_pod_icon_text_size">32sp</dimen>
+    <dimen name="car_fullscreen_user_pod_width">243dp</dimen>
     <dimen name="car_fullscreen_user_pod_height">356dp</dimen>
-    <dimen name="car_fullscreen_user_pod_name_text_size">40sp</dimen> <!-- B1 -->
-    <dimen name="car_fullscreen_user_pod_device_text_size">@dimen/car_body2_size</dimen>
+    <dimen name="car_fullscreen_user_pod_image_avatar_width">96dp</dimen>
+    <dimen name="car_fullscreen_user_pod_image_avatar_height">96dp</dimen>
 
     <dimen name="car_navigation_button_width">64dp</dimen>
     <dimen name="car_navigation_bar_width">760dp</dimen>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 0e92c60..d45c427 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -98,5 +98,8 @@
     <item type="id" name="status_bar_view_state_tag" />
 
     <item type="id" name="display_cutout" />
+
+    <!-- Optional cancel button on Keyguard -->
+    <item type="id" name="cancel_button"/>
 </resources>
 
diff --git a/packages/SystemUI/res/values/integers_car.xml b/packages/SystemUI/res/values/integers_car.xml
index a462576..7513fd4 100644
--- a/packages/SystemUI/res/values/integers_car.xml
+++ b/packages/SystemUI/res/values/integers_car.xml
@@ -17,4 +17,6 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android">
     <integer name="car_user_switcher_anim_cascade_delay_ms">27</integer>
+    <!-- Full screen user switcher column number TODO: move to support library-->
+    <integer name="user_fullscreen_switcher_num_col">3</integer>
 </resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 4074042..c1e1873 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -366,10 +366,10 @@
     <string name="data_connection_3g">3G</string>
 
     <!-- Content description of the data connection type 3.5G. [CHAR LIMIT=NONE] -->
-    <string name="data_connection_3_5g">3.5G</string>
+    <string name="data_connection_3_5g">H</string>
 
     <!-- Content description of the data connection type 3.5G+. [CHAR LIMIT=NONE] -->
-    <string name="data_connection_3_5g_plus">3.5G+</string>
+    <string name="data_connection_3_5g_plus">H+</string>
 
     <!-- Content description of the data connection type 4G . [CHAR LIMIT=NONE] -->
     <string name="data_connection_4g">4G</string>
@@ -384,7 +384,7 @@
     <string name="data_connection_lte_plus">LTE+</string>
 
     <!-- Content description of the data connection type CDMA. [CHAR LIMIT=NONE] -->
-    <string name="data_connection_cdma">CDMA</string>
+    <string name="data_connection_cdma">1X</string>
 
     <!-- Content description of the roaming data connection type. [CHAR LIMIT=NONE] -->
     <string name="data_connection_roaming">Roaming</string>
@@ -1335,6 +1335,11 @@
     <string name="volume_ringer_status_vibrate">Vibrate</string>
     <string name="volume_ringer_status_silent">Mute</string>
 
+    <!-- Shown in the header of quick settings to indicate to the user that their phone ringer is on vibrate. [CHAR_LIMIT=NONE] -->
+    <string name="qs_status_phone_vibrate">Phone on vibrate</string>
+    <!-- Shown in the header of quick settings to indicate to the user that their phone ringer is on silent (muted). [CHAR_LIMIT=NONE] -->
+    <string name="qs_status_phone_muted">Phone muted</string>
+
     <string name="volume_stream_muted" translatable="false">%s silent</string>
     <string name="volume_stream_vibrate" translatable="false">%s vibrate</string>
     <string name="volume_stream_suppressed" translatable="false">%1$s silent — %2$s</string>
diff --git a/packages/SystemUI/res/values/strings_car.xml b/packages/SystemUI/res/values/strings_car.xml
index 658eb4f..0b57ff8 100644
--- a/packages/SystemUI/res/values/strings_car.xml
+++ b/packages/SystemUI/res/values/strings_car.xml
@@ -17,6 +17,10 @@
  */
 -->
 <resources>
-    <string name="unknown_user_label">Unknown</string>
-    <string name="start_driving">Start Driving</string>
+    <!-- Name of Guest Profile. [CHAR LIMIT=30] -->
+    <string name="car_guest">Guest</string>
+    <!-- Name of Add User Profile. [CHAR LIMIT=30] -->
+    <string name="car_add_user">Add User</string>
+    <!-- Default name of the new user created. [CHAR LIMIT=30] -->
+    <string name="car_new_user">New User</string>
 </resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
index 20d1418..78b1b2614 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
@@ -15,10 +15,13 @@
  */
 package com.android.systemui.shared.recents.model;
 
+import static android.content.pm.PackageManager.MATCH_ANY_USER;
+
 import android.app.ActivityManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
@@ -108,10 +111,12 @@
         }
         if (desc.getIconResource() != 0) {
             try {
-                Context packageContext = mContext.createPackageContextAsUser(
-                        taskKey.getPackageName(), 0, UserHandle.of(userId));
-                return createBadgedDrawable(packageContext.getDrawable(desc.getIconResource()),
-                        userId, desc);
+                PackageManager pm = mContext.getPackageManager();
+                ApplicationInfo appInfo = pm.getApplicationInfo(taskKey.getPackageName(),
+                        MATCH_ANY_USER);
+                Resources res = pm.getResourcesForApplication(appInfo);
+                return createBadgedDrawable(res.getDrawable(desc.getIconResource(), null), userId,
+                        desc);
             } catch (Resources.NotFoundException|PackageManager.NameNotFoundException e) {
                 Log.e(TAG, "Could not find icon drawable from resource", e);
             }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 1aad27f..ca5b034 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -44,8 +44,10 @@
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Looper;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Log;
@@ -53,6 +55,8 @@
 import android.view.IRecentsAnimationRunner;
 
 import android.view.RemoteAnimationTarget;
+
+import com.android.internal.app.IVoiceInteractionManagerService;
 import com.android.systemui.shared.recents.model.Task;
 import com.android.systemui.shared.recents.model.Task.TaskKey;
 import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -67,6 +71,9 @@
 
     private static final ActivityManagerWrapper sInstance = new ActivityManagerWrapper();
 
+    // Should match the values in PhoneWindowManager
+    public static final String CLOSE_SYSTEM_WINDOWS_REASON_RECENTS = "recentapps";
+
     private final PackageManager mPackageManager;
     private final BackgroundExecutor mBackgroundExecutor;
     private final TaskStackChangeListeners mTaskStackChangeListeners;
@@ -258,9 +265,9 @@
     /**
      * Cancels the remote recents animation started from {@link #startRecentsActivity}.
      */
-    public void cancelRecentsAnimation() {
+    public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
         try {
-            ActivityManager.getService().cancelRecentsAnimation();
+            ActivityManager.getService().cancelRecentsAnimation(restoreHomeStackPosition);
         } catch (RemoteException e) {
             Log.e(TAG, "Failed to cancel recents animation", e);
         }
@@ -432,4 +439,21 @@
             return false;
         }
     }
+
+    /**
+     * Shows a voice session identified by {@code token}
+     * @return true if the session was shown, false otherwise
+     */
+    public boolean showVoiceSession(IBinder token, Bundle args, int flags) {
+        IVoiceInteractionManagerService service = IVoiceInteractionManagerService.Stub.asInterface(
+                ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE));
+        if (service == null) {
+            return false;
+        }
+        try {
+            return service.showSessionFromSession(token, args, flags);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
index 79c1cb1..bff0d9b 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/NavigationBarCompat.java
@@ -17,10 +17,27 @@
 package com.android.systemui.shared.system;
 
 import android.annotation.IntDef;
+import android.content.Context;
+import android.content.res.Resources;
+import android.util.DisplayMetrics;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
+import sun.misc.Resource;
+
 public class NavigationBarCompat {
+    /**
+     * Touch slopes and thresholds for quick step operations. Drag slop is the point where the
+     * home button press/long press over are ignored and will start to drag when exceeded and the
+     * touch slop is when the respected operation will occur when exceeded. Touch slop must be
+     * larger than the drag slop.
+     */
+    public static final int QUICK_STEP_DRAG_SLOP_PX = convertDpToPixel(10);
+    public static final int QUICK_SCRUB_DRAG_SLOP_PX = convertDpToPixel(20);
+    public static final int QUICK_STEP_TOUCH_SLOP_PX = convertDpToPixel(40);
+    public static final int QUICK_SCRUB_TOUCH_SLOP_PX = convertDpToPixel(35);
+
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({HIT_TARGET_NONE, HIT_TARGET_BACK, HIT_TARGET_HOME, HIT_TARGET_OVERVIEW})
     public @interface HitTarget{}
@@ -42,7 +59,6 @@
      * Interaction type: whether the gesture to swipe up from the navigation bar will trigger
      * launcher to show overview
      */
-
     public static final int FLAG_DISABLE_SWIPE_UP = 0x1;
     /**
      * Interaction type: enable quick scrub interaction on the home button
@@ -58,4 +74,8 @@
      * Interaction type: show/hide the back button while this service is connected to launcher
      */
     public static final int FLAG_HIDE_BACK_BUTTON = 0x8;
+
+    private static int convertDpToPixel(float dp){
+        return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
+    }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
index 6fa7db3..32e4bbf 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/PackageManagerWrapper.java
@@ -18,23 +18,24 @@
 
 import android.app.AppGlobals;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.RemoteException;
 
-import java.util.ArrayList;
 import java.util.List;
 
 public class PackageManagerWrapper {
 
-    private static final String TAG = "PackageManagerWrapper";
-
     private static final PackageManagerWrapper sInstance = new PackageManagerWrapper();
 
     private static final IPackageManager mIPackageManager = AppGlobals.getPackageManager();
 
+    public static final String ACTION_PREFERRED_ACTIVITY_CHANGED =
+            Intent.ACTION_PREFERRED_ACTIVITY_CHANGED;
+
     public static PackageManagerWrapper getInstance() {
         return sInstance;
     }
@@ -53,40 +54,15 @@
     }
 
     /**
-     * @return true if the packageName belongs to the current preferred home app on the device.
-     *
-     * If will also return false if there are multiple home apps and the user has not picked any
-     * preferred home, in which case the user would see a disambiguation screen on going to home.
+     * Report the set of 'Home' activity candidates, plus (if any) which of them
+     * is the current "always use this one" setting.
      */
-    public boolean isDefaultHomeActivity(String packageName) {
-        List<ResolveInfo> allHomeCandidates = new ArrayList<>();
-        ComponentName home;
+    public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
         try {
-            home = mIPackageManager.getHomeActivities(allHomeCandidates);
+            return mIPackageManager.getHomeActivities(allHomeCandidates);
         } catch (RemoteException e) {
             e.printStackTrace();
-            return false;
+            return null;
         }
-
-        if (home != null && packageName.equals(home.getPackageName())) {
-            return true;
-        }
-
-        // Find the launcher with the highest priority and return that component if there are no
-        // other home activity with the same priority.
-        int lastPriority = Integer.MIN_VALUE;
-        ComponentName lastComponent = null;
-        final int size = allHomeCandidates.size();
-        for (int i = 0; i < size; i++) {
-            final ResolveInfo ri = allHomeCandidates.get(i);
-            if (ri.priority > lastPriority) {
-                lastComponent = ri.activityInfo.getComponentName();
-                lastPriority = ri.priority;
-            } else if (ri.priority == lastPriority) {
-                // Two components found with same priority.
-                lastComponent = null;
-            }
-        }
-        return lastComponent != null && packageName.equals(lastComponent.getPackageName());
     }
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
index 5fa6c79..80e226d 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java
@@ -61,6 +61,14 @@
         }
     }
 
+    public void setSplitScreenMinimized(boolean minimized) {
+        try {
+            mAnimationController.setSplitScreenMinimized(minimized);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Failed to set minimize dock", e);
+        }
+    }
+
     public void finish(boolean toHome) {
         try {
             mAnimationController.finish(toHome);
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
new file mode 100644
index 0000000..bf88a29
--- /dev/null
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ThreadedRendererCompat.java
@@ -0,0 +1,33 @@
+/*
+ * 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.systemui.shared.system;
+
+import android.view.ThreadedRenderer;
+
+/**
+ * @see ThreadedRenderer
+ */
+public class ThreadedRendererCompat {
+
+    public static int EGL_CONTEXT_PRIORITY_HIGH_IMG = 0x3101;
+    public static int EGL_CONTEXT_PRIORITY_MEDIUM_IMG = 0x3102;
+    public static int EGL_CONTEXT_PRIORITY_LOW_IMG = 0x3103;
+
+    public static void setContextPriority(int priority) {
+        ThreadedRenderer.setContextPriority(priority);
+    }
+}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
index c82c519..9975c41 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TransactionCompat.java
@@ -101,6 +101,11 @@
         return this;
     }
 
+    public TransactionCompat setEarlyWakeup() {
+        mTransaction.setEarlyWakeup();
+        return this;
+    }
+
     public TransactionCompat setColor(SurfaceControlCompat surfaceControl, float[] color) {
         mTransaction.setColor(surfaceControl.mSurfaceControl, color);
         return this;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
index d63ad08..00cd5a7 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java
@@ -265,11 +265,11 @@
             mPendingLockCheck.cancel(false);
             mPendingLockCheck = null;
         }
+        reset();
     }
 
     @Override
     public void onResume(int reason) {
-        reset();
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
index c1cff9e..adb2460 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
@@ -107,6 +107,13 @@
                 new View[]{
                         null, mEcaView, null
                 }};
+
+        View cancelBtn = findViewById(R.id.cancel_button);
+        if (cancelBtn != null) {
+            cancelBtn.setOnClickListener(view -> {
+                mCallback.reset();
+            });
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index 75c52d8..7cc37c4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -205,6 +205,13 @@
             }
         });
 
+        View cancelBtn = findViewById(R.id.cancel_button);
+        if (cancelBtn != null) {
+            cancelBtn.setOnClickListener(view -> {
+                mCallback.reset();
+            });
+        }
+
         // If there's more than one IME, enable the IME switcher button
         updateSwitchImeButton();
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
index 651831e..174dcab 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
@@ -157,6 +157,13 @@
         if (button != null) {
             button.setCallback(this);
         }
+
+        View cancelBtn = findViewById(R.id.cancel_button);
+        if (cancelBtn != null) {
+            cancelBtn.setOnClickListener(view -> {
+                mCallback.reset();
+            });
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 8a4f324..ff3af17 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -54,7 +54,6 @@
     private static final int MARQUEE_DELAY_MS = 2000;
 
     private final LockPatternUtils mLockPatternUtils;
-    private final AlarmManager mAlarmManager;
     private final IActivityManager mIActivityManager;
     private final float mSmallClockScale;
     private final float mWidgetPadding;
@@ -123,7 +122,6 @@
 
     public KeyguardStatusView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
         mIActivityManager = ActivityManager.getService();
         mLockPatternUtils = new LockPatternUtils(getContext());
         mHandler = new Handler(Looper.myLooper());
@@ -218,15 +216,11 @@
     }
 
     public void refreshTime() {
-        mClockView.setFormat12Hour(Patterns.clockView12);
-        mClockView.setFormat24Hour(Patterns.clockView24);
+        mClockView.refresh();
     }
 
     private void refresh() {
-        AlarmManager.AlarmClockInfo nextAlarm =
-                mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
-        Patterns.update(mContext, nextAlarm != null);
-
+        Patterns.update(mContext);
         refreshTime();
     }
 
@@ -301,20 +295,16 @@
     // DateFormat.getBestDateTimePattern is extremely expensive, and refresh is called often.
     // This is an optimization to ensure we only recompute the patterns when the inputs change.
     private static final class Patterns {
-        static String dateViewSkel;
         static String clockView12;
         static String clockView24;
         static String cacheKey;
 
-        static void update(Context context, boolean hasAlarm) {
+        static void update(Context context) {
             final Locale locale = Locale.getDefault();
             final Resources res = context.getResources();
-            dateViewSkel = res.getString(hasAlarm
-                    ? R.string.abbrev_wday_month_day_no_year_alarm
-                    : R.string.abbrev_wday_month_day_no_year);
             final String clockView12Skel = res.getString(R.string.clock_12hr_format);
             final String clockView24Skel = res.getString(R.string.clock_24hr_format);
-            final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel;
+            final String key = locale.toString() + clockView12Skel + clockView24Skel;
             if (key.equals(cacheKey)) return;
 
             clockView12 = DateFormat.getBestDateTimePattern(locale, clockView12Skel);
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 1ae06d7..0683514 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -81,6 +81,14 @@
     private float mDarkIntensity;
     private int mUser;
 
+    /**
+     * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings.
+     */
+    private boolean mUseWallpaperTextColors;
+
+    private int mNonAdaptedForegroundColor;
+    private int mNonAdaptedBackgroundColor;
+
     public BatteryMeterView(Context context) {
         this(context, null, 0);
     }
@@ -140,6 +148,29 @@
         updateShowPercent();
     }
 
+    /**
+     * Sets whether the battery meter view uses the wallpaperTextColor. If we're not using it, we'll
+     * revert back to dark-mode-based/tinted colors.
+     *
+     * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for all
+     *                                    components
+     */
+    public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) {
+        if (shouldUseWallpaperTextColor == mUseWallpaperTextColors) {
+            return;
+        }
+
+        mUseWallpaperTextColors = shouldUseWallpaperTextColor;
+
+        if (mUseWallpaperTextColors) {
+            updateColors(
+                    Utils.getColorAttr(mContext, R.attr.wallpaperTextColor),
+                    Utils.getColorAttr(mContext, R.attr.wallpaperTextColorSecondary));
+        } else {
+            updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor);
+        }
+    }
+
     public void setColorsFromContext(Context context) {
         if (context == null) {
             return;
@@ -179,7 +210,8 @@
         getContext().getContentResolver().registerContentObserver(
                 Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver, mUser);
         updateShowPercent();
-        Dependency.get(TunerService.class).addTunable(this, StatusBarIconController.ICON_BLACKLIST);
+        Dependency.get(TunerService.class)
+                .addTunable(this, StatusBarIconController.ICON_BLACKLIST);
         Dependency.get(ConfigurationController.class).addCallback(this);
         mUserTracker.startTracking();
     }
@@ -273,19 +305,23 @@
     @Override
     public void onDarkChanged(Rect area, float darkIntensity, int tint) {
         mDarkIntensity = darkIntensity;
+
         float intensity = DarkIconDispatcher.isInArea(area, this) ? darkIntensity : 0;
-        int foreground = getColorForDarkIntensity(intensity, mLightModeFillColor,
-                mDarkModeFillColor);
-        int background = getColorForDarkIntensity(intensity, mLightModeBackgroundColor,
-                mDarkModeBackgroundColor);
-        mDrawable.setColors(foreground, background);
-        setTextColor(foreground);
+        mNonAdaptedForegroundColor = getColorForDarkIntensity(
+                intensity, mLightModeFillColor, mDarkModeFillColor);
+        mNonAdaptedBackgroundColor = getColorForDarkIntensity(
+                intensity, mLightModeBackgroundColor,mDarkModeBackgroundColor);
+
+        if (!mUseWallpaperTextColors) {
+            updateColors(mNonAdaptedForegroundColor, mNonAdaptedBackgroundColor);
+        }
     }
 
-    public void setTextColor(int color) {
-        mTextColor = color;
+    private void updateColors(int foregroundColor, int backgroundColor) {
+        mDrawable.setColors(foregroundColor, backgroundColor);
+        mTextColor = foregroundColor;
         if (mBatteryPercentView != null) {
-            mBatteryPercentView.setTextColor(color);
+            mBatteryPercentView.setTextColor(foregroundColor);
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java b/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
index 5a2263c..ae6ee2a 100644
--- a/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
+++ b/packages/SystemUI/src/com/android/systemui/ForegroundServiceController.java
@@ -73,7 +73,7 @@
     void onAppOpChanged(int code, int uid, String packageName, boolean active);
 
     /**
-     * Gets active app ops for this user and package.
+     * Gets active app ops for this user and package
      */
     @Nullable ArraySet<Integer> getAppOps(int userId, String packageName);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
index a4f8d8c..b8a57bf 100644
--- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java
@@ -444,13 +444,7 @@
             final Surface surface = getSurfaceHolder().getSurface();
             surface.hwuiDestroy();
 
-            mLoader = new AsyncTask<Void, Void, Bitmap>() {
-                @Override
-                protected Bitmap doInBackground(Void... params) {
-                    mWallpaperManager.forgetLoadedWallpaper();
-                    return null;
-                }
-            }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+            mWallpaperManager.forgetLoadedWallpaper();
         }
 
         private void scheduleUnloadWallpaper() {
diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
index 8cff56d..b1020cf 100644
--- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
 import android.graphics.Rect;
 import android.os.Binder;
 import android.os.Handler;
@@ -39,6 +40,7 @@
 import com.android.systemui.recents.misc.SystemServicesProxy;
 import com.android.systemui.shared.recents.IOverviewProxy;
 import com.android.systemui.shared.recents.ISystemUiProxy;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.GraphicBufferCompat;
 import com.android.systemui.statusbar.phone.StatusBar;
 import com.android.systemui.statusbar.policy.CallbackController;
@@ -50,6 +52,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
 import static com.android.systemui.shared.system.NavigationBarCompat.FLAG_DISABLE_SWIPE_UP;
 import static com.android.systemui.shared.system.NavigationBarCompat.InteractionType;
 
@@ -71,11 +74,13 @@
     private final DeviceProvisionedController mDeviceProvisionedController
             = Dependency.get(DeviceProvisionedController.class);
     private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>();
+    private final Intent mQuickStepIntent;
 
     private IOverviewProxy mOverviewProxy;
     private int mConnectionBackoffAttempts;
     private CharSequence mOnboardingText;
     private @InteractionType int mInteractionFlags;
+    private boolean mIsEnabled;
 
     private ISystemUiProxy mSysUiProxy = new ISystemUiProxy.Stub() {
 
@@ -130,14 +135,23 @@
                     });
                 }
             } finally {
+                Prefs.putInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS, mInteractionFlags);
                 Binder.restoreCallingIdentity(token);
             }
         }
     };
 
-    private final BroadcastReceiver mLauncherAddedReceiver = new BroadcastReceiver() {
+    private final BroadcastReceiver mLauncherStateChangedReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
+            updateEnabledState();
+
+            // When launcher service is disabled, reset interaction flags because it is inactive
+            if (!isEnabled()) {
+                mInteractionFlags = 0;
+                Prefs.remove(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS);
+            }
+
             // Reconnect immediately, instead of waiting for resume to arrive.
             startConnectionToCurrentUser();
         }
@@ -196,17 +210,21 @@
         mConnectionBackoffAttempts = 0;
         mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
                 com.android.internal.R.string.config_recentsComponentName));
+        mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
+                .setPackage(mRecentsComponentName.getPackageName());
+        mInteractionFlags = Prefs.getInt(mContext, Prefs.Key.QUICK_STEP_INTERACTION_FLAGS, 0);
 
         // Listen for the package update changes.
         if (SystemServicesProxy.getInstance(context)
                 .isSystemUser(mDeviceProvisionedController.getCurrentUser())) {
+            updateEnabledState();
             mDeviceProvisionedController.addCallback(mDeviceProvisionedCallback);
             IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
             filter.addDataScheme("package");
             filter.addDataSchemeSpecificPart(mRecentsComponentName.getPackageName(),
                     PatternMatcher.PATTERN_LITERAL);
             filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
-            mContext.registerReceiver(mLauncherAddedReceiver, filter);
+            mContext.registerReceiver(mLauncherStateChangedReceiver, filter);
         }
     }
 
@@ -222,7 +240,7 @@
         disconnectFromLauncherService();
 
         // If user has not setup yet or already connected, do not try to connect
-        if (!mDeviceProvisionedController.isCurrentUserSetup()) {
+        if (!mDeviceProvisionedController.isCurrentUserSetup() || !isEnabled()) {
             return;
         }
         mHandler.removeCallbacks(mConnectionRunnable);
@@ -248,6 +266,7 @@
     public void addCallback(OverviewProxyListener listener) {
         mConnectionCallbacks.add(listener);
         listener.onConnectionChanged(mOverviewProxy != null);
+        listener.onInteractionFlagsChanged(mInteractionFlags);
     }
 
     @Override
@@ -256,7 +275,11 @@
     }
 
     public boolean shouldShowSwipeUpUI() {
-        return getProxy() != null && ((mInteractionFlags & FLAG_DISABLE_SWIPE_UP) == 0);
+        return isEnabled() && ((mInteractionFlags & FLAG_DISABLE_SWIPE_UP) == 0);
+    }
+
+    public boolean isEnabled() {
+        return mIsEnabled;
     }
 
     public IOverviewProxy getProxy() {
@@ -292,6 +315,12 @@
         }
     }
 
+    private void updateEnabledState() {
+        mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,
+                MATCH_DIRECT_BOOT_UNAWARE,
+                ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
+    }
+
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println(TAG_OPS + " state:");
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index 2a27147..7f7a769 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -54,7 +54,8 @@
             Key.HAS_SEEN_RECENTS_ONBOARDING,
             Key.SEEN_RINGER_GUIDANCE_COUNT,
             Key.QS_HAS_TURNED_OFF_MOBILE_DATA,
-            Key.TOUCHED_RINGER_TOGGLE
+            Key.TOUCHED_RINGER_TOGGLE,
+            Key.QUICK_STEP_INTERACTION_FLAGS
     })
     public @interface Key {
         @Deprecated
@@ -93,6 +94,7 @@
         String QS_TILE_SPECS_REVEALED = "QsTileSpecsRevealed";
         String QS_HAS_TURNED_OFF_MOBILE_DATA = "QsHasTurnedOffMobileData";
         String TOUCHED_RINGER_TOGGLE = "TouchedRingerToggle";
+        String QUICK_STEP_INTERACTION_FLAGS = "QuickStepInteractionFlags";
     }
 
     public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 039e7b5..c01cafa 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -25,6 +25,7 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.colorextraction.ColorExtractor.GradientColors;
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.systemui.Dependency.DependencyProvider;
 import com.android.systemui.classifier.FalsingManager;
@@ -44,6 +45,7 @@
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.phone.DozeParameters;
 import com.android.systemui.statusbar.phone.KeyguardBouncer;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 import com.android.systemui.statusbar.phone.LightBarController;
 import com.android.systemui.statusbar.phone.LockIcon;
 import com.android.systemui.statusbar.phone.LockscreenWallpaper;
@@ -100,12 +102,13 @@
                 dismissCallbackRegistry, FalsingManager.getInstance(context));
     }
 
-    public ScrimController createScrimController(LightBarController lightBarController,
-            ScrimView scrimBehind, ScrimView scrimInFront, LockscreenWallpaper lockscreenWallpaper,
+    public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
+            LockscreenWallpaper lockscreenWallpaper, Consumer<Float> scrimBehindAlphaListener,
+            Consumer<GradientColors> scrimInFrontColorListener,
             Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
             AlarmManager alarmManager) {
-        return new ScrimController(lightBarController, scrimBehind, scrimInFront,
-                scrimVisibleListener, dozeParameters, alarmManager);
+        return new ScrimController(scrimBehind, scrimInFront, scrimBehindAlphaListener,
+                scrimInFrontColorListener, scrimVisibleListener, dozeParameters, alarmManager);
     }
 
     public NotificationIconAreaController createNotificationIconAreaController(Context context,
@@ -142,5 +145,6 @@
         providers.put(NotificationViewHierarchyManager.class,
                 () -> new NotificationViewHierarchyManager(context));
         providers.put(NotificationEntryManager.class, () -> new NotificationEntryManager(context));
+        providers.put(KeyguardDismissUtil.class, KeyguardDismissUtil::new);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
index e18ac74..cdf4ba7 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/AnglesClassifier.java
@@ -16,6 +16,9 @@
 
 package com.android.systemui.classifier;
 
+import android.os.Build;
+import android.os.SystemProperties;
+import android.util.Log;
 import android.view.MotionEvent;
 
 import java.util.ArrayList;
@@ -49,13 +52,18 @@
 public class AnglesClassifier extends StrokeClassifier {
     private HashMap<Stroke, Data> mStrokeMap = new HashMap<>();
 
+    public static final boolean VERBOSE = SystemProperties.getBoolean("debug.falsing_log.ang",
+            Build.IS_DEBUGGABLE);
+
+    private static String TAG = "ANG";
+
     public AnglesClassifier(ClassifierData classifierData) {
         mClassifierData = classifierData;
     }
 
     @Override
     public String getTag() {
-        return "ANG";
+        return TAG;
     }
 
     @Override
@@ -170,18 +178,31 @@
 
         public float getAnglesVariance() {
             float anglesVariance = getAnglesVariance(mSumSquares, mSum, mCount);
+            if (VERBOSE) {
+                FalsingLog.i(TAG, "getAnglesVariance: (first pass) " + anglesVariance);
+                FalsingLog.i(TAG, "   - mFirstLength=" + mFirstLength);
+                FalsingLog.i(TAG, "   - mLength=" + mLength);
+            }
             if (mFirstLength < mLength / 2f) {
                 anglesVariance = Math.min(anglesVariance, mFirstAngleVariance
                         + getAnglesVariance(mSecondSumSquares, mSecondSum, mSecondCount));
+                if (VERBOSE) FalsingLog.i(TAG, "getAnglesVariance: (second pass) " + anglesVariance);
             }
             return anglesVariance;
         }
 
         public float getAnglesPercentage() {
             if (mAnglesCount == 0.0f) {
+                if (VERBOSE) FalsingLog.i(TAG, "getAnglesPercentage: count==0, result=1");
                 return 1.0f;
             }
-            return (Math.max(mLeftAngles, mRightAngles) + mStraightAngles) / mAnglesCount;
+            final float result = (Math.max(mLeftAngles, mRightAngles) + mStraightAngles) / mAnglesCount;
+            if (VERBOSE) {
+                FalsingLog.i(TAG, "getAnglesPercentage: left=" + mLeftAngles + " right="
+                        + mRightAngles + " straight=" + mStraightAngles + " count=" + mAnglesCount
+                        + " result=" + result);
+            }
+            return result;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java b/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
index 6883dd0..9ffe783 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/AnglesVarianceEvaluator.java
@@ -18,14 +18,11 @@
 
 public class AnglesVarianceEvaluator {
     public static float evaluate(float value, int type) {
-        final boolean secureUnlock = type == Classifier.BOUNCER_UNLOCK;
         float evaluation = 0.0f;
-        if (value > 0.05) evaluation++;
-        if (value > 0.10) evaluation++;
         if (value > 0.20) evaluation++;
-        if (value > 0.40 && !secureUnlock) evaluation++;
-        if (value > 0.80 && !secureUnlock) evaluation++;
-        if (value > 1.50 && !secureUnlock) evaluation++;
+        if (value > 0.40) evaluation++;
+        if (value > 0.80) evaluation++;
+        if (value > 1.50) evaluation++;
         return evaluation;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
index 6df72b1..66f0cf6 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/SpeedAnglesClassifier.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.classifier;
 
+import android.os.Build;
+import android.os.SystemProperties;
 import android.view.MotionEvent;
 
 import java.util.ArrayList;
@@ -34,6 +36,10 @@
  * should be in this interval.
  */
 public class SpeedAnglesClassifier extends StrokeClassifier {
+    public static final boolean VERBOSE = SystemProperties.getBoolean("debug.falsing_log.spd_ang",
+            Build.IS_DEBUGGABLE);
+    public static final String TAG = "SPD_ANG";
+
     private HashMap<Stroke, Data> mStrokeMap = new HashMap<>();
 
     public SpeedAnglesClassifier(ClassifierData classifierData) {
@@ -42,7 +48,7 @@
 
     @Override
     public String getTag() {
-        return "SPD_ANG";
+        return TAG;
     }
 
     @Override
@@ -135,14 +141,24 @@
         }
 
         public float getAnglesVariance() {
-            return mSumSquares / mCount - (mSum / mCount) * (mSum / mCount);
+            final float v = mSumSquares / mCount - (mSum / mCount) * (mSum / mCount);
+            if (VERBOSE) {
+                FalsingLog.i(TAG, "getAnglesVariance: sum^2=" + mSumSquares
+                        + " count=" + mCount + " result=" + v);
+            }
+            return v;
         }
 
         public float getAnglesPercentage() {
             if (mAnglesCount == 0.0f) {
                 return 1.0f;
             }
-            return (mAcceleratingAngles) / mAnglesCount;
+            final float v = (mAcceleratingAngles) / mAnglesCount;
+            if (VERBOSE) {
+                FalsingLog.i(TAG, "getAnglesPercentage: angles=" + mAcceleratingAngles
+                        + " count=" + mAnglesCount + " result=" + v);
+            }
+            return v;
         }
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 778e630..c390764 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -109,7 +109,11 @@
         switch (newState) {
             case DOZE_AOD:
                 if (oldState == DOZE_AOD_PAUSED) {
+                    // Whenever turning on the display, it's necessary to push a new frame.
+                    // The display buffers will be empty and need to be filled.
                     mHost.dozeTimeTick();
+                    // The first frame may arrive when the display isn't ready yet.
+                    mHandler.postDelayed(mHost::dozeTimeTick, 100);
                 }
                 scheduleTimeTick();
                 break;
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
index 3577c0f..c238e54 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
@@ -18,8 +18,8 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
-import android.hardware.biometrics.BiometricDialog;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.BiometricPrompt;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -48,7 +48,7 @@
 
     private FingerprintDialogView mDialogView;
     private WindowManager mWindowManager;
-    private IBiometricDialogReceiver mReceiver;
+    private IBiometricPromptReceiver mReceiver;
     private boolean mDialogShowing;
 
     private Handler mHandler = new Handler() {
@@ -97,7 +97,7 @@
     }
 
     @Override
-    public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
+    public void showFingerprintDialog(Bundle bundle, IBiometricPromptReceiver receiver) {
         if (DEBUG) Log.d(TAG, "showFingerprintDialog");
         // Remove these messages as they are part of the previous client
         mHandler.removeMessages(MSG_FINGERPRINT_ERROR);
@@ -139,7 +139,7 @@
             Log.w(TAG, "Dialog already showing");
             return;
         }
-        mReceiver = (IBiometricDialogReceiver) args.arg2;
+        mReceiver = (IBiometricPromptReceiver) args.arg2;
         mDialogView.setBundle((Bundle)args.arg1);
         mWindowManager.addView(mDialogView, mDialogView.getLayoutParams());
         mDialogShowing = true;
@@ -177,7 +177,7 @@
         }
         if (userCanceled) {
             try {
-                mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_USER_CANCEL);
+                mReceiver.onDialogDismissed(BiometricPrompt.DISMISSED_REASON_USER_CANCEL);
             } catch (RemoteException e) {
                 Log.e(TAG, "RemoteException when hiding dialog", e);
             }
@@ -193,7 +193,7 @@
             return;
         }
         try {
-            mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_NEGATIVE);
+            mReceiver.onDialogDismissed(BiometricPrompt.DISMISSED_REASON_NEGATIVE);
         } catch (RemoteException e) {
             Log.e(TAG, "Remote exception when handling negative button", e);
         }
@@ -206,7 +206,7 @@
             return;
         }
         try {
-            mReceiver.onDialogDismissed(BiometricDialog.DISMISSED_REASON_POSITIVE);
+            mReceiver.onDialogDismissed(BiometricPrompt.DISMISSED_REASON_POSITIVE);
         } catch (RemoteException e) {
             Log.e(TAG, "Remote exception when handling positive button", e);
         }
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
index 95258b0..d1d6609 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
@@ -17,17 +17,17 @@
 package com.android.systemui.fingerprint;
 
 import android.content.Context;
-import android.content.res.Configuration;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
-import android.hardware.biometrics.BiometricDialog;
+import android.hardware.biometrics.BiometricPrompt;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
+import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -44,7 +44,6 @@
 
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
-import com.android.systemui.util.leak.RotationUtils;
 
 /**
  * This class loads the view for the system-provided dialog. The view consists of:
@@ -67,7 +66,7 @@
     private final Interpolator mLinearOutSlowIn;
     private final WindowManager mWindowManager;
     private final float mAnimationTranslationOffset;
-    private final int mErrorTextColor;
+    private final int mErrorColor;
     private final int mTextColor;
     private final int mFingerprintColor;
 
@@ -87,8 +86,8 @@
         mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
         mAnimationTranslationOffset = getResources()
                 .getDimension(R.dimen.fingerprint_dialog_animation_translation_offset);
-        mErrorTextColor = Color.parseColor(
-                getResources().getString(R.color.fingerprint_dialog_error_message_color));
+        mErrorColor = Color.parseColor(
+                getResources().getString(R.color.fingerprint_dialog_error_color));
         mTextColor = Color.parseColor(
                 getResources().getString(R.color.fingerprint_dialog_text_light_color));
         mFingerprintColor = Color.parseColor(
@@ -163,29 +162,29 @@
         mLastState = STATE_NONE;
         updateFingerprintIcon(STATE_FINGERPRINT);
 
-        title.setText(mBundle.getCharSequence(BiometricDialog.KEY_TITLE));
+        title.setText(mBundle.getCharSequence(BiometricPrompt.KEY_TITLE));
         title.setSelected(true);
 
-        final CharSequence subtitleText = mBundle.getCharSequence(BiometricDialog.KEY_SUBTITLE);
-        if (subtitleText == null) {
+        final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE);
+        if (TextUtils.isEmpty(subtitleText)) {
             subtitle.setVisibility(View.GONE);
         } else {
             subtitle.setVisibility(View.VISIBLE);
             subtitle.setText(subtitleText);
         }
 
-        final CharSequence descriptionText = mBundle.getCharSequence(BiometricDialog.KEY_DESCRIPTION);
-        if (descriptionText == null) {
-            subtitle.setVisibility(View.VISIBLE);
+        final CharSequence descriptionText = mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION);
+        if (TextUtils.isEmpty(descriptionText)) {
             description.setVisibility(View.GONE);
         } else {
-            description.setText(mBundle.getCharSequence(BiometricDialog.KEY_DESCRIPTION));
+            description.setVisibility(View.VISIBLE);
+            description.setText(descriptionText);
         }
 
-        negative.setText(mBundle.getCharSequence(BiometricDialog.KEY_NEGATIVE_TEXT));
+        negative.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT));
 
         final CharSequence positiveText =
-                mBundle.getCharSequence(BiometricDialog.KEY_POSITIVE_TEXT);
+                mBundle.getCharSequence(BiometricPrompt.KEY_POSITIVE_TEXT);
         positive.setText(positiveText); // needs to be set for marquee to work
         if (positiveText != null) {
             positive.setVisibility(View.VISIBLE);
@@ -268,10 +267,10 @@
         mHandler.removeMessages(FingerprintDialogImpl.MSG_CLEAR_MESSAGE);
         updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
         mErrorText.setText(message);
-        mErrorText.setTextColor(mErrorTextColor);
+        mErrorText.setTextColor(mErrorColor);
         mErrorText.setContentDescription(message);
         mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_CLEAR_MESSAGE),
-                BiometricDialog.HIDE_DIALOG_DELAY);
+                BiometricPrompt.HIDE_DIALOG_DELAY);
     }
 
     public void showHelpMessage(String message) {
@@ -281,21 +280,17 @@
     public void showErrorMessage(String error) {
         showTemporaryMessage(error);
         mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_HIDE_DIALOG,
-                false /* userCanceled */), BiometricDialog.HIDE_DIALOG_DELAY);
+                false /* userCanceled */), BiometricPrompt.HIDE_DIALOG_DELAY);
     }
 
     private void updateFingerprintIcon(int newState) {
-        Drawable icon  = getAnimationResForTransition(mLastState, newState);
+        Drawable icon  = getAnimationForTransition(mLastState, newState);
 
         if (icon == null) {
             Log.e(TAG, "Animation not found");
             return;
         }
 
-        if (newState == STATE_FINGERPRINT) {
-            icon.setColorFilter(mFingerprintColor, PorterDuff.Mode.SRC_IN);
-        }
-
         final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
                 ? (AnimatedVectorDrawable) icon
                 : null;
@@ -303,7 +298,7 @@
         final ImageView fingerprint_icon = mLayout.findViewById(R.id.fingerprint_icon);
         fingerprint_icon.setImageDrawable(icon);
 
-        if (animation != null) {
+        if (animation != null && shouldAnimateForTransition(mLastState, newState)) {
             animation.forceAnimationOnUI();
             animation.start();
         }
@@ -311,17 +306,33 @@
         mLastState = newState;
     }
 
-    private Drawable getAnimationResForTransition(int oldState, int newState) {
+    private boolean shouldAnimateForTransition(int oldState, int newState) {
+        if (oldState == STATE_NONE && newState == STATE_FINGERPRINT) {
+            return false;
+        } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
+            return true;
+        } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
+            return true;
+        } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_AUTHENTICATED) {
+            // TODO(b/77328470): add animation when fingerprint is authenticated
+            return false;
+        }
+        return false;
+    }
+
+    private Drawable getAnimationForTransition(int oldState, int newState) {
         int iconRes;
         if (oldState == STATE_NONE && newState == STATE_FINGERPRINT) {
-            iconRes = R.drawable.lockscreen_fingerprint_draw_on_animation;
+            iconRes = R.drawable.fingerprint_dialog_fp_to_error;
         } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
-            iconRes = R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
+            iconRes = R.drawable.fingerprint_dialog_fp_to_error;
         } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
-            iconRes = R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
+            iconRes = R.drawable.fingerprint_dialog_error_to_fp;
         } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_AUTHENTICATED) {
-            iconRes = R.drawable.lockscreen_fingerprint_draw_off_animation;
-        } else {
+            // TODO(b/77328470): add animation when fingerprint is authenticated
+            iconRes = R.drawable.fingerprint_dialog_error_to_fp;
+        }
+        else {
             return null;
         }
         return mContext.getDrawable(iconRes);
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index e171b53..a7975d7 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -107,6 +107,7 @@
 
     static public final String SYSTEM_DIALOG_REASON_KEY = "reason";
     static public final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
+    static public final String SYSTEM_DIALOG_REASON_DREAM = "dream";
 
     private static final String TAG = "GlobalActionsDialog";
 
@@ -376,17 +377,13 @@
 
         mAdapter = new MyAdapter();
 
-        OnItemLongClickListener onItemLongClickListener = new OnItemLongClickListener() {
-            @Override
-            public boolean onItemLongClick(AdapterView<?> parent, View view, int position,
-                    long id) {
-                final Action action = mAdapter.getItem(position);
-                if (action instanceof LongPressAction) {
-                    mDialog.dismiss();
-                    return ((LongPressAction) action).onLongPress();
-                }
-                return false;
+        OnItemLongClickListener onItemLongClickListener = (parent, view, position, id) -> {
+            final Action action = mAdapter.getItem(position);
+            if (action instanceof LongPressAction) {
+                mDialog.dismiss();
+                return ((LongPressAction) action).onLongPress();
             }
+            return false;
         };
         ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener);
         dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
@@ -1236,7 +1233,7 @@
                     || Intent.ACTION_SCREEN_OFF.equals(action)) {
                 String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
                 if (!SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS.equals(reason)) {
-                    mHandler.sendEmptyMessage(MESSAGE_DISMISS);
+                    mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_DISMISS, reason));
                 }
             } else if (TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED.equals(action)) {
                 // Airplane mode can be changed after ECM exits if airplane toggle button
@@ -1287,7 +1284,11 @@
             switch (msg.what) {
                 case MESSAGE_DISMISS:
                     if (mDialog != null) {
-                        mDialog.dismiss();
+                        if (SYSTEM_DIALOG_REASON_DREAM.equals(msg.obj)) {
+                            mDialog.dismissImmediately();
+                        } else {
+                            mDialog.dismiss();
+                        }
                         mDialog = null;
                     }
                     break;
@@ -1468,6 +1469,10 @@
                     .start();
         }
 
+        void dismissImmediately() {
+            super.dismiss();
+        }
+
         private float getAnimTranslation() {
             return getContext().getResources().getDimension(
                     com.android.systemui.R.dimen.global_actions_panel_width) / 2;
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index d6e59c7..426f714 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1184,6 +1184,10 @@
         Trace.endSection();
     }
 
+    public boolean isHiding() {
+        return mHiding;
+    }
+
     /**
      * Handles SET_OCCLUDED message sent by setOccluded()
      */
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 5c0576d..1805f96 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -295,6 +295,26 @@
                 final Rect toAdjustedBounds = mMenuState == MENU_STATE_FULL
                         ? expandedAdjustedBounds
                         : normalAdjustedBounds;
+                final Rect toMovementBounds = mMenuState == MENU_STATE_FULL
+                        ? expandedMovementBounds
+                        : normalMovementBounds;
+
+                // If the PIP window needs to shift to right above shelf/IME and it's already above
+                // that, don't move the PIP window.
+                if (toAdjustedBounds.bottom < mMovementBounds.bottom
+                        && animatingBounds.top < toAdjustedBounds.bottom) {
+                    return;
+                }
+
+                // If the PIP window needs to shift down due to dismissal of shelf/IME but it's way
+                // above the position as if shelf/IME shows, don't move the PIP window.
+                int movementBoundsAdjustment = toMovementBounds.bottom - mMovementBounds.bottom;
+                int offsetAdjustment = fromImeAdjustment ? mImeOffset : mShelfHeight;
+                if (toAdjustedBounds.bottom >= mMovementBounds.bottom
+                        && animatingBounds.top
+                        < toAdjustedBounds.bottom - movementBoundsAdjustment - offsetAdjustment) {
+                    return;
+                }
 
                 animateToOffset(animatingBounds, toAdjustedBounds);
             }
@@ -320,11 +340,10 @@
 
     private void animateToOffset(Rect animatingBounds, Rect toAdjustedBounds) {
         final Rect bounds = new Rect(animatingBounds);
-        if (toAdjustedBounds.bottom < mMovementBounds.bottom
-                && bounds.top < toAdjustedBounds.bottom) {
-            return;
-        }
         bounds.offset(0, toAdjustedBounds.bottom - bounds.top);
+        // In landscape mode, PIP window can go offset while launching IME. We want to align the
+        // the top of the PIP window with the top of the movement bounds in that case.
+        bounds.offset(0, Math.max(0, mMovementBounds.top - bounds.top));
         mMotionHelper.animateToOffset(bounds);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 49b00ce..40ce69b 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -229,10 +229,11 @@
                         // Bump the notification when the bucket dropped.
                         .setWhen(mWarningTriggerTimeMs)
                         .setShowWhen(false)
-                        .setContentTitle(title)
                         .setContentText(contentText)
+                        .setContentTitle(title)
                         .setOnlyAlertOnce(true)
                         .setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_WARNING))
+                        .setStyle(new Notification.BigTextStyle().bigText(contentText))
                         .setVisibility(Notification.VISIBILITY_PUBLIC);
         if (hasBatterySettings()) {
             nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
@@ -483,16 +484,24 @@
         d.setMessage(mContext.getString(R.string.auto_saver_enabled_text,
                 getLowBatteryAutoTriggerDefaultLevel()));
 
-        // Negative == "got it". Just close the dialog. Battery saver has already been enabled.
-        d.setNegativeButton(R.string.auto_saver_okay_action, null);
-        d.setPositiveButton(R.string.open_saver_setting_action, (dialog, which) ->
-                mContext.startActivity(actionBatterySaverSetting));
+        // "Got it". Just close the dialog. Automatic battery has been enabled already.
+        d.setPositiveButton(R.string.auto_saver_okay_action,
+                (dialog, which) -> onAutoSaverEnabledConfirmationClosed());
+
+        // "Settings" -> Opens the battery saver settings activity.
+        d.setNeutralButton(R.string.open_saver_setting_action, (dialog, which) -> {
+            mContext.startActivity(actionBatterySaverSetting);
+            onAutoSaverEnabledConfirmationClosed();
+        });
         d.setShowForAllUsers(true);
-        d.setOnDismissListener((dialog) -> mSaverEnabledConfirmation = null);
+        d.setOnDismissListener((dialog) -> onAutoSaverEnabledConfirmationClosed());
         d.show();
         mSaverEnabledConfirmation = d;
     }
 
+    private void onAutoSaverEnabledConfirmationClosed() {
+        mSaverEnabledConfirmation = null;
+    }
 
     private void setSaverMode(boolean mode, boolean needFirstTimeWarning) {
         BatterySaverUtils.setPowerSaveMode(mContext, mode, needFirstTimeWarning);
@@ -505,7 +514,7 @@
             autoTriggerThreshold = 15;
         }
 
-        BatterySaverUtils.scheduleAutoBatterySaver(mContext, autoTriggerThreshold);
+        BatterySaverUtils.ensureAutoBatterySaver(mContext, autoTriggerThreshold);
         showAutoSaverEnabledConfirmation();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index bfbfbf6..a9455f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -16,19 +16,19 @@
 
 package com.android.systemui.qs;
 
+import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
+
 import android.content.Context;
 import android.content.res.Configuration;
-import android.graphics.Canvas;
-import android.graphics.Path;
 import android.graphics.Point;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.FrameLayout;
 
-import com.android.settingslib.Utils;
 import com.android.systemui.R;
+import com.android.systemui.SysUiServiceProvider;
 import com.android.systemui.qs.customize.QSCustomizer;
-import com.android.systemui.statusbar.ExpandableOutlineView;
+import com.android.systemui.statusbar.CommandQueue;
 
 /**
  * Wrapper view with background which contains {@link QSPanel} and {@link BaseStatusBarHeader}
@@ -44,8 +44,13 @@
     protected float mQsExpansion;
     private QSCustomizer mQSCustomizer;
     private View mQSFooter;
+
     private View mBackground;
+    private View mBackgroundGradient;
+    private View mStatusBarBackground;
+
     private int mSideMargins;
+    private boolean mQsDisabled;
 
     public QSContainerImpl(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -60,6 +65,8 @@
         mQSCustomizer = findViewById(R.id.qs_customize);
         mQSFooter = findViewById(R.id.qs_footer);
         mBackground = findViewById(R.id.quick_settings_background);
+        mStatusBarBackground = findViewById(R.id.quick_settings_status_bar_background);
+        mBackgroundGradient = findViewById(R.id.quick_settings_gradient_view);
         mSideMargins = getResources().getDimensionPixelSize(R.dimen.notification_side_paddings);
 
         setClickable(true);
@@ -68,6 +75,23 @@
     }
 
     @Override
+    protected void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+
+        // Hide the backgrounds when in landscape mode.
+        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            mBackgroundGradient.setVisibility(View.INVISIBLE);
+            mStatusBarBackground.setVisibility(View.INVISIBLE);
+        } else {
+            mBackgroundGradient.setVisibility(View.VISIBLE);
+            mStatusBarBackground.setVisibility(View.VISIBLE);
+        }
+
+        updateResources();
+        mSizePoint.set(0, 0); // Will be retrieved on next measure pass.
+    }
+
+    @Override
     public boolean performClick() {
         // Want to receive clicks so missing QQS tiles doesn't cause collapse, but
         // don't want to do anything with them.
@@ -76,6 +100,16 @@
 
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        if (mQsDisabled) {
+            // Only show the status bar contents in QQS header when QS is disabled.
+            mHeader.measure(widthMeasureSpec, heightMeasureSpec);
+            LayoutParams layoutParams = (LayoutParams) mHeader.getLayoutParams();
+            int height = layoutParams.topMargin + layoutParams.bottomMargin
+                    + mHeader.getMeasuredHeight();
+            super.onMeasure(
+                    widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
+            return;
+        }
         // Since we control our own bottom, be whatever size we want.
         // Otherwise the QSPanel ends up with 0 height when the window is only the
         // size of the status bar.
@@ -90,9 +124,8 @@
 
         // QSCustomizer will always be the height of the screen, but do this after
         // other measuring to avoid changing the height of the QS.
-        getDisplay().getRealSize(mSizePoint);
         mQSCustomizer.measure(widthMeasureSpec,
-                MeasureSpec.makeMeasureSpec(mSizePoint.y, MeasureSpec.EXACTLY));
+                MeasureSpec.makeMeasureSpec(getDisplayHeight(), MeasureSpec.EXACTLY));
     }
 
     @Override
@@ -101,6 +134,23 @@
         updateExpansion();
     }
 
+    public void disable(int state1, int state2, boolean animate) {
+        final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
+        if (disabled == mQsDisabled) return;
+        mQsDisabled = disabled;
+        mBackgroundGradient.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+        mQSPanel.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+        mQSFooter.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+    }
+
+    private void updateResources() {
+        LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams();
+        layoutParams.topMargin = mContext.getResources().getDimensionPixelSize(
+                com.android.internal.R.dimen.quick_qs_offset_height);
+
+        mQSPanel.setLayoutParams(layoutParams);
+    }
+
     /**
      * Overrides the height of this view (post-layout), so that the content is clipped to that
      * height and the background is set to that height.
@@ -147,4 +197,11 @@
         lp.rightMargin = mSideMargins;
         lp.leftMargin = mSideMargins;
     }
+
+    private int getDisplayHeight() {
+        if (mSizePoint.y == 0) {
+            getDisplay().getRealSize(mSizePoint);
+        }
+        return mSizePoint.y;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 3f3cea2..6c7eda7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -69,4 +69,6 @@
      */
     @Nullable
     View getExpandView();
+
+    default void disable(int state1, int state2, boolean animate) {}
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index 0fa6597..cf549fa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -47,10 +47,8 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.R.dimen;
-import com.android.systemui.SysUiServiceProvider;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.qs.TouchAnimator.Builder;
-import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.phone.MultiUserSwitch;
 import com.android.systemui.statusbar.phone.SettingsButton;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
@@ -62,8 +60,7 @@
 import com.android.systemui.tuner.TunerService;
 
 public class QSFooterImpl extends FrameLayout implements QSFooter,
-        OnClickListener, OnUserInfoChangedListener, EmergencyListener,
-        SignalCallback, CommandQueue.Callbacks {
+        OnClickListener, OnUserInfoChangedListener, EmergencyListener, SignalCallback {
 
     private ActivityStarter mActivityStarter;
     private UserInfoController mUserInfoController;
@@ -211,16 +208,9 @@
     }
 
     @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallbacks(this);
-    }
-
-    @Override
     @VisibleForTesting
     public void onDetachedFromWindow() {
         setListening(false);
-        SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).removeCallbacks(this);
         super.onDetachedFromWindow();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 018a635..cb068e3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -14,9 +14,12 @@
 
 package com.android.systemui.qs;
 
+import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.Fragment;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.os.Bundle;
@@ -35,12 +38,14 @@
 import com.android.systemui.Interpolators;
 import com.android.systemui.R;
 import com.android.systemui.R.id;
+import com.android.systemui.SysUiServiceProvider;
 import com.android.systemui.plugins.qs.QS;
 import com.android.systemui.qs.customize.QSCustomizer;
+import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
 import com.android.systemui.statusbar.stack.StackStateAnimator;
 
-public class QSFragment extends Fragment implements QS {
+public class QSFragment extends Fragment implements QS, CommandQueue.Callbacks {
     private static final String TAG = "QS";
     private static final boolean DEBUG = false;
     private static final String EXTRA_EXPANDED = "expanded";
@@ -65,6 +70,7 @@
     private int mLayoutDirection;
     private QSFooter mFooter;
     private float mLastQSExpansion = -1;
+    private boolean mQsDisabled;
 
     @Override
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@@ -176,6 +182,17 @@
         }
     }
 
+    @Override
+    public void disable(int state1, int state2, boolean animate) {
+        final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
+        if (disabled == mQsDisabled) return;
+        mQsDisabled = disabled;
+        mContainer.disable(state1, state2, animate);
+        mHeader.disable(state1, state2, animate);
+        mFooter.disable(state1, state2, animate);
+        updateQsState();
+    }
+
     private void updateQsState() {
         final boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling
                 || mHeaderAnimating;
@@ -189,6 +206,9 @@
         mFooter.setVisibility((mQsExpanded || !mKeyguardShowing || mHeaderAnimating)
                 ? View.VISIBLE
                 : View.INVISIBLE);
+        if (mQsDisabled) {
+            mFooter.setVisibility(View.GONE);
+        }
         mFooter.setExpanded((mKeyguardShowing && !mHeaderAnimating)
                 || (mQsExpanded && !mStackScrollerOverscrolling));
         mQSPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
@@ -258,6 +278,12 @@
         mHeader.setListening(listening);
         mFooter.setListening(listening);
         mQSPanel.setListening(mListening && mQsExpanded);
+        if (listening) {
+            SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallbacks(this);
+        } else {
+            SysUiServiceProvider.getComponent(getContext(), CommandQueue.class)
+                    .removeCallbacks(this);
+        }
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index df65d1f..e2af90d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -26,6 +26,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.media.AudioManager;
@@ -54,8 +55,10 @@
 import com.android.systemui.statusbar.phone.PhoneStatusBarView;
 import com.android.systemui.statusbar.phone.StatusBarIconController;
 import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager;
+import com.android.systemui.statusbar.policy.Clock;
 import com.android.systemui.statusbar.policy.DarkIconDispatcher;
 import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
+import com.android.systemui.statusbar.policy.DateView;
 import com.android.systemui.statusbar.policy.NextAlarmController;
 
 import java.util.Locale;
@@ -65,7 +68,7 @@
  * battery) and also contains the {@link QuickQSPanel} along with some of the panel's inner
  * contents.
  */
-public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue.Callbacks,
+public class QuickStatusBarHeader extends RelativeLayout implements
         View.OnClickListener, NextAlarmController.NextAlarmChangeCallback {
     private static final String TAG = "QuickStatusBarHeader";
     private static final boolean DEBUG = false;
@@ -90,6 +93,7 @@
     private TouchAnimator mStatusIconsAlphaAnimator;
     private TouchAnimator mHeaderTextContainerAlphaAnimator;
 
+    private View mSystemIconsView;
     private View mQuickQsStatusIcons;
     private View mDate;
     private View mHeaderTextContainerView;
@@ -107,6 +111,9 @@
     private View mStatusSeparator;
     private ImageView mRingerModeIcon;
     private TextView mRingerModeTextView;
+    private BatteryMeterView mBatteryMeterView;
+    private Clock mClockView;
+    private DateView mDateView;
 
     private NextAlarmController mAlarmController;
     /** Counts how many times the long press tooltip has been shown to the user. */
@@ -138,6 +145,7 @@
         mHeaderQsPanel = findViewById(R.id.quick_qs_panel);
         mDate = findViewById(R.id.date);
         mDate.setOnClickListener(this);
+        mSystemIconsView = findViewById(R.id.quick_status_bar_system_icons);
         mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons);
         mIconManager = new TintedIconManager(findViewById(R.id.statusIcons));
 
@@ -164,19 +172,21 @@
         // Set the correct tint for the status icons so they contrast
         mIconManager.setTint(fillColor);
 
-        BatteryMeterView battery = findViewById(R.id.battery);
-        battery.setForceShowPercent(true);
+        mBatteryMeterView = findViewById(R.id.battery);
+        mBatteryMeterView.setForceShowPercent(true);
+        mClockView = findViewById(R.id.clock);
+        mDateView = findViewById(R.id.date);
     }
 
     private void updateStatusText() {
         boolean ringerVisible = false;
         if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
             mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_vibrate);
-            mRingerModeTextView.setText(R.string.volume_ringer_status_vibrate);
+            mRingerModeTextView.setText(R.string.qs_status_phone_vibrate);
             ringerVisible = true;
         } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) {
             mRingerModeIcon.setImageResource(R.drawable.stat_sys_ringer_silent);
-            mRingerModeTextView.setText(R.string.volume_ringer_status_silent);
+            mRingerModeTextView.setText(R.string.qs_status_phone_muted);
             ringerVisible = true;
         }
         mRingerModeIcon.setVisibility(ringerVisible ? View.VISIBLE : View.GONE);
@@ -212,6 +222,13 @@
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
         updateResources();
+
+        // Update color schemes in landscape to use wallpaperTextColor
+        boolean shouldUseWallpaperTextColor =
+                newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE;
+        mBatteryMeterView.useWallpaperTextColor(shouldUseWallpaperTextColor);
+        mClockView.useWallpaperTextColor(shouldUseWallpaperTextColor);
+        mDateView.useWallpaperTextColor(shouldUseWallpaperTextColor);
     }
 
     @Override
@@ -221,11 +238,22 @@
     }
 
     private void updateResources() {
-        // Update height, especially due to landscape mode restricting space.
+        Resources resources = mContext.getResources();
+
+        // Update height for a few views, especially due to landscape mode restricting space.
         mHeaderTextContainerView.getLayoutParams().height =
-                mContext.getResources().getDimensionPixelSize(R.dimen.qs_header_tooltip_height);
+                resources.getDimensionPixelSize(R.dimen.qs_header_tooltip_height);
         mHeaderTextContainerView.setLayoutParams(mHeaderTextContainerView.getLayoutParams());
 
+        mSystemIconsView.getLayoutParams().height = resources.getDimensionPixelSize(
+                com.android.internal.R.dimen.quick_qs_offset_height);
+        mSystemIconsView.setLayoutParams(mSystemIconsView.getLayoutParams());
+
+        getLayoutParams().height = resources.getDimensionPixelSize(mQsDisabled
+                ? com.android.internal.R.dimen.quick_qs_offset_height
+                : com.android.internal.R.dimen.quick_qs_total_height);
+        setLayoutParams(getLayoutParams());
+
         updateStatusIconAlphaAnimator();
         updateHeaderTextContainerAlphaAnimator();
     }
@@ -293,20 +321,18 @@
                 TOOLTIP_NOT_YET_SHOWN_COUNT);
     }
 
-    @Override
     public void disable(int state1, int state2, boolean animate) {
         final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0;
         if (disabled == mQsDisabled) return;
         mQsDisabled = disabled;
         mHeaderQsPanel.setDisabledByPolicy(disabled);
-        final int rawHeight = (int) getResources().getDimension(
-                com.android.internal.R.dimen.quick_qs_total_height);
-        getLayoutParams().height = disabled ? (rawHeight - mHeaderQsPanel.getHeight()) : rawHeight;
+        mHeaderTextContainerView.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+        mQuickQsStatusIcons.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
+        updateResources();
     }
 
     @Override
     public void onAttachedToWindow() {
-        SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).addCallbacks(this);
         Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager);
         requestApplyInsets();
     }
@@ -327,7 +353,6 @@
     @VisibleForTesting
     public void onDetachedFromWindow() {
         setListening(false);
-        SysUiServiceProvider.getComponent(getContext(), CommandQueue.class).removeCallbacks(this);
         Dependency.get(StatusBarIconController.class).removeIconGroup(mIconManager);
         super.onDetachedFromWindow();
     }
@@ -497,9 +522,8 @@
         mHeaderQsPanel.setHost(host, null /* No customization in header */);
 
         // Use SystemUI context to get battery meter colors, and let it use the default tint (white)
-        BatteryMeterView battery = findViewById(R.id.battery);
-        battery.setColorsFromContext(mHost.getContext());
-        battery.onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
+        mBatteryMeterView.setColorsFromContext(mHost.getContext());
+        mBatteryMeterView.onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
     }
 
     public void setCallback(Callback qsPanelCallback) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
index 23d3ebbb..24b5a34 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java
@@ -29,7 +29,6 @@
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.qs.QSFooter;
 import com.android.systemui.qs.QSPanel;
-import com.android.systemui.statusbar.car.UserGridView;
 import com.android.systemui.statusbar.phone.MultiUserSwitch;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.UserInfoController;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
index 0ee6d1f..da21aa5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java
@@ -20,21 +20,20 @@
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
 import android.app.Fragment;
+import android.content.Context;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
+import android.support.v7.widget.GridLayoutManager;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 
-import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.plugins.qs.QS;
 import com.android.systemui.qs.QSFooter;
-import com.android.systemui.statusbar.car.PageIndicator;
-import com.android.systemui.statusbar.car.UserGridView;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
+import com.android.systemui.statusbar.car.UserGridRecyclerView;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -45,14 +44,12 @@
  * status bar, and a static row with access to the user switcher and settings.
  */
 public class CarQSFragment extends Fragment implements QS {
-    private ViewGroup mPanel;
     private View mHeader;
     private View mUserSwitcherContainer;
     private CarQSFooter mFooter;
     private View mFooterUserName;
     private View mFooterExpandIcon;
-    private UserGridView mUserGridView;
-    private PageIndicator mPageIndicator;
+    private UserGridRecyclerView mUserGridView;
     private AnimatorSet mAnimatorSet;
     private UserSwitchCallback mUserSwitchCallback;
 
@@ -65,7 +62,6 @@
     @Override
     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mPanel = (ViewGroup) view;
         mHeader = view.findViewById(R.id.header);
         mFooter = view.findViewById(R.id.qs_footer);
         mFooterUserName = mFooter.findViewById(R.id.user_name);
@@ -75,16 +71,15 @@
 
         updateUserSwitcherHeight(0);
 
-        mUserGridView = view.findViewById(R.id.user_grid);
-        mUserGridView.init(null, Dependency.get(UserSwitcherController.class),
-                false /* overrideAlpha */);
-
-        mPageIndicator = view.findViewById(R.id.user_switcher_page_indicator);
-        mPageIndicator.setupWithViewPager(mUserGridView);
+        Context context = getContext();
+        mUserGridView = mUserSwitcherContainer.findViewById(R.id.user_grid);
+        GridLayoutManager layoutManager = new GridLayoutManager(context,
+                context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col));
+        mUserGridView.setLayoutManager(layoutManager);
+        mUserGridView.buildAdapter();
 
         mUserSwitchCallback = new UserSwitchCallback();
         mFooter.setUserSwitchCallback(mUserSwitchCallback);
-        mUserGridView.setUserSwitchCallback(mUserSwitchCallback);
     }
 
     @Override
@@ -111,13 +106,11 @@
     @Override
     public void setHeaderListening(boolean listening) {
         mFooter.setListening(listening);
-        mUserGridView.setListening(listening);
     }
 
     @Override
     public void setListening(boolean listening) {
         mFooter.setListening(listening);
-        mUserGridView.setListening(listening);
     }
 
     @Override
@@ -219,24 +212,6 @@
             mShowing = false;
             animateHeightChange(false /* opening */);
         }
-
-        public void resetShowing() {
-            if (mShowing) {
-                for (int i = 0; i < mUserGridView.getChildCount(); i++) {
-                    ViewGroup podContainer = (ViewGroup) mUserGridView.getChildAt(i);
-                    // Need to bring the last child to the front to maintain the order in the pod
-                    // container. Why? ¯\_(ツ)_/¯
-                    if (podContainer.getChildCount() > 0) {
-                        podContainer.getChildAt(podContainer.getChildCount() - 1).bringToFront();
-                    }
-                    // The alpha values are default to 0, so if the pods have been refreshed, they
-                    // need to be set to 1 when showing.
-                    for (int j = 0; j < podContainer.getChildCount(); j++) {
-                        podContainer.getChildAt(j).setAlpha(1f);
-                    }
-                }
-            }
-        }
     }
 
     private void updateUserSwitcherHeight(int height) {
@@ -260,27 +235,6 @@
         });
         allAnimators.add(heightAnimator);
 
-        // The user grid contains pod containers that each contain a number of pods.  Animate
-        // all pods to avoid any discrepancy/race conditions with possible changes during the
-        // animation.
-        int cascadeDelay = getResources().getInteger(
-                R.integer.car_user_switcher_anim_cascade_delay_ms);
-        for (int i = 0; i < mUserGridView.getChildCount(); i++) {
-            ViewGroup podContainer = (ViewGroup) mUserGridView.getChildAt(i);
-            for (int j = 0; j < podContainer.getChildCount(); j++) {
-                View pod = podContainer.getChildAt(j);
-                Animator podAnimator = AnimatorInflater.loadAnimator(getContext(),
-                        opening ? R.anim.car_user_switcher_open_pod_animation
-                                : R.anim.car_user_switcher_close_pod_animation);
-                // Add the cascading delay between pods
-                if (opening) {
-                    podAnimator.setStartDelay(podAnimator.getStartDelay() + j * cascadeDelay);
-                }
-                podAnimator.setTarget(pod);
-                allAnimators.add(podAnimator);
-            }
-        }
-
         Animator nameAnimator = AnimatorInflater.loadAnimator(getContext(),
                 opening ? R.anim.car_user_switcher_open_name_animation
                         : R.anim.car_user_switcher_close_name_animation);
@@ -293,12 +247,6 @@
         iconAnimator.setTarget(mFooterExpandIcon);
         allAnimators.add(iconAnimator);
 
-        Animator pageAnimator = AnimatorInflater.loadAnimator(getContext(),
-                opening ? R.anim.car_user_switcher_open_pages_animation
-                        : R.anim.car_user_switcher_close_pages_animation);
-        pageAnimator.setTarget(mPageIndicator);
-        allAnimators.add(pageAnimator);
-
         mAnimatorSet = new AnimatorSet();
         mAnimatorSet.addListener(new AnimatorListenerAdapter() {
             @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
index eb95866..20e3cee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
@@ -44,4 +44,9 @@
     public TextView getAppLabel() {
         return mSecondLine;
     }
+
+    @Override
+    protected boolean animationsEnabled() {
+        return false;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
index 0f83078..e7e756f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java
@@ -16,6 +16,8 @@
 
 import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -127,7 +129,6 @@
     }
 
     protected void setIcon(ImageView iv, QSTile.State state) {
-        updateIcon(iv, state);
         if (state.disabledByPolicy) {
             iv.setColorFilter(getContext().getColor(R.color.qs_tile_disabled_color));
         } else {
@@ -137,7 +138,7 @@
             int color = getColor(state.state);
             mState = state.state;
             if (iv.isShown() && mTint != 0) {
-                animateGrayScale(mTint, color, iv);
+                animateGrayScale(mTint, color, iv, () -> updateIcon(iv, state));
                 mTint = color;
             } else {
                 if (iv instanceof AlphaControlledSlashImageView) {
@@ -147,7 +148,10 @@
                     setTint(iv, color);
                 }
                 mTint = color;
+                updateIcon(iv, state);
             }
+        } else {
+            updateIcon(iv, state);
         }
     }
 
@@ -155,12 +159,13 @@
         return getColorForState(getContext(), state);
     }
 
-    public static void animateGrayScale(int fromColor, int toColor, ImageView iv) {
+    private void animateGrayScale(int fromColor, int toColor, ImageView iv,
+        final Runnable endRunnable) {
         if (iv instanceof AlphaControlledSlashImageView) {
             ((AlphaControlledSlashImageView)iv)
                     .setFinalImageTintList(ColorStateList.valueOf(toColor));
         }
-        if (ValueAnimator.areAnimatorsEnabled()) {
+        if (mAnimationEnabled && ValueAnimator.areAnimatorsEnabled()) {
             final float fromAlpha = Color.alpha(fromColor);
             final float toAlpha = Color.alpha(toColor);
             final float fromChannel = Color.red(fromColor);
@@ -175,10 +180,16 @@
 
                 setTint(iv, Color.argb(alpha, channel, channel, channel));
             });
-
+            anim.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    endRunnable.run();
+                }
+            });
             anim.start();
         } else {
             setTint(iv, toColor);
+            endRunnable.run();
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
index 09d928f..cc60f87 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
@@ -179,7 +179,7 @@
     protected void handleStateChanged(QSTile.State state) {
         int circleColor = getCircleColor(state.state);
         if (circleColor != mCircleColor) {
-            if (mBg.isShown()) {
+            if (mBg.isShown() && animationsEnabled()) {
                 ValueAnimator animator = ValueAnimator.ofArgb(mCircleColor, circleColor)
                         .setDuration(QS_ANIM_LENGTH);
                 animator.addUpdateListener(animation -> mBg.setImageTintList(ColorStateList.valueOf(
@@ -205,6 +205,10 @@
         }
     }
 
+    protected boolean animationsEnabled() {
+        return true;
+    }
+
     private int getCircleColor(int state) {
         switch (state) {
             case Tile.STATE_ACTIVE:
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 7dcf5c0..4b312f5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -209,7 +209,7 @@
         state.slash.isSlashed = !state.value;
         state.label = getTileLabel();
         state.secondaryLabel = ZenModeConfig.getDescription(mContext,zen != Global.ZEN_MODE_OFF,
-                mController.getConfig());
+                mController.getConfig(), false);
         state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on);
         checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_ADJUST_VOLUME);
         switch (zen) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 8a1e4da..d8f7b71 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -41,6 +41,7 @@
 import com.android.systemui.qs.QSDetailItems;
 import com.android.systemui.qs.QSDetailItems.Item;
 import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.tileimpl.QSIconViewImpl;
 import com.android.systemui.qs.tileimpl.QSTileImpl;
 import com.android.systemui.statusbar.policy.NetworkController;
 import com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
@@ -60,6 +61,7 @@
 
     protected final WifiSignalCallback mSignalCallback = new WifiSignalCallback();
     private final ActivityStarter mActivityStarter;
+    private boolean mExpectDisabled;
 
     public WifiTile(QSHost host) {
         super(host);
@@ -120,6 +122,15 @@
         // Immediately enter transient state when turning on wifi.
         refreshState(wifiEnabled ? null : ARG_SHOW_TRANSIENT_ENABLING);
         mController.setWifiEnabled(!wifiEnabled);
+        mExpectDisabled = wifiEnabled;
+        if (mExpectDisabled) {
+            mHandler.postDelayed(() -> {
+                if (mExpectDisabled) {
+                    mExpectDisabled = false;
+                    refreshState();
+                }
+            }, QSIconViewImpl.QS_ANIM_LENGTH);
+        }
     }
 
     @Override
@@ -143,11 +154,13 @@
     @Override
     protected void handleUpdateState(SignalState state, Object arg) {
         if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg);
-        final CallbackInfo cb;
-        if (arg != null && arg instanceof CallbackInfo) {
-            cb = (CallbackInfo) arg;
-        } else {
-            cb = mSignalCallback.mInfo;
+        final CallbackInfo cb = mSignalCallback.mInfo;
+        if (mExpectDisabled) {
+            if (cb.enabled) {
+                return; // Ignore updates until disabled event occurs.
+            } else {
+                mExpectDisabled = false;
+            }
         }
         boolean transientEnabling = arg == ARG_SHOW_TRANSIENT_ENABLING;
         boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.ssid != null);
@@ -288,7 +301,7 @@
             if (isShowingDetail()) {
                 mDetailAdapter.updateItems();
             }
-            refreshState(mInfo);
+            refreshState();
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 0f85c5b..8bb3c02 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -22,6 +22,7 @@
 import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS;
 
 import android.app.ActivityManager;
+import android.app.trust.TrustManager;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -51,6 +52,7 @@
 import com.android.systemui.OverviewProxyService;
 import com.android.systemui.R;
 import com.android.systemui.RecentsComponent;
+import com.android.systemui.SystemUIApplication;
 import com.android.systemui.shared.recents.IOverviewProxy;
 import com.android.systemui.SystemUI;
 import com.android.systemui.recents.events.EventBus;
@@ -70,6 +72,7 @@
 import com.android.systemui.stackdivider.Divider;
 import com.android.systemui.statusbar.CommandQueue;
 
+import com.android.systemui.statusbar.phone.StatusBar;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -107,6 +110,7 @@
 
     private Handler mHandler;
     private RecentsImpl mImpl;
+    private TrustManager mTrustManager;
     private int mDraggingInRecentsCurrentUser;
 
     // Only For system user, this is the callbacks instance we return to each secondary user
@@ -235,6 +239,8 @@
             registerWithSystemUser();
         }
         putComponent(Recents.class, this);
+
+        mTrustManager = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE);
     }
 
     @Override
@@ -342,12 +348,28 @@
         // If connected to launcher service, let it handle the toggle logic
         IOverviewProxy overviewProxy = mOverviewProxyService.getProxy();
         if (overviewProxy != null) {
-            try {
-                overviewProxy.onOverviewToggle();
-                return;
-            } catch (RemoteException e) {
-                Log.e(TAG, "Cannot send toggle recents through proxy service.", e);
+            final Runnable toggleRecents = () -> {
+                try {
+                    if (mOverviewProxyService.getProxy() != null) {
+                        mOverviewProxyService.getProxy().onOverviewToggle();
+                    }
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Cannot send toggle recents through proxy service.", e);
+                }
+            };
+            // Preload only if device for current user is unlocked
+            final StatusBar statusBar = getComponent(StatusBar.class);
+            if (statusBar != null && statusBar.isKeyguardShowing()) {
+                statusBar.executeRunnableDismissingKeyguard(() -> {
+                        // Flush trustmanager before checking device locked per user
+                        mTrustManager.reportKeyguardShowingChanged();
+                        mHandler.post(toggleRecents);
+                    }, null,  true /* dismissShade */, false /* afterKeyguardGone */,
+                    true /* deferred */);
+            } else {
+                toggleRecents.run();
             }
+            return;
         }
 
         int growTarget = getComponent(Divider.class).getView().growsRecents();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index 19da3db..6fcb1c1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -126,7 +126,7 @@
         @Override
         public void onTaskStackChangedBackground() {
             // Skip background preloading recents in SystemUI if the overview services is bound
-            if (Dependency.get(OverviewProxyService.class).getProxy() != null) {
+            if (Dependency.get(OverviewProxyService.class).isEnabled()) {
                 return;
             }
 
@@ -300,7 +300,7 @@
 
     public void onBootCompleted() {
         // Skip preloading tasks if we are already bound to the service
-        if (Dependency.get(OverviewProxyService.class).getProxy() != null) {
+        if (Dependency.get(OverviewProxyService.class).isEnabled()) {
             return;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 75bc955..30e9afd8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -21,7 +21,6 @@
 
 import android.annotation.TargetApi;
 import android.app.ActivityManager;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -62,6 +61,7 @@
 
     private static final String TAG = "RecentsOnboarding";
     private static final boolean RESET_PREFS_FOR_DEBUG = false;
+    private static final boolean ONBOARDING_ENABLED = false;
     private static final long SHOW_DELAY_MS = 500;
     private static final long SHOW_HIDE_DURATION_MS = 300;
     // Don't show the onboarding until the user has launched this number of apps.
@@ -184,6 +184,9 @@
     }
 
     public void onConnectedToLauncher() {
+        if (!ONBOARDING_ENABLED) {
+            return;
+        }
         boolean alreadySeenRecentsOnboarding = Prefs.getBoolean(mContext,
                 Prefs.Key.HAS_SEEN_RECENTS_ONBOARDING, false);
         if (!mTaskListenerRegistered && !alreadySeenRecentsOnboarding) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index 3dd6e35..bfbba7c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -107,7 +107,7 @@
         final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.MATCH_PARENT,
-                WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                         | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                 PixelFormat.TRANSLUCENT);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AppOpsListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/AppOpsListener.java
index 2ec78cf..019c680 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AppOpsListener.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AppOpsListener.java
@@ -62,7 +62,7 @@
     public void onOpActiveChanged(int code, int uid, String packageName, boolean active) {
         mFsc.onAppOpChanged(code, uid, packageName, active);
         mPresenter.getHandler().post(() -> {
-          mEntryManager.updateNotificationsForAppOps(code, uid, packageName, active);
+          mEntryManager.updateNotificationsForAppOp(code, uid, packageName, active);
         });
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 65037f9..6fd0aa6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -18,7 +18,7 @@
 
 import android.content.ComponentName;
 import android.graphics.Rect;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
@@ -160,7 +160,7 @@
 
         default void onRotationProposal(int rotation, boolean isValid) { }
 
-        default void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) { }
+        default void showFingerprintDialog(Bundle bundle, IBiometricPromptReceiver receiver) { }
         default void onFingerprintAuthenticated() { }
         default void onFingerprintHelp(String message) { }
         default void onFingerprintError(String error) { }
@@ -513,7 +513,7 @@
     }
 
     @Override
-    public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
+    public void showFingerprintDialog(Bundle bundle, IBiometricPromptReceiver receiver) {
         synchronized (mLock) {
             SomeArgs args = SomeArgs.obtain();
             args.arg1 = bundle;
@@ -759,7 +759,7 @@
                     for (int i = 0; i < mCallbacks.size(); i++) {
                         mCallbacks.get(i).showFingerprintDialog(
                                 (Bundle)((SomeArgs)msg.obj).arg1,
-                                (IBiometricDialogReceiver)((SomeArgs)msg.obj).arg2);
+                                (IBiometricPromptReceiver)((SomeArgs)msg.obj).arg2);
                     }
                     break;
                 case MSG_FINGERPRINT_AUTHENTICATED:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 3ece2f9..87e6608 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -35,6 +35,7 @@
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
 import android.service.notification.StatusBarNotification;
@@ -100,13 +101,17 @@
 public class ExpandableNotificationRow extends ActivatableNotificationView
         implements PluginListener<NotificationMenuRowPlugin> {
 
+    private static final boolean DEBUG = false;
     private static final int DEFAULT_DIVIDER_ALPHA = 0x29;
     private static final int COLORED_DIVIDER_ALPHA = 0x7B;
     private static final int MENU_VIEW_INDEX = 0;
     private static final String TAG = "ExpandableNotifRow";
 
+    /**
+     * Listener for when {@link ExpandableNotificationRow} is laid out.
+     */
     public interface LayoutListener {
-        public void onLayout();
+        void onLayout();
     }
 
     private LayoutListener mLayoutListener;
@@ -174,8 +179,11 @@
     private NotificationGuts mGuts;
     private NotificationData.Entry mEntry;
     private StatusBarNotification mStatusBarNotification;
-    private PackageManager mCachedPackageManager;
-    private PackageInfo mCachedPackageInfo;
+    /**
+     * Whether or not this row represents a system notification. Note that if this is {@code null},
+     * that means we were either unable to retrieve the info or have yet to retrieve the info.
+     */
+    private Boolean mIsSystemNotification;
     private String mAppName;
     private boolean mIsHeadsUp;
     private boolean mLastChronometerRunning = true;
@@ -271,7 +279,7 @@
                 public Float get(ExpandableNotificationRow object) {
                     return object.getTranslation();
                 }
-    };
+            };
     private OnClickListener mOnClickListener;
     private boolean mHeadsupDisappearRunning;
     private View mChildAfterViewWhenDismissed;
@@ -292,6 +300,33 @@
     private int mNotificationColorAmbient;
     private NotificationViewState mNotificationViewState;
 
+    private SystemNotificationAsyncTask mSystemNotificationAsyncTask =
+            new SystemNotificationAsyncTask();
+
+    /**
+     * Returns whether the given {@code statusBarNotification} is a system notification.
+     * <b>Note</b>, this should be run in the background thread if possible as it makes multiple IPC
+     * calls.
+     */
+    private static Boolean isSystemNotification(
+            Context context, StatusBarNotification statusBarNotification) {
+        PackageManager packageManager = StatusBar.getPackageManagerForUser(
+                context, statusBarNotification.getUser().getIdentifier());
+        Boolean isSystemNotification = null;
+
+        try {
+            PackageInfo packageInfo = packageManager.getPackageInfo(
+                    statusBarNotification.getPackageName(), PackageManager.GET_SIGNATURES);
+
+            isSystemNotification =
+                    com.android.settingslib.Utils.isSystemPackage(
+                            context.getResources(), packageManager, packageInfo);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "cacheIsSystemNotification: Could not find package info");
+        }
+        return isSystemNotification;
+    }
+
     @Override
     public boolean isGroupExpansionChanging() {
         if (isChildInGroup()) {
@@ -383,45 +418,43 @@
         mStatusBarNotification = entry.notification;
         mNotificationInflater.inflateNotificationViews();
 
-        perhapsCachePackageInfo();
+        cacheIsSystemNotification();
     }
 
     /**
-     * Caches the package manager and info objects which are expensive to obtain.
+     * Caches whether or not this row contains a system notification. Note, this is only cached
+     * once per notification as the packageInfo can't technically change for a notification row.
      */
-    private void perhapsCachePackageInfo() {
-        if (mCachedPackageInfo == null) {
-            mCachedPackageManager = StatusBar.getPackageManagerForUser(
-                    mContext, mStatusBarNotification.getUser().getIdentifier());
-            try {
-                mCachedPackageInfo = mCachedPackageManager.getPackageInfo(
-                        mStatusBarNotification.getPackageName(), PackageManager.GET_SIGNATURES);
-            } catch (PackageManager.NameNotFoundException e) {
-                Log.e(TAG, "perhapsCachePackageInfo: Could not find package info");
+    private void cacheIsSystemNotification() {
+        if (mIsSystemNotification == null) {
+            if (mSystemNotificationAsyncTask.getStatus() == AsyncTask.Status.PENDING) {
+                // Run async task once, only if it hasn't already been executed. Note this is
+                // executed in serial - no need to parallelize this small task.
+                mSystemNotificationAsyncTask.execute();
             }
         }
     }
 
     /**
-     * Returns whether this row is considered non-blockable (e.g. it's a non-blockable system notif,
-     * covers multiple channels, or is in a whitelist).
+     * Returns whether this row is considered non-blockable (i.e. it's a non-blockable system notif
+     * or is in a whitelist).
      */
     public boolean getIsNonblockable() {
-        boolean isNonblockable;
-
-        isNonblockable = Dependency.get(NotificationBlockingHelperManager.class)
+        boolean isNonblockable = Dependency.get(NotificationBlockingHelperManager.class)
                 .isNonblockablePackage(mStatusBarNotification.getPackageName());
 
-        // Only bother with going through the children if the row is still blockable based on the
-        // number of unique channels.
-        if (!isNonblockable) {
-            isNonblockable = getNumUniqueChannels() > 1;
+        // If the SystemNotifAsyncTask hasn't finished running or retrieved a value, we'll try once
+        // again, but in-place on the main thread this time. This should rarely ever get called.
+        if (mIsSystemNotification == null) {
+            if (DEBUG) {
+                Log.d(TAG, "Retrieving isSystemNotification on main thread");
+            }
+            mSystemNotificationAsyncTask.cancel(true /* mayInterruptIfRunning */);
+            mIsSystemNotification = isSystemNotification(mContext, mStatusBarNotification);
         }
 
-        // Only bother with IPC if the package is still blockable.
-        if (!isNonblockable && mCachedPackageManager != null && mCachedPackageInfo != null) {
-            if (com.android.settingslib.Utils.isSystemPackage(
-                    mContext.getResources(), mCachedPackageManager, mCachedPackageInfo)) {
+        if (!isNonblockable && mIsSystemNotification != null) {
+            if (mIsSystemNotification) {
                 if (mEntry.channel != null
                         && !mEntry.channel.isBlockableSystem()) {
                     isNonblockable = true;
@@ -2828,4 +2861,21 @@
          */
         boolean onClick(View v, int x, int y, MenuItem item);
     }
+
+    /**
+     * Background task for executing IPCs to check if the notification is a system notification. The
+     * output is used for both the blocking helper and the notification info.
+     */
+    private class SystemNotificationAsyncTask extends AsyncTask<Void, Void, Boolean> {
+
+        @Override
+        protected Boolean doInBackground(Void... voids) {
+            return isSystemNotification(mContext, mStatusBarNotification);
+        }
+
+        @Override
+        protected void onPostExecute(Boolean result) {
+            mIsSystemNotification = result;
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index b81e9af..29c2edc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -26,6 +26,7 @@
 import android.util.ArraySet;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.view.MotionEvent;
 import android.view.NotificationHeaderView;
 import android.view.View;
 import android.view.ViewGroup;
@@ -1631,6 +1632,42 @@
         return null;
     }
 
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        float y = ev.getY();
+        // We still want to distribute touch events to the remote input even if it's outside the
+        // view boundary. We're therefore manually dispatching these events to the remote view
+        RemoteInputView riv = getRemoteInputForView(getViewForVisibleType(mVisibleType));
+        if (riv != null && riv.getVisibility() == VISIBLE) {
+            int inputStart = mUnrestrictedContentHeight - riv.getHeight();
+            if (y <= mUnrestrictedContentHeight && y >= inputStart) {
+                ev.offsetLocation(0, -inputStart);
+                return riv.dispatchTouchEvent(ev);
+            }
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+    /**
+     * Overridden to make sure touches to the reply action bar actually go through to this view
+     */
+    @Override
+    public boolean pointInView(float localX, float localY, float slop) {
+        float top = mClipTopAmount;
+        float bottom = mUnrestrictedContentHeight;
+        return localX >= -slop && localY >= top - slop && localX < ((mRight - mLeft) + slop) &&
+                localY < (bottom + slop);
+    }
+
+    private RemoteInputView getRemoteInputForView(View child) {
+        if (child == mExpandedChild) {
+            return mExpandedRemoteInput;
+        } else if (child == mHeadsUpChild) {
+            return mHeadsUpRemoteInput;
+        }
+        return null;
+    }
+
     public int getExpandHeight() {
         int viewType = VISIBLE_TYPE_EXPANDED;
         if (mExpandedChild == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 4b6ab64..ab46b39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -383,8 +383,6 @@
         }
         mGroupManager.onEntryAdded(entry);
 
-        updateAppOps(entry);
-
         updateRankingAndSort(mRankingMap);
     }
 
@@ -403,25 +401,14 @@
         updateRankingAndSort(ranking);
     }
 
-    private void updateAppOps(Entry entry) {
-        final int uid = entry.notification.getUid();
-        final String pkg = entry.notification.getPackageName();
-        ArraySet<Integer> activeOps = mFsc.getAppOps(entry.notification.getUserId(), pkg);
-        if (activeOps != null) {
-            int N = activeOps.size();
-            for (int i = 0; i < N; i++) {
-                updateAppOp(activeOps.valueAt(i), uid, pkg, true);
-            }
-        }
-    }
-
-    public void updateAppOp(int appOp, int uid, String pkg, boolean showIcon) {
+    public void updateAppOp(int appOp, int uid, String pkg, String key, boolean showIcon) {
         synchronized (mEntries) {
             final int N = mEntries.size();
             for (int i = 0; i < N; i++) {
                 Entry entry = mEntries.valueAt(i);
                 if (uid == entry.notification.getUid()
-                    && pkg.equals(entry.notification.getPackageName())) {
+                        && pkg.equals(entry.notification.getPackageName())
+                        && key.equals(entry.key)) {
                     if (showIcon) {
                         entry.mActiveAppOps.add(appOp);
                     } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
index 45df450..849cfdd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationEntryManager.java
@@ -43,6 +43,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.internal.util.NotificationMessagingUtil;
@@ -665,6 +666,7 @@
         }
         // Add the expanded view and icon.
         mNotificationData.add(entry);
+        tagForeground(entry.notification);
         updateNotifications();
     }
 
@@ -726,6 +728,19 @@
         mPendingNotifications.put(key, shadeEntry);
     }
 
+    @VisibleForTesting
+    protected void tagForeground(StatusBarNotification notification) {
+        ArraySet<Integer> activeOps = mForegroundServiceController.getAppOps(
+                notification.getUserId(), notification.getPackageName());
+        if (activeOps != null) {
+            int N = activeOps.size();
+            for (int i = 0; i < N; i++) {
+                updateNotificationsForAppOp(activeOps.valueAt(i), notification.getUid(),
+                        notification.getPackageName(), true);
+            }
+        }
+    }
+
     @Override
     public void addNotification(StatusBarNotification notification,
             NotificationListenerService.RankingMap ranking) {
@@ -736,10 +751,11 @@
         }
     }
 
-    public void updateNotificationsForAppOps(int appOp, int uid, String pkg, boolean showIcon) {
-        if (mForegroundServiceController.getStandardLayoutKey(
-                UserHandle.getUserId(uid), pkg) != null) {
-            mNotificationData.updateAppOp(appOp, uid, pkg, showIcon);
+    public void updateNotificationsForAppOp(int appOp, int uid, String pkg, boolean showIcon) {
+        String foregroundKey = mForegroundServiceController.getStandardLayoutKey(
+                UserHandle.getUserId(uid), pkg);
+        if (foregroundKey != null) {
+            mNotificationData.updateAppOp(appOp, uid, pkg, foregroundKey, showIcon);
             updateNotifications();
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index a93be00..81dd9e8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -23,6 +23,7 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
+import android.annotation.Nullable;
 import android.app.INotificationManager;
 import android.app.Notification;
 import android.app.NotificationChannel;
@@ -34,10 +35,12 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
+import android.os.Handler;
 import android.os.RemoteException;
 import android.service.notification.StatusBarNotification;
 import android.text.TextUtils;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
@@ -63,10 +66,10 @@
     private INotificationManager mINotificationManager;
     private PackageManager mPm;
 
-    private String mPkg;
+    private String mPackageName;
     private String mAppName;
     private int mAppUid;
-    private int mNumNotificationChannels;
+    private int mNumUniqueChannelsInRow;
     private NotificationChannel mSingleNotificationChannel;
     private int mStartingUserImportance;
     private int mChosenImportance;
@@ -87,7 +90,7 @@
 
     private OnClickListener mOnKeepShowing = this::closeControls;
 
-    private OnClickListener mOnStopMinNotifications = v -> {
+    private OnClickListener mOnStopOrMinimizeNotifications = v -> {
         swapContent(false);
     };
 
@@ -120,16 +123,16 @@
             final INotificationManager iNotificationManager,
             final String pkg,
             final NotificationChannel notificationChannel,
-            final int numChannels,
+            final int numUniqueChannelsInRow,
             final StatusBarNotification sbn,
             final CheckSaveListener checkSaveListener,
             final OnSettingsClickListener onSettingsClick,
             final OnAppSettingsClickListener onAppSettingsClick,
             boolean isNonblockable)
             throws RemoteException {
-        bindNotification(pm, iNotificationManager, pkg, notificationChannel, numChannels, sbn,
-                checkSaveListener, onSettingsClick, onAppSettingsClick, isNonblockable,
-                false /* isBlockingHelper */,
+        bindNotification(pm, iNotificationManager, pkg, notificationChannel,
+                numUniqueChannelsInRow, sbn, checkSaveListener, onSettingsClick,
+                onAppSettingsClick, isNonblockable, false /* isBlockingHelper */,
                 false /* isUserSentimentNegative */);
     }
 
@@ -138,7 +141,7 @@
             INotificationManager iNotificationManager,
             String pkg,
             NotificationChannel notificationChannel,
-            int numChannels,
+            int numUniqueChannelsInRow,
             StatusBarNotification sbn,
             CheckSaveListener checkSaveListener,
             OnSettingsClickListener onSettingsClick,
@@ -148,12 +151,12 @@
             boolean isUserSentimentNegative)
             throws RemoteException {
         mINotificationManager = iNotificationManager;
-        mPkg = pkg;
-        mNumNotificationChannels = numChannels;
+        mPackageName = pkg;
+        mNumUniqueChannelsInRow = numUniqueChannelsInRow;
         mSbn = sbn;
         mPm = pm;
         mAppSettingsClickListener = onAppSettingsClick;
-        mAppName = mPkg;
+        mAppName = mPackageName;
         mCheckSaveListener = checkSaveListener;
         mOnSettingsClickListener = onSettingsClick;
         mSingleNotificationChannel = notificationChannel;
@@ -167,11 +170,11 @@
 
         int numTotalChannels = mINotificationManager.getNumNotificationChannelsForPackage(
                 pkg, mAppUid, false /* includeDeleted */);
-        if (mNumNotificationChannels == 0) {
+        if (mNumUniqueChannelsInRow == 0) {
             throw new IllegalArgumentException("bindNotification requires at least one channel");
         } else  {
             // Special behavior for the Default channel if no other channels have been defined.
-            mIsSingleDefaultChannel = mNumNotificationChannels == 1
+            mIsSingleDefaultChannel = mNumUniqueChannelsInRow == 1
                     && mSingleNotificationChannel.getId().equals(
                             NotificationChannel.DEFAULT_CHANNEL_ID)
                     && numTotalChannels == 1;
@@ -187,7 +190,8 @@
         Drawable pkgicon = null;
         ApplicationInfo info;
         try {
-            info = mPm.getApplicationInfo(mPkg,
+            info = mPm.getApplicationInfo(
+                    mPackageName,
                     PackageManager.MATCH_UNINSTALLED_PACKAGES
                             | PackageManager.MATCH_DISABLED_COMPONENTS
                             | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
@@ -208,7 +212,7 @@
         if (mSingleNotificationChannel != null && mSingleNotificationChannel.getGroup() != null) {
             final NotificationChannelGroup notificationChannelGroup =
                     mINotificationManager.getNotificationChannelGroupForPackage(
-                            mSingleNotificationChannel.getGroup(), mPkg, mAppUid);
+                            mSingleNotificationChannel.getGroup(), mPackageName, mAppUid);
             if (notificationChannelGroup != null) {
                 groupName = notificationChannelGroup.getName();
             }
@@ -232,7 +236,7 @@
             settingsButton.setOnClickListener(
                     (View view) -> {
                         mOnSettingsClickListener.onClick(view,
-                                mNumNotificationChannels > 1 ? null : mSingleNotificationChannel,
+                                mNumUniqueChannelsInRow > 1 ? null : mSingleNotificationChannel,
                                 appUidF);
                     });
         } else {
@@ -248,7 +252,7 @@
         } else {
             if (mNegativeUserSentiment) {
                 blockPrompt.setText(R.string.inline_blocking_helper);
-            }  else if (mIsSingleDefaultChannel || mNumNotificationChannels > 1) {
+            }  else if (mIsSingleDefaultChannel || mNumUniqueChannelsInRow > 1) {
                 blockPrompt.setText(R.string.inline_keep_showing_app);
             } else {
                 blockPrompt.setText(R.string.inline_keep_showing);
@@ -258,7 +262,7 @@
 
     private void bindName() {
         final TextView channelName = findViewById(R.id.channel_name);
-        if (mIsSingleDefaultChannel || mNumNotificationChannels > 1) {
+        if (mIsSingleDefaultChannel || mNumUniqueChannelsInRow > 1) {
             channelName.setVisibility(View.GONE);
         } else {
             channelName.setText(mSingleNotificationChannel.getName());
@@ -270,19 +274,26 @@
     }
 
     private void saveImportance() {
-        if (mIsNonblockable) {
-            return;
+        if (!mIsNonblockable) {
+            if (mCheckSaveListener != null) {
+                mCheckSaveListener.checkSave(this::updateImportance, mSbn);
+            } else {
+                updateImportance();
+            }
         }
+    }
+
+    /**
+     * Commits the updated importance values on the background thread.
+     */
+    private void updateImportance() {
         MetricsLogger.action(mContext, MetricsEvent.ACTION_SAVE_IMPORTANCE,
                 mChosenImportance - mStartingUserImportance);
-        mSingleNotificationChannel.setImportance(mChosenImportance);
-        mSingleNotificationChannel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
-        try {
-            mINotificationManager.updateNotificationChannelForPackage(
-                    mPkg, mAppUid, mSingleNotificationChannel);
-        } catch (RemoteException e) {
-            // :(
-        }
+
+        Handler bgHandler = new Handler(Dependency.get(Dependency.BG_LOOPER));
+        bgHandler.post(new UpdateImportanceRunnable(mINotificationManager, mPackageName, mAppUid,
+                mNumUniqueChannelsInRow == 1 ? mSingleNotificationChannel : null,
+                mStartingUserImportance, mChosenImportance));
     }
 
     private void bindButtons() {
@@ -292,9 +303,9 @@
         View minimize = findViewById(R.id.minimize);
 
         findViewById(R.id.undo).setOnClickListener(mOnUndo);
-        block.setOnClickListener(mOnStopMinNotifications);
+        block.setOnClickListener(mOnStopOrMinimizeNotifications);
         keep.setOnClickListener(mOnKeepShowing);
-        minimize.setOnClickListener(mOnStopMinNotifications);
+        minimize.setOnClickListener(mOnStopOrMinimizeNotifications);
 
         if (mIsNonblockable) {
             keep.setText(R.string.notification_done);
@@ -308,15 +319,15 @@
             minimize.setVisibility(GONE);
         }
 
-        // Set up app settings link
+        // Set up app settings link (i.e. Customize)
         TextView settingsLinkView = findViewById(R.id.app_settings);
-        Intent settingsIntent = getAppSettingsIntent(mPm, mPkg, mSingleNotificationChannel,
+        Intent settingsIntent = getAppSettingsIntent(mPm, mPackageName, mSingleNotificationChannel,
                 mSbn.getId(), mSbn.getTag());
-        if (settingsIntent != null
+        if (!mIsForBlockingHelper
+                && settingsIntent != null
                 && !TextUtils.isEmpty(mSbn.getNotification().getSettingsText())) {
             settingsLinkView.setVisibility(VISIBLE);
-            settingsLinkView.setText(mContext.getString(R.string.notification_app_settings,
-                    mSbn.getNotification().getSettingsText()));
+            settingsLinkView.setText(mContext.getString(R.string.notification_app_settings));
             settingsLinkView.setOnClickListener((View view) -> {
                 mAppSettingsClickListener.onClick(view, settingsIntent);
             });
@@ -415,12 +426,25 @@
         return intent;
     }
 
+    /**
+     * Closes the controls and commits the updated importance values (indirectly). If this view is
+     * being used to show the blocking helper, this will immediately dismiss the blocking helper and
+     * commit the updated importance.
+     *
+     * <p><b>Note,</b> this will only get called once the view is dismissing. This means that the
+     * user does not have the ability to undo the action anymore. See {@link #swapContent(boolean)}
+     * for where undo is handled.
+     */
     @VisibleForTesting
     void closeControls(View v) {
         if (mIsForBlockingHelper) {
             NotificationBlockingHelperManager manager =
                     Dependency.get(NotificationBlockingHelperManager.class);
             manager.dismissCurrentBlockingHelper();
+
+            // Since this won't get a callback via gutsContainer.closeControls, save the new
+            // importance values immediately.
+            saveImportance();
         } else {
             int[] parentLoc = new int[2];
             int[] targetLoc = new int[2];
@@ -454,11 +478,7 @@
         // Save regardless of the importance so we can lock the importance field if the user wants
         // to keep getting notifications
         if (save) {
-            if (mCheckSaveListener != null) {
-                mCheckSaveListener.checkSave(this::saveImportance, mSbn);
-            } else {
-                saveImportance();
-            }
+            saveImportance();
         }
         return false;
     }
@@ -467,4 +487,48 @@
     public int getActualHeight() {
         return getHeight();
     }
+
+    /**
+     * Runnable to either update the given channel (with a new importance value) or, if no channel
+     * is provided, update notifications enabled state for the package.
+     */
+    private static class UpdateImportanceRunnable implements Runnable {
+        private final INotificationManager mINotificationManager;
+        private final String mPackageName;
+        private final int mAppUid;
+        private final @Nullable NotificationChannel mChannelToUpdate;
+        private final int mCurrentImportance;
+        private final int mNewImportance;
+
+
+        public UpdateImportanceRunnable(INotificationManager notificationManager,
+                String packageName, int appUid, @Nullable NotificationChannel channelToUpdate,
+                int currentImportance, int newImportance) {
+            mINotificationManager = notificationManager;
+            mPackageName = packageName;
+            mAppUid = appUid;
+            mChannelToUpdate = channelToUpdate;
+            mCurrentImportance = currentImportance;
+            mNewImportance = newImportance;
+        }
+
+        @Override
+        public void run() {
+            try {
+                if (mChannelToUpdate != null) {
+                    mChannelToUpdate.setImportance(mNewImportance);
+                    mChannelToUpdate.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
+                    mINotificationManager.updateNotificationChannelForPackage(
+                            mPackageName, mAppUid, mChannelToUpdate);
+                } else {
+                    // For notifications with more than one channel, update notification enabled
+                    // state. If the importance was lowered, we disable notifications.
+                    mINotificationManager.setNotificationsEnabledForPackage(
+                            mPackageName, mAppUid, mNewImportance >= mCurrentImportance);
+                }
+            } catch (RemoteException e) {
+                Log.e(TAG, "Unable to update notification importance", e);
+            }
+        }
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
index ccabb79..e24bf67 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java
@@ -47,7 +47,6 @@
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
-import java.util.List;
 
 /**
  * Handles keeping track of the current user, profiles, and various things related to hiding
@@ -352,7 +351,8 @@
             final boolean allowedByUser = 0 != Settings.Secure.getIntForUser(
                     mContext.getContentResolver(),
                     Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 0, userHandle);
-            final boolean allowedByDpm = adminAllowsUnredactedNotifications(userHandle);
+            final boolean allowedByDpm = adminAllowsKeyguardFeature(userHandle,
+                    DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS);
             final boolean allowed = allowedByUser && allowedByDpm;
             mUsersAllowingPrivateNotifications.append(userHandle, allowed);
             return allowed;
@@ -361,13 +361,13 @@
         return mUsersAllowingPrivateNotifications.get(userHandle);
     }
 
-    private boolean adminAllowsUnredactedNotifications(int userHandle) {
+    private boolean adminAllowsKeyguardFeature(int userHandle, int feature) {
         if (userHandle == UserHandle.USER_ALL) {
             return true;
         }
-        final int dpmFlags = mDevicePolicyManager.getKeyguardDisabledFeatures(null /* admin */,
-                userHandle);
-        return (dpmFlags & DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS) == 0;
+        final int dpmFlags =
+                mDevicePolicyManager.getKeyguardDisabledFeatures(null /* admin */, userHandle);
+        return (dpmFlags & feature) == 0;
     }
 
     /**
@@ -389,14 +389,17 @@
      * "public" (secure & locked) mode?
      */
     private boolean userAllowsNotificationsInPublic(int userHandle) {
-        if (isCurrentProfile(userHandle)) {
+        if (isCurrentProfile(userHandle) && userHandle != mCurrentUserId) {
             return true;
         }
 
         if (mUsersAllowingNotifications.indexOfKey(userHandle) < 0) {
-            final boolean allowed = 0 != Settings.Secure.getIntForUser(
+            final boolean allowedByUser = 0 != Settings.Secure.getIntForUser(
                     mContext.getContentResolver(),
                     Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 0, userHandle);
+            final boolean allowedByDpm = adminAllowsKeyguardFeature(userHandle,
+                    DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS);
+            final boolean allowed = allowedByUser && allowedByDpm;
             mUsersAllowingNotifications.append(userHandle, allowed);
             return allowed;
         }
@@ -428,7 +431,6 @@
                 Notification.VISIBILITY_PRIVATE;
     }
 
-
     private void updateCurrentProfilesCache() {
         synchronized (mCurrentProfiles) {
             mCurrentProfiles.clear();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
index 852239a..abc261e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java
@@ -172,6 +172,14 @@
                 }
             }
 
+            if (mediaNotification != null) {
+                mMediaNotificationKey = mediaNotification.notification.getKey();
+                if (DEBUG_MEDIA) {
+                    Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key="
+                            + mMediaNotificationKey + " controller=" + mMediaController);
+                }
+            }
+
             if (controller != null && !sameSessions(mMediaController, controller)) {
                 // We have a new media session
                 clearCurrentMediaNotification();
@@ -183,13 +191,6 @@
                             + mMediaMetadata);
                 }
 
-                if (mediaNotification != null) {
-                    mMediaNotificationKey = mediaNotification.notification.getKey();
-                    if (DEBUG_MEDIA) {
-                        Log.v(TAG, "DEBUG_MEDIA: Found new media notification: key="
-                                + mMediaNotificationKey + " controller=" + mMediaController);
-                    }
-                }
                 metaDataChanged = true;
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index fd3a9d5e..1637849 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -323,8 +323,7 @@
             boolean showOnKeyguard = mLockscreenUserManager.shouldShowOnKeyguard(entry
                     .notification);
             if (suppressedSummary
-                    || (mLockscreenUserManager.isLockscreenPublicMode(userId)
-                    && !mLockscreenUserManager.shouldShowLockscreenNotifications())
+                    || mLockscreenUserManager.shouldHideNotifications(userId)
                     || (isLocked && !showOnKeyguard)) {
                 entry.row.setVisibility(View.GONE);
             } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
index b7620f3..51b4239 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarMobileView.java
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar;
 
 import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
+import static com.android.systemui.statusbar.policy.DarkIconDispatcher.isInArea;
 
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -141,12 +142,14 @@
         if (mState.strengthId != state.strengthId) {
             mMobileDrawable.setLevel(state.strengthId);
         }
-        if (mState.typeId != state.typeId && state.typeId != 0) {
-            mMobileType.setContentDescription(state.typeContentDescription);
-            mMobileType.setImageResource(state.typeId);
-            mMobileType.setVisibility(View.VISIBLE);
-        } else {
-            mMobileType.setVisibility(View.GONE);
+        if (mState.typeId != state.typeId) {
+            if (state.typeId != 0) {
+                mMobileType.setContentDescription(state.typeContentDescription);
+                mMobileType.setImageResource(state.typeId);
+                mMobileType.setVisibility(View.VISIBLE);
+            } else {
+                mMobileType.setVisibility(View.GONE);
+            }
         }
 
         mMobileRoaming.setVisibility(state.roaming ? View.VISIBLE : View.GONE);
@@ -161,6 +164,9 @@
 
     @Override
     public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+        if (!isInArea(area, this)) {
+            return;
+        }
         mMobileDrawable.setDarkIntensity(darkIntensity);
         ColorStateList color = ColorStateList.valueOf(getTint(area, this, tint));
         mIn.setImageTintList(color);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
index afd373e..62cd16f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarWifiView.java
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar;
 
 import static com.android.systemui.statusbar.policy.DarkIconDispatcher.getTint;
+import static com.android.systemui.statusbar.policy.DarkIconDispatcher.isInArea;
 
 import android.content.Context;
 import android.content.res.ColorStateList;
@@ -175,6 +176,9 @@
 
     @Override
     public void onDarkChanged(Rect area, float darkIntensity, int tint) {
+        if (!isInArea(area, this)) {
+            return;
+        }
         mDarkIntensity = darkIntensity;
         Drawable d = mWifiIcon.getDrawable();
         if (d instanceof NeutralGoodDrawable) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
index 5f3e2e3..7285db6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
@@ -42,6 +42,11 @@
     /** App packages that are allowed to be used with this widget */
     private String[] mFacetPackages;
     private int mIconResourceId;
+    /**
+     * If defined in the xml this will be the icon that's rendered when the button is marked as
+     * selected
+     */
+    private int mSelectedIconResourceId;
     private boolean mUseMoreIcon = true;
     private float mSelectedAlpha = 1f;
     private float mUnselectedAlpha = 1f;
@@ -112,10 +117,9 @@
         mIcon.setClickable(false);
         mIcon.setAlpha(mUnselectedAlpha);
         mIconResourceId = styledAttributes.getResourceId(R.styleable.CarFacetButton_icon, 0);
-        if (mIconResourceId == 0)  {
-            throw new RuntimeException("specified icon resource was not found and is required");
-        }
         mIcon.setImageResource(mIconResourceId);
+        mSelectedIconResourceId = styledAttributes.getResourceId(
+                R.styleable.CarFacetButton_selectedIcon, mIconResourceId);
 
         mMoreIcon = findViewById(R.id.car_nav_button_more_icon);
         mMoreIcon.setClickable(false);
@@ -161,22 +165,10 @@
      */
     public void setSelected(boolean selected, boolean showMoreIcon) {
         mSelected = selected;
-        if (selected) {
-            if (mUseMoreIcon) {
-                mMoreIcon.setVisibility(showMoreIcon ? VISIBLE : GONE);
-            }
-            mIcon.setAlpha(mSelectedAlpha);
-        } else {
-            mMoreIcon.setVisibility(GONE);
-            mIcon.setAlpha(mUnselectedAlpha);
-        }
-    }
-
-    public void setIcon(Drawable d) {
-        if (d != null) {
-            mIcon.setImageDrawable(d);
-        } else {
-            mIcon.setImageResource(mIconResourceId);
+        mIcon.setAlpha(mSelected ? mSelectedAlpha : mUnselectedAlpha);
+        mIcon.setImageResource(mSelected ? mSelectedIconResourceId : mIconResourceId);
+        if (mUseMoreIcon) {
+            mMoreIcon.setVisibility(showMoreIcon ? VISIBLE : GONE);
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
index e73b173..b2cef16 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationBarView.java
@@ -25,7 +25,9 @@
 import android.widget.TextView;
 
 import com.android.keyguard.AlphaOptimizedImageButton;
+import com.android.systemui.Dependency;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.StatusBarIconController;
 
 /**
  * A custom navigation bar for the automotive use case.
@@ -52,6 +54,17 @@
         if (mNotificationsButton != null) {
             mNotificationsButton.setOnClickListener(this::onNotificationsClick);
         }
+        View mStatusIcons = findViewById(R.id.statusIcons);
+        if (mStatusIcons != null) {
+            // Attach the controllers for Status icons such as wifi and bluetooth if the standard
+            // container is in the view.
+            StatusBarIconController.DarkIconManager mDarkIconManager =
+                    new StatusBarIconController.DarkIconManager(
+                            mStatusIcons.findViewById(R.id.statusIcons));
+            mDarkIconManager.setShouldLog(true);
+            Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
+        }
+
     }
 
     void setStatusBar(CarStatusBar carStatusBar) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
index 0cdaec1..ec243fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
@@ -4,6 +4,7 @@
 import android.content.Intent;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.widget.ImageView;
 
 import com.android.systemui.R;
@@ -17,23 +18,34 @@
  */
 public class CarNavigationButton extends com.android.keyguard.AlphaOptimizedImageButton {
 
-    private static final float SELECTED_ALPHA = 1;
-    private static final float UNSELECTED_ALPHA = 0.7f;
-
+    private static final String TAG = "CarNavigationButton";
     private Context mContext;
-    private String mIntent = null;
-    private String mLongIntent = null;
-    private boolean mBroadcastIntent = false;
+    private String mIntent;
+    private String mLongIntent;
+    private boolean mBroadcastIntent;
     private boolean mSelected = false;
+    private float mSelectedAlpha = 1f;
+    private float mUnselectedAlpha = 1f;
+    private int mSelectedIconResourceId;
+    private int mIconResourceId;
 
 
     public CarNavigationButton(Context context, AttributeSet attrs) {
         super(context, attrs);
         mContext = context;
-        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CarNavigationButton);
+        TypedArray typedArray = context.obtainStyledAttributes(
+                attrs, R.styleable.CarNavigationButton);
         mIntent = typedArray.getString(R.styleable.CarNavigationButton_intent);
         mLongIntent = typedArray.getString(R.styleable.CarNavigationButton_longIntent);
         mBroadcastIntent = typedArray.getBoolean(R.styleable.CarNavigationButton_broadcast, false);
+        mSelectedAlpha = typedArray.getFloat(
+                R.styleable.CarNavigationButton_selectedAlpha, mSelectedAlpha);
+        mUnselectedAlpha = typedArray.getFloat(
+                R.styleable.CarNavigationButton_unselectedAlpha, mUnselectedAlpha);
+        mIconResourceId = typedArray.getResourceId(
+                com.android.internal.R.styleable.ImageView_src, 0);
+        mSelectedIconResourceId = typedArray.getResourceId(
+                R.styleable.CarNavigationButton_selectedIcon, mIconResourceId);
     }
 
 
@@ -45,17 +57,20 @@
     public void onFinishInflate() {
         super.onFinishInflate();
         setScaleType(ImageView.ScaleType.CENTER);
-        setAlpha(UNSELECTED_ALPHA);
+        setAlpha(mUnselectedAlpha);
         try {
             if (mIntent != null) {
                 final Intent intent = Intent.parseUri(mIntent, Intent.URI_INTENT_SCHEME);
-                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                 setOnClickListener(v -> {
-                    if (mBroadcastIntent) {
-                        mContext.sendBroadcast(intent);
-                        return;
+                    try {
+                        if (mBroadcastIntent) {
+                            mContext.sendBroadcast(intent);
+                            return;
+                        }
+                        mContext.startActivity(intent);
+                    } catch (Exception e) {
+                        Log.e(TAG, "Failed to launch intent", e);
                     }
-                    mContext.startActivity(intent);
                 });
             }
         } catch (URISyntaxException e) {
@@ -65,9 +80,13 @@
         try {
             if (mLongIntent != null) {
                 final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
-                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                 setOnLongClickListener(v -> {
-                    mContext.startActivity(intent);
+                    try {
+                        mContext.startActivity(intent);
+                    } catch (Exception e) {
+                        Log.e(TAG, "Failed to launch intent", e);
+                    }
+                    // consume event either way
                     return true;
                 });
             }
@@ -82,6 +101,7 @@
     public void setSelected(boolean selected) {
         super.setSelected(selected);
         mSelected = selected;
-        setAlpha(mSelected ? SELECTED_ALPHA : UNSELECTED_ALPHA);
+        setAlpha(mSelected ? mSelectedAlpha : mUnselectedAlpha);
+        setImageResource(mSelected ? mSelectedIconResourceId : mIconResourceId);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 3530e0b..008794c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -182,27 +182,6 @@
             // By default, the BatteryMeterView should not be visible. It will be toggled
             // when a device has connected by bluetooth.
             mBatteryMeterView.setVisibility(View.GONE);
-
-            ViewStub stub = fragment.getView().findViewById(R.id.connected_device_signals_stub);
-            View signalsView = stub.inflate();
-
-            // When a ViewStub if inflated, it does not respect the margins on the
-            // inflated view.
-            // As a result, manually add the ending margin.
-            ((LinearLayout.LayoutParams) signalsView.getLayoutParams()).setMarginEnd(
-                    mContext.getResources().getDimensionPixelOffset(
-                            R.dimen.status_bar_connected_device_signal_margin_end));
-
-            if (mConnectedDeviceSignalController != null) {
-                mConnectedDeviceSignalController.stopListening();
-            }
-            mConnectedDeviceSignalController = new ConnectedDeviceSignalController(mContext,
-                    signalsView);
-            mConnectedDeviceSignalController.startListening();
-
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "makeStatusBarView(). mBatteryMeterView: " + mBatteryMeterView);
-            }
         });
     }
 
@@ -439,8 +418,7 @@
                 Dependency.get(UserSwitcherController.class);
         if (userSwitcherController.useFullscreenUserSwitcher()) {
             mFullscreenUserSwitcher = new FullscreenUserSwitcher(this,
-                    userSwitcherController,
-                    mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub));
+                    mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub), mContext);
         } else {
             super.createUserSwitcher();
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index bc353f2..fb525f7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -18,14 +18,15 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.content.res.Resources;
+import android.content.Context;
 import android.view.View;
 import android.view.ViewStub;
 import android.widget.ProgressBar;
 
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import com.android.systemui.R;
 import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
 
 /**
  * Manages the fullscreen user switcher.
@@ -33,36 +34,25 @@
 public class FullscreenUserSwitcher {
     private final View mContainer;
     private final View mParent;
-    private final UserGridView mUserGridView;
-    private final UserSwitcherController mUserSwitcherController;
+    private final UserGridRecyclerView mUserGridView;
     private final ProgressBar mSwitchingUsers;
     private final int mShortAnimDuration;
 
     private boolean mShowing;
 
-    public FullscreenUserSwitcher(StatusBar statusBar,
-            UserSwitcherController userSwitcherController,
-            ViewStub containerStub) {
-        mUserSwitcherController = userSwitcherController;
+    public FullscreenUserSwitcher(StatusBar statusBar, ViewStub containerStub, Context context) {
         mParent = containerStub.inflate();
         mContainer = mParent.findViewById(R.id.container);
         mUserGridView = mContainer.findViewById(R.id.user_grid);
-        mUserGridView.init(statusBar, mUserSwitcherController, true /* overrideAlpha */);
-        mUserGridView.setUserSelectionListener(record -> {
-            if (!record.isCurrent) {
-                toggleSwitchInProgress(true);
-            }
-        });
+        mUserGridView.setStatusBar(statusBar);
+        GridLayoutManager layoutManager = new GridLayoutManager(context,
+                context.getResources().getInteger(R.integer.user_fullscreen_switcher_num_col));
+        mUserGridView.setLayoutManager(layoutManager);
+        mUserGridView.buildAdapter();
+        mUserGridView.setUserSelectionListener(record -> toggleSwitchInProgress(true));
 
-        PageIndicator pageIndicator = mContainer.findViewById(R.id.user_switcher_page_indicator);
-        pageIndicator.setupWithViewPager(mUserGridView);
-
-        Resources res = mContainer.getResources();
-        mShortAnimDuration = res.getInteger(android.R.integer.config_shortAnimTime);
-
-        mContainer.findViewById(R.id.start_driving).setOnClickListener(v -> {
-            automaticallySelectUser();
-        });
+        mShortAnimDuration = mContainer.getResources()
+            .getInteger(android.R.integer.config_shortAnimTime);
 
         mSwitchingUsers = mParent.findViewById(R.id.switching_users);
     }
@@ -115,10 +105,4 @@
         toggleSwitchInProgress(false);
         mParent.setVisibility(View.GONE);
     }
-
-    private void automaticallySelectUser() {
-        // TODO: Switch according to some policy. This implementation just tries to drop the
-        //       keyguard for the current user.
-        mUserGridView.showOfflineAuthUi();
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
new file mode 100644
index 0000000..e09a360
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -0,0 +1,360 @@
+/*
+ * 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.systemui.statusbar.car;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.drawable.GradientDrawable;
+import android.os.AsyncTask;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerView.ViewHolder;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.settingslib.users.UserManagerHelper;
+import com.android.systemui.R;
+import com.android.systemui.qs.car.CarQSFragment;
+import com.android.systemui.statusbar.phone.StatusBar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Displays a GridLayout with icons for the users in the system to allow switching between users.
+ * One of the uses of this is for the lock screen in auto.
+ */
+public class UserGridRecyclerView extends RecyclerView implements
+        UserManagerHelper.OnUsersUpdateListener {
+
+    private StatusBar mStatusBar;
+    private UserSelectionListener mUserSelectionListener;
+    private UserAdapter mAdapter;
+    private UserManagerHelper mUserManagerHelper;
+    private Context mContext;
+
+    public UserGridRecyclerView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        super.setHasFixedSize(true);
+        mContext = context;
+        mUserManagerHelper = new UserManagerHelper(mContext);
+    }
+
+    /**
+     * Register listener for any update to the users
+     */
+    @Override
+    public void onFinishInflate() {
+        mUserManagerHelper.registerOnUsersUpdateListener(this);
+    }
+
+    /**
+     * Unregisters listener checking for any change to the users
+     */
+    @Override
+    public void onDetachedFromWindow() {
+        mUserManagerHelper.unregisterOnUsersUpdateListener();
+    }
+
+    /**
+     * Initializes the adapter that populates the grid layout
+     *
+     * @return the adapter
+     */
+    public void buildAdapter() {
+        List<UserRecord> userRecords = createUserRecords(mUserManagerHelper
+                .getAllUsers());
+        mAdapter = new UserAdapter(mContext, userRecords);
+        super.setAdapter(mAdapter);
+    }
+
+    public void setStatusBar(@Nullable StatusBar statusBar) {
+        mStatusBar = statusBar;
+    }
+
+    private List<UserRecord> createUserRecords(List<UserInfo> userInfoList) {
+        List<UserRecord> userRecords = new ArrayList<>();
+        for (UserInfo userInfo : userInfoList) {
+            boolean isCurrent = false;
+            if (ActivityManager.getCurrentUser() == userInfo.id) {
+                isCurrent = true;
+            }
+            UserRecord record = new UserRecord(userInfo, false /* isGuest */,
+                    false /* isAddUser */, isCurrent);
+            userRecords.add(record);
+        }
+
+        // Add guest user record if the current user is not a guest
+        if (!mUserManagerHelper.isGuestUser()) {
+            userRecords.add(addGuestUserRecord());
+        }
+
+        // Add add user record if the current user can add users
+        if (mUserManagerHelper.canAddUsers()) {
+            userRecords.add(addUserRecord());
+        }
+
+        return userRecords;
+    }
+
+    /**
+     * Create guest user record
+     */
+    private UserRecord addGuestUserRecord() {
+        UserInfo userInfo = new UserInfo();
+        userInfo.name = mContext.getString(R.string.car_guest);
+        return new UserRecord(userInfo, true /* isGuest */,
+                false /* isAddUser */, false /* isCurrent */);
+    }
+
+    /**
+     * Create add user record
+     */
+    private UserRecord addUserRecord() {
+        UserInfo userInfo = new UserInfo();
+        userInfo.name = mContext.getString(R.string.car_add_user);
+        return new UserRecord(userInfo, false /* isGuest */,
+                true /* isAddUser */, false /* isCurrent */);
+    }
+
+    public void onUserSwitched(int newUserId) {
+        // Bring up security view after user switch is completed.
+        post(this::showOfflineAuthUi);
+    }
+
+    public void setUserSelectionListener(UserSelectionListener userSelectionListener) {
+        mUserSelectionListener = userSelectionListener;
+    }
+
+    void showOfflineAuthUi() {
+        // TODO: Show keyguard UI in-place.
+        if (mStatusBar != null) {
+            mStatusBar.executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
+                    true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
+        }
+    }
+
+    @Override
+    public void onUsersUpdate() {
+        mAdapter.clearUsers();
+        mAdapter.updateUsers(createUserRecords(mUserManagerHelper.getAllUsers()));
+        mAdapter.notifyDataSetChanged();
+    }
+
+    /**
+     * Adapter to populate the grid layout with the available user profiles
+     */
+    public final class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserAdapterViewHolder> {
+
+        private final Context mContext;
+        private List<UserRecord> mUsers;
+        private final int mPodImageAvatarWidth;
+        private final int mPodImageAvatarHeight;
+        private final Resources mRes;
+        private final String mGuestName;
+        private final String mNewUserName;
+
+        public UserAdapter(Context context, List<UserRecord> users) {
+            mRes = context.getResources();
+            mContext = context;
+            updateUsers(users);
+            mPodImageAvatarWidth = mRes.getDimensionPixelSize(
+                    R.dimen.car_fullscreen_user_pod_image_avatar_width);
+            mPodImageAvatarHeight = mRes.getDimensionPixelSize(
+                    R.dimen.car_fullscreen_user_pod_image_avatar_height);
+            mGuestName = mRes.getString(R.string.car_guest);
+            mNewUserName = mRes.getString(R.string.car_new_user);
+        }
+
+        public void clearUsers() {
+            mUsers.clear();
+        }
+
+        public void updateUsers(List<UserRecord> users) {
+            mUsers = users;
+        }
+
+        @Override
+        public UserAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            View view = LayoutInflater.from(mContext)
+                    .inflate(R.layout.car_fullscreen_user_pod, parent, false);
+            view.setAlpha(1f);
+            view.bringToFront();
+            return new UserAdapterViewHolder(view);
+        }
+
+        @Override
+        public void onBindViewHolder(UserAdapterViewHolder holder, int position) {
+            UserRecord userRecord = mUsers.get(position);
+            holder.mUserAvatarImageView.setImageBitmap(getDefaultUserIcon(userRecord));
+            holder.mUserNameTextView.setText(userRecord.mInfo.name);
+            holder.mView.setOnClickListener(v -> {
+                if (userRecord == null) {
+                    return;
+                }
+
+                // Notify the listener which user was selected
+                if (mUserSelectionListener != null) {
+                    mUserSelectionListener.onUserSelected(userRecord);
+                }
+
+                // If the user selects Guest, switch to Guest profile
+                if (userRecord.mIsGuest) {
+                    mUserManagerHelper.switchToGuest(mGuestName);
+                    return;
+                }
+
+                // If the user wants to add a user, start task to add new user
+                if (userRecord.mIsAddUser) {
+                    new AddNewUserTask().execute(mNewUserName);
+                    return;
+                }
+
+                // If the user doesn't want to be a guest or add a user, switch to the user selected
+                mUserManagerHelper.switchToUser(userRecord.mInfo);
+            });
+
+        }
+
+        private class AddNewUserTask extends AsyncTask<String, Void, UserInfo> {
+
+            @Override
+            protected UserInfo doInBackground(String... userNames) {
+                return mUserManagerHelper.createNewUser(userNames[0]);
+            }
+
+            @Override
+            protected void onPreExecute() {
+            }
+
+            @Override
+            protected void onPostExecute(UserInfo user) {
+                if (user != null) {
+                    mUserManagerHelper.switchToUser(user);
+                }
+            }
+        }
+
+        @Override
+        public int getItemCount() {
+            return mUsers.size();
+        }
+
+        /**
+         * Returns the default user icon.  This icon is a circle with a letter in it.  The letter is
+         * the first character in the username.
+         *
+         * @param record the profile of the user for which the icon should be created
+         */
+        private Bitmap getDefaultUserIcon(UserRecord record) {
+            CharSequence displayText;
+            boolean isAddUserText = false;
+            if (record.mIsAddUser) {
+                displayText = "+";
+                isAddUserText = true;
+            } else {
+                displayText = record.mInfo.name.subSequence(0, 1);
+            }
+            Bitmap out = Bitmap.createBitmap(mPodImageAvatarWidth, mPodImageAvatarHeight,
+                    Bitmap.Config.ARGB_8888);
+            Canvas canvas = new Canvas(out);
+
+            // Draw the circle background.
+            GradientDrawable shape = new GradientDrawable();
+            shape.setShape(GradientDrawable.RADIAL_GRADIENT);
+            shape.setGradientRadius(1.0f);
+            shape.setColor(mContext.getColor(R.color.car_user_switcher_no_user_image_bgcolor));
+            shape.setBounds(0, 0, mPodImageAvatarWidth, mPodImageAvatarHeight);
+            shape.draw(canvas);
+
+            // Draw the letter in the center.
+            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+            paint.setColor(mContext.getColor(R.color.car_user_switcher_no_user_image_fgcolor));
+            paint.setTextAlign(Align.CENTER);
+            if (isAddUserText) {
+                paint.setTextSize(mRes.getDimensionPixelSize(
+                        R.dimen.car_touch_target_size));
+            } else {
+                paint.setTextSize(mRes.getDimensionPixelSize(
+                        R.dimen.car_fullscreen_user_pod_icon_text_size));
+            }
+
+            Paint.FontMetricsInt metrics = paint.getFontMetricsInt();
+            // The Y coordinate is measured by taking half the height of the pod, but that would
+            // draw the character putting the bottom of the font in the middle of the pod.  To
+            // correct this, half the difference between the top and bottom distance metrics of the
+            // font gives the offset of the font.  Bottom is a positive value, top is negative, so
+            // the different is actually a sum.  The "half" operation is then factored out.
+            canvas.drawText(displayText.toString(), mPodImageAvatarWidth / 2,
+                    (mPodImageAvatarHeight - (metrics.bottom + metrics.top)) / 2, paint);
+
+            return out;
+        }
+
+        public class UserAdapterViewHolder extends RecyclerView.ViewHolder {
+
+            public ImageView mUserAvatarImageView;
+            public TextView mUserNameTextView;
+            public View mView;
+
+            public UserAdapterViewHolder(View view) {
+                super(view);
+                mView = view;
+                mUserAvatarImageView = (ImageView) view.findViewById(R.id.user_avatar);
+                mUserNameTextView = (TextView) view.findViewById(R.id.user_name);
+            }
+        }
+    }
+
+    /**
+     * Object wrapper class for the userInfo.  Use it to distinguish if a profile is a
+     * guest profile, add user profile, or a current user.
+     */
+    public static final class UserRecord {
+
+        public final UserInfo mInfo;
+        public final boolean mIsGuest;
+        public final boolean mIsAddUser;
+        public final boolean mIsCurrent;
+
+        public UserRecord(UserInfo userInfo, boolean isGuest, boolean isAddUser,
+                boolean isCurrent) {
+            mInfo = userInfo;
+            mIsGuest = isGuest;
+            mIsAddUser = isAddUser;
+            mIsCurrent = isCurrent;
+        }
+    }
+
+    /**
+     * Listener used to notify when a user has been selected
+     */
+    interface UserSelectionListener {
+
+        void onUserSelected(UserRecord record);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java
deleted file mode 100644
index 1bd820d..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.systemui.statusbar.car;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.support.v4.view.PagerAdapter;
-import android.support.v4.view.ViewPager;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.systemui.Dependency;
-import com.android.systemui.R;
-import com.android.systemui.qs.car.CarQSFragment;
-import com.android.systemui.statusbar.phone.StatusBar;
-import com.android.systemui.statusbar.policy.UserInfoController;
-import com.android.systemui.statusbar.policy.UserSwitcherController;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Vector;
-
-/**
- * Displays a ViewPager with icons for the users in the system to allow switching between users.
- * One of the uses of this is for the lock screen in auto.
- */
-public class UserGridView extends ViewPager implements
-        UserInfoController.OnUserInfoChangedListener {
-    private StatusBar mStatusBar;
-    private UserSwitcherController mUserSwitcherController;
-    private Adapter mAdapter;
-    private UserSelectionListener mUserSelectionListener;
-    private UserInfoController mUserInfoController;
-    private Vector mUserContainers;
-    private int mContainerWidth;
-    private boolean mOverrideAlpha;
-    private CarQSFragment.UserSwitchCallback mUserSwitchCallback;
-
-    public UserGridView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public void init(StatusBar statusBar, UserSwitcherController userSwitcherController,
-            boolean overrideAlpha) {
-        mStatusBar = statusBar;
-        mUserSwitcherController = userSwitcherController;
-        mAdapter = new Adapter(mUserSwitcherController);
-        mUserInfoController = Dependency.get(UserInfoController.class);
-        mOverrideAlpha = overrideAlpha;
-        // Whenever the container width changes, the containers must be refreshed. Instead of
-        // doing an initial refreshContainers() to populate the containers, this listener will
-        // refresh them on layout change because that affects how the users are split into
-        // containers. Furthermore, at this point, the container width is unknown, so
-        // refreshContainers() cannot populate any containers.
-        addOnLayoutChangeListener(
-                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
-                    int newWidth = Math.max(left - right, right - left);
-                    if (mContainerWidth != newWidth) {
-                        mContainerWidth = newWidth;
-                        refreshContainers();
-                    }
-                });
-    }
-
-    private void refreshContainers() {
-        mUserContainers = new Vector();
-
-        Context context = getContext();
-        LayoutInflater inflater = LayoutInflater.from(context);
-
-        for (int i = 0; i < mAdapter.getCount(); i++) {
-            ViewGroup pods = (ViewGroup) inflater.inflate(
-                    R.layout.car_fullscreen_user_pod_container, null);
-
-            int iconsPerPage = mAdapter.getIconsPerPage();
-            int limit = Math.min(mUserSwitcherController.getUsers().size(), (i + 1) * iconsPerPage);
-            for (int j = i * iconsPerPage; j < limit; j++) {
-                View v = mAdapter.makeUserPod(inflater, context, j, pods);
-                if (mOverrideAlpha) {
-                    v.setAlpha(1f);
-                }
-                pods.addView(v);
-                // This is hacky, but the dividers on the pod container LinearLayout don't seem
-                // to work for whatever reason.  Instead, set a right margin on the pod if it's not
-                // the right-most pod and there is more than one pod in the container.
-                if (i < limit - 1 && limit > 1) {
-                    ViewGroup.MarginLayoutParams params =
-                            (ViewGroup.MarginLayoutParams) v.getLayoutParams();
-                    params.setMargins(0, 0, getResources().getDimensionPixelSize(
-                            R.dimen.car_fullscreen_user_pod_margin_between), 0);
-                    v.setLayoutParams(params);
-                }
-            }
-            mUserContainers.add(pods);
-        }
-
-        mAdapter = new Adapter(mUserSwitcherController);
-        setAdapter(mAdapter);
-    }
-
-    @Override
-    public void onUserInfoChanged(String name, Drawable picture, String userAccount) {
-        refreshContainers();
-    }
-
-    public void setUserSwitchCallback(CarQSFragment.UserSwitchCallback callback) {
-        mUserSwitchCallback = callback;
-    }
-
-    public void onUserSwitched(int newUserId) {
-        // Bring up security view after user switch is completed.
-        post(this::showOfflineAuthUi);
-    }
-
-    public void setUserSelectionListener(UserSelectionListener userSelectionListener) {
-        mUserSelectionListener = userSelectionListener;
-    }
-
-    public void setListening(boolean listening) {
-        if (listening) {
-            mUserInfoController.addCallback(this);
-        } else {
-            mUserInfoController.removeCallback(this);
-        }
-    }
-
-    void showOfflineAuthUi() {
-        // TODO: Show keyguard UI in-place.
-        mStatusBar.executeRunnableDismissingKeyguard(null, null, true, true, true);
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        // Wrap content doesn't work in ViewPagers, so simulate the behavior in code.
-        int height = 0;
-        if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) {
-            height = MeasureSpec.getSize(heightMeasureSpec);
-        } else {
-            for (int i = 0; i < getChildCount(); i++) {
-                View child = getChildAt(i);
-                child.measure(widthMeasureSpec,
-                        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
-                height = Math.max(child.getMeasuredHeight(), height);
-            }
-
-            // Respect the AT_MOST request from parent.
-            if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) {
-                height = Math.min(MeasureSpec.getSize(heightMeasureSpec), height);
-            }
-        }
-        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-    }
-
-    /**
-     * This is a ViewPager.PagerAdapter which deletegates the work to a
-     * UserSwitcherController.BaseUserAdapter. Java doesn't support multiple inheritance so we have
-     * to use composition instead to achieve the same goal since both the base classes are abstract
-     * classes and not interfaces.
-     */
-    private final class Adapter extends PagerAdapter {
-        private final int mPodWidth;
-        private final int mPodMarginBetween;
-        private final int mPodImageAvatarWidth;
-        private final int mPodImageAvatarHeight;
-
-        private final WrappedBaseUserAdapter mUserAdapter;
-
-        public Adapter(UserSwitcherController controller) {
-            super();
-            mUserAdapter = new WrappedBaseUserAdapter(controller, this);
-
-            Resources res = getResources();
-            mPodWidth = res.getDimensionPixelSize(R.dimen.car_fullscreen_user_pod_width);
-            mPodMarginBetween = res.getDimensionPixelSize(
-                    R.dimen.car_fullscreen_user_pod_margin_between);
-            mPodImageAvatarWidth = res.getDimensionPixelSize(
-                    R.dimen.car_fullscreen_user_pod_image_avatar_width);
-            mPodImageAvatarHeight = res.getDimensionPixelSize(
-                    R.dimen.car_fullscreen_user_pod_image_avatar_height);
-        }
-
-        @Override
-        public void destroyItem(ViewGroup container, int position, Object object) {
-            container.removeView((View) object);
-        }
-
-        private int getIconsPerPage() {
-            // We need to know how many pods we need in this page. Each pod has its own width and
-            // a margin between them. We can then divide the measured width of the parent by the
-            // sum of pod width and margin to get the number of pods that will completely fit.
-            // There is one less margin than the number of pods (eg. for 5 pods, there are 4
-            // margins), so need to add the margin to the measured width to account for that.
-            return (mContainerWidth + mPodMarginBetween) /
-                    (mPodWidth + mPodMarginBetween);
-        }
-
-        @Override
-        public void finishUpdate(ViewGroup container) {
-            if (mUserSwitchCallback != null) {
-                mUserSwitchCallback.resetShowing();
-            }
-        }
-
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            if (position < mUserContainers.size()) {
-                container.addView((View) mUserContainers.get(position));
-                return mUserContainers.get(position);
-            } else {
-                return null;
-            }
-        }
-
-        /**
-         * Returns the default user icon.  This icon is a circle with a letter in it.  The letter is
-         * the first character in the username.
-         *
-         * @param userName the username of the user for which the icon is to be created
-         */
-        private Bitmap getDefaultUserIcon(CharSequence userName) {
-            CharSequence displayText = userName.subSequence(0, 1);
-            Bitmap out = Bitmap.createBitmap(mPodImageAvatarWidth, mPodImageAvatarHeight,
-                    Bitmap.Config.ARGB_8888);
-            Canvas canvas = new Canvas(out);
-
-            // Draw the circle background.
-            GradientDrawable shape = new GradientDrawable();
-            shape.setShape(GradientDrawable.RADIAL_GRADIENT);
-            shape.setGradientRadius(1.0f);
-            shape.setColor(getContext().getColor(R.color.car_user_switcher_no_user_image_bgcolor));
-            shape.setBounds(0, 0, mPodImageAvatarWidth, mPodImageAvatarHeight);
-            shape.draw(canvas);
-
-            // Draw the letter in the center.
-            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
-            paint.setColor(getContext().getColor(R.color.car_user_switcher_no_user_image_fgcolor));
-            paint.setTextAlign(Align.CENTER);
-            paint.setTextSize(getResources().getDimensionPixelSize(
-                    R.dimen.car_fullscreen_user_pod_icon_text_size));
-            Paint.FontMetricsInt metrics = paint.getFontMetricsInt();
-            // The Y coordinate is measured by taking half the height of the pod, but that would
-            // draw the character putting the bottom of the font in the middle of the pod.  To
-            // correct this, half the difference between the top and bottom distance metrics of the
-            // font gives the offset of the font.  Bottom is a positive value, top is negative, so
-            // the different is actually a sum.  The "half" operation is then factored out.
-            canvas.drawText(displayText.toString(), mPodImageAvatarWidth / 2,
-                    (mPodImageAvatarHeight - (metrics.bottom + metrics.top)) / 2, paint);
-
-            return out;
-        }
-
-        private View makeUserPod(LayoutInflater inflater, Context context,
-                int position, ViewGroup parent) {
-            final UserSwitcherController.UserRecord record = mUserAdapter.getItem(position);
-            View view = inflater.inflate(R.layout.car_fullscreen_user_pod, parent, false);
-
-            TextView nameView = view.findViewById(R.id.user_name);
-            if (record != null) {
-                nameView.setText(mUserAdapter.getName(context, record));
-                view.setActivated(record.isCurrent);
-            } else {
-                nameView.setText(context.getString(R.string.unknown_user_label));
-            }
-
-            ImageView iconView = (ImageView) view.findViewById(R.id.user_avatar);
-            if (record == null || (record.picture == null && !record.isAddUser)) {
-                iconView.setImageBitmap(getDefaultUserIcon(nameView.getText()));
-            } else if (record.isAddUser) {
-                Drawable icon = context.getDrawable(R.drawable.ic_add_circle_qs);
-                icon.setTint(context.getColor(R.color.car_user_switcher_no_user_image_bgcolor));
-                iconView.setImageDrawable(icon);
-            } else {
-                iconView.setImageBitmap(record.picture);
-            }
-
-            iconView.setOnClickListener(v -> {
-                if (record == null) {
-                    return;
-                }
-
-                if (mUserSelectionListener != null) {
-                    mUserSelectionListener.onUserSelected(record);
-                }
-
-                if (record.isCurrent) {
-                    showOfflineAuthUi();
-                } else {
-                    mUserSwitcherController.switchTo(record);
-                }
-            });
-
-            return view;
-        }
-
-        @Override
-        public int getCount() {
-            int iconsPerPage = getIconsPerPage();
-            if (iconsPerPage == 0) {
-                return 0;
-            }
-            return (int) Math.ceil((double) mUserAdapter.getCount() / getIconsPerPage());
-        }
-
-        public void refresh() {
-            mUserAdapter.refresh();
-        }
-
-        @Override
-        public boolean isViewFromObject(View view, Object object) {
-            return view == object;
-        }
-    }
-
-    private final class WrappedBaseUserAdapter extends UserSwitcherController.BaseUserAdapter {
-        private final Adapter mContainer;
-
-        public WrappedBaseUserAdapter(UserSwitcherController controller, Adapter container) {
-            super(controller);
-            mContainer = container;
-        }
-
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            throw new UnsupportedOperationException("unused");
-        }
-
-        @Override
-        public void notifyDataSetChanged() {
-            super.notifyDataSetChanged();
-            mContainer.notifyDataSetChanged();
-        }
-    }
-
-    interface UserSelectionListener {
-        void onUserSelected(UserSwitcherController.UserRecord record);
-    };
-}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
index 3bbfe3c..b8bce95 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
@@ -238,6 +238,7 @@
                 t.deferTransactionUntilSurface(app.leash, systemUiSurface,
                         systemUiSurface.getNextFrameNumber());
             }
+            t.setEarlyWakeup();
             t.apply();
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
index 75b31c5..9fcb090 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
@@ -14,6 +14,7 @@
 
 package com.android.systemui.statusbar.phone;
 
+import static android.app.StatusBarManager.DISABLE_CLOCK;
 import static android.app.StatusBarManager.DISABLE_NOTIFICATION_ICONS;
 import static android.app.StatusBarManager.DISABLE_SYSTEM_INFO;
 
@@ -96,6 +97,7 @@
         mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
         mClockView = mStatusBar.findViewById(R.id.clock);
         showSystemIconArea(false);
+        showClock(false);
         initEmergencyCryptkeeperText();
         initOperatorName();
     }
@@ -163,6 +165,13 @@
                 showNotificationIconArea(animate);
             }
         }
+        if ((diff1 & DISABLE_CLOCK) != 0) {
+            if ((state1 & DISABLE_CLOCK) != 0) {
+                hideClock(animate);
+            } else {
+                showClock(animate);
+            }
+        }
     }
 
     protected int adjustDisableFlags(int state) {
@@ -171,6 +180,7 @@
                 && shouldHideNotificationIcons()) {
             state |= DISABLE_NOTIFICATION_ICONS;
             state |= DISABLE_SYSTEM_INFO;
+            state |= DISABLE_CLOCK;
         }
         if (mNetworkController != null && EncryptionHelper.IS_DATA_ENCRYPTED) {
             if (mNetworkController.hasEmergencyCryptKeeperText()) {
@@ -195,11 +205,17 @@
 
     public void hideSystemIconArea(boolean animate) {
         animateHide(mSystemIconArea, animate);
-        animateHide(mClockView, animate);
     }
 
     public void showSystemIconArea(boolean animate) {
         animateShow(mSystemIconArea, animate);
+    }
+
+    public void hideClock(boolean animate) {
+        animateHide(mClockView, animate);
+    }
+
+    public void showClock(boolean animate) {
         animateShow(mClockView, animate);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index df2b817..60a3474 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -159,6 +159,11 @@
      */
     public void onFullyShown() {
         mFalsingManager.onBouncerShown();
+        if (mKeyguardView == null) {
+            Log.wtf(TAG, "onFullyShown when view was null");
+        } else {
+            mKeyguardView.onResume();
+        }
     }
 
     /**
@@ -180,7 +185,6 @@
         @Override
         public void run() {
             mRoot.setVisibility(View.VISIBLE);
-            mKeyguardView.onResume();
             showPromptReason(mBouncerPromptReason);
             final CharSequence customMessage = mCallback.consumeCustomMessage();
             if (customMessage != null) {
@@ -296,7 +300,7 @@
 
     public boolean isShowing() {
         return (mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE))
-                && mExpansion == 0;
+                && mExpansion == 0 && !isAnimatingAway();
     }
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 3d7067d..1fb1ddd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -99,6 +99,11 @@
     private int mBurnInPreventionOffsetY;
 
     /**
+     * Clock vertical padding when pulsing.
+     */
+    private int mPulsingPadding;
+
+    /**
      * Doze/AOD transition amount.
      */
     private float mDarkAmount;
@@ -109,9 +114,9 @@
     private boolean mCurrentlySecure;
 
     /**
-     * If notification panel view currently has a touch.
+     * Dozing and receiving a notification (AOD notification.)
      */
-    private boolean mTracking;
+    private boolean mPulsing;
 
     /**
      * Distance in pixels between the top of the screen and the first view of the bouncer.
@@ -130,11 +135,13 @@
                 R.dimen.burn_in_prevention_offset_x);
         mBurnInPreventionOffsetY = res.getDimensionPixelSize(
                 R.dimen.burn_in_prevention_offset_y);
+        mPulsingPadding = res.getDimensionPixelSize(
+                R.dimen.widget_pulsing_bottom_padding);
     }
 
     public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
             float expandedHeight, float maxPanelHeight, int parentHeight, int keyguardStatusHeight,
-            float dark, boolean secure, boolean tracking, int bouncerTop) {
+            float dark, boolean secure, boolean pulsing, int bouncerTop) {
         mMinTopMargin = minTopMargin + mContainerTopPadding;
         mMaxShadeBottom = maxShadeBottom;
         mNotificationStackHeight = notificationStackHeight;
@@ -144,7 +151,7 @@
         mKeyguardStatusHeight = keyguardStatusHeight;
         mDarkAmount = dark;
         mCurrentlySecure = secure;
-        mTracking = tracking;
+        mPulsing = pulsing;
         mBouncerTop = bouncerTop;
     }
 
@@ -152,7 +159,7 @@
         final int y = getClockY();
         result.clockY = y;
         result.clockAlpha = getClockAlpha(y);
-        result.stackScrollerPadding = y + mKeyguardStatusHeight;
+        result.stackScrollerPadding = y + (mPulsing ? 0 : mKeyguardStatusHeight);
         result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount);
     }
 
@@ -194,9 +201,13 @@
 
     private int getClockY() {
         // Dark: Align the bottom edge of the clock at about half of the screen:
-        final float clockYDark = getMaxClockY() + burnInPreventionOffsetY();
-        final float clockYRegular = getExpandedClockPosition();
-        final boolean hasEnoughSpace = mMinTopMargin + mKeyguardStatusHeight < mBouncerTop;
+        float clockYDark = getMaxClockY() + burnInPreventionOffsetY();
+        if (mPulsing) {
+            clockYDark -= mPulsingPadding;
+        }
+
+        float clockYRegular = getExpandedClockPosition();
+        boolean hasEnoughSpace = mMinTopMargin + mKeyguardStatusHeight < mBouncerTop;
         float clockYTarget = mCurrentlySecure && hasEnoughSpace ?
                 mMinTopMargin : -mKeyguardStatusHeight;
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java
new file mode 100644
index 0000000..759a0d1
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java
@@ -0,0 +1,29 @@
+/*
+ * 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.systemui.statusbar.phone;
+
+import android.annotation.Nullable;
+
+import com.android.keyguard.KeyguardHostView.OnDismissAction;
+
+
+/** Executes actions that require the screen to be unlocked. */
+public interface KeyguardDismissHandler {
+    /** Executes an action that requres the screen to be unlocked. */
+    void dismissKeyguardThenExecute(
+            OnDismissAction action, @Nullable Runnable cancelAction, boolean afterKeyguardGone);
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java
new file mode 100644
index 0000000..c38b0b6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java
@@ -0,0 +1,53 @@
+/*
+ * 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.systemui.statusbar.phone;
+
+import android.util.Log;
+
+import com.android.keyguard.KeyguardHostView.OnDismissAction;
+
+/**
+ * Executes actions that require the screen to be unlocked. Delegates the actual handling to an
+ * implementation passed via {@link #setDismissHandler}.
+ */
+public class KeyguardDismissUtil implements KeyguardDismissHandler {
+    private static final String TAG = "KeyguardDismissUtil";
+
+    private volatile KeyguardDismissHandler mDismissHandler;
+
+    /** Sets the actual {@link DismissHandler} implementation. */
+    public void setDismissHandler(KeyguardDismissHandler dismissHandler) {
+        mDismissHandler = dismissHandler;
+    }
+
+    /**
+     * Executes an action that requres the screen to be unlocked.
+     *
+     * <p>Must be called after {@link #setDismissHandler}.
+     */
+    @Override
+    public void dismissKeyguardThenExecute(
+            OnDismissAction action, Runnable cancelAction, boolean afterKeyguardGone) {
+        KeyguardDismissHandler dismissHandler = mDismissHandler;
+        if (dismissHandler == null) {
+            Log.wtf(TAG, "KeyguardDismissHandler not set.");
+            action.onDismiss();
+            return;
+        }
+        dismissHandler.dismissKeyguardThenExecute(action, cancelAction, afterKeyguardGone);
+    }
+}
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 84582b0..db2139d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -39,7 +39,6 @@
 import android.os.Handler;
 import android.os.Message;
 import android.os.SystemProperties;
-import android.os.VibrationEffect;
 import android.support.annotation.ColorInt;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -69,7 +68,6 @@
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.NavigationBarCompat;
 import com.android.systemui.stackdivider.Divider;
-import com.android.systemui.statusbar.VibratorHelper;
 import com.android.systemui.statusbar.policy.DeadZone;
 import com.android.systemui.statusbar.policy.KeyButtonDrawable;
 import com.android.systemui.statusbar.policy.TintedKeyButtonDrawable;
@@ -124,7 +122,7 @@
     private TintedKeyButtonDrawable mRotateSuggestionIcon;
 
     private GestureHelper mGestureHelper;
-    private DeadZone mDeadZone;
+    private final DeadZone mDeadZone;
     private final NavigationBarTransitions mBarTransitions;
     private final OverviewProxyService mOverviewProxyService;
 
@@ -150,7 +148,6 @@
     private Divider mDivider;
     private RecentsOnboarding mRecentsOnboarding;
     private NotificationPanelView mPanelView;
-    private final VibratorHelper mVibratorHelper;
 
     private int mRotateBtnStyle = R.style.RotateButtonCCWStart90;
 
@@ -246,7 +243,6 @@
 
         mOverviewProxyService = Dependency.get(OverviewProxyService.class);
         mRecentsOnboarding = new RecentsOnboarding(context, mOverviewProxyService);
-        mVibratorHelper = Dependency.get(VibratorHelper.class);
 
         mConfiguration = new Configuration();
         mConfiguration.updateFrom(context.getResources().getConfiguration());
@@ -263,6 +259,7 @@
                 new ButtonDispatcher(R.id.accessibility_button));
         mButtonDispatchers.put(R.id.rotate_suggestion,
                 new ButtonDispatcher(R.id.rotate_suggestion));
+        mDeadZone = new DeadZone(this);
     }
 
     public BarTransitions getBarTransitions() {
@@ -297,6 +294,10 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent event) {
+        if (mDeadZone.onTouchEvent(event)) {
+            // Consumed the touch event
+            return true;
+        }
         switch (event.getActionMasked()) {
             case ACTION_DOWN:
                 int x = (int) event.getX();
@@ -309,9 +310,6 @@
                 } else if (mRecentsButtonBounds.contains(x, y)) {
                     mDownHitTarget = HIT_TARGET_OVERVIEW;
                 }
-
-                // Vibrate tick whenever down occurs on navigation bar
-                mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
                 break;
         }
         return mGestureHelper.onInterceptTouchEvent(event);
@@ -319,6 +317,10 @@
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
+        if (mDeadZone.onTouchEvent(event)) {
+            // Consumed the touch event
+            return true;
+        }
         if (mGestureHelper.onTouchEvent(event)) {
             return true;
         }
@@ -389,7 +391,7 @@
 
     public boolean isQuickScrubEnabled() {
         return SystemProperties.getBoolean("persist.quickstep.scrub.enabled", true)
-                && mOverviewProxyService.getProxy() != null && isOverviewEnabled()
+                && mOverviewProxyService.isEnabled() && isOverviewEnabled()
                 && ((mOverviewProxyService.getInteractionFlags() & FLAG_DISABLE_QUICK_SCRUB) == 0);
     }
 
@@ -424,13 +426,16 @@
             mRecentIcon = getDrawable(ctx,
                     R.drawable.ic_sysbar_recent, R.drawable.ic_sysbar_recent_dark);
             mMenuIcon = getDrawable(ctx, R.drawable.ic_sysbar_menu, R.drawable.ic_sysbar_menu_dark);
-            mAccessibilityIcon = getDrawable(ctx, R.drawable.ic_sysbar_accessibility_button,
-                    R.drawable.ic_sysbar_accessibility_button_dark);
 
             int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme);
             int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
             Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme);
             Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
+
+            mAccessibilityIcon = getDrawable(darkContext, lightContext,
+                    R.drawable.ic_sysbar_accessibility_button,
+                    R.drawable.ic_sysbar_accessibility_button);
+
             mImeIcon = getDrawable(darkContext, lightContext,
                     R.drawable.ic_ime_switcher_default, R.drawable.ic_ime_switcher_default);
 
@@ -584,7 +589,7 @@
         // recents buttons when disconnected from launcher service in screen pinning mode,
         // as they are used for exiting.
         final boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
-        if (mOverviewProxyService.getProxy() != null) {
+        if (mOverviewProxyService.isEnabled()) {
             // Use interaction flags to show/hide navigation buttons but will be shown if required
             // to exit screen pinning.
             final int flags = mOverviewProxyService.getInteractionFlags();
@@ -815,6 +820,7 @@
     @Override
     protected void onDraw(Canvas canvas) {
         mGestureHelper.onDraw(canvas);
+        mDeadZone.onDraw(canvas);
         super.onDraw(canvas);
     }
 
@@ -886,10 +892,8 @@
     public void reorient() {
         updateCurrentView();
 
-        mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);
-
         ((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone);
-        mDeadZone.setDisplayRotation(mCurrentRotation);
+        mDeadZone.onConfigurationChanged(mCurrentRotation);
 
         // force the low profile & disabled states into compliance
         mBarTransitions.init();
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 b6a11f7..6bc19ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -125,7 +125,14 @@
         } else {
             mTintArea.set(tintArea);
         }
-        mIconTint = iconTint;
+        if (mNotificationIconArea != null) {
+            if (DarkIconDispatcher.isInArea(tintArea, mNotificationIconArea)) {
+                mIconTint = iconTint;
+            }
+        } else {
+            mIconTint = iconTint;
+        }
+
         applyNotificationIconsTint();
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 5517434..8c257fe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -151,6 +151,7 @@
     private ArrayMap<String, ArrayList<StatusBarIcon>> mReplacingIcons;
     // Keep track of the last visible icon so collapsed container can report on its location
     private IconState mLastVisibleIconState;
+    private IconState mFirstVisibleIconState;
     private float mVisualOverflowStart;
     // Keep track of overflow in range [0, 3]
     private int mNumDots;
@@ -159,7 +160,6 @@
     private int[] mAbsolutePosition = new int[2];
     private View mIsolatedIconForAnimation;
 
-
     public NotificationIconContainer(Context context, AttributeSet attrs) {
         super(context, attrs);
         initDimens();
@@ -192,10 +192,15 @@
             paint.setColor(Color.BLUE);
             canvas.drawLine(end, 0, end, height, paint);
 
-            paint.setColor(Color.BLACK);
+            paint.setColor(Color.GREEN);
             int lastIcon = (int) mLastVisibleIconState.xTranslation;
             canvas.drawLine(lastIcon, 0, lastIcon, height, paint);
 
+            if (mFirstVisibleIconState != null) {
+                int firstIcon = (int) mFirstVisibleIconState.xTranslation;
+                canvas.drawLine(firstIcon, 0, firstIcon, height, paint);
+            }
+
             paint.setColor(Color.RED);
             canvas.drawLine(mVisualOverflowStart, 0, mVisualOverflowStart, height, paint);
 
@@ -210,6 +215,7 @@
         super.onConfigurationChanged(newConfig);
         initDimens();
     }
+
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         float centerY = getHeight() / 2.0f;
@@ -364,11 +370,15 @@
         float layoutEnd = getLayoutEnd();
         float overflowStart = getMaxOverflowStart();
         mVisualOverflowStart = 0;
+        mFirstVisibleIconState = null;
         boolean hasAmbient = mSpeedBumpIndex != -1 && mSpeedBumpIndex < getChildCount();
         for (int i = 0; i < childCount; i++) {
             View view = getChildAt(i);
             IconState iconState = mIconStates.get(view);
             iconState.xTranslation = translationX;
+            if (mFirstVisibleIconState == null) {
+                mFirstVisibleIconState = iconState;
+            }
             boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
                     && iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
             boolean noOverflowAfter = i == childCount - 1;
@@ -417,10 +427,16 @@
         } else if (childCount > 0) {
             View lastChild = getChildAt(childCount - 1);
             mLastVisibleIconState = mIconStates.get(lastChild);
+            mFirstVisibleIconState = mIconStates.get(getChildAt(0));
         }
         boolean center = mDark;
         if (center && translationX < getLayoutEnd()) {
-            float delta = (getLayoutEnd() - translationX) / 2;
+            float initialTranslation =
+                    mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation;
+            float contentWidth = getFinalTranslationX() - initialTranslation;
+            float availableSpace = getLayoutEnd() - getActualPaddingStart();
+            float delta = (availableSpace - contentWidth) / 2;
+
             if (firstOverflowIndex != -1) {
                 // If we have an overflow, only count those half for centering because the dots
                 // don't have a lot of visual weight.
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 27ca0d1..351633b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -238,6 +238,7 @@
     private boolean mIsFullWidth;
     private float mDarkAmount;
     private float mDarkAmountTarget;
+    private boolean mPulsing;
     private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
     private boolean mNoVisibleNotifications = true;
     private ValueAnimator mDarkAnimator;
@@ -477,7 +478,7 @@
                     mKeyguardStatusView.getHeight(),
                     mDarkAmount,
                     mStatusBar.isKeyguardCurrentlySecure(),
-                    mTracking,
+                    mPulsing,
                     mBouncerTop);
             mClockPositionAlgorithm.run(mClockPositionResult);
             if (animate || mClockAnimator != null) {
@@ -659,6 +660,14 @@
         expand(true /* animate */);
     }
 
+    public void expandWithoutQs() {
+        if (isQsExpanded()) {
+            flingSettings(0 /* velocity */, false /* expand */);
+        } else {
+            expand(true /* animate */);
+        }
+    }
+
     @Override
     public void fling(float vel, boolean expand) {
         GestureRecorder gr = ((PhoneStatusBarView) mBar).mBar.getGestureRecorder();
@@ -2681,14 +2690,8 @@
         positionClockAndNotifications();
     }
 
-    public void setNoVisibleNotifications(boolean noNotifications) {
-        mNoVisibleNotifications = noNotifications;
-        if (mQs != null) {
-            mQs.setHasNotifications(!noNotifications);
-        }
-    }
-
     public void setPulsing(boolean pulsing) {
+        mPulsing = pulsing;
         mKeyguardStatusView.setPulsing(pulsing);
         positionClockAndNotifications();
         mNotificationStackScroller.setPulsing(pulsing, mKeyguardStatusView.getLocationOnScreen()[1]
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 04cb620..304a499 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -488,7 +488,7 @@
                 mUpdateFlingVelocity = vel;
             }
         } else if (mPanelClosedOnDown && !mHeadsUpManager.hasPinnedHeadsUp() && !mTracking
-                && !mStatusBar.isBouncerShowing()) {
+                && !mStatusBar.isBouncerShowing() && !mStatusBar.isKeyguardFadingAway()) {
             long timePassed = SystemClock.uptimeMillis() - mDownTime;
             if (timePassed < ViewConfiguration.getLongPressTimeout()) {
                 // Lets show the user that he can actually expand the panel
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
index 12bdfc6..a7d5aca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -43,10 +43,9 @@
     }
 
     public void init() {
-        mLeftSide = mView.findViewById(R.id.notification_icon_area);
+        mLeftSide = mView.findViewById(R.id.status_bar_left_side);
         mStatusIcons = mView.findViewById(R.id.statusIcons);
         mBattery = mView.findViewById(R.id.battery);
-        mClock = mView.findViewById(R.id.clock);
         applyModeBackground(-1, getMode(), false /*animate*/);
         applyMode(getMode(), false /*animate*/);
     }
@@ -89,8 +88,7 @@
             anims.playTogether(
                     animateTransitionTo(mLeftSide, newAlpha),
                     animateTransitionTo(mStatusIcons, newAlpha),
-                    animateTransitionTo(mBattery, newAlphaBC),
-                    animateTransitionTo(mClock, newAlphaBC)
+                    animateTransitionTo(mBattery, newAlphaBC)
                     );
             if (isLightsOut(mode)) {
                 anims.setDuration(LIGHTS_OUT_DURATION);
@@ -101,7 +99,6 @@
             mLeftSide.setAlpha(newAlpha);
             mStatusIcons.setAlpha(newAlpha);
             mBattery.setAlpha(newAlphaBC);
-            mClock.setAlpha(newAlphaBC);
         }
     }
 }
\ No newline at end of file
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 a51cd93..d3790d4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStepController.java
@@ -51,6 +51,10 @@
 import static com.android.systemui.OverviewProxyService.DEBUG_OVERVIEW_PROXY;
 import static com.android.systemui.OverviewProxyService.TAG_OPS;
 import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_HOME;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_DRAG_SLOP_PX;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_TOUCH_SLOP_PX;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_DRAG_SLOP_PX;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_TOUCH_SLOP_PX;
 
 /**
  * Class to detect gestures on the navigation bar and implement quick scrub.
@@ -69,6 +73,7 @@
     private float mTranslation;
     private int mTouchDownX;
     private int mTouchDownY;
+    private boolean mDragScrubActive;
     private boolean mDragPositive;
     private boolean mIsVertical;
     private boolean mIsRTL;
@@ -82,7 +87,6 @@
     private final Interpolator mQuickScrubEndInterpolator = new DecelerateInterpolator();
     private final Rect mTrackRect = new Rect();
     private final Paint mTrackPaint = new Paint();
-    private final int mScrollTouchSlop;
     private final OverviewProxyService mOverviewEventSender;
     private final int mTrackThickness;
     private final int mTrackPadding;
@@ -115,6 +119,7 @@
         @Override
         public void onAnimationEnd(Animator animation) {
             mQuickScrubActive = false;
+            mDragScrubActive = false;
             mTranslation = 0;
             mQuickScrubEndAnimator.setCurrentPlayTime(mQuickScrubEndAnimator.getDuration());
             mHomeButtonView = null;
@@ -123,7 +128,6 @@
 
     public QuickStepController(Context context) {
         mContext = context;
-        mScrollTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
         mOverviewEventSender = Dependency.get(OverviewProxyService.class);
         mTrackThickness = getDimensionPixelSize(mContext, R.dimen.nav_quick_scrub_track_thickness);
         mTrackPadding = getDimensionPixelSize(mContext, R.dimen.nav_quick_scrub_track_edge_padding);
@@ -168,8 +172,8 @@
     }
 
     private boolean handleTouchEvent(MotionEvent event) {
-        if (!mNavigationBarView.isQuickScrubEnabled()
-                && !mNavigationBarView.isQuickStepSwipeUpEnabled()) {
+        if (mOverviewEventSender.getProxy() == null || (!mNavigationBarView.isQuickScrubEnabled()
+                && !mNavigationBarView.isQuickStepSwipeUpEnabled())) {
             mNavigationBarView.getHomeButton().setDelayTouchFeedback(false /* delay */);
             return false;
         }
@@ -177,8 +181,8 @@
 
         final ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
         final boolean homePressed = mNavigationBarView.getDownHitTarget() == HIT_TARGET_HOME;
-        int action = event.getAction();
-        switch (action & MotionEvent.ACTION_MASK) {
+        int action = event.getActionMasked();
+        switch (action) {
             case MotionEvent.ACTION_DOWN: {
                 int x = (int) event.getX();
                 int y = (int) event.getY();
@@ -199,28 +203,29 @@
                 break;
             }
             case MotionEvent.ACTION_MOVE: {
-                if (mQuickStepStarted || !mAllowGestureDetection){
+                if (mQuickStepStarted || !mAllowGestureDetection || mHomeButtonView == null){
                     break;
                 }
                 int x = (int) event.getX();
                 int y = (int) event.getY();
                 int xDiff = Math.abs(x - mTouchDownX);
                 int yDiff = Math.abs(y - mTouchDownY);
-                boolean exceededTouchSlopX = xDiff > mScrollTouchSlop && xDiff > yDiff;
-                boolean exceededTouchSlopY = yDiff > mScrollTouchSlop && yDiff > xDiff;
-                boolean exceededTouchSlop, exceededPerpendicularTouchSlop;
+
+                boolean exceededScrubTouchSlop, exceededSwipeUpTouchSlop, exceededScrubDragSlop;
                 int pos, touchDown, offset, trackSize;
 
                 if (mIsVertical) {
-                    exceededTouchSlop = exceededTouchSlopY;
-                    exceededPerpendicularTouchSlop = exceededTouchSlopX;
+                    exceededScrubTouchSlop = yDiff > QUICK_STEP_TOUCH_SLOP_PX && yDiff > xDiff;
+                    exceededSwipeUpTouchSlop = xDiff > QUICK_STEP_DRAG_SLOP_PX && xDiff > yDiff;
+                    exceededScrubDragSlop = yDiff > QUICK_SCRUB_DRAG_SLOP_PX && yDiff > xDiff;
                     pos = y;
                     touchDown = mTouchDownY;
                     offset = pos - mTrackRect.top;
                     trackSize = mTrackRect.height();
                 } else {
-                    exceededTouchSlop = exceededTouchSlopX;
-                    exceededPerpendicularTouchSlop = exceededTouchSlopY;
+                    exceededScrubTouchSlop = xDiff > QUICK_STEP_TOUCH_SLOP_PX && xDiff > yDiff;
+                    exceededSwipeUpTouchSlop = yDiff > QUICK_SCRUB_TOUCH_SLOP_PX && yDiff > xDiff;
+                    exceededScrubDragSlop = xDiff > QUICK_SCRUB_DRAG_SLOP_PX && xDiff > yDiff;
                     pos = x;
                     touchDown = mTouchDownX;
                     offset = pos - mTrackRect.left;
@@ -228,7 +233,7 @@
                 }
                 // Decide to start quickstep if dragging away from the navigation bar, otherwise in
                 // the parallel direction, decide to start quickscrub. Only one may run.
-                if (!mQuickScrubActive && exceededPerpendicularTouchSlop) {
+                if (!mQuickScrubActive && exceededSwipeUpTouchSlop) {
                     if (mNavigationBarView.isQuickStepSwipeUpEnabled()) {
                         startQuickStep(event);
                     }
@@ -244,29 +249,38 @@
                     offset -= mIsVertical ? mTrackRect.height() : mTrackRect.width();
                 }
 
-                // Control the button movement
-                if (!mQuickScrubActive && exceededTouchSlop) {
-                    boolean allowDrag = !mDragPositive
-                            ? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
-                    if (allowDrag) {
+                final boolean allowDrag = !mDragPositive
+                        ? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
+                if (allowDrag) {
+                    // Passing the drag slop is for visual feedback and will not initiate anything
+                    if (!mDragScrubActive && exceededScrubDragSlop) {
                         mDownOffset = offset;
+                        mDragScrubActive = true;
+                    }
+
+                    // Passing the drag slop then touch slop will start quick step
+                    if (!mQuickScrubActive && exceededScrubTouchSlop) {
                         homeButton.abortCurrentGesture();
                         startQuickScrub();
                     }
                 }
-                if (mQuickScrubActive && (mDragPositive && offset >= 0
+
+                if ((mQuickScrubActive || mDragScrubActive) && (mDragPositive && offset >= 0
                         || !mDragPositive && offset <= 0)) {
-                    float scrubFraction = Utilities.clamp(Math.abs(offset) * 1f / trackSize, 0, 1);
                     mTranslation = !mDragPositive
-                        ? Utilities.clamp(offset - mDownOffset, -trackSize, 0)
-                        : Utilities.clamp(offset - mDownOffset, 0, trackSize);
-                    try {
-                        mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
-                        if (DEBUG_OVERVIEW_PROXY) {
-                            Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
+                            ? Utilities.clamp(offset - mDownOffset, -trackSize, 0)
+                            : Utilities.clamp(offset - mDownOffset, 0, trackSize);
+                    if (mQuickScrubActive) {
+                        float scrubFraction =
+                                Utilities.clamp(Math.abs(offset) * 1f / trackSize, 0, 1);
+                        try {
+                            mOverviewEventSender.getProxy().onQuickScrubProgress(scrubFraction);
+                            if (DEBUG_OVERVIEW_PROXY) {
+                                Log.d(TAG_OPS, "Quick Scrub Progress:" + scrubFraction);
+                            }
+                        } catch (RemoteException e) {
+                            Log.e(TAG, "Failed to send progress of quick scrub.", e);
                         }
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Failed to send progress of quick scrub.", e);
                     }
                     if (mIsVertical) {
                         mHomeButtonView.setTranslationY(mTranslation);
@@ -283,7 +297,9 @@
         }
 
         // Proxy motion events to launcher if not handled by quick scrub
-        if (!mQuickScrubActive && mAllowGestureDetection) {
+        // Proxy motion events up/cancel that would be sent after long press on any nav button
+        if (!mQuickScrubActive && (mAllowGestureDetection || action == MotionEvent.ACTION_CANCEL
+                || action == MotionEvent.ACTION_UP)) {
             proxyMotionEvents(event);
         }
         return mQuickScrubActive || mQuickStepStarted;
@@ -370,10 +386,14 @@
         mOverviewEventSender.notifyQuickStepStarted();
         mNavigationBarView.getHomeButton().abortCurrentGesture();
         mHandler.removeCallbacksAndMessages(null);
+
+        if (mDragScrubActive) {
+            animateEnd();
+        }
     }
 
     private void startQuickScrub() {
-        if (!mQuickScrubActive) {
+        if (!mQuickScrubActive && mDragScrubActive) {
             mQuickScrubActive = true;
             mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light);
             mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark);
@@ -391,15 +411,17 @@
     }
 
     private void endQuickScrub(boolean animate) {
-        if (mQuickScrubActive) {
+        if (mQuickScrubActive || mDragScrubActive) {
             animateEnd();
-            try {
-                mOverviewEventSender.getProxy().onQuickScrubEnd();
-                if (DEBUG_OVERVIEW_PROXY) {
-                    Log.d(TAG_OPS, "Quick Scrub End");
+            if (mQuickScrubActive) {
+                try {
+                    mOverviewEventSender.getProxy().onQuickScrubEnd();
+                    if (DEBUG_OVERVIEW_PROXY) {
+                        Log.d(TAG_OPS, "Quick Scrub End");
+                    }
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Failed to send end of quick scrub.", e);
                 }
-            } catch (RemoteException e) {
-                Log.e(TAG, "Failed to send end of quick scrub.", e);
             }
         }
         if (mHomeButtonView != null && !animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 2c025b5..cc143bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -68,8 +68,14 @@
     private static final String TAG = "ScrimController";
     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
+    /**
+     * General scrim animation duration.
+     */
     public static final long ANIMATION_DURATION = 220;
-
+    /**
+     * Longer duration, currently only used when going to AOD.
+     */
+    public static final long ANIMATION_DURATION_LONG = 1000;
     /**
      * When both scrims have 0 alpha.
      */
@@ -85,7 +91,7 @@
     /**
      * Default alpha value for most scrims.
      */
-    public static final float GRADIENT_SCRIM_ALPHA = 0.45f;
+    public static final float GRADIENT_SCRIM_ALPHA = 0.70f;
     /**
      * A scrim varies its opacity based on a busyness factor, for example
      * how many notifications are currently visible.
@@ -105,7 +111,6 @@
     private final Context mContext;
     protected final ScrimView mScrimBehind;
     protected final ScrimView mScrimInFront;
-    private final LightBarController mLightBarController;
     private final UnlockMethodCache mUnlockMethodCache;
     private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
     private final DozeParameters mDozeParameters;
@@ -139,6 +144,8 @@
     private int mCurrentBehindTint;
     private boolean mWallpaperVisibilityTimedOut;
     private int mScrimsVisibility;
+    private final Consumer<GradientColors> mScrimInFrontColorListener;
+    private final Consumer<Float> mScrimBehindAlphaListener;
     private final Consumer<Integer> mScrimVisibleListener;
     private boolean mBlankScreen;
     private boolean mScreenBlankingCallbackCalled;
@@ -155,17 +162,20 @@
     private boolean mWakeLockHeld;
     private boolean mKeyguardOccluded;
 
-    public ScrimController(LightBarController lightBarController, ScrimView scrimBehind,
-            ScrimView scrimInFront, Consumer<Integer> scrimVisibleListener,
-            DozeParameters dozeParameters, AlarmManager alarmManager) {
+    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
+            Consumer<Float> scrimBehindAlphaListener,
+            Consumer<GradientColors> scrimInFrontColorListener,
+            Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
+            AlarmManager alarmManager) {
         mScrimBehind = scrimBehind;
         mScrimInFront = scrimInFront;
+        mScrimBehindAlphaListener = scrimBehindAlphaListener;
+        mScrimInFrontColorListener = scrimInFrontColorListener;
         mScrimVisibleListener = scrimVisibleListener;
         mContext = scrimBehind.getContext();
         mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
         mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
         mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
-        mLightBarController = lightBarController;
         mScrimBehindAlphaResValue = mContext.getResources().getFloat(R.dimen.scrim_behind_alpha);
         mTimeTicker = new AlarmTimeout(alarmManager, this::onHideWallpaperTimeout,
                 "hide_aod_wallpaper", new Handler());
@@ -190,6 +200,9 @@
         }
         mState = ScrimState.UNINITIALIZED;
 
+        mScrimBehind.setDefaultFocusHighlightEnabled(false);
+        mScrimInFront.setDefaultFocusHighlightEnabled(false);
+
         updateScrims();
     }
 
@@ -361,6 +374,8 @@
 
             setOrAdaptCurrentAnimation(mScrimBehind);
             setOrAdaptCurrentAnimation(mScrimInFront);
+
+            mScrimBehindAlphaListener.accept(mScrimBehind.getViewAlpha());
         }
     }
 
@@ -389,7 +404,7 @@
             // Darken scrim as you pull down the shade when unlocked
             float behindFraction = getInterpolatedFraction();
             behindFraction = (float) Math.pow(behindFraction, 0.8f);
-            mCurrentBehindAlpha = behindFraction * mScrimBehindAlphaKeyguard;
+            mCurrentBehindAlpha = behindFraction * GRADIENT_SCRIM_ALPHA_BUSY;
             mCurrentInFrontAlpha = 0;
         } else if (mState == ScrimState.KEYGUARD) {
             // Either darken of make the scrim transparent when you
@@ -469,7 +484,7 @@
             float minOpacity = ColorUtils.calculateMinimumBackgroundAlpha(textColor, mainColor,
                     4.5f /* minimumContrast */) / 255f;
             mScrimBehindAlpha = Math.max(mScrimBehindAlphaResValue, minOpacity);
-            mLightBarController.setScrimColor(mScrimInFront.getColors());
+            mScrimInFrontColorListener.accept(mScrimInFront.getColors());
         }
 
         // We want to override the back scrim opacity for the AOD state
@@ -528,8 +543,8 @@
         if (alpha == 0f) {
             scrim.setClickable(false);
         } else {
-            // Eat touch events (unless dozing).
-            scrim.setClickable(!mState.isLowPowerState());
+            // Eat touch events (unless dozing or pulsing).
+            scrim.setClickable(mState != ScrimState.AOD && mState != ScrimState.PULSING);
         }
         updateScrim(scrim, alpha);
     }
@@ -696,9 +711,8 @@
             }
         }
 
-        // TODO factor mLightBarController out of this class
         if (scrim == mScrimBehind) {
-            mLightBarController.setScrimAlpha(alpha);
+            mScrimBehindAlphaListener.accept(alpha);
         }
 
         final boolean wantsAlphaUpdate = alpha != currentAlpha;
@@ -807,7 +821,7 @@
     @VisibleForTesting
     protected WakeLock createWakeLock() {
          return new DelayedWakeLock(getHandler(),
-                WakeLock.createPartial(mContext, "Doze"));
+                WakeLock.createPartial(mContext, "Scrims"));
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
index f4b6c38..bbdaa99 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -111,9 +111,10 @@
             mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f;
             mCurrentInFrontTint = Color.BLACK;
             mCurrentBehindTint = Color.BLACK;
-            // DisplayPowerManager will blank the screen for us, we just need
-            // to set our state.
-            mAnimateChange = !mDisplayRequiresBlanking;
+            mAnimationDuration = ScrimController.ANIMATION_DURATION_LONG;
+            // DisplayPowerManager may blank the screen for us,
+            // in this case we just need to set our state.
+            mAnimateChange = mDozeParameters.shouldControlScreenOff();
         }
 
         @Override
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 750d2a5..4b2bc45 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -213,6 +213,7 @@
 import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.phone.UnlockMethodCache.OnUnlockMethodChangedListener;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
 import com.android.systemui.statusbar.policy.BrightnessMirrorController;
@@ -915,8 +916,14 @@
 
         ScrimView scrimBehind = mStatusBarWindow.findViewById(R.id.scrim_behind);
         ScrimView scrimInFront = mStatusBarWindow.findViewById(R.id.scrim_in_front);
-        mScrimController = SystemUIFactory.getInstance().createScrimController(mLightBarController,
+        mScrimController = SystemUIFactory.getInstance().createScrimController(
                 scrimBehind, scrimInFront, mLockscreenWallpaper,
+                scrimBehindAlpha -> {
+                    mLightBarController.setScrimAlpha(scrimBehindAlpha);
+                },
+                scrimInFrontColor -> {
+                    mLightBarController.setScrimColor(scrimInFrontColor);
+                },
                 scrimsVisible -> {
                     if (mStatusBarWindowManager != null) {
                         mStatusBarWindowManager.setScrimsVisibility(scrimsVisible);
@@ -1300,6 +1307,8 @@
 
         mKeyguardViewMediatorCallback = keyguardViewMediator.getViewMediatorCallback();
         mLightBarController.setFingerprintUnlockController(mFingerprintUnlockController);
+        Dependency.get(KeyguardDismissUtil.class).setDismissHandler(
+                this::dismissKeyguardThenExecute);
         Trace.endSection();
     }
 
@@ -1425,11 +1434,15 @@
     }
 
     public void addQsTile(ComponentName tile) {
-        mQSPanel.getHost().addTile(tile);
+        if (mQSPanel != null && mQSPanel.getHost() != null) {
+            mQSPanel.getHost().addTile(tile);
+        }
     }
 
     public void remQsTile(ComponentName tile) {
-        mQSPanel.getHost().removeTile(tile);
+        if (mQSPanel != null && mQSPanel.getHost() != null) {
+            mQSPanel.getHost().removeTile(tile);
+        }
     }
 
     public void clickTile(ComponentName tile) {
@@ -1439,7 +1452,8 @@
     @VisibleForTesting
     protected void updateFooter() {
         boolean showFooterView = mState != StatusBarState.KEYGUARD
-                && mEntryManager.getNotificationData().getActiveNotifications().size() != 0;
+                && mEntryManager.getNotificationData().getActiveNotifications().size() != 0
+                && !mRemoteInputManager.getController().isRemoteInputActive();
         boolean showDismissView = mClearAllEnabled && mState != StatusBarState.KEYGUARD
                 && hasActiveClearableNotifications();
 
@@ -2043,11 +2057,19 @@
     }
 
     /**
+     * Decides if the status bar (clock + notifications + signal cluster) should be visible
+     * or not when showing the bouncer.
+     *
+     * We want to hide it when:
+     * • User swipes up on the keyguard
+     * • Locked activity that doesn't show a status bar requests the bouncer
+     *
      * @param animate should the change of the icons be animated.
      */
     private void updateHideIconsForBouncer(boolean animate) {
-        boolean shouldHideIconsForBouncer = !mPanelExpanded && mTopHidesStatusBar && mIsOccluded
-                && (mBouncerShowing || mStatusBarWindowHidden);
+        boolean hideBecauseApp = mTopHidesStatusBar && mIsOccluded;
+        boolean hideBecauseKeyguard = !mPanelExpanded && !mIsOccluded && mBouncerShowing;
+        boolean shouldHideIconsForBouncer = hideBecauseApp || hideBecauseKeyguard;
         if (mHideIconsForBouncer != shouldHideIconsForBouncer) {
             mHideIconsForBouncer = shouldHideIconsForBouncer;
             if (!shouldHideIconsForBouncer && mBouncerWasShowingWhenHidden) {
@@ -2286,7 +2308,7 @@
             return ;
         }
 
-        mNotificationPanel.expand(true /* animate */);
+        mNotificationPanel.expandWithoutQs();
 
         if (false) postStartTracing();
     }
@@ -2811,6 +2833,7 @@
                             boolean remoteInputActive) {
                         mHeadsUpManager.setRemoteInputActive(entry, remoteInputActive);
                         entry.row.notifyHeightChanged(true /* needsAnimation */);
+                        updateFooter();
                     }
                     public void lockScrollTo(NotificationData.Entry entry) {
                         mStackScroller.lockScrollTo(entry.row);
@@ -3884,7 +3907,11 @@
     }
 
     public boolean onBackPressed() {
-        if (mStatusBarKeyguardViewManager.onBackPressed()) {
+        boolean isScrimmedBouncer = mScrimController.getState() == ScrimState.BOUNCER_SCRIMMED;
+        if (mStatusBarKeyguardViewManager.onBackPressed(isScrimmedBouncer /* hideImmediately */)) {
+            if (!isScrimmedBouncer) {
+                mNotificationPanel.expandWithoutQs();
+            }
             return true;
         }
         if (mNotificationPanel.isQsExpanded()) {
@@ -3915,7 +3942,8 @@
     }
 
     private void showBouncerIfKeyguard() {
-        if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
+        if ((mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)
+                && !mKeyguardViewMediator.isHiding()) {
             showBouncer(true /* animated */);
         }
     }
@@ -4979,6 +5007,14 @@
 
     @Override
     public void onNotificationClicked(StatusBarNotification sbn, ExpandableNotificationRow row) {
+        RemoteInputController controller = mRemoteInputManager.getController();
+        if (controller.isRemoteInputActive(row.getEntry())
+                && !TextUtils.isEmpty(row.getActiveRemoteInputText())) {
+            // We have an active remote input typed and the user clicked on the notification.
+            // this was probably unintentional, so we're closing the edit text instead.
+            controller.closeRemoteInputs();
+            return;
+        }
         Notification notification = sbn.getNotification();
         final PendingIntent intent = notification.contentIntent != null
                 ? notification.contentIntent
@@ -5042,12 +5078,7 @@
                     Intent fillInIntent = null;
                     Entry entry = row.getEntry();
                     CharSequence remoteInputText = null;
-                    RemoteInputController controller = mRemoteInputManager.getController();
-                    if (controller.isRemoteInputActive(entry)) {
-                        remoteInputText = row.getActiveRemoteInputText();
-                    }
-                    if (TextUtils.isEmpty(remoteInputText)
-                            && !TextUtils.isEmpty(entry.remoteInputText)) {
+                    if (!TextUtils.isEmpty(entry.remoteInputText)) {
                         remoteInputText = entry.remoteInputText;
                     }
                     if (!TextUtils.isEmpty(remoteInputText)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
index 510af03..b4e7575 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconControllerImpl.java
@@ -306,17 +306,6 @@
         mIconGroups.forEach(l -> l.onSetIconHolder(viewIndex, holder));
     }
 
-    /**
-     * For mobile essentially (an array of holders in one slot)
-     */
-    private void handleSet(int slotIndex, List<StatusBarIconHolder> holders) {
-        for (StatusBarIconHolder holder : holders) {
-            int viewIndex = getViewIndex(slotIndex, holder.getTag());
-            mIconLogger.onIconVisibility(getSlotName(slotIndex), holder.isVisible());
-            mIconGroups.forEach(l -> l.onSetIconHolder(viewIndex, holder));
-        }
-    }
-
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println(TAG + " state:");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 6b6ea10..670c68f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -89,7 +89,6 @@
     protected boolean mFirstUpdate = true;
     protected boolean mLastShowing;
     protected boolean mLastOccluded;
-    private boolean mLastTracking;
     private boolean mLastBouncerShowing;
     private boolean mLastBouncerDismissible;
     protected boolean mLastRemoteInputActive;
@@ -152,28 +151,19 @@
         // • The user quickly taps on the display and we show "swipe up to unlock."
         // • Keyguard will be dismissed by an action. a.k.a: FLAG_DISMISS_KEYGUARD_ACTIVITY
         // • Full-screen user switcher is displayed.
-        final boolean noLongerTracking = mLastTracking != tracking && !tracking;
         if (mOccluded || mNotificationPanelView.isUnlockHintRunning()
                 || mBouncer.willDismissWithAction()
                 || mStatusBar.isFullScreenUserSwitcherState()) {
             mBouncer.setExpansion(0);
         } else if (mShowing && mStatusBar.isKeyguardCurrentlySecure() && !mDozing) {
             mBouncer.setExpansion(expansion);
-            if (expansion == 1) {
-                mBouncer.onFullyHidden();
-            } else if (!mBouncer.isShowing() && !mBouncer.isAnimatingAway()) {
+            if (expansion != 1 && tracking && !mBouncer.isShowing()
+                    && !mBouncer.isAnimatingAway()) {
                 mBouncer.show(false /* resetSecuritySelection */, false /* animated */);
-            } else if (noLongerTracking) {
-                // Notify that falsing manager should stop its session when user stops touching,
-                // even before the animation ends, to guarantee that we're not recording sensitive
-                // data.
-                mBouncer.onFullyShown();
-            }
-            if (expansion == 0 || expansion == 1) {
+            } else if (expansion == 0 || expansion == 1) {
                 updateStates();
             }
         }
-        mLastTracking = tracking;
     }
 
     /**
@@ -522,12 +512,15 @@
     /**
      * Notifies this manager that the back button has been pressed.
      *
+     * @param hideImmediately Hide bouncer when {@code true}, keep it around otherwise.
+     *                        Non-scrimmed bouncers have a special animation tied to the expansion
+     *                        of the notification panel.
      * @return whether the back press has been handled
      */
-    public boolean onBackPressed() {
+    public boolean onBackPressed(boolean hideImmediately) {
         if (mBouncer.isShowing()) {
             mStatusBar.endAffordanceLaunch();
-            reset(true /* hideBouncerWhenShowing */);
+            reset(hideImmediately);
             return true;
         }
         return false;
@@ -595,6 +588,11 @@
         if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
             mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
             mStatusBar.setBouncerShowing(bouncerShowing);
+            if (bouncerShowing) {
+                mBouncer.onFullyShown();
+            } else {
+                mBouncer.onFullyHidden();
+            }
         }
 
         KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
index c5a3a0d..94ac4f62 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java
@@ -414,7 +414,7 @@
 
         @Override public String toString() {
             return "MobileIconState(subId=" + subId + ", strengthId=" + strengthId + ", roaming="
-                    + roaming + ", visible=" + visible + ")";
+                    + roaming + ", typeId=" + typeId + ", visible=" + visible + ")";
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 378dad7..6a8d3a5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -69,6 +69,10 @@
         setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
     }
 
+    public void setNeutralButton(int resId, OnClickListener onClick) {
+        setButton(BUTTON_NEUTRAL, mContext.getString(resId), onClick);
+    }
+
     public static void setShowForAllUsers(Dialog dialog, boolean show) {
         if (show) {
             dialog.getWindow().getAttributes().privateFlags |=
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
index 4c92d01..9aa8044 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
@@ -16,9 +16,6 @@
 
 package com.android.systemui.statusbar.policy;
 
-import libcore.icu.LocaleData;
-
-import android.app.ActivityManager;
 import android.app.StatusBarManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -40,11 +37,13 @@
 import android.view.View;
 import android.widget.TextView;
 
+import com.android.settingslib.Utils;
 import com.android.systemui.DemoMode;
 import com.android.systemui.Dependency;
 import com.android.systemui.FontSizeUtils;
 import com.android.systemui.R;
 import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.settings.CurrentUserTracker;
 import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.phone.StatusBarIconController;
 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
@@ -52,6 +51,8 @@
 import com.android.systemui.tuner.TunerService;
 import com.android.systemui.tuner.TunerService.Tunable;
 
+import libcore.icu.LocaleData;
+
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Locale;
@@ -65,6 +66,9 @@
 
     public static final String CLOCK_SECONDS = "clock_seconds";
 
+    private final CurrentUserTracker mCurrentUserTracker;
+    private int mCurrentUserId;
+
     private boolean mClockVisibleByPolicy = true;
     private boolean mClockVisibleByUser = true;
 
@@ -84,6 +88,17 @@
     private boolean mShowSeconds;
     private Handler mSecondsHandler;
 
+    /**
+     * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings
+     * for text.
+     */
+    private boolean mUseWallpaperTextColor;
+
+    /**
+     * Color to be set on this {@link TextView}, when wallpaperTextColor is <b>not</b> utilized.
+     */
+    private int mNonAdaptedColor;
+
     public Clock(Context context) {
         this(context, null);
     }
@@ -101,9 +116,16 @@
         try {
             mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_GONE);
             mShowDark = a.getBoolean(R.styleable.Clock_showDark, true);
+            mNonAdaptedColor = getCurrentTextColor();
         } finally {
             a.recycle();
         }
+        mCurrentUserTracker = new CurrentUserTracker(context) {
+            @Override
+            public void onUserSwitched(int newUserId) {
+                mCurrentUserId = newUserId;
+            }
+        };
     }
 
     @Override
@@ -128,6 +150,8 @@
             if (mShowDark) {
                 Dependency.get(DarkIconDispatcher.class).addDarkReceiver(this);
             }
+            mCurrentUserTracker.startTracking();
+            mCurrentUserId = mCurrentUserTracker.getCurrentUserId();
         }
 
         // NOTE: It's safe to do these after registering the receiver since the receiver always runs
@@ -153,6 +177,7 @@
             if (mShowDark) {
                 Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(this);
             }
+            mCurrentUserTracker.stopTracking();
         }
     }
 
@@ -227,7 +252,10 @@
 
     @Override
     public void onDarkChanged(Rect area, float darkIntensity, int tint) {
-        setTextColor(DarkIconDispatcher.getTint(area, this, tint));
+        mNonAdaptedColor = DarkIconDispatcher.getTint(area, this, tint);
+        if (!mUseWallpaperTextColor) {
+            setTextColor(mNonAdaptedColor);
+        }
     }
 
     @Override
@@ -242,6 +270,25 @@
                 0);
     }
 
+    /**
+     * Sets whether the clock uses the wallpaperTextColor. If we're not using it, we'll revert back
+     * to dark-mode-based/tinted colors.
+     *
+     * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for text color
+     */
+    public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) {
+        if (shouldUseWallpaperTextColor == mUseWallpaperTextColor) {
+            return;
+        }
+        mUseWallpaperTextColor = shouldUseWallpaperTextColor;
+
+        if (mUseWallpaperTextColor) {
+            setTextColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor));
+        } else {
+            setTextColor(mNonAdaptedColor);
+        }
+    }
+
     private void updateShowSeconds() {
         if (mShowSeconds) {
             // Wait until we have a display to start trying to show seconds.
@@ -267,7 +314,7 @@
 
     private final CharSequence getSmallTime() {
         Context context = getContext();
-        boolean is24 = DateFormat.is24HourFormat(context, ActivityManager.getCurrentUser());
+        boolean is24 = DateFormat.is24HourFormat(context, mCurrentUserId);
         LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
 
         final char MAGIC1 = '\uEF00';
@@ -357,8 +404,7 @@
             } else if (hhmm != null && hhmm.length() == 4) {
                 int hh = Integer.parseInt(hhmm.substring(0, 2));
                 int mm = Integer.parseInt(hhmm.substring(2));
-                boolean is24 = DateFormat.is24HourFormat(
-                        getContext(), ActivityManager.getCurrentUser());
+                boolean is24 = DateFormat.is24HourFormat(getContext(), mCurrentUserId);
                 if (is24) {
                     mCalendar.set(Calendar.HOUR_OF_DAY, hh);
                 } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
index 74a30fa..ef630c7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
@@ -27,6 +27,7 @@
 import android.util.AttributeSet;
 import android.widget.TextView;
 
+import com.android.settingslib.Utils;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 
@@ -42,6 +43,17 @@
     private String mLastText;
     private String mDatePattern;
 
+    /**
+     * Whether we should use colors that adapt based on wallpaper/the scrim behind quick settings
+     * for text.
+     */
+    private boolean mUseWallpaperTextColor;
+
+    /**
+     * Color to be set on this {@link TextView}, when wallpaperTextColor is <b>not</b> utilized.
+     */
+    private int mNonAdaptedTextColor;
+
     private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -62,6 +74,7 @@
 
     public DateView(Context context, AttributeSet attrs) {
         super(context, attrs);
+        mNonAdaptedTextColor = getCurrentTextColor();
         TypedArray a = context.getTheme().obtainStyledAttributes(
                 attrs,
                 R.styleable.DateView,
@@ -117,6 +130,25 @@
         }
     }
 
+    /**
+     * Sets whether the date view uses the wallpaperTextColor. If we're not using it, we'll revert
+     * back to dark-mode-based/tinted colors.
+     *
+     * @param shouldUseWallpaperTextColor whether we should use wallpaperTextColor for text color
+     */
+    public void useWallpaperTextColor(boolean shouldUseWallpaperTextColor) {
+        if (shouldUseWallpaperTextColor == mUseWallpaperTextColor) {
+            return;
+        }
+        mUseWallpaperTextColor = shouldUseWallpaperTextColor;
+
+        if (mUseWallpaperTextColor) {
+            setTextColor(Utils.getColorAttr(mContext, R.attr.wallpaperTextColor));
+        } else {
+            setTextColor(mNonAdaptedTextColor);
+        }
+    }
+
     public void setDatePattern(String pattern) {
         if (TextUtils.equals(pattern, mDatePattern)) {
             return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
index 06040e2..4a11754 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java
@@ -17,18 +17,16 @@
 package com.android.systemui.statusbar.policy;
 
 import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
+import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.os.SystemClock;
-import android.util.AttributeSet;
 import android.util.Slog;
 import android.view.MotionEvent;
 import android.view.Surface;
-import android.view.View;
 
 import com.android.systemui.R;
 import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.statusbar.phone.NavigationBarView;
 import com.android.systemui.statusbar.phone.StatusBar;
 
 /**
@@ -38,7 +36,7 @@
  * outside the navigation bar (since this is when accidental taps are more likely), then contracts
  * back over time (since a later tap might be intended for the top of the bar).
  */
-public class DeadZone extends View {
+public class DeadZone {
     public static final String TAG = "DeadZone";
 
     public static final boolean DEBUG = false;
@@ -47,6 +45,7 @@
 
     private static final boolean CHATTY = true; // print to logcat when we eat a click
     private final StatusBar mStatusBar;
+    private final NavigationBarView mNavigationBarView;
 
     private boolean mShouldFlash;
     private float mFlashFrac = 0f;
@@ -67,31 +66,11 @@
         }
     };
 
-    public DeadZone(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public DeadZone(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs);
-
-        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DeadZone,
-                defStyle, 0);
-
-        mHold = a.getInteger(R.styleable.DeadZone_holdTime, 0);
-        mDecay = a.getInteger(R.styleable.DeadZone_decayTime, 0);
-
-        mSizeMin = a.getDimensionPixelSize(R.styleable.DeadZone_minSize, 0);
-        mSizeMax = a.getDimensionPixelSize(R.styleable.DeadZone_maxSize, 0);
-
-        int index = a.getInt(R.styleable.DeadZone_orientation, -1);
-        mVertical = (index == VERTICAL);
-
-        if (DEBUG)
-            Slog.v(TAG, this + " size=[" + mSizeMin + "-" + mSizeMax + "] hold=" + mHold
-                    + (mVertical ? " vertical" : " horizontal"));
-
-        setFlashOnTouchCapture(context.getResources().getBoolean(R.bool.config_dead_zone_flash));
-        mStatusBar = SysUiServiceProvider.getComponent(context, StatusBar.class);
+    public DeadZone(NavigationBarView view) {
+        mNavigationBarView = view;
+        mStatusBar = SysUiServiceProvider.getComponent(mNavigationBarView.getContext(),
+                StatusBar.class);
+        onConfigurationChanged(HORIZONTAL);
     }
 
     static float lerp(float a, float b, float f) {
@@ -112,11 +91,29 @@
     public void setFlashOnTouchCapture(boolean dbg) {
         mShouldFlash = dbg;
         mFlashFrac = 0f;
-        postInvalidate();
+        mNavigationBarView.postInvalidate();
+    }
+
+    public void onConfigurationChanged(int rotation) {
+        mDisplayRotation = rotation;
+
+        final Resources res = mNavigationBarView.getResources();
+        mHold = res.getInteger(R.integer.navigation_bar_deadzone_hold);
+        mDecay = res.getInteger(R.integer.navigation_bar_deadzone_decay);
+
+        mSizeMin = res.getDimensionPixelSize(R.dimen.navigation_bar_deadzone_size);
+        mSizeMax = res.getDimensionPixelSize(R.dimen.navigation_bar_deadzone_size_max);
+        int index = res.getInteger(R.integer.navigation_bar_deadzone_orientation);
+        mVertical = (index == VERTICAL);
+
+        if (DEBUG) {
+            Slog.v(TAG, this + " size=[" + mSizeMin + "-" + mSizeMax + "] hold=" + mHold
+                    + (mVertical ? " vertical" : " horizontal"));
+        }
+        setFlashOnTouchCapture(res.getBoolean(R.bool.config_dead_zone_flash));
     }
 
     // I made you a touch event...
-    @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (DEBUG) {
             Slog.v(TAG, this + " onTouch: " + MotionEvent.actionToString(event.getAction()));
@@ -143,7 +140,7 @@
             final boolean consumeEvent;
             if (mVertical) {
                 if (mDisplayRotation == Surface.ROTATION_270) {
-                    consumeEvent = event.getX() > getWidth() - size;
+                    consumeEvent = event.getX() > mNavigationBarView.getWidth() - size;
                 } else {
                     consumeEvent = event.getX() < size;
                 }
@@ -155,8 +152,8 @@
                     Slog.v(TAG, "consuming errant click: (" + event.getX() + "," + event.getY() + ")");
                 }
                 if (mShouldFlash) {
-                    post(mDebugFlash);
-                    postInvalidate();
+                    mNavigationBarView.post(mDebugFlash);
+                    mNavigationBarView.postInvalidate();
                 }
                 return true; // ...but I eated it
             }
@@ -168,19 +165,18 @@
         mLastPokeTime = event.getEventTime();
         if (DEBUG)
             Slog.v(TAG, "poked! size=" + getSize(mLastPokeTime));
-        if (mShouldFlash) postInvalidate();
+        if (mShouldFlash) mNavigationBarView.postInvalidate();
     }
 
     public void setFlash(float f) {
         mFlashFrac = f;
-        postInvalidate();
+        mNavigationBarView.postInvalidate();
     }
 
     public float getFlash() {
         return mFlashFrac;
     }
 
-    @Override
     public void onDraw(Canvas can) {
         if (!mShouldFlash || mFlashFrac <= 0f) {
             return;
@@ -202,10 +198,6 @@
 
         if (DEBUG && size > mSizeMin)
             // crazy aggressive redrawing here, for debugging only
-            postInvalidateDelayed(100);
-    }
-
-    public void setDisplayRotation(int rotation) {
-        mDisplayRotation = rotation;
+            mNavigationBarView.postInvalidateDelayed(100);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index 5d7e938..1b02e15 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -28,7 +28,6 @@
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.SystemClock;
-import android.os.VibrationEffect;
 import android.util.AttributeSet;
 import android.util.TypedValue;
 import android.view.HapticFeedbackConstants;
@@ -50,10 +49,12 @@
 import com.android.systemui.R;
 import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider.ButtonInterface;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.statusbar.VibratorHelper;
 
+import static android.view.KeyEvent.KEYCODE_HOME;
 import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
 import static android.view.accessibility.AccessibilityNodeInfo.ACTION_LONG_CLICK;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_SCRUB_TOUCH_SLOP_PX;
+import static com.android.systemui.shared.system.NavigationBarCompat.QUICK_STEP_TOUCH_SLOP_PX;
 
 public class KeyButtonView extends ImageView implements ButtonInterface {
     private static final String TAG = KeyButtonView.class.getSimpleName();
@@ -62,9 +63,9 @@
     private int mContentDescriptionRes;
     private long mDownTime;
     private int mCode;
-    private int mTouchSlop;
     private int mTouchDownX;
     private int mTouchDownY;
+    private boolean mIsVertical;
     private boolean mSupportsLongpress = true;
     private AudioManager mAudioManager;
     private boolean mGestureAborted;
@@ -72,7 +73,6 @@
     private OnClickListener mOnClickListener;
     private final KeyButtonRipple mRipple;
     private final OverviewProxyService mOverviewProxyService;
-    private final VibratorHelper mVibratorHelper;
     private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
 
     private final Runnable mCheckLongPress = new Runnable() {
@@ -115,11 +115,9 @@
         a.recycle();
 
         setClickable(true);
-        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
         mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
 
         mRipple = new KeyButtonRipple(context, this);
-        mVibratorHelper = Dependency.get(VibratorHelper.class);
         mOverviewProxyService = Dependency.get(OverviewProxyService.class);
         setBackground(mRipple);
     }
@@ -200,7 +198,7 @@
     }
 
     public boolean onTouchEvent(MotionEvent ev) {
-        final boolean isProxyConnected = mOverviewProxyService.getProxy() != null;
+        final boolean showSwipeUI = mOverviewProxyService.shouldShowSwipeUpUI();
         final int action = ev.getAction();
         int x, y;
         if (action == MotionEvent.ACTION_DOWN) {
@@ -226,7 +224,7 @@
                     // Provide the same haptic feedback that the system offers for virtual keys.
                     performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
                 }
-                if (!isProxyConnected) {
+                if (!showSwipeUI) {
                     playSoundEffect(SoundEffectConstants.CLICK);
                 }
                 removeCallbacks(mCheckLongPress);
@@ -235,8 +233,11 @@
             case MotionEvent.ACTION_MOVE:
                 x = (int)ev.getRawX();
                 y = (int)ev.getRawY();
-                boolean exceededTouchSlopX = Math.abs(x - mTouchDownX) > mTouchSlop;
-                boolean exceededTouchSlopY = Math.abs(y - mTouchDownY) > mTouchSlop;
+
+                boolean exceededTouchSlopX = Math.abs(x - mTouchDownX) >
+                        (mIsVertical ? QUICK_SCRUB_TOUCH_SLOP_PX : QUICK_STEP_TOUCH_SLOP_PX);
+                boolean exceededTouchSlopY = Math.abs(y - mTouchDownY) >
+                        (mIsVertical ? QUICK_STEP_TOUCH_SLOP_PX : QUICK_SCRUB_TOUCH_SLOP_PX);
                 if (exceededTouchSlopX || exceededTouchSlopY) {
                     // When quick step is enabled, prevent animating the ripple triggered by
                     // setPressed and decide to run it on touch up
@@ -255,11 +256,10 @@
                 final boolean doIt = isPressed() && !mLongClicked;
                 setPressed(false);
                 final boolean doHapticFeedback = (SystemClock.uptimeMillis() - mDownTime) > 150;
-                if (isProxyConnected) {
+                if (showSwipeUI) {
                     if (doIt) {
-                        if (doHapticFeedback) {
-                            mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK);
-                        }
+                        // Apply haptic feedback on touch up since there is none on touch down
+                        performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
                         playSoundEffect(SoundEffectConstants.CLICK);
                     }
                 } else if (doHapticFeedback && !mLongClicked) {
@@ -270,8 +270,12 @@
                 if (mCode != 0) {
                     if (doIt) {
                         // If there was a pending remote recents animation, then we need to
-                        // cancel the animation now before we handle the button itself
-                        ActivityManagerWrapper.getInstance().cancelRecentsAnimation();
+                        // cancel the animation now before we handle the button itself. In the case
+                        // where we are going home and the recents animation has already started,
+                        // just cancel the recents animation, leaving the home stack in place
+                        boolean isHomeKey = mCode == KEYCODE_HOME;
+                        ActivityManagerWrapper.getInstance().cancelRecentsAnimation(!isHomeKey);
+
                         sendEvent(KeyEvent.ACTION_UP, 0);
                         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
                     } else {
@@ -342,7 +346,7 @@
 
     @Override
     public void setVertical(boolean vertical) {
-        //no op
+        mIsVertical = vertical;
     }
 }
 
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 790135f..74b3926 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -20,8 +20,10 @@
 import android.widget.Button;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.KeyguardHostView.OnDismissAction;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 
 import java.text.BreakIterator;
 import java.util.Comparator;
@@ -42,6 +44,7 @@
     private static final int SQUEEZE_FAILED = -1;
 
     private final SmartReplyConstants mConstants;
+    private final KeyguardDismissUtil mKeyguardDismissUtil;
 
     /** Spacing to be applied between views. */
     private final int mSpacing;
@@ -62,6 +65,7 @@
     public SmartReplyView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mConstants = Dependency.get(SmartReplyConstants.class);
+        mKeyguardDismissUtil = Dependency.get(KeyguardDismissUtil.class);
 
         int spacing = 0;
         int singleLineButtonPaddingHorizontal = 0;
@@ -126,12 +130,13 @@
     }
 
     @VisibleForTesting
-    static Button inflateReplyButton(Context context, ViewGroup root, CharSequence choice,
+    Button inflateReplyButton(Context context, ViewGroup root, CharSequence choice,
             RemoteInput remoteInput, PendingIntent pendingIntent) {
         Button b = (Button) LayoutInflater.from(context).inflate(
                 R.layout.smart_reply_button, root, false);
         b.setText(choice);
-        b.setOnClickListener(view -> {
+
+        OnDismissAction action = () -> {
             Bundle results = new Bundle();
             results.putString(remoteInput.getResultKey(), choice.toString());
             Intent intent = new Intent().addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -142,6 +147,12 @@
             } catch (PendingIntent.CanceledException e) {
                 Log.w(TAG, "Unable to send smart reply", e);
             }
+            return false; // do not defer
+        };
+
+        b.setOnClickListener(view -> {
+            mKeyguardDismissUtil.dismissKeyguardThenExecute(
+                    action, null /* cancelAction */, false /* afterKeyguardGone */);
         });
         return b;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
index 0616ffc..4d33dec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TintedKeyButtonDrawable.java
@@ -17,6 +17,7 @@
 package com.android.systemui.statusbar.policy;
 
 import android.annotation.ColorInt;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 
 import com.android.internal.graphics.ColorUtils;
@@ -49,16 +50,21 @@
     public void setDarkIntensity(float intensity) {
         // Duplicate intensity scaling from KeyButtonDrawable
         mDarkIntensity = intensity;
-        int intermediateColor = ColorUtils.compositeColors(
-                setAlphaFloat(mDarkColor, intensity),
-                setAlphaFloat(mLightColor,1f - intensity));
+
+        // Dark and light colors may have an alpha component
+        final int intermediateColor = ColorUtils.compositeColors(
+                blendAlpha(mDarkColor, intensity),
+                blendAlpha(mLightColor, (1f - intensity)));
+
         getDrawable(0).setTint(intermediateColor);
         invalidateSelf();
     }
 
-    private int setAlphaFloat(int color, float alpha) {
+    private int blendAlpha(int color, float alpha) {
+        final float newAlpha = alpha < 0f ? 0f : (alpha > 1f ? 1f : alpha);
+        final float colorAlpha = Color.alpha(color) / 255f;
+        final int alphaInt = (int) (255 * newAlpha * colorAlpha); // Blend by multiplying
         // Ensure alpha is clamped [0-255] or ColorUtils will crash
-        final int alphaInt = alpha > 1f ? 255 : (alpha < 0f ? 0 : ((int) alpha*255));
         return ColorUtils.setAlphaComponent(color, alphaInt);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 375e860..d282f25 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -3023,6 +3023,11 @@
     public void setAnimationsEnabled(boolean animationsEnabled) {
         mAnimationsEnabled = animationsEnabled;
         updateNotificationAnimationStates();
+        if (!animationsEnabled) {
+            mSwipedOutViews.clear();
+            mChildrenToRemoveAnimated.clear();
+            clearTemporaryViewsInGroup(this);
+        }
     }
 
     private void updateNotificationAnimationStates() {
@@ -3090,6 +3095,21 @@
     @Override
     public void changeViewPosition(View child, int newIndex) {
         int currentIndex = indexOfChild(child);
+
+        if (currentIndex == -1) {
+            boolean isTransient = false;
+            if (child instanceof ExpandableNotificationRow
+                    && ((ExpandableNotificationRow)child).getTransientContainer() != null) {
+                isTransient = true;
+            }
+            Log.e(TAG, "Attempting to re-position "
+                    + (isTransient ? "transient" : "")
+                    + " view {"
+                    + child
+                    + "}");
+            return;
+        }
+
         if (child != null && child.getParent() == this && currentIndex != newIndex) {
             mChangePositionInProgress = true;
             ((ExpandableView)child).setChangingPosition(true);
@@ -3569,17 +3589,17 @@
 
     private void clearTemporaryViews() {
         // lets make sure nothing is in the overlay / transient anymore
-        clearTemporaryViews(this);
+        clearTemporaryViewsInGroup(this);
         for (int i = 0; i < getChildCount(); i++) {
             ExpandableView child = (ExpandableView) getChildAt(i);
             if (child instanceof ExpandableNotificationRow) {
                 ExpandableNotificationRow row = (ExpandableNotificationRow) child;
-                clearTemporaryViews(row.getChildrenContainer());
+                clearTemporaryViewsInGroup(row.getChildrenContainer());
             }
         }
     }
 
-    private void clearTemporaryViews(ViewGroup viewGroup) {
+    private void clearTemporaryViewsInGroup(ViewGroup viewGroup) {
         while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
             viewGroup.removeTransientView(viewGroup.getTransientView(0));
         }
@@ -3922,12 +3942,11 @@
         requestChildrenUpdate();
         applyCurrentBackgroundBounds();
         updateWillNotDraw();
-        updateAntiBurnInTranslation();
         notifyHeightChangeListener(mShelf);
     }
 
     private void updateAntiBurnInTranslation() {
-        setTranslationX(mAmbientState.isDark() ? mAntiBurnInOffsetX : 0);
+        setTranslationX(mAntiBurnInOffsetX * mDarkAmount);
     }
 
     /**
@@ -3948,6 +3967,7 @@
             updateContentHeight();
         }
         updateBackgroundDimming();
+        updateAntiBurnInTranslation();
     }
 
     public float getDarkAmount() {
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
index 5a4478f..639e49b 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java
@@ -58,7 +58,7 @@
 
     private static final String TUNER_VERSION = "sysui_tuner_version";
 
-    private static final int CURRENT_TUNER_VERSION = 2;
+    private static final int CURRENT_TUNER_VERSION = 3;
 
     private final Observer mObserver = new Observer();
     // Map of Uris we listen on to their settings keys.
@@ -119,6 +119,10 @@
         if (oldVersion < 2) {
             setTunerEnabled(mContext, false);
         }
+        if (oldVersion < 3) {
+            // Delay this so that we can wait for everything to be registered first.
+            new Handler(Dependency.get(Dependency.BG_LOOPER)).postDelayed(() -> clearAll(), 5000);
+        }
         setValue(TUNER_VERSION, newVersion);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
index 5ec3dff..a901e88 100644
--- a/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
+++ b/packages/SystemUI/src/com/android/systemui/util/wakelock/DelayedWakeLock.java
@@ -23,7 +23,7 @@
  */
 public class DelayedWakeLock implements WakeLock {
 
-    private static final long RELEASE_DELAY_MS = 120;
+    private static final long RELEASE_DELAY_MS = 140;
 
     private final Handler mHandler;
     private final WakeLock mInner;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 6f71e55..a2d2615 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -212,8 +212,7 @@
                     .setDuration(300)
                     .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
                     .withEndAction(() -> {
-                        mWindow.getDecorView().requestAccessibilityFocus();
-                        if (!Prefs.getBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true)) {
+                        if (!Prefs.getBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, false)) {
                             mRingerIcon.postOnAnimationDelayed(mSinglePress, 1500);
                         }
                     })
diff --git a/packages/SystemUI/tests/AndroidTest.xml b/packages/SystemUI/tests/AndroidTest.xml
index 53839a9b..fc353a1 100644
--- a/packages/SystemUI/tests/AndroidTest.xml
+++ b/packages/SystemUI/tests/AndroidTest.xml
@@ -24,5 +24,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.systemui.tests" />
         <option name="runner" value="android.testing.TestableInstrumentation" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
index 8905d72..b6335f3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
@@ -21,6 +21,7 @@
 import android.app.Instrumentation;
 import android.support.test.InstrumentationRegistry;
 import android.testing.BaseFragmentTest;
+import android.testing.DexmakerShareClassLoaderRule;
 
 import com.android.systemui.utils.leaks.LeakCheckedTest;
 import com.android.systemui.utils.leaks.LeakCheckedTest.SysuiLeakCheck;
@@ -36,6 +37,10 @@
     @Rule
     public final SysuiLeakCheck mLeakCheck = new SysuiLeakCheck();
 
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
     protected final TestableDependency mDependency = new TestableDependency(mContext);
     protected SysuiTestableContext mSysuiContext;
     private Instrumentation mRealInstrumentation;
@@ -46,7 +51,6 @@
 
     @Before
     public void SysuiSetup() {
-        System.setProperty("dexmaker.share_classloader", "true");
         SystemUIFactory.createFromConfig(mContext);
         // TODO: Figure out another way to give reference to a SysuiTestableContext.
         mSysuiContext = (SysuiTestableContext) mContext;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 4c7c1d1..7475cd7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -19,21 +19,18 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Instrumentation;
-import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.MessageQueue;
 import android.os.ParcelFileDescriptor;
 import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
+import android.testing.DexmakerShareClassLoaderRule;
 import android.testing.LeakCheck;
 import android.util.Log;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -51,12 +48,14 @@
     @Rule
     public SysuiTestableContext mContext = new SysuiTestableContext(
             InstrumentationRegistry.getContext(), getLeakCheck());
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
     public TestableDependency mDependency = new TestableDependency(mContext);
     private Instrumentation mRealInstrumentation;
 
     @Before
     public void SysuiSetup() throws Exception {
-        System.setProperty("dexmaker.share_classloader", "true");
         mContext.setTheme(R.style.Theme_SystemUI);
         SystemUIFactory.createFromConfig(mContext);
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index 5812da2..7d49c4d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -44,6 +44,7 @@
 
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
+import java.util.HashSet;
 
 import androidx.slice.SliceItem;
 import androidx.slice.SliceProvider;
@@ -66,7 +67,7 @@
         MockitoAnnotations.initMocks(this);
         mProvider = new TestableKeyguardSliceProvider();
         mProvider.attachInfo(getContext(), null);
-        SliceProvider.setSpecs(Arrays.asList(SliceSpecs.LIST));
+        SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST)));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AppOpsListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AppOpsListenerTest.java
index 2a48c4b..dc0e2b0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AppOpsListenerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AppOpsListenerTest.java
@@ -86,7 +86,7 @@
         mListener.onOpActiveChanged(
                 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
         waitForIdleSync(mHandler);
-        verify(mEntryManager, times(1)).updateNotificationsForAppOps(
+        verify(mEntryManager, times(1)).updateNotificationsForAppOp(
                 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
     }
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
index 78cceeb..b3dddd5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationBlockingHelperManagerTest.java
@@ -65,6 +65,8 @@
     @Before
     public void setUp() {
         mBlockingHelperManager = new NotificationBlockingHelperManager(mContext);
+        // By default, have the shade visible/expanded.
+        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         mHelper = new NotificationTestHelper(mContext);
         when(mGutsManager.openGuts(
@@ -115,7 +117,6 @@
     public void testPerhapsShowBlockingHelper_shown() throws Exception {
         ExpandableNotificationRow row = createBlockableRowSpy();
         row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
 
@@ -127,7 +128,6 @@
     public void testPerhapsShowBlockingHelper_shownForLargeGroup() throws Exception {
         ExpandableNotificationRow groupRow = createBlockableGroupRowSpy(10);
         groupRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(groupRow, mMenuRow));
 
@@ -143,7 +143,6 @@
         // of the child row.
         ExpandableNotificationRow childRow = groupRow.getChildrenContainer().getViewAtPosition(0);
         childRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(childRow, mMenuRow));
 
@@ -154,7 +153,6 @@
     public void testPerhapsShowBlockingHelper_notShownDueToNeutralUserSentiment() throws Exception {
         ExpandableNotificationRow row = createBlockableRowSpy();
         row.getEntry().userSentiment = USER_SENTIMENT_NEUTRAL;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
     }
@@ -164,7 +162,6 @@
             throws Exception {
         ExpandableNotificationRow row = createBlockableRowSpy();
         row.getEntry().userSentiment = USER_SENTIMENT_POSITIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
     }
@@ -184,7 +181,6 @@
         ExpandableNotificationRow row = createBlockableRowSpy();
         when(row.getIsNonblockable()).thenReturn(true);
         row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
     }
@@ -198,7 +194,6 @@
         // of the child row.
         ExpandableNotificationRow childRow = groupRow.getChildrenContainer().getViewAtPosition(0);
         childRow.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         assertFalse(mBlockingHelperManager.perhapsShowBlockingHelper(childRow, mMenuRow));
     }
@@ -208,7 +203,6 @@
         ExpandableNotificationRow row = spy(createBlockableRowSpy());
         row.getEntry().userSentiment = USER_SENTIMENT_NEGATIVE;
         when(row.isAttachedToWindow()).thenReturn(true);
-        mBlockingHelperManager.setNotificationShadeExpanded(1f);
 
         // Show check
         assertTrue(mBlockingHelperManager.perhapsShowBlockingHelper(row, mMenuRow));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
index 5e27fde..5ec77ac 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationDataTest.java
@@ -139,32 +139,7 @@
         Assert.assertTrue(mRow.getEntry().channel != null);
     }
 
-    @Test
-    public void testAdd_appOpsAdded() {
-        ArraySet<Integer> expected = new ArraySet<>();
-        expected.add(3);
-        expected.add(235);
-        expected.add(1);
-        when(mFsc.getAppOps(mRow.getEntry().notification.getUserId(),
-                mRow.getEntry().notification.getPackageName())).thenReturn(expected);
 
-        mNotificationData.add(mRow.getEntry());
-        assertEquals(expected.size(),
-                mNotificationData.get(mRow.getEntry().key).mActiveAppOps.size());
-        for (int op : expected) {
-            assertTrue(" entry missing op " + op,
-                    mNotificationData.get(mRow.getEntry().key).mActiveAppOps.contains(op));
-        }
-    }
-
-    @Test
-    public void testAdd_noExistingAppOps() {
-        when(mFsc.getAppOps(mRow.getEntry().notification.getUserId(),
-                mRow.getEntry().notification.getPackageName())).thenReturn(null);
-
-        mNotificationData.add(mRow.getEntry());
-        assertEquals(0, mNotificationData.get(mRow.getEntry().key).mActiveAppOps.size());
-    }
 
     @Test
     public void testAllRelevantNotisTaggedWithAppOps() throws Exception {
@@ -181,7 +156,9 @@
 
         for (int op : expectedOps) {
             mNotificationData.updateAppOp(op, NotificationTestHelper.UID,
-                    NotificationTestHelper.PKG, true);
+                    NotificationTestHelper.PKG, mRow.getEntry().key, true);
+            mNotificationData.updateAppOp(op, NotificationTestHelper.UID,
+                    NotificationTestHelper.PKG, row2.getEntry().key, true);
         }
         for (int op : expectedOps) {
             assertTrue(mRow.getEntry().key + " doesn't have op " + op,
@@ -205,12 +182,12 @@
 
         for (int op : expectedOps) {
             mNotificationData.updateAppOp(op, NotificationTestHelper.UID,
-                    NotificationTestHelper.PKG, true);
+                    NotificationTestHelper.PKG, row2.getEntry().key, true);
         }
 
         expectedOps.remove(OP_ACCEPT_HANDOVER);
         mNotificationData.updateAppOp(OP_ACCEPT_HANDOVER, NotificationTestHelper.UID,
-                NotificationTestHelper.PKG, false);
+                NotificationTestHelper.PKG, row2.getEntry().key, false);
 
         assertTrue(mRow.getEntry().key + " doesn't have op " + OP_CAMERA,
                 mNotificationData.get(mRow.getEntry().key).mActiveAppOps.contains(OP_CAMERA));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
index 3703d6a..7cfd7a3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationEntryManagerTest.java
@@ -37,18 +37,15 @@
 import android.app.Notification;
 import android.app.NotificationManager;
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.UserHandle;
 import android.service.notification.NotificationListenerService;
-import android.service.notification.NotificationRankingUpdate;
 import android.service.notification.StatusBarNotification;
 import android.support.test.filters.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
+import android.util.ArraySet;
 import android.widget.FrameLayout;
 
 import com.android.internal.logging.MetricsLogger;
@@ -56,12 +53,13 @@
 import com.android.systemui.ForegroundServiceController;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
-import com.android.systemui.UiOffloadThread;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
 import com.android.systemui.statusbar.phone.NotificationGroupManager;
 import com.android.systemui.statusbar.policy.DeviceProvisionedController;
 import com.android.systemui.statusbar.policy.HeadsUpManager;
 
+import junit.framework.Assert;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -285,13 +283,12 @@
         com.android.systemui.util.Assert.isNotMainThread();
 
         when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
-                .thenReturn("something");
+                .thenReturn(mEntry.key);
         mEntry.row = mRow;
         mEntryManager.getNotificationData().add(mEntry);
 
-
         mHandler.post(() -> {
-            mEntryManager.updateNotificationsForAppOps(
+            mEntryManager.updateNotificationsForAppOp(
                     AppOpsManager.OP_CAMERA, mEntry.notification.getUid(),
                     mEntry.notification.getPackageName(), true);
         });
@@ -309,10 +306,65 @@
         when(mForegroundServiceController.getStandardLayoutKey(anyInt(), anyString()))
                 .thenReturn(null);
         mHandler.post(() -> {
-            mEntryManager.updateNotificationsForAppOps(AppOpsManager.OP_CAMERA, 1000, "pkg", true);
+            mEntryManager.updateNotificationsForAppOp(AppOpsManager.OP_CAMERA, 1000, "pkg", true);
         });
         waitForIdleSync(mHandler);
 
         verify(mPresenter, never()).updateNotificationViews();
     }
+
+    @Test
+    public void testAddNotificationExistingAppOps() {
+        mEntry.row = mRow;
+        mEntryManager.getNotificationData().add(mEntry);
+        ArraySet<Integer> expected = new ArraySet<>();
+        expected.add(3);
+        expected.add(235);
+        expected.add(1);
+
+        when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn(expected);
+        when(mForegroundServiceController.getStandardLayoutKey(
+                mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn(mEntry.key);
+
+        mEntryManager.tagForeground(mEntry.notification);
+
+        Assert.assertEquals(expected.size(), mEntry.mActiveAppOps.size());
+        for (int op : expected) {
+            assertTrue("Entry missing op " + op, mEntry.mActiveAppOps.contains(op));
+        }
+    }
+
+    @Test
+    public void testAdd_noExistingAppOps() {
+        mEntry.row = mRow;
+        mEntryManager.getNotificationData().add(mEntry);
+        when(mForegroundServiceController.getStandardLayoutKey(
+                mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn(mEntry.key);
+        when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn(null);
+
+        mEntryManager.tagForeground(mEntry.notification);
+        Assert.assertEquals(0, mEntry.mActiveAppOps.size());
+    }
+
+    @Test
+    public void testAdd_existingAppOpsNotForegroundNoti() {
+        mEntry.row = mRow;
+        mEntryManager.getNotificationData().add(mEntry);
+        ArraySet<Integer> ops = new ArraySet<>();
+        ops.add(3);
+        ops.add(235);
+        ops.add(1);
+        when(mForegroundServiceController.getAppOps(mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn(ops);
+        when(mForegroundServiceController.getStandardLayoutKey(
+                mEntry.notification.getUserId(),
+                mEntry.notification.getPackageName())).thenReturn("something else");
+
+        mEntryManager.tagForeground(mEntry.notification);
+        Assert.assertEquals(0, mEntry.mActiveAppOps.size());
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index d86e947..3cbe274 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -52,17 +52,20 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.graphics.drawable.Drawable;
+import android.os.Looper;
 import android.os.UserHandle;
 import android.service.notification.StatusBarNotification;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.testing.AndroidTestingRunner;
 import android.testing.PollingCheck;
+import android.testing.TestableLooper;
 import android.testing.UiThreadTest;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
 
@@ -81,7 +84,7 @@
 
 @SmallTest
 @RunWith(AndroidTestingRunner.class)
-@UiThreadTest
+@TestableLooper.RunWithLooper
 public class NotificationInfoTest extends SysuiTestCase {
     private static final String TEST_PACKAGE_NAME = "test_package";
     private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME;
@@ -90,12 +93,14 @@
     private static final String TEST_CHANNEL = "test_channel";
     private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME";
 
+    private TestableLooper mTestableLooper;
     private NotificationInfo mNotificationInfo;
     private NotificationChannel mNotificationChannel;
     private NotificationChannel mDefaultNotificationChannel;
     private StatusBarNotification mSbn;
 
     @Rule public MockitoRule mockito = MockitoJUnit.rule();
+    private Looper mLooper;
     @Mock private INotificationManager mMockINotificationManager;
     @Mock private PackageManager mMockPackageManager;
     @Mock private NotificationBlockingHelperManager mBlockingHelperManager;
@@ -105,7 +110,8 @@
         mDependency.injectTestDependency(
                 NotificationBlockingHelperManager.class,
                 mBlockingHelperManager);
-
+        mTestableLooper = TestableLooper.get(this);
+        mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper());
         // Inflate the layout
         final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
         mNotificationInfo = (NotificationInfo) layoutInflater.inflate(R.layout.notification_info,
@@ -355,6 +361,7 @@
     public void testBindNotification_DoesNotUpdateNotificationChannel() throws Exception {
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
     }
@@ -366,6 +373,7 @@
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
 
         mNotificationInfo.findViewById(R.id.block).performClick();
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
     }
@@ -378,6 +386,7 @@
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
 
         mNotificationInfo.findViewById(R.id.minimize).performClick();
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
     }
@@ -390,6 +399,7 @@
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
 
         mNotificationInfo.handleCloseControls(true, false);
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
         assertEquals(originalImportance, mNotificationChannel.getImportance());
@@ -403,6 +413,8 @@
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false);
 
         mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
         assertEquals(IMPORTANCE_UNSPECIFIED, mNotificationChannel.getImportance());
@@ -436,6 +448,8 @@
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
         mNotificationInfo.findViewById(R.id.block).performClick();
         waitForUndoButton();
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
     }
@@ -450,6 +464,7 @@
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
 
+        mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
                 ArgumentCaptor.forClass(NotificationChannel.class);
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -460,12 +475,46 @@
     }
 
     @Test
+    public void testBlockChangedCallsUpdateNotificationChannel_blockingHelper() throws Exception {
+        mNotificationChannel.setImportance(IMPORTANCE_LOW);
+        mNotificationInfo.bindNotification(
+                mMockPackageManager,
+                mMockINotificationManager,
+                TEST_PACKAGE_NAME,
+                mNotificationChannel,
+                1 /* numChannels */,
+                mSbn,
+                null /* checkSaveListener */,
+                null /* onSettingsClick */,
+                null /* onAppSettingsClick */,
+                false /* isNonblockable */,
+                true /* isForBlockingHelper */,
+                true /* isUserSentimentNegative */);
+
+        mNotificationInfo.findViewById(R.id.block).performClick();
+        waitForUndoButton();
+        mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
+        ArgumentCaptor<NotificationChannel> updated =
+                ArgumentCaptor.forClass(NotificationChannel.class);
+        verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
+                anyString(), eq(TEST_UID), updated.capture());
+        assertTrue((updated.getValue().getUserLockedFields()
+                & USER_LOCKED_IMPORTANCE) != 0);
+        assertEquals(IMPORTANCE_NONE, updated.getValue().getImportance());
+    }
+
+
+    @Test
     public void testNonBlockableAppDoesNotBecomeMin() throws Exception {
         mNotificationChannel.setImportance(IMPORTANCE_LOW);
         mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                 TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true);
         mNotificationInfo.findViewById(R.id.minimize).performClick();
         waitForUndoButton();
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 anyString(), eq(TEST_UID), any());
     }
@@ -481,6 +530,7 @@
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
 
+        mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
                 ArgumentCaptor.forClass(NotificationChannel.class);
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -498,6 +548,7 @@
 
         mNotificationInfo.handleCloseControls(true, false);
 
+        mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
                 ArgumentCaptor.forClass(NotificationChannel.class);
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -518,6 +569,7 @@
         waitForStopButton();
         mNotificationInfo.handleCloseControls(true, false);
 
+        mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
                 ArgumentCaptor.forClass(NotificationChannel.class);
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -538,6 +590,7 @@
         waitForStopButton();
         mNotificationInfo.handleCloseControls(true, false);
 
+        mTestableLooper.processAllMessages();
         ArgumentCaptor<NotificationChannel> updated =
                 ArgumentCaptor.forClass(NotificationChannel.class);
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
@@ -555,6 +608,8 @@
         mNotificationInfo.findViewById(R.id.minimize).performClick();
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(false, false);
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 eq(TEST_PACKAGE_NAME), eq(TEST_UID), eq(mNotificationChannel));
     }
@@ -568,6 +623,8 @@
         mNotificationInfo.findViewById(R.id.block).performClick();
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(false, false);
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 eq(TEST_PACKAGE_NAME), eq(TEST_UID), eq(mNotificationChannel));
     }
@@ -583,6 +640,8 @@
         mNotificationInfo.findViewById(R.id.block).performClick();
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, never()).updateNotificationChannelForPackage(
                 eq(TEST_PACKAGE_NAME), eq(TEST_UID), eq(mNotificationChannel));
     }
@@ -599,6 +658,8 @@
         mNotificationInfo.findViewById(R.id.block).performClick();
         waitForUndoButton();
         mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
         verify(mMockINotificationManager, times(1)).updateNotificationChannelForPackage(
                 eq(TEST_PACKAGE_NAME), eq(TEST_UID), eq(mNotificationChannel));
     }
@@ -696,6 +757,29 @@
         assertEquals(GONE, settingsLink.getVisibility());
     }
 
+    @Test
+    public void testBindHeader_noSettingsLinkWhenIsForBlockingHelper() throws Exception {
+        final String settingsText = "work chats";
+        final ResolveInfo ri = new ResolveInfo();
+        ri.activityInfo = new ActivityInfo();
+        ri.activityInfo.packageName = TEST_PACKAGE_NAME;
+        ri.activityInfo.name = "something";
+        List<ResolveInfo> ris = new ArrayList<>();
+        ris.add(ri);
+        when(mMockPackageManager.queryIntentActivities(any(), anyInt())).thenReturn(ris);
+        mNotificationChannel.setImportance(IMPORTANCE_LOW);
+        Notification n = new Notification.Builder(mContext, mNotificationChannel.getId())
+                .setSettingsText(settingsText).build();
+        StatusBarNotification sbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME,
+                0, null, 0, 0, n, UserHandle.CURRENT, null, 0);
+
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel, 1, sbn, null, null, null, false, true,
+                true);
+        final TextView settingsLink = mNotificationInfo.findViewById(R.id.app_settings);
+        assertEquals(GONE, settingsLink.getVisibility());
+    }
+
 
     @Test
     public void testWillBeRemovedReturnsFalseBeforeBind() throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 2edcd01..9e8fa22 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -89,15 +89,11 @@
 
         assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
                 .getVisibility());
-        assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.clock)
-                .getVisibility());
 
         fragment.disable(0, 0, false);
 
         assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.system_icon_area)
                 .getVisibility());
-        assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.clock)
-                .getVisibility());
     }
 
     @Test
@@ -115,4 +111,20 @@
 
         Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
     }
+
+    @Test
+    public void testDisableClock() throws Exception {
+        mFragments.dispatchResume();
+        processAllMessages();
+
+        CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
+        fragment.initNotificationIconArea(mMockNotificiationAreaController);
+        fragment.disable(StatusBarManager.DISABLE_CLOCK, 0, false);
+
+        assertEquals(View.INVISIBLE, mFragment.getView().findViewById(R.id.clock).getVisibility());
+
+        fragment.disable(0, 0, false);
+
+        assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.clock).getVisibility());
+    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index 67453d5..c6b6546 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -167,11 +167,19 @@
 
     @Test
     public void testOnFullyShown_notifiesFalsingManager() {
+        mBouncer.ensureView();
         mBouncer.onFullyShown();
         verify(mFalsingManager).onBouncerShown();
     }
 
     @Test
+    public void testOnFullyShown_notifiesKeyguardView() {
+        mBouncer.ensureView();
+        mBouncer.onFullyShown();
+        verify(mKeyguardHostView).onResume();
+    }
+
+    @Test
     public void testOnFullyHidden_notifiesFalsingManager() {
         mBouncer.onFullyHidden();
         verify(mFalsingManager).onBouncerHidden();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index a88f31a..0416232 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -42,6 +42,7 @@
 import android.testing.TestableLooper;
 import android.view.View;
 
+import com.android.internal.colorextraction.ColorExtractor.GradientColors;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.ScrimView;
@@ -53,6 +54,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.function.Consumer;
 
 @RunWith(AndroidTestingRunner.class)
@@ -63,9 +66,12 @@
     private SynchronousScrimController mScrimController;
     private ScrimView mScrimBehind;
     private ScrimView mScrimInFront;
+    private Consumer<Float> mScrimBehindAlphaCallback;
+    private Consumer<GradientColors> mScrimInFrontColorCallback;
     private Consumer<Integer> mScrimVisibilityCallback;
+    private float mScrimBehindAlpha;
+    private GradientColors mScrimInFrontColor;
     private int mScrimVisibility;
-    private LightBarController mLightBarController;
     private DozeParameters mDozeParamenters;
     private WakeLock mWakeLock;
     private boolean mAlwaysOnEnabled;
@@ -73,19 +79,20 @@
 
     @Before
     public void setup() {
-        mLightBarController = mock(LightBarController.class);
         mScrimBehind = spy(new ScrimView(getContext()));
         mScrimInFront = new ScrimView(getContext());
         mWakeLock = mock(WakeLock.class);
         mAlarmManager = mock(AlarmManager.class);
         mAlwaysOnEnabled = true;
+        mScrimBehindAlphaCallback = (Float alpha) -> mScrimBehindAlpha = alpha;
+        mScrimInFrontColorCallback = (GradientColors color) -> mScrimInFrontColor = color;
         mScrimVisibilityCallback = (Integer visible) -> mScrimVisibility = visible;
         mDozeParamenters = mock(DozeParameters.class);
         when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
         when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
-        mScrimController = new SynchronousScrimController(mLightBarController, mScrimBehind,
-                mScrimInFront, mScrimVisibilityCallback, mDozeParamenters,
-                mAlarmManager);
+        mScrimController = new SynchronousScrimController(mScrimBehind, mScrimInFront,
+                mScrimBehindAlphaCallback, mScrimInFrontColorCallback, mScrimVisibilityCallback,
+                mDozeParamenters, mAlarmManager);
     }
 
     @Test
@@ -204,6 +211,28 @@
     }
 
     @Test
+    public void panelExpansion() {
+        mScrimController.setPanelExpansion(0f);
+        mScrimController.setPanelExpansion(0.5f);
+        mScrimController.transitionTo(ScrimState.UNLOCKED);
+        mScrimController.finishAnimationsImmediately();
+
+        reset(mScrimBehind);
+        mScrimController.setPanelExpansion(0f);
+        mScrimController.setPanelExpansion(1.0f);
+        mScrimController.onPreDraw();
+
+        Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
+                mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
+
+        mScrimController.setPanelExpansion(0f);
+        mScrimController.onPreDraw();
+
+        Assert.assertEquals("Scrim alpha should change after setPanelExpansion",
+                mScrimBehindAlpha, mScrimBehind.getViewAlpha(), 0.01f);
+    }
+
+    @Test
     public void panelExpansionAffectsAlpha() {
         mScrimController.setPanelExpansion(0f);
         mScrimController.setPanelExpansion(0.5f);
@@ -244,7 +273,7 @@
     }
 
     @Test
-    public void scrimBlanksBeforeLeavingAoD() {
+    public void scrimBlanksBeforeLeavingAod() {
         // Simulate unlock with fingerprint
         mScrimController.transitionTo(ScrimState.AOD);
         mScrimController.finishAnimationsImmediately();
@@ -437,6 +466,44 @@
         assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE);
     }
 
+    @Test
+    public void testEatsTouchEvent() {
+        HashSet<ScrimState> eatsTouches =
+                new HashSet<>(Arrays.asList(ScrimState.AOD, ScrimState.PULSING));
+        for (ScrimState state : ScrimState.values()) {
+            if (state == ScrimState.UNINITIALIZED) {
+                continue;
+            }
+            mScrimController.transitionTo(state);
+            mScrimController.finishAnimationsImmediately();
+            Assert.assertEquals("Should be clickable unless AOD or PULSING, was: " + state,
+                    mScrimBehind.getViewAlpha() != 0 && !eatsTouches.contains(state),
+                    mScrimBehind.isClickable());
+        }
+    }
+
+    @Test
+    public void testAnimatesTransitionToAod() {
+        when(mDozeParamenters.shouldControlScreenOff()).thenReturn(false);
+        ScrimState.AOD.prepare(ScrimState.KEYGUARD);
+        Assert.assertFalse("No animation when ColorFade kicks in",
+                ScrimState.AOD.getAnimateChange());
+
+        reset(mDozeParamenters);
+        when(mDozeParamenters.shouldControlScreenOff()).thenReturn(true);
+        ScrimState.AOD.prepare(ScrimState.KEYGUARD);
+        Assert.assertTrue("Animate scrims when ColorFade won't be triggered",
+                ScrimState.AOD.getAnimateChange());
+    }
+
+    @Test
+    public void testViewsDontHaveFocusHighlight() {
+        Assert.assertFalse("Scrim shouldn't have focus highlight",
+                mScrimInFront.getDefaultFocusHighlightEnabled());
+        Assert.assertFalse("Scrim shouldn't have focus highlight",
+                mScrimBehind.getDefaultFocusHighlightEnabled());
+    }
+
     /**
      * Conserves old notification density after leaving state and coming back.
      *
@@ -491,11 +558,12 @@
         private boolean mAnimationCancelled;
         boolean mOnPreDrawCalled;
 
-        SynchronousScrimController(LightBarController lightBarController,
-                ScrimView scrimBehind, ScrimView scrimInFront,
+        SynchronousScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
+                Consumer<Float> scrimBehindAlphaListener,
+                Consumer<GradientColors> scrimInFrontColorListener,
                 Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
                 AlarmManager alarmManager) {
-            super(lightBarController, scrimBehind, scrimInFront,
+            super(scrimBehind, scrimInFront, scrimBehindAlphaListener, scrimInFrontColorListener,
                     scrimVisibleListener, dozeParameters, alarmManager);
             mHandler = new FakeHandler(Looper.myLooper());
         }
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 b31a2dc..d3cb5a6 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
@@ -95,6 +95,7 @@
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 import com.android.systemui.statusbar.NotificationShelf;
 import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.RemoteInputController;
 import com.android.systemui.statusbar.StatusBarState;
 import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
 import com.android.systemui.statusbar.notification.VisualStabilityManager;
@@ -139,6 +140,8 @@
     @Mock private NotificationListener mNotificationListener;
     @Mock private KeyguardViewMediator mKeyguardViewMediator;
     @Mock private NotificationLockscreenUserManager mLockscreenUserManager;
+    @Mock private NotificationRemoteInputManager mRemoteInputManager;
+    @Mock private RemoteInputController mRemoteInputController;
 
     private TestableStatusBar mStatusBar;
     private FakeMetricsLogger mMetricsLogger;
@@ -166,8 +169,8 @@
 
         mMetricsLogger = new FakeMetricsLogger();
         mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
-        mNotificationLogger = new NotificationLogger();
         mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger);
+        mNotificationLogger = new NotificationLogger();
 
         IPowerManager powerManagerService = mock(IPowerManager.class);
         HandlerThread handlerThread = new HandlerThread("TestThread");
@@ -200,13 +203,14 @@
 
         mEntryManager = new TestableNotificationEntryManager(mSystemServicesProxy, mPowerManager,
                 mContext);
+        when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
         mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
                 mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
                 mPowerManager, mNotificationPanelView, mBarService, mNotificationListener,
                 mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager,
                 mEntryManager, mScrimController, mFingerprintUnlockController,
                 mock(ActivityLaunchAnimator.class), mKeyguardViewMediator,
-                mock(NotificationRemoteInputManager.class), mock(NotificationGroupManager.class),
+                mRemoteInputManager, mock(NotificationGroupManager.class),
                 mock(FalsingManager.class), mock(StatusBarWindowManager.class),
                 mock(NotificationIconAreaController.class), mock(DozeScrimController.class),
                 mock(NotificationShelf.class), mLockscreenUserManager,
@@ -524,9 +528,9 @@
         mStatusBar.disable(StatusBarManager.DISABLE_NONE, StatusBarManager.DISABLE2_NONE, false);
         verify(mNotificationPanelView).setQsExpansionEnabled(true);
         mStatusBar.animateExpandNotificationsPanel();
-        verify(mNotificationPanelView).expand(anyBoolean());
+        verify(mNotificationPanelView).expandWithoutQs();
         mStatusBar.animateExpandSettingsPanel(null);
-        verify(mNotificationPanelView).expand(anyBoolean());
+        verify(mNotificationPanelView).expandWithQs();
     }
 
     @Test
@@ -588,6 +592,23 @@
     }
 
     @Test
+    public void testUpdateFooter_remoteInput() {
+        mStatusBar.setBarStateForTest(StatusBarState.SHADE);
+        ArrayList<Entry> entries = new ArrayList<>();
+        entries.add(mock(Entry.class));
+        when(mNotificationData.getActiveNotifications()).thenReturn(entries);
+
+        ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
+        when(row.canViewBeDismissed()).thenReturn(true);
+        when(mStackScroller.getChildCount()).thenReturn(1);
+        when(mStackScroller.getChildAt(anyInt())).thenReturn(row);
+        when(mRemoteInputController.isRemoteInputActive()).thenReturn(true);
+
+        mStatusBar.updateFooter();
+        verify(mStackScroller).updateFooterView(false, true);
+    }
+
+    @Test
     public void testUpdateFooter_oneClearableNotification() {
         mStatusBar.setBarStateForTest(StatusBarState.SHADE);
         ArrayList<Entry> entries = new ArrayList<>();
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 a9b2c96..56882c6 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
@@ -18,6 +18,7 @@
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNull;
 import static junit.framework.Assert.assertTrue;
 import static junit.framework.Assert.fail;
 
@@ -34,8 +35,12 @@
 import android.widget.Button;
 import android.widget.LinearLayout;
 
+import com.android.keyguard.KeyguardHostView.OnDismissAction;
 import com.android.systemui.R;
 import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
+
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.junit.After;
 import org.junit.Before;
@@ -65,6 +70,8 @@
     public void setUp() {
         mReceiver = new BlockingQueueIntentReceiver();
         mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION));
+        mDependency.get(KeyguardDismissUtil.class).setDismissHandler(
+            (action, cancelAction, afterKeyguardGone) -> action.onDismiss());
 
         mView = SmartReplyView.inflate(mContext, null);
 
@@ -95,6 +102,42 @@
     }
 
     @Test
+    public void testSendSmartReply_keyguardCancelled() throws InterruptedException {
+        mDependency.get(KeyguardDismissUtil.class).setDismissHandler(
+            (action, cancelAction, afterKeyguardGone) -> {
+                if (cancelAction != null) {
+                    cancelAction.run();
+                }
+            });
+        setRepliesFromRemoteInput(TEST_CHOICES);
+
+        mView.getChildAt(2).performClick();
+
+        assertNull(mReceiver.waitForIntent());
+    }
+
+    @Test
+    public void testSendSmartReply_waitsForKeyguard() throws InterruptedException {
+        AtomicReference<OnDismissAction> actionRef = new AtomicReference<>();
+        mDependency.get(KeyguardDismissUtil.class).setDismissHandler(
+            (action, cancelAction, afterKeyguardGone) -> actionRef.set(action));
+        setRepliesFromRemoteInput(TEST_CHOICES);
+
+        mView.getChildAt(2).performClick();
+
+        // No intent until the screen is unlocked.
+        assertNull(mReceiver.waitForIntent());
+
+        actionRef.get().onDismiss();
+
+        // Now the intent should arrive.
+        Intent resultIntent = mReceiver.waitForIntent();
+        assertEquals(TEST_CHOICES[2],
+                RemoteInput.getResultsFromIntent(resultIntent).get(TEST_RESULT_KEY));
+        assertEquals(RemoteInput.SOURCE_CHOICE, RemoteInput.getResultsSource(resultIntent));
+    }
+
+    @Test
     public void testMeasure_empty() {
         mView.measure(WIDTH_SPEC, HEIGHT_SPEC);
         assertEquals(500, mView.getMeasuredWidthAndState());
@@ -301,7 +344,7 @@
 
         Button previous = null;
         for (CharSequence choice : choices) {
-            Button current = SmartReplyView.inflateReplyButton(mContext, mView, choice, null, null);
+            Button current = mView.inflateReplyButton(mContext, mView, choice, null, null);
             current.setPadding(paddingHorizontal, current.getPaddingTop(), paddingHorizontal,
                     current.getPaddingBottom());
             if (previous != null) {
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml
new file mode 100644
index 0000000..bd52901
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-land/config.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ 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>
+    <!-- Can't link to other dimensions here, but this should be status_bar_height_landscape -->
+    <dimen name="quick_qs_offset_height">28dp</dimen>
+    <!-- Total height of QQS in landscape; quick_qs_offset_height + 128 -->
+    <dimen name="quick_qs_total_height">156dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml
new file mode 100644
index 0000000..bd52901
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-land/config.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ 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>
+    <!-- Can't link to other dimensions here, but this should be status_bar_height_landscape -->
+    <dimen name="quick_qs_offset_height">28dp</dimen>
+    <!-- Total height of QQS in landscape; quick_qs_offset_height + 128 -->
+    <dimen name="quick_qs_total_height">156dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml
new file mode 100644
index 0000000..bd52901
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/res/values-land/config.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ 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>
+    <!-- Can't link to other dimensions here, but this should be status_bar_height_landscape -->
+    <dimen name="quick_qs_offset_height">28dp</dimen>
+    <!-- Total height of QQS in landscape; quick_qs_offset_height + 128 -->
+    <dimen name="quick_qs_total_height">156dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml
new file mode 100644
index 0000000..bd52901
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-land/config.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ 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>
+    <!-- Can't link to other dimensions here, but this should be status_bar_height_landscape -->
+    <dimen name="quick_qs_offset_height">28dp</dimen>
+    <!-- Total height of QQS in landscape; quick_qs_offset_height + 128 -->
+    <dimen name="quick_qs_total_height">156dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml
new file mode 100644
index 0000000..bd52901
--- /dev/null
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/res/values-land/config.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ 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>
+    <!-- Can't link to other dimensions here, but this should be status_bar_height_landscape -->
+    <dimen name="quick_qs_offset_height">28dp</dimen>
+    <!-- Total height of QQS in landscape; quick_qs_offset_height + 128 -->
+    <dimen name="quick_qs_total_height">156dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index c6878d7..446c0a1 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -4779,7 +4779,7 @@
     // CATEGORY: SETTINGS
     ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK = 1210;
 
-    // FIELD - Manually selected mobile network
+    // Not used anymore.
     FIELD_MOBILE_NETWORK = 1211;
 
     // OPEN: Settings > Network & Internet > Mobile network > Access Point Names
@@ -5562,6 +5562,57 @@
     // OS: P
     PREVIOUSLY_CONNECTED_DEVICES = 1370;
 
+    // ACTION: A Settings Slice is requested
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_SETTINGS_SLICE_REQUESTED = 1371;
+
+    // ACTION: A Settings Slice is updated with new value
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_SETTINGS_SLICE_CHANGED = 1372;
+
+    // OPEN: Settings > Network & Internet > Wi-Fi > Wi-Fi Preferences > Turn on Wi-Fi automatically
+    //       note: Wifi Scanning must be off for this dialog to show
+    // CATEGORY: SETTINGS
+    // OS: P
+    WIFI_SCANNING_NEEDED_DIALOG = 1373;
+
+    // OPEN: Settings > System > Gestures > Swipe up gesture
+    // CATEGORY: SETTINGS
+    // OS: P
+    SETTINGS_GESTURE_SWIPE_UP = 1374;
+
+    // OPEN: Settings > Storage > Dialog to format a storage volume
+    // CATEGORY: SETTINGS
+    // OS: P
+    DIALOG_VOLUME_FORMAT = 1375;
+
+    // OPEN: DND onboarding activity > screen on checkbox
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_ZEN_ONBOARDING_SCREEN_ON = 1376;
+
+    // OPEN: DND onboarding activity > screen off checkbox
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_ZEN_ONBOARDING_SCREEN_OFF = 1377;
+
+    // OPEN: DND onboarding activity > Ok button
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_ZEN_ONBOARDING_OK = 1378;
+
+    // OPEN: DND onboarding activity > Settings link
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_ZEN_ONBOARDING_SETTINGS = 1379;
+
+    // OPEN: DND onboarding activity
+    // CATEGORY: SETTINGS
+    // OS: P
+    SETTINGS_ZEN_ONBOARDING = 1380;
+
     // ---- End P Constants, all P 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 934ad88..595a1d9 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -422,6 +422,16 @@
 
   // Indicates the number of times a scan request from an external background app was throttled.
   optional int32 num_external_background_app_oneshot_scan_requests_throttled = 106;
+
+  // WifiLastResortWatchdog time milliseconds delta between trigger and first connection success
+  optional int64 watchdog_trigger_to_connection_success_duration_ms = 107 [default = -1];
+
+  // The number of times wifi experienced failures after watchdog has already been triggered and is
+  // waiting for a connection success
+  optional int64 watchdog_total_connection_failure_count_after_trigger = 108;
+
+  // Number of times DFS channel scans are requested in single scan requests.
+  optional int32 num_oneshot_has_dfs_channel_scans = 109;
 }
 
 // Information that gets logged for every WiFi connection.
@@ -1271,9 +1281,16 @@
     // Start time of session in milliseconds.
     optional int64 start_time_millis = 1;
 
-    // The number of networks the lock was initialized with at start.
+    // The number of networks the lock was provided with at start.
     optional int32 locked_networks_at_start = 2;
 
+    // The number of networks in the lock at the time of the initialize event. Only valid if
+    // initialize_event is recorded.
+    optional int32 locked_networks_at_initialize = 6;
+
+    // Event for fully initializing the WakeupLock (i.e. WakeupLock is "locked").
+    optional Event initialize_event = 7;
+
     // Event for unlocking the WakeupLock. Does not occur if lock was initialized with 0 networks.
     optional Event unlock_event = 3;
 
@@ -1289,4 +1306,10 @@
 
   // Session information for every Wifi Wake session (up to a maximum of 10).
   repeated Session sessions = 2;
+
+  // Number of ignored calls to start (due to WakeupController already being active).
+  optional int32 num_ignored_starts = 3;
+
+  // Number of Wifi Wake sessions that have recorded wakeup events.
+  optional int32 num_wakeups = 4;
 }
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 5c5978a..28aa984 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -53,7 +53,6 @@
 import android.view.accessibility.IAccessibilityInteractionConnection;
 import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
 
-
 import com.android.internal.os.SomeArgs;
 import com.android.internal.util.DumpUtils;
 import com.android.server.accessibility.AccessibilityManagerService.RemoteAccessibilityConnection;
@@ -76,7 +75,7 @@
         implements ServiceConnection, IBinder.DeathRecipient, KeyEventDispatcher.KeyEventFilter,
         FingerprintGestureDispatcher.FingerprintGestureClient {
     private static final boolean DEBUG = false;
-    private static final String LOG_TAG = "AccessibilityClientConnection";
+    private static final String LOG_TAG = "AbstractAccessibilityServiceConnection";
 
     protected final Context mContext;
     protected final SystemSupport mSystemSupport;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index de112f9..08aa063 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2721,7 +2721,7 @@
             }
         }
 
-        private AccessibilityWindowInfo populateReportedWindow(WindowInfo window) {
+        private AccessibilityWindowInfo populateReportedWindowLocked(WindowInfo window) {
             final int windowId = findWindowIdLocked(window.token);
             if (windowId < 0) {
                 return null;
@@ -2949,7 +2949,7 @@
                 | AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED
                 | AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY;
 
-        // In Z order
+        // In Z order top to bottom
         public List<AccessibilityWindowInfo> mWindows;
         public SparseArray<AccessibilityWindowInfo> mA11yWindowInfoById = new SparseArray<>();
         public SparseArray<WindowInfo> mWindowInfoById = new SparseArray<>();
@@ -3140,11 +3140,19 @@
                     mAccessibilityFocusedWindowId != INVALID_WINDOW_ID;
             if (windowCount > 0) {
                 for (int i = 0; i < windowCount; i++) {
-                    WindowInfo windowInfo = windows.get(i);
-                    AccessibilityWindowInfo window = (mWindowsForAccessibilityCallback != null)
-                            ? mWindowsForAccessibilityCallback.populateReportedWindow(windowInfo)
-                            : null;
+                    final WindowInfo windowInfo = windows.get(i);
+                    final AccessibilityWindowInfo window;
+                    if (mWindowsForAccessibilityCallback != null) {
+                        window = mWindowsForAccessibilityCallback
+                                .populateReportedWindowLocked(windowInfo);
+                    } else {
+                        window = null;
+                    }
                     if (window != null) {
+
+                        // Flip layers in list to be consistent with AccessibilityService#getWindows
+                        window.setLayer(windowCount - 1 - window.getLayer());
+
                         final int windowId = window.getId();
                         if (window.isFocused()) {
                             mFocusedWindowId = windowId;
@@ -3169,7 +3177,7 @@
                 // active window once we decided which it is.
                 final int accessibilityWindowCount = mWindows.size();
                 for (int i = 0; i < accessibilityWindowCount; i++) {
-                    AccessibilityWindowInfo window = mWindows.get(i);
+                    final AccessibilityWindowInfo window = mWindows.get(i);
                     if (window.getId() == mActiveWindowId) {
                         window.setActive(true);
                     }
@@ -3188,7 +3196,10 @@
             }
 
             if (shouldClearAccessibilityFocus) {
-                clearAccessibilityFocus(mAccessibilityFocusedWindowId);
+                mMainHandler.sendMessage(obtainMessage(
+                        AccessibilityManagerService::clearAccessibilityFocus,
+                        AccessibilityManagerService.this,
+                        box(mAccessibilityFocusedWindowId)));
             }
         }
 
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index e14584f..06707da 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -99,6 +99,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
@@ -1400,6 +1401,7 @@
          *   the current values of all fields in the screen.
          */
         if (saveInfo == null) {
+            if (sVerbose) Slog.w(TAG, "showSaveLocked(): no saveInfo from service");
             return true;
         }
 
@@ -1970,8 +1972,8 @@
                     return;
                 }
 
-                if (value != null && !value.equals(viewState.getCurrentValue())) {
-                    if (value.isEmpty()
+                if (!Objects.equals(value, viewState.getCurrentValue())) {
+                    if ((value == null || value.isEmpty())
                             && viewState.getCurrentValue() != null
                             && viewState.getCurrentValue().isText()
                             && viewState.getCurrentValue().getTextValue() != null
@@ -1992,18 +1994,26 @@
                     // Must check if this update was caused by autofilling the view, in which
                     // case we just update the value, but not the UI.
                     final AutofillValue filledValue = viewState.getAutofilledValue();
-                    if (value.equals(filledValue)) {
+                    if (filledValue != null && filledValue.equals(value)) {
+                        if (sVerbose) {
+                            Slog.v(TAG, "ignoring autofilled change on id " + id);
+                        }
                         return;
                     }
                     // Update the internal state...
                     viewState.setState(ViewState.STATE_CHANGED);
 
                     //..and the UI
-                    if (value.isText()) {
-                        getUiForShowing().filterFillUi(value.getTextValue().toString(), this);
+                    final String filterText;
+                    if (value == null || !value.isText()) {
+                        filterText = null;
                     } else {
-                        getUiForShowing().filterFillUi(null, this);
+                        final CharSequence text = value.getTextValue();
+                        // Text should never be null, but it doesn't hurt to check to avoid a
+                        // system crash...
+                        filterText = (text == null) ? null : text.toString();
                     }
+                    getUiForShowing().filterFillUi(filterText, this);
                 }
                 break;
             case ACTION_VIEW_ENTERED:
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index 9210de2..2a76055 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -237,12 +237,7 @@
         }
         pw.print(prefix); pw.print("state:" ); pw.println(getStateAsString());
         if (mResponse != null) {
-            pw.print(prefix); pw.print("response:");
-            if (sVerbose) {
-                pw.println(mResponse);
-            } else {
-                pw.print("id=");pw.println(mResponse.getRequestId());
-            }
+            pw.print(prefix); pw.print("response id:");pw.println(mResponse.getRequestId());
         }
         if (mCurrentValue != null) {
             pw.print(prefix); pw.print("currentValue:" ); pw.println(mCurrentValue);
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index 7c0671f..d29ca05 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -656,6 +656,8 @@
         private final WindowManager mWm;
         private final View mContentView;
         private boolean mShowing;
+        // Used on dump only
+        private WindowManager.LayoutParams mShowParams;
 
         /**
          * Constructor.
@@ -672,16 +674,13 @@
          * Shows the window.
          */
         public void show(WindowManager.LayoutParams params) {
+            mShowParams = params;
             if (sVerbose) {
                 Slog.v(TAG, "show(): showing=" + mShowing + ", params=" + paramsToString(params));
             }
             try {
-                // Okay here is a bit of voodoo - we want to show the window as system
-                // controlled one so it covers app windows - adjust the params accordingly.
-                params.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
-                params.token = null;
                 params.packageName = "android";
-                params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+                params.setTitle("Autofill UI"); // Title is set for debugging purposes
                 if (!mShowing) {
                     params.accessibilityTitle = mContentView.getContext()
                             .getString(R.string.autofill_picker_accessibility_title);
@@ -760,6 +759,9 @@
             pw.println();
             pw.print(prefix2); pw.print("showing: "); pw.println(mWindow.mShowing);
             pw.print(prefix2); pw.print("view: "); pw.println(mWindow.mContentView);
+            if (mWindow.mShowParams != null) {
+                pw.print(prefix2); pw.print("params: "); pw.println(mWindow.mShowParams);
+            }
             pw.print(prefix2); pw.print("screen coordinates: ");
             if (mWindow.mContentView == null) {
                 pw.println("N/A");
diff --git a/services/backup/java/com/android/server/backup/transport/TransportClient.java b/services/backup/java/com/android/server/backup/transport/TransportClient.java
index fa881a9..e4dcb25 100644
--- a/services/backup/java/com/android/server/backup/transport/TransportClient.java
+++ b/services/backup/java/com/android/server/backup/transport/TransportClient.java
@@ -439,8 +439,17 @@
         synchronized (mStateLock) {
             log(Priority.ERROR, "Service disconnected: client UNUSABLE");
             setStateLocked(State.UNUSABLE, null);
-            // After unbindService() no calls back to mConnection
-            mContext.unbindService(mConnection);
+            try {
+                // After unbindService() no calls back to mConnection
+                mContext.unbindService(mConnection);
+            } catch (IllegalArgumentException e) {
+                // TODO: Investigate why this is happening
+                // We're UNUSABLE, so any calls to mConnection will be no-op, so it's safe to
+                // swallow this one
+                log(
+                        Priority.WARN,
+                        "Exception trying to unbind onServiceDisconnected(): " + e.getMessage());
+            }
         }
     }
 
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 861ae83..6463bed 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -52,6 +52,8 @@
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.PacketKeepalive;
 import android.net.IConnectivityManager;
+import android.net.IIpConnectivityMetrics;
+import android.net.INetdEventCallback;
 import android.net.INetworkManagementEventObserver;
 import android.net.INetworkPolicyListener;
 import android.net.INetworkPolicyManager;
@@ -140,6 +142,7 @@
 import com.android.server.connectivity.DataConnectionStats;
 import com.android.server.connectivity.DnsManager;
 import com.android.server.connectivity.DnsManager.PrivateDnsConfig;
+import com.android.server.connectivity.DnsManager.PrivateDnsValidationUpdate;
 import com.android.server.connectivity.IpConnectivityMetrics;
 import com.android.server.connectivity.KeepaliveTracker;
 import com.android.server.connectivity.LingerMonitor;
@@ -155,6 +158,7 @@
 import com.android.server.connectivity.Tethering;
 import com.android.server.connectivity.Vpn;
 import com.android.server.connectivity.tethering.TetheringDependencies;
+import com.android.server.net.BaseNetdEventCallback;
 import com.android.server.net.BaseNetworkObserver;
 import com.android.server.net.LockdownVpnTracker;
 import com.android.server.net.NetworkPolicyManagerInternal;
@@ -256,6 +260,7 @@
     private INetworkStatsService mStatsService;
     private INetworkPolicyManager mPolicyManager;
     private NetworkPolicyManagerInternal mPolicyManagerInternal;
+    private IIpConnectivityMetrics mIpConnectivityMetrics;
 
     private String mCurrentTcpBufferSizes;
 
@@ -414,6 +419,9 @@
     // Handle changes in Private DNS settings.
     private static final int EVENT_PRIVATE_DNS_SETTINGS_CHANGED = 37;
 
+    // Handle private DNS validation status updates.
+    private static final int EVENT_PRIVATE_DNS_VALIDATION_UPDATE = 38;
+
     private static String eventName(int what) {
         return sMagicDecoderRing.get(what, Integer.toString(what));
     }
@@ -910,7 +918,12 @@
 
     private Tethering makeTethering() {
         // TODO: Move other elements into @Overridden getters.
-        final TetheringDependencies deps = new TetheringDependencies();
+        final TetheringDependencies deps = new TetheringDependencies() {
+            @Override
+            public boolean isTetheringSupported() {
+                return ConnectivityService.this.isTetheringSupported();
+            }
+        };
         return new Tethering(mContext, mNetd, mStatsService, mPolicyManager,
                 IoThread.get().getLooper(), new MockableSystemProperties(),
                 deps);
@@ -929,7 +942,7 @@
 
     // Used only for testing.
     // TODO: Delete this and either:
-    // 1. Give Fake SettingsProvider the ability to send settings change notifications (requires
+    // 1. Give FakeSettingsProvider the ability to send settings change notifications (requires
     //    changing ContentResolver to make registerContentObserver non-final).
     // 2. Give FakeSettingsProvider an alternative notification mechanism and have the test use it
     //    by subclassing SettingsObserver.
@@ -938,6 +951,12 @@
         mHandler.sendEmptyMessage(EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON);
     }
 
+    // See FakeSettingsProvider comment above.
+    @VisibleForTesting
+    void updatePrivateDnsSettings() {
+        mHandler.sendEmptyMessage(EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
+    }
+
     private void handleMobileDataAlwaysOn() {
         final boolean enable = toBool(Settings.Global.getInt(
                 mContext.getContentResolver(), Settings.Global.MOBILE_DATA_ALWAYS_ON, 1));
@@ -967,8 +986,8 @@
     }
 
     private void registerPrivateDnsSettingsCallbacks() {
-        for (Uri u : DnsManager.getPrivateDnsSettingsUris()) {
-            mSettingsObserver.observe(u, EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
+        for (Uri uri : DnsManager.getPrivateDnsSettingsUris()) {
+            mSettingsObserver.observe(uri, EVENT_PRIVATE_DNS_SETTINGS_CHANGED);
         }
     }
 
@@ -1021,8 +1040,12 @@
         if (network == null) {
             return null;
         }
+        return getNetworkAgentInfoForNetId(network.netId);
+    }
+
+    private NetworkAgentInfo getNetworkAgentInfoForNetId(int netId) {
         synchronized (mNetworkForNetId) {
-            return mNetworkForNetId.get(network.netId);
+            return mNetworkForNetId.get(netId);
         }
     }
 
@@ -1162,9 +1185,7 @@
         }
         NetworkAgentInfo nai;
         if (vpnNetId != NETID_UNSET) {
-            synchronized (mNetworkForNetId) {
-                nai = mNetworkForNetId.get(vpnNetId);
-            }
+            nai = getNetworkAgentInfoForNetId(vpnNetId);
             if (nai != null) return nai.network;
         }
         nai = getDefaultNetwork();
@@ -1540,6 +1561,41 @@
         return true;
     }
 
+    @VisibleForTesting
+    protected final INetdEventCallback mNetdEventCallback = new BaseNetdEventCallback() {
+        @Override
+        public void onPrivateDnsValidationEvent(int netId, String ipAddress,
+                String hostname, boolean validated) {
+            try {
+                mHandler.sendMessage(mHandler.obtainMessage(
+                        EVENT_PRIVATE_DNS_VALIDATION_UPDATE,
+                        new PrivateDnsValidationUpdate(netId,
+                                InetAddress.parseNumericAddress(ipAddress),
+                                hostname, validated)));
+            } catch (IllegalArgumentException e) {
+                loge("Error parsing ip address in validation event");
+            }
+        }
+    };
+
+    @VisibleForTesting
+    protected void registerNetdEventCallback() {
+        mIpConnectivityMetrics =
+                (IIpConnectivityMetrics) IIpConnectivityMetrics.Stub.asInterface(
+                ServiceManager.getService(IpConnectivityLog.SERVICE_NAME));
+        if (mIpConnectivityMetrics == null) {
+            Slog.wtf(TAG, "Missing IIpConnectivityMetrics");
+        }
+
+        try {
+            mIpConnectivityMetrics.addNetdEventCallback(
+                    INetdEventCallback.CALLBACK_CALLER_CONNECTIVITY_SERVICE,
+                    mNetdEventCallback);
+        } catch (Exception e) {
+            loge("Error registering netd callback: " + e);
+        }
+    }
+
     private final INetworkPolicyListener mPolicyListener = new NetworkPolicyManager.Listener() {
         @Override
         public void onUidRulesChanged(int uid, int uidRules) {
@@ -1725,6 +1781,7 @@
 
     void systemReady() {
         loadGlobalProxy();
+        registerNetdEventCallback();
 
         synchronized (this) {
             mSystemReady = true;
@@ -2150,41 +2207,21 @@
                 default:
                     return false;
                 case NetworkMonitor.EVENT_NETWORK_TESTED: {
-                    final NetworkAgentInfo nai;
-                    synchronized (mNetworkForNetId) {
-                        nai = mNetworkForNetId.get(msg.arg2);
-                    }
+                    final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
                     if (nai == null) break;
 
                     final boolean valid = (msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID);
                     final boolean wasValidated = nai.lastValidated;
                     final boolean wasDefault = isDefaultNetwork(nai);
 
-                    final PrivateDnsConfig privateDnsCfg = (msg.obj instanceof PrivateDnsConfig)
-                            ? (PrivateDnsConfig) msg.obj : null;
                     final String redirectUrl = (msg.obj instanceof String) ? (String) msg.obj : "";
 
-                    final boolean reevaluationRequired;
-                    final String logMsg;
-                    if (valid) {
-                        reevaluationRequired = updatePrivateDns(nai, privateDnsCfg);
-                        logMsg = (DBG && (privateDnsCfg != null))
-                                 ? " with " + privateDnsCfg.toString() : "";
-                    } else {
-                        reevaluationRequired = false;
-                        logMsg = (DBG && !TextUtils.isEmpty(redirectUrl))
-                                 ? " with redirect to " + redirectUrl : "";
-                    }
                     if (DBG) {
+                        final String logMsg = !TextUtils.isEmpty(redirectUrl)
+                                 ? " with redirect to " + redirectUrl
+                                 : "";
                         log(nai.name() + " validation " + (valid ? "passed" : "failed") + logMsg);
                     }
-                    // If there is a change in Private DNS configuration,
-                    // trigger reevaluation of the network to test it.
-                    if (reevaluationRequired) {
-                        nai.networkMonitor.sendMessage(
-                                NetworkMonitor.CMD_FORCE_REEVALUATION, Process.SYSTEM_UID);
-                        break;
-                    }
                     if (valid != nai.lastValidated) {
                         if (wasDefault) {
                             metricsLogger().defaultNetworkMetrics().logDefaultNetworkValidity(
@@ -2213,10 +2250,7 @@
                 case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: {
                     final int netId = msg.arg2;
                     final boolean visible = toBool(msg.arg1);
-                    final NetworkAgentInfo nai;
-                    synchronized (mNetworkForNetId) {
-                        nai = mNetworkForNetId.get(netId);
-                    }
+                    final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(netId);
                     // If captive portal status has changed, update capabilities or disconnect.
                     if (nai != null && (visible != nai.lastCaptivePortalDetected)) {
                         final int oldScore = nai.getCurrentScore();
@@ -2247,18 +2281,10 @@
                     break;
                 }
                 case NetworkMonitor.EVENT_PRIVATE_DNS_CONFIG_RESOLVED: {
-                    final NetworkAgentInfo nai;
-                    synchronized (mNetworkForNetId) {
-                        nai = mNetworkForNetId.get(msg.arg2);
-                    }
+                    final NetworkAgentInfo nai = getNetworkAgentInfoForNetId(msg.arg2);
                     if (nai == null) break;
 
-                    final PrivateDnsConfig cfg = (PrivateDnsConfig) msg.obj;
-                    final boolean reevaluationRequired = updatePrivateDns(nai, cfg);
-                    if (nai.lastValidated && reevaluationRequired) {
-                        nai.networkMonitor.sendMessage(
-                                NetworkMonitor.CMD_FORCE_REEVALUATION, Process.SYSTEM_UID);
-                    }
+                    updatePrivateDns(nai, (PrivateDnsConfig) msg.obj);
                     break;
                 }
             }
@@ -2296,61 +2322,50 @@
         }
     }
 
+    private boolean networkRequiresValidation(NetworkAgentInfo nai) {
+        return NetworkMonitor.isValidationRequired(
+                mDefaultRequest.networkCapabilities, nai.networkCapabilities);
+    }
+
     private void handlePrivateDnsSettingsChanged() {
         final PrivateDnsConfig cfg = mDnsManager.getPrivateDnsConfig();
 
         for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
-            // Private DNS only ever applies to networks that might provide
-            // Internet access and therefore also require validation.
-            if (!NetworkMonitor.isValidationRequired(
-                    mDefaultRequest.networkCapabilities, nai.networkCapabilities)) {
-                continue;
-            }
-
-            // Notify the NetworkMonitor thread in case it needs to cancel or
-            // schedule DNS resolutions. If a DNS resolution is required the
-            // result will be sent back to us.
-            nai.networkMonitor.notifyPrivateDnsSettingsChanged(cfg);
-
-            if (!cfg.inStrictMode()) {
-                // No strict mode hostname DNS resolution needed, so just update
-                // DNS settings directly. In opportunistic and "off" modes this
-                // just reprograms netd with the network-supplied DNS servers
-                // (and of course the boolean of whether or not to attempt TLS).
-                //
-                // TODO: Consider code flow parity with strict mode, i.e. having
-                // NetworkMonitor relay the PrivateDnsConfig back to us and then
-                // performing this call at that time.
-                updatePrivateDns(nai, cfg);
+            handlePerNetworkPrivateDnsConfig(nai, cfg);
+            if (networkRequiresValidation(nai)) {
+                handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
             }
         }
     }
 
-    private boolean updatePrivateDns(NetworkAgentInfo nai, PrivateDnsConfig newCfg) {
-        final boolean reevaluationRequired = true;
-        final boolean dontReevaluate = false;
+    private void handlePerNetworkPrivateDnsConfig(NetworkAgentInfo nai, PrivateDnsConfig cfg) {
+        // Private DNS only ever applies to networks that might provide
+        // Internet access and therefore also require validation.
+        if (!networkRequiresValidation(nai)) return;
 
-        final PrivateDnsConfig oldCfg = mDnsManager.updatePrivateDns(nai.network, newCfg);
+        // Notify the NetworkMonitor thread in case it needs to cancel or
+        // schedule DNS resolutions. If a DNS resolution is required the
+        // result will be sent back to us.
+        nai.networkMonitor.notifyPrivateDnsSettingsChanged(cfg);
+
+        // With Private DNS bypass support, we can proceed to update the
+        // Private DNS config immediately, even if we're in strict mode
+        // and have not yet resolved the provider name into a set of IPs.
+        updatePrivateDns(nai, cfg);
+    }
+
+    private void updatePrivateDns(NetworkAgentInfo nai, PrivateDnsConfig newCfg) {
+        mDnsManager.updatePrivateDns(nai.network, newCfg);
         updateDnses(nai.linkProperties, null, nai.network.netId);
+    }
 
-        if (newCfg == null) {
-            if (oldCfg == null) return dontReevaluate;
-            return oldCfg.useTls ? reevaluationRequired : dontReevaluate;
+    private void handlePrivateDnsValidationUpdate(PrivateDnsValidationUpdate update) {
+        NetworkAgentInfo nai = getNetworkAgentInfoForNetId(update.netId);
+        if (nai == null) {
+            return;
         }
-
-        if (oldCfg == null) {
-            return newCfg.useTls ? reevaluationRequired : dontReevaluate;
-        }
-
-        if (oldCfg.useTls != newCfg.useTls) {
-            return reevaluationRequired;
-        }
-
-        if (newCfg.inStrictMode() && !Objects.equals(oldCfg.hostname, newCfg.hostname)) {
-            return reevaluationRequired;
-        }
-
-        return dontReevaluate;
+        mDnsManager.updatePrivateDnsValidation(update);
+        handleUpdateLinkProperties(nai, new LinkProperties(nai.linkProperties));
     }
 
     private void updateLingerState(NetworkAgentInfo nai, long now) {
@@ -3043,6 +3058,10 @@
                 case EVENT_PRIVATE_DNS_SETTINGS_CHANGED:
                     handlePrivateDnsSettingsChanged();
                     break;
+                case EVENT_PRIVATE_DNS_VALIDATION_UPDATE:
+                    handlePrivateDnsValidationUpdate(
+                            (PrivateDnsValidationUpdate) msg.obj);
+                    break;
             }
         }
     }
@@ -3295,7 +3314,7 @@
         if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
             return;
         }
-        nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
+        nai.networkMonitor.forceReevaluation(uid);
     }
 
     private ProxyInfo getDefaultProxy() {
@@ -4616,6 +4635,11 @@
 
         updateRoutes(newLp, oldLp, netId);
         updateDnses(newLp, oldLp, netId);
+        // Make sure LinkProperties represents the latest private DNS status.
+        // This does not need to be done before updateDnses because the
+        // LinkProperties are not the source of the private DNS configuration.
+        // updateDnses will fetch the private DNS configuration from DnsManager.
+        mDnsManager.updatePrivateDnsStatus(netId, newLp);
 
         // Start or stop clat accordingly to network state.
         networkAgent.updateClat(mNetd);
@@ -4914,7 +4938,7 @@
     }
 
     public void handleUpdateLinkProperties(NetworkAgentInfo nai, LinkProperties newLp) {
-        if (mNetworkForNetId.get(nai.network.netId) != nai) {
+        if (getNetworkAgentInfoForNetId(nai.network.netId) != nai) {
             // Ignore updates for disconnected networks
             return;
         }
@@ -5490,6 +5514,7 @@
         if (!networkAgent.everConnected && state == NetworkInfo.State.CONNECTED) {
             networkAgent.everConnected = true;
 
+            handlePerNetworkPrivateDnsConfig(networkAgent, mDnsManager.getPrivateDnsConfig());
             updateLinkProperties(networkAgent, null);
             notifyIfacesChangedForNetworkStats();
 
@@ -5906,4 +5931,4 @@
             pw.println("    Get airplane mode.");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 45c9a71..48bb409 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -219,7 +219,7 @@
 # DisplayManagerService.java
 # ---------------------------
 # Auto-brightness adjustments by the user.
-35000 auto_brightness_adj (old_adj|5),(old_lux|5),(old_brightness|5),(old_gamma|5),(new_adj|5),(new_lux|5),(new_brightness|5),(new_gamma|5)
+35000 auto_brightness_adj (old_lux|5),(old_brightness|5),(new_lux|5),(new_brightness|5)
 
 # ---------------------------
 # ConnectivityService.java
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 40f9476..f678eed 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -263,17 +263,19 @@
     private static final class DebugFlag {
         private static final Object LOCK = new Object();
         private final String mKey;
+        private final boolean mDefaultValue;
         @GuardedBy("LOCK")
         private boolean mValue;
 
         public DebugFlag(String key, boolean defaultValue) {
             mKey = key;
+            mDefaultValue = defaultValue;
             mValue = SystemProperties.getBoolean(key, defaultValue);
         }
 
         void refresh() {
             synchronized (LOCK) {
-                mValue = SystemProperties.getBoolean(mKey, true);
+                mValue = SystemProperties.getBoolean(mKey, mDefaultValue);
             }
         }
 
diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java
index bde6bd8..cd90e3f 100644
--- a/services/core/java/com/android/server/IpSecService.java
+++ b/services/core/java/com/android/server/IpSecService.java
@@ -24,6 +24,8 @@
 import static android.system.OsConstants.SOCK_DGRAM;
 import static com.android.internal.util.Preconditions.checkNotNull;
 
+import android.annotation.NonNull;
+import android.app.AppOpsManager;
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.IIpSecService;
@@ -42,6 +44,7 @@
 import android.net.TrafficStats;
 import android.net.util.NetdService;
 import android.os.Binder;
+import android.os.DeadSystemException;
 import android.os.IBinder;
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
@@ -974,6 +977,13 @@
         return service;
     }
 
+    @NonNull
+    private AppOpsManager getAppOpsManager() {
+        AppOpsManager appOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+        if(appOps == null) throw new RuntimeException("System Server couldn't get AppOps");
+        return appOps;
+    }
+
     /** @hide */
     @VisibleForTesting
     public IpSecService(Context context, IpSecServiceConfiguration config) {
@@ -1240,7 +1250,9 @@
      */
     @Override
     public synchronized IpSecTunnelInterfaceResponse createTunnelInterface(
-            String localAddr, String remoteAddr, Network underlyingNetwork, IBinder binder) {
+            String localAddr, String remoteAddr, Network underlyingNetwork, IBinder binder,
+            String callingPackage) {
+        enforceTunnelPermissions(callingPackage);
         checkNotNull(binder, "Null Binder passed to createTunnelInterface");
         checkNotNull(underlyingNetwork, "No underlying network was specified");
         checkInetAddress(localAddr);
@@ -1320,8 +1332,8 @@
      */
     @Override
     public synchronized void addAddressToTunnelInterface(
-            int tunnelResourceId, LinkAddress localAddr) {
-        enforceNetworkStackPermission();
+            int tunnelResourceId, LinkAddress localAddr, String callingPackage) {
+        enforceTunnelPermissions(callingPackage);
         UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
 
         // Get tunnelInterface record; if no such interface is found, will throw
@@ -1352,10 +1364,10 @@
      */
     @Override
     public synchronized void removeAddressFromTunnelInterface(
-            int tunnelResourceId, LinkAddress localAddr) {
-        enforceNetworkStackPermission();
-        UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
+            int tunnelResourceId, LinkAddress localAddr, String callingPackage) {
+        enforceTunnelPermissions(callingPackage);
 
+        UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
         // Get tunnelInterface record; if no such interface is found, will throw
         // IllegalArgumentException
         TunnelInterfaceRecord tunnelInterfaceInfo =
@@ -1383,7 +1395,9 @@
      * server
      */
     @Override
-    public synchronized void deleteTunnelInterface(int resourceId) throws RemoteException {
+    public synchronized void deleteTunnelInterface(
+            int resourceId, String callingPackage) throws RemoteException {
+        enforceTunnelPermissions(callingPackage);
         UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
         releaseResource(userRecord.mTunnelInterfaceRecords, resourceId);
     }
@@ -1469,7 +1483,6 @@
             case IpSecTransform.MODE_TRANSPORT:
                 break;
             case IpSecTransform.MODE_TUNNEL:
-                enforceNetworkStackPermission();
                 break;
             default:
                 throw new IllegalArgumentException(
@@ -1477,9 +1490,20 @@
         }
     }
 
-    private void enforceNetworkStackPermission() {
-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.NETWORK_STACK,
-                "IpSecService");
+    private void enforceTunnelPermissions(String callingPackage) {
+        checkNotNull(callingPackage, "Null calling package cannot create IpSec tunnels");
+        switch (getAppOpsManager().noteOp(
+                    AppOpsManager.OP_MANAGE_IPSEC_TUNNELS,
+                    Binder.getCallingUid(), callingPackage)) {
+            case AppOpsManager.MODE_DEFAULT:
+                mContext.enforceCallingOrSelfPermission(
+                        android.Manifest.permission.MANAGE_IPSEC_TUNNELS, "IpSecService");
+                break;
+            case AppOpsManager.MODE_ALLOWED:
+                return;
+            default:
+                throw new SecurityException("Request to ignore AppOps for non-legacy API");
+        }
     }
 
     private void createOrUpdateTransform(
@@ -1535,8 +1559,12 @@
      * result in all of those sockets becoming unable to send or receive data.
      */
     @Override
-    public synchronized IpSecTransformResponse createTransform(IpSecConfig c, IBinder binder)
-            throws RemoteException {
+    public synchronized IpSecTransformResponse createTransform(
+            IpSecConfig c, IBinder binder, String callingPackage) throws RemoteException {
+        checkNotNull(c);
+        if (c.getMode() == IpSecTransform.MODE_TUNNEL) {
+            enforceTunnelPermissions(callingPackage);
+        }
         checkIpSecConfig(c);
         checkNotNull(binder, "Null Binder passed to createTransform");
         final int resourceId = mNextResourceId++;
@@ -1657,8 +1685,9 @@
      */
     @Override
     public synchronized void applyTunnelModeTransform(
-            int tunnelResourceId, int direction, int transformResourceId) throws RemoteException {
-        enforceNetworkStackPermission();
+            int tunnelResourceId, int direction,
+            int transformResourceId, String callingPackage) throws RemoteException {
+        enforceTunnelPermissions(callingPackage);
         checkDirection(direction);
 
         UserRecord userRecord = mUserResourceTracker.getUserRecord(Binder.getCallingUid());
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 26b83f5..fb5fba0 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1344,13 +1344,7 @@
      * @param provider the name of the location provider
      */
     private boolean isAllowedByCurrentUserSettingsLocked(String provider) {
-        if (mEnabledProviders.contains(provider)) {
-            return true;
-        }
-        if (mDisabledProviders.contains(provider)) {
-            return false;
-        }
-        return isLocationProviderEnabledForUser(provider, mCurrentUserId);
+        return isAllowedByUserSettingsLockedForUser(provider, mCurrentUserId);
     }
 
     /**
@@ -1359,13 +1353,33 @@
      * processes belonging to background users.
      *
      * @param provider the name of the location provider
-     * @param uid      the requestor's UID
+     * @param userId   the user id to query
      */
-    private boolean isAllowedByUserSettingsLocked(String provider, int uid) {
+    private boolean isAllowedByUserSettingsLockedForUser(String provider, int userId) {
+        if (mEnabledProviders.contains(provider)) {
+            return true;
+        }
+        if (mDisabledProviders.contains(provider)) {
+            return false;
+        }
+        return isLocationProviderEnabledForUser(provider, userId);
+    }
+
+
+    /**
+     * Returns "true" if access to the specified location provider is allowed by the specified
+     * user's settings. Access to all location providers is forbidden to non-location-provider
+     * processes belonging to background users.
+     *
+     * @param provider the name of the location provider
+     * @param uid      the requestor's UID
+     * @param userId   the user id to query
+     */
+    private boolean isAllowedByUserSettingsLocked(String provider, int uid, int userId) {
         if (!isCurrentProfile(UserHandle.getUserId(uid)) && !isUidALocationProvider(uid)) {
             return false;
         }
-        return isAllowedByCurrentUserSettingsLocked(provider);
+        return isAllowedByUserSettingsLockedForUser(provider, userId);
     }
 
     /**
@@ -1572,7 +1586,8 @@
                         continue;
                     }
                     if (allowedResolutionLevel >= getMinimumResolutionLevelForProviderUse(name)) {
-                        if (enabledOnly && !isAllowedByUserSettingsLocked(name, uid)) {
+                        if (enabledOnly
+                                && !isAllowedByUserSettingsLocked(name, uid, mCurrentUserId)) {
                             continue;
                         }
                         if (criteria != null && !LocationProvider.propertiesMeetCriteria(
@@ -2098,7 +2113,7 @@
             oldRecord.disposeLocked(false);
         }
 
-        boolean isProviderEnabled = isAllowedByUserSettingsLocked(name, uid);
+        boolean isProviderEnabled = isAllowedByUserSettingsLocked(name, uid, mCurrentUserId);
         if (isProviderEnabled) {
             applyRequirementsLocked(name);
         } else {
@@ -2219,7 +2234,7 @@
                 LocationProviderInterface provider = mProvidersByName.get(name);
                 if (provider == null) return null;
 
-                if (!isAllowedByUserSettingsLocked(name, uid)) return null;
+                if (!isAllowedByUserSettingsLocked(name, uid, mCurrentUserId)) return null;
 
                 Location location;
                 if (allowedResolutionLevel < RESOLUTION_LEVEL_FINE) {
@@ -2540,6 +2555,173 @@
     }
 
     /**
+     *  Returns the current location enabled/disabled status for a user
+     *
+     *  @param userId the id of the user
+     *  @return true if location is enabled
+     */
+    @Override
+    public boolean isLocationEnabledForUser(int userId) {
+        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
+        checkInteractAcrossUsersPermission(userId);
+
+        long identity = Binder.clearCallingIdentity();
+        try {
+            synchronized (mLock) {
+                final String allowedProviders = Settings.Secure.getStringForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+                        userId);
+                if (allowedProviders == null) {
+                    return false;
+                }
+                final List<String> providerList = Arrays.asList(allowedProviders.split(","));
+                for(String provider : mRealProviders.keySet()) {
+                    if (provider.equals(LocationManager.PASSIVE_PROVIDER)
+                            || provider.equals(LocationManager.FUSED_PROVIDER)) {
+                        continue;
+                    }
+                    if (providerList.contains(provider)) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    /**
+     *  Enable or disable location for a user
+     *
+     *  @param enabled true to enable location, false to disable location
+     *  @param userId the id of the user
+     */
+    @Override
+    public void setLocationEnabledForUser(boolean enabled, int userId) {
+        mContext.enforceCallingPermission(
+            android.Manifest.permission.WRITE_SECURE_SETTINGS,
+            "Requires WRITE_SECURE_SETTINGS permission");
+
+        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
+        checkInteractAcrossUsersPermission(userId);
+
+        long identity = Binder.clearCallingIdentity();
+        try {
+            synchronized (mLock) {
+                final Set<String> allRealProviders = mRealProviders.keySet();
+                // Update all providers on device plus gps and network provider when disabling
+                // location
+                Set<String> allProvidersSet = new ArraySet<>(allRealProviders.size() + 2);
+                allProvidersSet.addAll(allRealProviders);
+                // When disabling location, disable gps and network provider that could have been
+                // enabled by location mode api.
+                if (enabled == false) {
+                    allProvidersSet.add(LocationManager.GPS_PROVIDER);
+                    allProvidersSet.add(LocationManager.NETWORK_PROVIDER);
+                }
+                if (allProvidersSet.isEmpty()) {
+                    return;
+                }
+                // to ensure thread safety, we write the provider name with a '+' or '-'
+                // and let the SettingsProvider handle it rather than reading and modifying
+                // the list of enabled providers.
+                final String prefix = enabled ? "+" : "-";
+                StringBuilder locationProvidersAllowed = new StringBuilder();
+                for (String provider : allProvidersSet) {
+                    if (provider.equals(LocationManager.PASSIVE_PROVIDER)
+                            || provider.equals(LocationManager.FUSED_PROVIDER)) {
+                        continue;
+                    }
+                    locationProvidersAllowed.append(prefix);
+                    locationProvidersAllowed.append(provider);
+                    locationProvidersAllowed.append(",");
+                }
+                // Remove the trailing comma
+                locationProvidersAllowed.setLength(locationProvidersAllowed.length() - 1);
+                Settings.Secure.putStringForUser(
+                        mContext.getContentResolver(),
+                        Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+                        locationProvidersAllowed.toString(),
+                        userId);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    /**
+     *  Returns the current enabled/disabled status of a location provider and user
+     *
+     *  @param provider name of the provider
+     *  @param userId the id of the user
+     *  @return true if the provider exists and is enabled
+     */
+    @Override
+    public boolean isProviderEnabledForUser(String provider, int userId) {
+        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
+        checkInteractAcrossUsersPermission(userId);
+
+        // Fused provider is accessed indirectly via criteria rather than the provider-based APIs,
+        // so we discourage its use
+        if (LocationManager.FUSED_PROVIDER.equals(provider)) return false;
+
+        int uid = Binder.getCallingUid();
+        synchronized (mLock) {
+            LocationProviderInterface p = mProvidersByName.get(provider);
+            return p != null
+                    && isAllowedByUserSettingsLocked(provider, uid, userId);
+        }
+    }
+
+    /**
+     * Enable or disable a single location provider.
+     *
+     * @param provider name of the provider
+     * @param enabled true to enable the provider. False to disable the provider
+     * @param userId the id of the user to set
+     * @return true if the value was set, false on errors
+     */
+    @Override
+    public boolean setProviderEnabledForUser(String provider, boolean enabled, int userId) {
+        mContext.enforceCallingPermission(
+                android.Manifest.permission.WRITE_SECURE_SETTINGS,
+                "Requires WRITE_SECURE_SETTINGS permission");
+
+        // Check INTERACT_ACROSS_USERS permission if userId is not current user id.
+        checkInteractAcrossUsersPermission(userId);
+
+        // Fused provider is accessed indirectly via criteria rather than the provider-based APIs,
+        // so we discourage its use
+        if (LocationManager.FUSED_PROVIDER.equals(provider)) return false;
+
+        long identity = Binder.clearCallingIdentity();
+        try {
+            synchronized (mLock) {
+                // No such provider exists
+                if (!mProvidersByName.containsKey(provider)) return false;
+
+                // If it is a test provider, do not write to Settings.Secure
+                if (mMockProviders.containsKey(provider)) {
+                    setTestProviderEnabled(provider, enabled);
+                    return true;
+                }
+
+                // to ensure thread safety, we write the provider name with a '+' or '-'
+                // and let the SettingsProvider handle it rather than reading and modifying
+                // the list of enabled providers.
+                String providerChange = (enabled ? "+" : "-") + provider;
+                return Settings.Secure.putStringForUser(
+                        mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
+                        providerChange, userId);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    /**
      * Read location provider status from Settings.Secure
      *
      * @param provider the location provider to query
@@ -2560,6 +2742,23 @@
     }
 
     /**
+     * Method for checking INTERACT_ACROSS_USERS permission if specified user id is not the same as
+     * current user id
+     *
+     * @param userId the user id to get or set value
+     */
+    private void checkInteractAcrossUsersPermission(int userId) {
+        int uid = Binder.getCallingUid();
+        if (UserHandle.getUserId(uid) != userId) {
+            if (ActivityManager.checkComponentPermission(
+                    android.Manifest.permission.INTERACT_ACROSS_USERS, uid, -1, true)
+                    != PERMISSION_GRANTED) {
+                throw new SecurityException("Requires INTERACT_ACROSS_USERS permission");
+            }
+        }
+    }
+
+    /**
      * Returns "true" if the UID belongs to a bound location provider.
      *
      * @param uid the uid
@@ -3076,7 +3275,11 @@
         if (!canCallerAccessMockLocation(opPackageName)) {
             return;
         }
+        setTestProviderEnabled(provider, enabled);
+    }
 
+    /** Enable or disable a test location provider. */
+    private void setTestProviderEnabled(String provider, boolean enabled) {
         synchronized (mLock) {
             MockProvider mockProvider = mMockProviders.get(provider);
             if (mockProvider == null) {
diff --git a/services/core/java/com/android/server/LockGuard.java b/services/core/java/com/android/server/LockGuard.java
index b744917..5ce16c4 100644
--- a/services/core/java/com/android/server/LockGuard.java
+++ b/services/core/java/com/android/server/LockGuard.java
@@ -16,10 +16,14 @@
 
 package com.android.server;
 
+import android.annotation.Nullable;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.ArraySet;
 import android.util.Slog;
 
+import com.android.internal.os.BackgroundThread;
+
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 
@@ -60,8 +64,6 @@
 public class LockGuard {
     private static final String TAG = "LockGuard";
 
-    public static final boolean ENABLED = false;
-
     /**
      * Well-known locks ordered by fixed index. Locks with a specific index
      * should never be acquired while holding a lock of a lower index.
@@ -73,8 +75,9 @@
     public static final int INDEX_STORAGE = 4;
     public static final int INDEX_WINDOW = 5;
     public static final int INDEX_ACTIVITY = 6;
+    public static final int INDEX_DPMS = 7;
 
-    private static Object[] sKnownFixed = new Object[INDEX_ACTIVITY + 1];
+    private static Object[] sKnownFixed = new Object[INDEX_DPMS + 1];
 
     private static ArrayMap<Object, LockInfo> sKnown = new ArrayMap<>(0, true);
 
@@ -84,6 +87,9 @@
 
         /** Child locks that can be acquired while this lock is already held */
         public ArraySet<Object> children = new ArraySet<>(0, true);
+
+        /** If true, do wtf instead of a warning log. */
+        public boolean doWtf;
     }
 
     private static LockInfo findOrCreateLockInfo(Object lock) {
@@ -114,9 +120,9 @@
             if (child == null) continue;
 
             if (Thread.holdsLock(child)) {
-                Slog.w(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding "
-                      + lockToString(child) + " while trying to acquire "
-                      + lockToString(lock), new Throwable());
+                doLog(lock, "Calling thread " + Thread.currentThread().getName()
+                        + " is holding " + lockToString(child) + " while trying to acquire "
+                        + lockToString(lock));
                 triggered = true;
             }
         }
@@ -145,13 +151,30 @@
         for (int i = 0; i < index; i++) {
             final Object lock = sKnownFixed[i];
             if (lock != null && Thread.holdsLock(lock)) {
-                Slog.w(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding "
-                        + lockToString(i) + " while trying to acquire "
-                        + lockToString(index), new Throwable());
+
+                // Note in this case sKnownFixed may not contain a lock at the given index,
+                // which is okay and in that case we just don't do a WTF.
+                final Object targetMayBeNull = sKnownFixed[index];
+                doLog(targetMayBeNull, "Calling thread " + Thread.currentThread().getName()
+                        + " is holding " + lockToString(i) + " while trying to acquire "
+                        + lockToString(index));
             }
         }
     }
 
+    private static void doLog(@Nullable Object lock, String message) {
+        if (lock != null && findOrCreateLockInfo(lock).doWtf) {
+
+            // Don't want to call into ActivityManager with any lock held, so let's just call it
+            // from a new thread. We don't want to use known threads (e.g. BackgroundThread) either
+            // because they may be stuck too.
+            final Throwable stackTrace = new RuntimeException(message);
+            new Thread(() -> Slog.wtf(TAG, stackTrace)).start();
+            return;
+        }
+        Slog.w(TAG, message, new Throwable());
+    }
+
     /**
      * Report the given lock with a well-known label.
      */
@@ -165,19 +188,33 @@
      * Report the given lock with a well-known index.
      */
     public static Object installLock(Object lock, int index) {
+        return installLock(lock, index, /*doWtf=*/ false);
+    }
+
+    /**
+     * Report the given lock with a well-known index.
+     */
+    public static Object installLock(Object lock, int index, boolean doWtf) {
         sKnownFixed[index] = lock;
+        final LockInfo info = findOrCreateLockInfo(lock);
+        info.doWtf = doWtf;
+        info.label = "Lock-" + lockToString(index);
         return lock;
     }
 
     public static Object installNewLock(int index) {
+        return installNewLock(index, /*doWtf=*/ false);
+    }
+
+    public static Object installNewLock(int index, boolean doWtf) {
         final Object lock = new Object();
-        installLock(lock, index);
+        installLock(lock, index, doWtf);
         return lock;
     }
 
     private static String lockToString(Object lock) {
         final LockInfo info = sKnown.get(lock);
-        if (info != null) {
+        if (info != null && !TextUtils.isEmpty(info.label)) {
             return info.label;
         } else {
             return "0x" + Integer.toHexString(System.identityHashCode(lock));
@@ -193,6 +230,7 @@
             case INDEX_STORAGE: return "STORAGE";
             case INDEX_WINDOW: return "WINDOW";
             case INDEX_ACTIVITY: return "ACTIVITY";
+            case INDEX_DPMS: return "DPMS";
             default: return Integer.toString(index);
         }
     }
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index 33f7769..80d7ac9 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -128,6 +128,30 @@
         }
     };
 
+    public static final class Lifecycle extends SystemService {
+        private final NetworkScoreService mService;
+
+        public Lifecycle(Context context) {
+            super(context);
+            mService = new NetworkScoreService(context);
+        }
+
+        @Override
+        public void onStart() {
+            Log.i(TAG, "Registering " + Context.NETWORK_SCORE_SERVICE);
+            publishBinderService(Context.NETWORK_SCORE_SERVICE, mService);
+        }
+
+        @Override
+        public void onBootPhase(int phase) {
+            if (phase == PHASE_SYSTEM_SERVICES_READY) {
+                mService.systemReady();
+            } else if (phase == PHASE_BOOT_COMPLETED) {
+                mService.systemRunning();
+            }
+        }
+    }
+
     /**
      * Clears scores when the active scorer package is no longer valid and
      * manages the service connection.
diff --git a/services/core/java/com/android/server/ThreadPriorityBooster.java b/services/core/java/com/android/server/ThreadPriorityBooster.java
index cc9ac0d..53e8ce4 100644
--- a/services/core/java/com/android/server/ThreadPriorityBooster.java
+++ b/services/core/java/com/android/server/ThreadPriorityBooster.java
@@ -25,6 +25,8 @@
  */
 public class ThreadPriorityBooster {
 
+    private static final boolean ENABLE_LOCK_GUARD = false;
+
     private volatile int mBoostToPriority;
     private final int mLockGuardIndex;
 
@@ -50,7 +52,7 @@
             }
         }
         state.regionCounter++;
-        if (LockGuard.ENABLED) {
+        if (ENABLE_LOCK_GUARD) {
             LockGuard.guard(mLockGuardIndex);
         }
     }
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 752c44a..66c2b07 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -53,6 +53,7 @@
 import android.provider.Settings.SettingNotFoundException;
 import android.util.DebugUtils;
 import android.util.Slog;
+import android.util.SparseArray;
 import android.view.InputDevice;
 import android.media.AudioAttributes;
 
@@ -91,7 +92,7 @@
     private final boolean mAllowPriorityVibrationsInLowPowerMode;
     private final boolean mSupportsAmplitudeControl;
     private final int mDefaultVibrationAmplitude;
-    private final VibrationEffect[] mFallbackEffects;
+    private final SparseArray<VibrationEffect> mFallbackEffects;
     private final WorkSource mTmpWorkSource = new WorkSource();
     private final Handler mH = new Handler();
     private final Object mLock = new Object();
@@ -177,6 +178,7 @@
                 switch (prebaked.getId()) {
                     case VibrationEffect.EFFECT_CLICK:
                     case VibrationEffect.EFFECT_DOUBLE_CLICK:
+                    case VibrationEffect.EFFECT_HEAVY_CLICK:
                     case VibrationEffect.EFFECT_TICK:
                         return true;
                     default:
@@ -293,7 +295,11 @@
                 com.android.internal.R.array.config_clockTickVibePattern);
         VibrationEffect tickEffect = createEffect(tickEffectTimings);
 
-        mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect, tickEffect };
+        mFallbackEffects = new SparseArray<VibrationEffect>();
+        mFallbackEffects.put(VibrationEffect.EFFECT_CLICK, clickEffect);
+        mFallbackEffects.put(VibrationEffect.EFFECT_DOUBLE_CLICK, doubleClickEffect);
+        mFallbackEffects.put(VibrationEffect.EFFECT_TICK, tickEffect);
+        mFallbackEffects.put(VibrationEffect.EFFECT_HEAVY_CLICK, clickEffect);
     }
 
     private static VibrationEffect createEffect(long[] timings) {
@@ -960,10 +966,7 @@
     }
 
     private VibrationEffect getFallbackEffect(int effectId) {
-        if (effectId < 0 || effectId >= mFallbackEffects.length) {
-            return null;
-        }
-        return mFallbackEffects[effectId];
+        return mFallbackEffects.get(effectId);
     }
 
     /**
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index f57e9ac..067566d 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -2283,7 +2283,7 @@
                         + " app=" + app);
             if (app != null && app.thread != null) {
                 try {
-                    app.addPackage(r.appInfo.packageName, r.appInfo.versionCode, mAm.mProcessStats);
+                    app.addPackage(r.appInfo.packageName, r.appInfo.longVersionCode, mAm.mProcessStats);
                     realStartServiceLocked(r, app, execInFg);
                     return null;
                 } catch (TransactionTooLargeException e) {
@@ -2645,6 +2645,8 @@
                 Message msg = mAm.mHandler.obtainMessage(
                         ActivityManagerService.SERVICE_FOREGROUND_CRASH_MSG);
                 msg.obj = r.app;
+                msg.getData().putCharSequence(
+                    ActivityManagerService.SERVICE_RECORD_KEY, r.toString());
                 mAm.mHandler.sendMessage(msg);
             }
         }
@@ -3009,7 +3011,7 @@
 
                     mPendingServices.remove(i);
                     i--;
-                    proc.addPackage(sr.appInfo.packageName, sr.appInfo.versionCode,
+                    proc.addPackage(sr.appInfo.packageName, sr.appInfo.longVersionCode,
                             mAm.mProcessStats);
                     realStartServiceLocked(sr, proc, sr.createdFromFg);
                     didSomething = true;
@@ -3563,13 +3565,15 @@
 
         if (app != null) {
             mAm.mAppErrors.appNotResponding(app, null, null, false,
-                    "Context.startForegroundService() did not then call Service.startForeground()");
+                    "Context.startForegroundService() did not then call Service.startForeground(): "
+                        + r);
         }
     }
 
-    void serviceForegroundCrash(ProcessRecord app) {
+    void serviceForegroundCrash(ProcessRecord app, CharSequence serviceRecord) {
         mAm.crashApplication(app.uid, app.pid, app.info.packageName, app.userId,
-                "Context.startForegroundService() did not then call Service.startForeground()");
+                "Context.startForegroundService() did not then call Service.startForeground(): "
+                    + serviceRecord);
     }
 
     void scheduleServiceTimeoutLocked(ProcessRecord proc) {
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 4a8bc87..fac3f92 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -16,7 +16,6 @@
 
 package com.android.server.am;
 
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
@@ -44,7 +43,6 @@
 import android.app.ActivityOptions;
 import android.app.WindowConfiguration;
 import android.graphics.Point;
-import android.graphics.Rect;
 import android.util.IntArray;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
@@ -702,57 +700,52 @@
     }
 
     /**
-     * @return the stack currently above the home stack.  Can be null if there is no home stack, or
-     *         the home stack is already on top.
+     * @return the stack currently above the {@param stack}.  Can be null if the {@param stack} is
+     *         already top-most.
      */
-    ActivityStack getStackAboveHome() {
-        if (mHomeStack == null) {
-            // Skip if there is no home stack
-            return null;
-        }
-
-        final int stackIndex = mStacks.indexOf(mHomeStack) + 1;
+    ActivityStack getStackAbove(ActivityStack stack) {
+        final int stackIndex = mStacks.indexOf(stack) + 1;
         return (stackIndex < mStacks.size()) ? mStacks.get(stackIndex) : null;
     }
 
     /**
-     * Adjusts the home stack behind the last visible stack in the display if necessary. Generally
-     * used in conjunction with {@link #moveHomeStackBehindStack}.
+     * Adjusts the {@param stack} behind the last visible stack in the display if necessary.
+     * Generally used in conjunction with {@link #moveStackBehindStack}.
      */
-    void moveHomeStackBehindBottomMostVisibleStack() {
-        if (mHomeStack == null || mHomeStack.shouldBeVisible(null)) {
-            // Skip if there is no home stack, or if it is already visible
+    void moveStackBehindBottomMostVisibleStack(ActivityStack stack) {
+        if (stack.shouldBeVisible(null)) {
+            // Skip if the stack is already visible
             return;
         }
 
-        // Move the home stack to the bottom to not affect the following visibility checks
-        positionChildAtBottom(mHomeStack);
+        // Move the stack to the bottom to not affect the following visibility checks
+        positionChildAtBottom(stack);
 
-        // Find the next position where the homes stack should be placed
+        // Find the next position where the stack should be placed
         final int numStacks = mStacks.size();
         for (int stackNdx = 0; stackNdx < numStacks; stackNdx++) {
-            final ActivityStack stack = mStacks.get(stackNdx);
-            if (stack == mHomeStack) {
+            final ActivityStack s = mStacks.get(stackNdx);
+            if (s == stack) {
                 continue;
             }
-            final int winMode = stack.getWindowingMode();
+            final int winMode = s.getWindowingMode();
             final boolean isValidWindowingMode = winMode == WINDOWING_MODE_FULLSCREEN ||
                     winMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
-            if (stack.shouldBeVisible(null) && isValidWindowingMode) {
-                // Move the home stack to behind this stack
-                positionChildAt(mHomeStack, Math.max(0, stackNdx - 1));
+            if (s.shouldBeVisible(null) && isValidWindowingMode) {
+                // Move the provided stack to behind this stack
+                positionChildAt(stack, Math.max(0, stackNdx - 1));
                 break;
             }
         }
     }
 
     /**
-     * Moves the home stack behind the given {@param stack} if possible. If {@param stack} is not
-     * currently in the display, then then the home stack is moved to the back. Generally used in
-     * conjunction with {@link #moveHomeStackBehindBottomMostVisibleStack}.
+     * Moves the {@param stack} behind the given {@param behindStack} if possible. If
+     * {@param behindStack} is not currently in the display, then then the stack is moved to the
+     * back. Generally used in conjunction with {@link #moveStackBehindBottomMostVisibleStack}.
      */
-    void moveHomeStackBehindStack(ActivityStack behindStack) {
-        if (behindStack == null || behindStack == mHomeStack) {
+    void moveStackBehindStack(ActivityStack stack, ActivityStack behindStack) {
+        if (behindStack == null || behindStack == stack) {
             return;
         }
 
@@ -760,11 +753,11 @@
         // list, so we need to adjust the insertion index to account for the removed index
         // TODO: Remove this logic when WindowContainer.positionChildAt() is updated to adjust the
         //       position internally
-        final int homeStackIndex = mStacks.indexOf(mHomeStack);
+        final int stackIndex = mStacks.indexOf(stack);
         final int behindStackIndex = mStacks.indexOf(behindStack);
-        final int insertIndex = homeStackIndex <= behindStackIndex
+        final int insertIndex = stackIndex <= behindStackIndex
                 ? behindStackIndex - 1 : behindStackIndex;
-        positionChildAt(mHomeStack, Math.max(0, insertIndex));
+        positionChildAt(stack, Math.max(0, insertIndex));
     }
 
     boolean isSleeping() {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index fd8998b..43c1655 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -27,6 +27,7 @@
 import static android.Manifest.permission.READ_FRAME_BUFFER;
 import static android.Manifest.permission.REMOVE_TASKS;
 import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
+import static android.Manifest.permission.STOP_APP_SWITCHES;
 import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
 import static android.app.ActivityManager.RESIZE_MODE_PRESERVE_WINDOW;
 import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
@@ -38,6 +39,7 @@
 import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
 import static android.app.AppOpsManager.OP_ASSIST_STRUCTURE;
 import static android.app.AppOpsManager.OP_NONE;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -50,6 +52,7 @@
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
+import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT;
 import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
 import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
 import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
@@ -116,6 +119,7 @@
 import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL;
+import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
 import static android.provider.Settings.Global.NETWORK_ACCESS_TIMEOUT_MS;
 import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER;
 import static android.provider.Settings.System.FONT_SCALE;
@@ -204,6 +208,8 @@
 import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
 import static android.view.WindowManager.TRANSIT_TASK_OPEN;
 import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
+import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
 import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
 import static org.xmlpull.v1.XmlPullParser.START_TAG;
 
@@ -257,7 +263,6 @@
 import android.app.WindowConfiguration.ActivityType;
 import android.app.WindowConfiguration.WindowingMode;
 import android.app.admin.DevicePolicyCache;
-import android.app.admin.DevicePolicyManager;
 import android.app.assist.AssistContent;
 import android.app.assist.AssistStructure;
 import android.app.backup.IBackupManager;
@@ -762,7 +767,7 @@
     /**
      * The controller for all operations related to locktask.
      */
-    final LockTaskController mLockTaskController;
+    private final LockTaskController mLockTaskController;
 
     final UserController mUserController;
 
@@ -1279,17 +1284,24 @@
 
     private final class FontScaleSettingObserver extends ContentObserver {
         private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
+        private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
 
         public FontScaleSettingObserver() {
             super(mHandler);
             ContentResolver resolver = mContext.getContentResolver();
             resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
+            resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
+                    UserHandle.USER_ALL);
         }
 
         @Override
         public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
             if (mFontScaleUri.equals(uri)) {
                 updateFontScaleIfNeeded(userId);
+            } else if (mHideErrorDialogsUri.equals(uri)) {
+                synchronized (ActivityManagerService.this) {
+                    updateShouldShowDialogsLocked(getGlobalConfiguration());
+                }
             }
         }
     }
@@ -1530,6 +1542,11 @@
     private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE;
 
     /**
+     * State of external calls telling us if the device is awake or asleep.
+     */
+    private boolean mKeyguardShown = false;
+
+    /**
      * Set if we are shutting down the system, similar to sleeping.
      */
     boolean mShuttingDown = false;
@@ -1913,6 +1930,8 @@
     static final int FIRST_COMPAT_MODE_MSG = 300;
     static final int FIRST_SUPERVISOR_STACK_MSG = 100;
 
+    static final String SERVICE_RECORD_KEY = "servicerecord";
+
     static ServiceThread sKillThread = null;
     static KillHandler sKillHandler = null;
 
@@ -1939,7 +1958,7 @@
     final ActivityManagerConstants mConstants;
 
     // Encapsulates the global setting "hidden_api_blacklist_exemptions"
-    final HiddenApiBlacklist mHiddenApiBlacklist;
+    final HiddenApiSettings mHiddenApiBlacklist;
 
     PackageManagerInternal mPackageManagerInt;
 
@@ -2161,7 +2180,8 @@
                 mServices.serviceForegroundTimeout((ServiceRecord)msg.obj);
             } break;
             case SERVICE_FOREGROUND_CRASH_MSG: {
-                mServices.serviceForegroundCrash((ProcessRecord)msg.obj);
+                mServices.serviceForegroundCrash(
+                    (ProcessRecord) msg.obj, msg.getData().getCharSequence(SERVICE_RECORD_KEY));
             } break;
             case DISPATCH_PENDING_INTENT_CANCEL_MSG: {
                 RemoteCallbackList<IResultReceiver> callbacks
@@ -2873,17 +2893,19 @@
     }
 
     /**
-     * Encapsulates the global setting "hidden_api_blacklist_exemptions", including tracking the
-     * latest value via a content observer.
+     * Encapsulates global settings related to hidden API enforcement behaviour, including tracking
+     * the latest value via a content observer.
      */
-    static class HiddenApiBlacklist extends ContentObserver {
+    static class HiddenApiSettings extends ContentObserver {
 
         private final Context mContext;
         private boolean mBlacklistDisabled;
         private String mExemptionsStr;
         private List<String> mExemptions = Collections.emptyList();
+        @HiddenApiEnforcementPolicy private int mPolicyPreP = HIDDEN_API_ENFORCEMENT_DEFAULT;
+        @HiddenApiEnforcementPolicy private int mPolicyP = HIDDEN_API_ENFORCEMENT_DEFAULT;
 
-        public HiddenApiBlacklist(Handler handler, Context context) {
+        public HiddenApiSettings(Handler handler, Context context) {
             super(handler);
             mContext = context;
         }
@@ -2893,6 +2915,14 @@
                     Settings.Global.getUriFor(Settings.Global.HIDDEN_API_BLACKLIST_EXEMPTIONS),
                     false,
                     this);
+            mContext.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS),
+                    false,
+                    this);
+            mContext.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(Settings.Global.HIDDEN_API_POLICY_P_APPS),
+                    false,
+                    this);
             update();
         }
 
@@ -2912,13 +2942,32 @@
                 }
                 zygoteProcess.setApiBlacklistExemptions(mExemptions);
             }
+            mPolicyPreP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS);
+            mPolicyP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_P_APPS);
+        }
 
+        private @HiddenApiEnforcementPolicy int getValidEnforcementPolicy(String settingsKey) {
+            int policy = Settings.Global.getInt(mContext.getContentResolver(), settingsKey,
+                    ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT);
+            if (ApplicationInfo.isValidHiddenApiEnforcementPolicy(policy)) {
+                return policy;
+            } else {
+                return ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT;
+            }
         }
 
         boolean isDisabled() {
             return mBlacklistDisabled;
         }
 
+        @HiddenApiEnforcementPolicy int getPolicyForPrePApps() {
+            return mPolicyPreP;
+        }
+
+        @HiddenApiEnforcementPolicy int getPolicyForPApps() {
+            return mPolicyP;
+        }
+
         public void onChange(boolean selfChange) {
             update();
         }
@@ -3091,7 +3140,7 @@
             }
         };
 
-        mHiddenApiBlacklist = new HiddenApiBlacklist(mHandler, mContext);
+        mHiddenApiBlacklist = new HiddenApiSettings(mHandler, mContext);
 
         Watchdog.getInstance().addMonitor(this);
         Watchdog.getInstance().addThread(mHandler);
@@ -4207,6 +4256,9 @@
             }
 
             if (!disableHiddenApiChecks && !mHiddenApiBlacklist.isDisabled()) {
+                app.info.maybeUpdateHiddenApiEnforcementPolicy(
+                        mHiddenApiBlacklist.getPolicyForPrePApps(),
+                        mHiddenApiBlacklist.getPolicyForPApps());
                 @HiddenApiEnforcementPolicy int policy =
                         app.info.getHiddenApiEnforcementPolicy();
                 int policyBits = (policy << Zygote.API_ENFORCEMENT_POLICY_SHIFT);
@@ -5233,12 +5285,14 @@
     }
 
     @Override
-    public void cancelRecentsAnimation() {
+    public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
         enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
         final long origId = Binder.clearCallingIdentity();
         try {
             synchronized (this) {
-                mWindowManager.cancelRecentsAnimation();
+                mWindowManager.cancelRecentsAnimation(restoreHomeStackPosition
+                        ? REORDER_MOVE_TO_ORIGINAL_POSITION
+                        : REORDER_KEEP_IN_PLACE);
             }
         } finally {
             Binder.restoreCallingIdentity(origId);
@@ -12387,6 +12441,10 @@
         return mActivityStartController;
     }
 
+    LockTaskController getLockTaskController() {
+        return mLockTaskController;
+    }
+
     ClientLifecycleManager getLifecycleManager() {
         return mLifecycleManager;
     }
@@ -12946,9 +13004,13 @@
         } catch (RemoteException exc) {
             // Ignore.
         }
+        return isBackgroundRestrictedNoCheck(callingUid, packageName);
+    }
+
+    boolean isBackgroundRestrictedNoCheck(final int uid, final String packageName) {
         final int mode = mAppOpsService.checkOperation(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
-                callingUid, packageName);
-        return (mode != AppOpsManager.MODE_ALLOWED);
+                uid, packageName);
+        return mode != AppOpsManager.MODE_ALLOWED;
     }
 
     @Override
@@ -13094,6 +13156,12 @@
                 : UsageEvents.Event.SCREEN_NON_INTERACTIVE);
     }
 
+    void reportCurKeyguardUsageEventLocked() {
+        reportGlobalUsageEventLocked(mKeyguardShown
+                ? UsageEvents.Event.KEYGUARD_SHOWN
+                : UsageEvents.Event.KEYGUARD_HIDDEN);
+    }
+
     void onWakefulnessChanged(int wakefulness) {
         synchronized(this) {
             boolean wasAwake = mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE;
@@ -13257,6 +13325,10 @@
 
         synchronized(this) {
             long ident = Binder.clearCallingIdentity();
+            if (mKeyguardShown != keyguardShowing) {
+                mKeyguardShown = keyguardShowing;
+                reportCurKeyguardUsageEventLocked();
+            }
             try {
                 mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing,
                         secondaryDisplayShowing);
@@ -13320,12 +13392,7 @@
 
     @Override
     public void stopAppSwitches() {
-        if (checkCallingPermission(android.Manifest.permission.STOP_APP_SWITCHES)
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("viewquires permission "
-                    + android.Manifest.permission.STOP_APP_SWITCHES);
-        }
-
+        enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches");
         synchronized(this) {
             mAppSwitchesAllowedTime = SystemClock.uptimeMillis()
                     + APP_SWITCH_DELAY_TIME;
@@ -13335,12 +13402,7 @@
     }
 
     public void resumeAppSwitches() {
-        if (checkCallingPermission(android.Manifest.permission.STOP_APP_SWITCHES)
-                != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Requires permission "
-                    + android.Manifest.permission.STOP_APP_SWITCHES);
-        }
-
+        enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
         synchronized(this) {
             // Note that we don't execute any pending app switches... we will
             // let those wait until either the timeout, or the next start
@@ -13367,9 +13429,11 @@
             return true;
         }
 
-        int perm = checkComponentPermission(
-                android.Manifest.permission.STOP_APP_SWITCHES, sourcePid,
-                sourceUid, -1, true);
+        if (mRecentTasks.isCallerRecents(sourceUid)) {
+            return true;
+        }
+
+        int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
         if (perm == PackageManager.PERMISSION_GRANTED) {
             return true;
         }
@@ -13380,9 +13444,7 @@
         // If the actual IPC caller is different from the logical source, then
         // also see if they are allowed to control app switches.
         if (callingUid != -1 && callingUid != sourceUid) {
-            perm = checkComponentPermission(
-                    android.Manifest.permission.STOP_APP_SWITCHES, callingPid,
-                    callingUid, -1, true);
+            perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
             if (perm == PackageManager.PERMISSION_GRANTED) {
                 return true;
             }
@@ -15209,7 +15271,17 @@
                 Binder.getCallingUid(),
                 eventType,
                 processName,
-                Binder.getCallingPid());
+                Binder.getCallingPid(),
+                (r != null && r.info != null) ? r.info.packageName : "",
+                (r != null && r.info != null) ? (r.info.isInstantApp()
+                        ? StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__TRUE
+                        : StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__FALSE)
+                        : StatsLog.APP_CRASH_OCCURRED__IS_INSTANT_APP__UNAVAILABLE,
+                r != null ? (r.isInterestingToUserLocked()
+                        ? StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__FOREGROUND
+                        : StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__BACKGROUND)
+                        : StatsLog.APP_CRASH_OCCURRED__FOREGROUND_STATE__UNKNOWN
+        );
 
         addErrorToDropBox(eventType, r, processName, null, null, null, null, null, crashInfo);
 
@@ -21033,6 +21105,7 @@
             }
         }
 
+        final String action = intent.getAction();
         BroadcastOptions brOptions = null;
         if (bOptions != null) {
             brOptions = new BroadcastOptions(bOptions);
@@ -21053,11 +21126,16 @@
                     throw new SecurityException(msg);
                 }
             }
+            if (brOptions.isDontSendToRestrictedApps()
+                    && isBackgroundRestrictedNoCheck(callingUid, callerPackage)) {
+                Slog.i(TAG, "Not sending broadcast " + action + " - app " + callerPackage
+                        + " has background restrictions");
+                return ActivityManager.START_CANCELED;
+            }
         }
 
         // Verify that protected broadcasts are only being sent by system code,
         // and that system code is only sending protected broadcasts.
-        final String action = intent.getAction();
         final boolean isProtectedBroadcast;
         try {
             isProtectedBroadcast = AppGlobals.getPackageManager().isProtectedBroadcast(action);
@@ -21879,8 +21957,6 @@
         "com.android.frameworks.locationtests",
         "com.android.frameworks.coretests.privacy",
         "com.android.settings.ui",
-        "com.android.perftests.core",
-        "com.android.perftests.multiuser",
     };
 
     public boolean startInstrumentation(ComponentName className,
@@ -22418,7 +22494,7 @@
                 mUserController.getCurrentUserId());
 
         // TODO: If our config changes, should we auto dismiss any currently showing dialogs?
-        mShowDialogs = shouldShowDialogs(mTempConfig);
+        updateShouldShowDialogsLocked(mTempConfig);
 
         AttributeCache ac = AttributeCache.instance();
         if (ac != null) {
@@ -22673,7 +22749,7 @@
      * A thought: SystemUI might also want to get told about this, the Power
      * dialog / global actions also might want different behaviors.
      */
-    private static boolean shouldShowDialogs(Configuration config) {
+    private void updateShouldShowDialogsLocked(Configuration config) {
         final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
                                    && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
                                    && config.navigation == Configuration.NAVIGATION_NONAV);
@@ -22682,7 +22758,9 @@
                 && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
                 && modeType != Configuration.UI_MODE_TYPE_TELEVISION
                 && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
-        return inputMethodExists && uiModeSupportsDialogs;
+        final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
+                HIDE_ERROR_DIALOGS, 0) != 0;
+        mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 1af4114..4ce157f 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -93,8 +93,6 @@
 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
 import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING;
 import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
 import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
@@ -154,6 +152,7 @@
 import android.graphics.Bitmap;
 import android.graphics.GraphicBuffer;
 import android.graphics.Rect;
+import android.os.Binder;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Debug;
@@ -1590,14 +1589,20 @@
     void pauseKeyDispatchingLocked() {
         if (!keysPaused) {
             keysPaused = true;
-            mWindowContainerController.pauseKeyDispatching();
+
+            if (mWindowContainerController != null) {
+                mWindowContainerController.pauseKeyDispatching();
+            }
         }
     }
 
     void resumeKeyDispatchingLocked() {
         if (keysPaused) {
             keysPaused = false;
-            mWindowContainerController.resumeKeyDispatching();
+
+            if (mWindowContainerController != null) {
+                mWindowContainerController.resumeKeyDispatching();
+            }
         }
     }
 
@@ -2880,7 +2885,7 @@
 
         final ActivityManagerService service = stackSupervisor.mService;
         final ActivityInfo aInfo = stackSupervisor.resolveActivity(intent, resolvedType, 0, null,
-                userId);
+                userId, Binder.getCallingUid());
         if (aInfo == null) {
             throw new XmlPullParserException("restoreActivity resolver error. Intent=" + intent +
                     " resolvedType=" + resolvedType);
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 00ebcbd..1e9edd9 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -3544,7 +3544,15 @@
         mService.updateOomAdjLocked();
     }
 
-    final TaskRecord finishTopRunningActivityLocked(ProcessRecord app, String reason) {
+    /**
+     * Finish the topmost activity that belongs to the crashed app. We may also finish the activity
+     * that requested launch of the crashed one to prevent launch-crash loop.
+     * @param app The app that crashed.
+     * @param reason Reason to perform this action.
+     * @return The task that was finished in this stack, {@code null} if top running activity does
+     *         not belong to the crashed app.
+     */
+    final TaskRecord finishTopCrashedActivityLocked(ProcessRecord app, String reason) {
         ActivityRecord r = topRunningActivityLocked();
         TaskRecord finishedTask = null;
         if (r == null || r.app != app) {
@@ -3735,7 +3743,7 @@
                 }
 
                 if (endTask) {
-                    mService.mLockTaskController.clearLockedTask(task);
+                    mService.getLockTaskController().clearLockedTask(task);
                 }
             } else if (!r.isState(PAUSING)) {
                 // If the activity is PAUSING, we will complete the finish once
@@ -4631,7 +4639,7 @@
 
         // In LockTask mode, moving a locked task to the back of the stack may expose unlocked
         // ones. Therefore we need to check if this operation is allowed.
-        if (!mService.mLockTaskController.canMoveTaskToBack(tr)) {
+        if (!mService.getLockTaskController().canMoveTaskToBack(tr)) {
             return false;
         }
 
@@ -5076,7 +5084,12 @@
             onActivityRemovedFromStack(record);
         }
 
-        mTaskHistory.remove(task);
+        final boolean removed = mTaskHistory.remove(task);
+
+        if (removed) {
+            EventLog.writeEvent(EventLogTags.AM_REMOVE_TASK, task.taskId, getStackId());
+        }
+
         removeActivitiesFromLRUListLocked(task);
         updateTaskMovement(task, true);
 
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index d5dfdcf..731a44d 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1264,10 +1264,11 @@
     }
 
     ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId) {
-        return resolveIntent(intent, resolvedType, userId, 0);
+        return resolveIntent(intent, resolvedType, userId, 0, Binder.getCallingUid());
     }
 
-    ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) {
+    ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags,
+            int filterCallingUid) {
         synchronized (mService) {
             try {
                 Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "resolveIntent");
@@ -1278,7 +1279,7 @@
                     modifiedFlags |= PackageManager.MATCH_INSTANT;
                 }
                 return mService.getPackageManagerInternalLocked().resolveIntent(
-                        intent, resolvedType, modifiedFlags, userId, true);
+                        intent, resolvedType, modifiedFlags, userId, true, filterCallingUid);
 
             } finally {
                 Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
@@ -1287,8 +1288,8 @@
     }
 
     ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
-            ProfilerInfo profilerInfo, int userId) {
-        final ResolveInfo rInfo = resolveIntent(intent, resolvedType, userId);
+            ProfilerInfo profilerInfo, int userId, int filterCallingUid) {
+        final ResolveInfo rInfo = resolveIntent(intent, resolvedType, userId, 0, filterCallingUid);
         return resolveActivity(intent, rInfo, startFlags, profilerInfo);
     }
 
@@ -1371,12 +1372,13 @@
             mService.updateLruProcessLocked(app, true, null);
             mService.updateOomAdjLocked();
 
+            final LockTaskController lockTaskController = mService.getLockTaskController();
             if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE
                     || task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV
                     || (task.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED
-                            && mService.mLockTaskController.getLockTaskModeState()
-                            == LOCK_TASK_MODE_LOCKED)) {
-                mService.mLockTaskController.startLockTaskMode(task, false, 0 /* blank UID */);
+                            && lockTaskController.getLockTaskModeState()
+                                    == LOCK_TASK_MODE_LOCKED)) {
+                lockTaskController.startLockTaskMode(task, false, 0 /* blank UID */);
             }
 
             try {
@@ -1579,7 +1581,7 @@
                     // to run in multiple processes, because this is actually
                     // part of the framework so doesn't make sense to track as a
                     // separate apk in the process.
-                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
+                    app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,
                             mService.mProcessStats);
                 }
                 realStartActivityLocked(r, app, andResume, checkConfig);
@@ -2126,15 +2128,22 @@
         }
     }
 
-    TaskRecord finishTopRunningActivityLocked(ProcessRecord app, String reason) {
+    /**
+     * Finish the topmost activities in all stacks that belong to the crashed app.
+     * @param app The app that crashed.
+     * @param reason Reason to perform this action.
+     * @return The task that was finished in this stack, {@code null} if haven't found any.
+     */
+    TaskRecord finishTopCrashedActivitiesLocked(ProcessRecord app, String reason) {
         TaskRecord finishedTask = null;
         ActivityStack focusedStack = getFocusedStack();
         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
             final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx);
-            final int numStacks = display.getChildCount();
-            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
+            // It is possible that request to finish activity might also remove its task and stack,
+            // so we need to be careful with indexes in the loop and check child count every time.
+            for (int stackNdx = 0; stackNdx < display.getChildCount(); ++stackNdx) {
                 final ActivityStack stack = display.getChildAt(stackNdx);
-                TaskRecord t = stack.finishTopRunningActivityLocked(app, reason);
+                final TaskRecord t = stack.finishTopCrashedActivityLocked(app, reason);
                 if (stack == focusedStack || finishedTask == null) {
                     finishedTask = t;
                 }
@@ -2892,7 +2901,7 @@
         if (tr != null) {
             tr.removeTaskActivitiesLocked(pauseImmediately, reason);
             cleanUpRemovedTaskLocked(tr, killProcess, removeFromRecents);
-            mService.mLockTaskController.clearLockedTask(tr);
+            mService.getLockTaskController().clearLockedTask(tr);
             if (tr.isPersistable) {
                 mService.notifyTaskPersisterLocked(null, true);
             }
@@ -3806,7 +3815,7 @@
         pw.print(mRecentTasks.isRecentsComponentHomeActivity(mCurrentUser));
 
         getKeyguardController().dump(pw, prefix);
-        mService.mLockTaskController.dump(pw, prefix);
+        mService.getLockTaskController().dump(pw, prefix);
     }
 
     public void writeToProto(ProtoOutputStream proto, long fieldId) {
diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java
index fb78838..86a3fce 100644
--- a/services/core/java/com/android/server/am/ActivityStartController.java
+++ b/services/core/java/com/android/server/am/ActivityStartController.java
@@ -23,7 +23,6 @@
 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
 import static com.android.server.am.ActivityManagerService.ALLOW_FULL_ONLY;
 
-import android.app.ActivityOptions;
 import android.app.IApplicationThread;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -33,7 +32,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Binder;
-import android.os.Bundle;
 import android.os.FactoryTest;
 import android.os.Handler;
 import android.os.IBinder;
@@ -322,7 +320,7 @@
 
                     // Collect information about the target of the Intent.
                     ActivityInfo aInfo = mSupervisor.resolveActivity(intent, resolvedTypes[i], 0,
-                            null, userId);
+                            null, userId, realCallingUid);
                     // TODO: New, check if this is correct
                     aInfo = mService.getActivityInfoForUser(aInfo, userId);
 
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
index b86a8a6..6ca8a92 100644
--- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -21,6 +21,8 @@
 import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
 import static android.app.PendingIntent.FLAG_IMMUTABLE;
 import static android.app.PendingIntent.FLAG_ONE_SHOT;
+import static android.app.admin.DevicePolicyManager.EXTRA_RESTRICTION;
+import static android.app.admin.DevicePolicyManager.POLICY_SUSPEND_PACKAGES;
 import static android.content.Context.KEYGUARD_SERVICE;
 import static android.content.Intent.EXTRA_INTENT;
 import static android.content.Intent.EXTRA_PACKAGE_NAME;
@@ -30,8 +32,10 @@
 import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
 import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
 
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
+
+import android.Manifest;
 import android.app.ActivityOptions;
-import android.app.AppGlobals;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManagerInternal;
 import android.content.Context;
@@ -39,6 +43,7 @@
 import android.content.Intent;
 import android.content.IntentSender;
 import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.ResolveInfo;
 import android.content.pm.UserInfo;
 import android.os.Binder;
@@ -49,6 +54,7 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.HarmfulAppWarningActivity;
+import com.android.internal.app.SuspendedAppActivity;
 import com.android.internal.app.UnlaunchableAppActivity;
 import com.android.server.LocalServices;
 
@@ -149,7 +155,7 @@
         mInTask = inTask;
         mActivityOptions = activityOptions;
 
-        if (interceptSuspendPackageIfNeed()) {
+        if (interceptSuspendedPackageIfNeeded()) {
             // Skip the rest of interceptions as the package is suspended by device admin so
             // no user action can undo this.
             return true;
@@ -202,18 +208,15 @@
         return true;
     }
 
-    private boolean interceptSuspendPackageIfNeed() {
-        // Do not intercept if the admin did not suspend the package
-        if (mAInfo == null || mAInfo.applicationInfo == null ||
-                (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) {
-            return false;
-        }
+    private boolean interceptSuspendedByAdminPackage() {
         DevicePolicyManagerInternal devicePolicyManager = LocalServices
                 .getService(DevicePolicyManagerInternal.class);
         if (devicePolicyManager == null) {
             return false;
         }
         mIntent = devicePolicyManager.createShowAdminSupportIntent(mUserId, true);
+        mIntent.putExtra(EXTRA_RESTRICTION, POLICY_SUSPEND_PACKAGES);
+
         mCallingPid = mRealCallingPid;
         mCallingUid = mRealCallingUid;
         mResolvedType = null;
@@ -228,6 +231,55 @@
         return true;
     }
 
+    private Intent createSuspendedAppInterceptIntent(String suspendedPackage,
+            String suspendingPackage, String dialogMessage, int userId) {
+        final Intent interceptIntent = new Intent(mServiceContext, SuspendedAppActivity.class)
+                .putExtra(Intent.EXTRA_PACKAGE_NAME, suspendedPackage)
+                .putExtra(SuspendedAppActivity.EXTRA_DIALOG_MESSAGE, dialogMessage)
+                .putExtra(Intent.EXTRA_USER_ID, userId)
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                        | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+
+        final Intent moreDetailsIntent = new Intent(Intent.ACTION_SHOW_SUSPENDED_APP_DETAILS)
+                .setPackage(suspendingPackage);
+        final String requiredPermission = Manifest.permission.SEND_SHOW_SUSPENDED_APP_DETAILS;
+        final ResolveInfo resolvedInfo = mSupervisor.resolveIntent(moreDetailsIntent, null, userId);
+        if (resolvedInfo != null && resolvedInfo.activityInfo != null
+                && requiredPermission.equals(resolvedInfo.activityInfo.permission)) {
+            moreDetailsIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, suspendedPackage)
+                    .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            interceptIntent.putExtra(SuspendedAppActivity.EXTRA_MORE_DETAILS_INTENT,
+                    moreDetailsIntent);
+        }
+        return interceptIntent;
+    }
+
+    private boolean interceptSuspendedPackageIfNeeded() {
+        // Do not intercept if the package is not suspended
+        if (mAInfo == null || mAInfo.applicationInfo == null ||
+                (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) {
+            return false;
+        }
+        final PackageManagerInternal pmi = mService.getPackageManagerInternalLocked();
+        if (pmi == null) {
+            return false;
+        }
+        final String suspendedPackage = mAInfo.applicationInfo.packageName;
+        final String suspendingPackage = pmi.getSuspendingPackage(suspendedPackage, mUserId);
+        if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage)) {
+            return interceptSuspendedByAdminPackage();
+        }
+        final String dialogMessage = pmi.getSuspendedDialogMessage(suspendedPackage, mUserId);
+        mIntent = createSuspendedAppInterceptIntent(suspendedPackage, suspendingPackage,
+                dialogMessage, mUserId);
+        mCallingPid = mRealCallingPid;
+        mCallingUid = mRealCallingUid;
+        mResolvedType = null;
+        mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, 0);
+        mAInfo = mSupervisor.resolveActivity(mIntent, mRInfo, mStartFlags, null /*profilerInfo*/);
+        return true;
+    }
+
     private boolean interceptWorkProfileChallengeIfNeeded() {
         final Intent interceptingIntent = interceptWithConfirmCredentialsIfNeeded(mAInfo, mUserId);
         if (interceptingIntent == null) {
@@ -289,9 +341,9 @@
     private boolean interceptHarmfulAppIfNeeded() {
         CharSequence harmfulAppWarning;
         try {
-            harmfulAppWarning = AppGlobals.getPackageManager().getHarmfulAppWarning(
-                    mAInfo.packageName, mUserId);
-        } catch (RemoteException e) {
+            harmfulAppWarning = mService.getPackageManager()
+                    .getHarmfulAppWarning(mAInfo.packageName, mUserId);
+        } catch (RemoteException ex) {
             return false;
         }
 
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index a30a944..fb89e67 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -28,10 +28,10 @@
 import static android.app.ActivityManager.START_TASK_TO_FRONT;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.Intent.ACTION_INSTALL_INSTANT_APP_PACKAGE;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
 import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT;
@@ -46,6 +46,7 @@
 import static android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
 import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;
 import static android.content.pm.ActivityInfo.DOCUMENT_LAUNCH_ALWAYS;
+import static android.content.pm.ActivityInfo.LAUNCH_MULTIPLE;
 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
 import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
@@ -902,14 +903,22 @@
         final int clearTaskFlags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK;
         boolean clearedTask = (mLaunchFlags & clearTaskFlags) == clearTaskFlags
                 && mReuseTask != null;
-        if (startedActivityStack.inPinnedWindowingMode()
-                && (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP
-                || clearedTask)) {
-            // The activity was already running in the pinned stack so it wasn't started, but either
-            // brought to the front or the new intent was delivered to it since it was already in
-            // front. Notify anyone interested in this piece of information.
-            mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
-                    clearedTask);
+        if (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP || clearedTask) {
+            // The activity was already running so it wasn't started, but either brought to the
+            // front or the new intent was delivered to it since it was already in front. Notify
+            // anyone interested in this piece of information.
+            switch (startedActivityStack.getWindowingMode()) {
+                case WINDOWING_MODE_PINNED:
+                    mService.mTaskChangeNotificationController.notifyPinnedActivityRestartAttempt(
+                            clearedTask);
+                    break;
+                case WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:
+                    final ActivityStack homeStack = mSupervisor.mHomeStack;
+                    if (homeStack != null && homeStack.shouldBeVisible(null /* starting */)) {
+                        mService.mWindowManager.showRecentApps();
+                    }
+                    break;
+            }
         }
     }
 
@@ -965,7 +974,8 @@
                 if (profileLockedAndParentUnlockingOrUnlocked) {
                     rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,
                             PackageManager.MATCH_DIRECT_BOOT_AWARE
-                                    | PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
+                                    | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
+                            Binder.getCallingUid());
                 }
             }
         }
@@ -1146,9 +1156,10 @@
             // If we are not able to proceed, disassociate the activity from the task. Leaving an
             // activity in an incomplete state can lead to issues, such as performing operations
             // without a window container.
-            if (!ActivityManager.isStartResultSuccessful(result)
-                    && mStartActivity.getTask() != null) {
-                mStartActivity.getTask().removeActivity(mStartActivity);
+            final ActivityStack stack = mStartActivity.getStack();
+            if (!ActivityManager.isStartResultSuccessful(result) && stack != null) {
+                stack.finishActivityLocked(mStartActivity, RESULT_CANCELED,
+                        null /* intentResultData */, "startActivity", true /* oomAdj */);
             }
             mService.mWindowManager.continueSurfaceLayout();
         }
@@ -1198,16 +1209,27 @@
             // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused but
             // still needs to be a lock task mode violation since the task gets cleared out and
             // the device would otherwise leave the locked task.
-            if (mService.mLockTaskController.isLockTaskModeViolation(reusedActivity.getTask(),
+            if (mService.getLockTaskController().isLockTaskModeViolation(reusedActivity.getTask(),
                     (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
                             == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) {
                 Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode");
                 return START_RETURN_LOCK_TASK_MODE_VIOLATION;
             }
 
-            if (mStartActivity.getTask() == null) {
+            // True if we are clearing top and resetting of a standard (default) launch mode
+            // ({@code LAUNCH_MULTIPLE}) activity. The existing activity will be finished.
+            final boolean clearTopAndResetStandardLaunchMode =
+                    (mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))
+                            == (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+                    && mLaunchMode == LAUNCH_MULTIPLE;
+
+            // If mStartActivity does not have a task associated with it, associate it with the
+            // reused activity's task. Do not do so if we're clearing top and resetting for a
+            // standard launchMode activity.
+            if (mStartActivity.getTask() == null && !clearTopAndResetStandardLaunchMode) {
                 mStartActivity.setTask(reusedActivity.getTask());
             }
+
             if (reusedActivity.getTask().intent == null) {
                 // This task was started because of movement of the activity based on affinity...
                 // Now that we are actually launching it, we can assign the base intent.
@@ -1266,17 +1288,21 @@
                 resumeTargetStackIfNeeded();
                 return START_RETURN_INTENT_TO_CALLER;
             }
-            setTaskFromIntentActivity(reusedActivity);
 
-            if (!mAddingToTask && mReuseTask == null) {
-                // We didn't do anything...  but it was needed (a.k.a., client don't use that
-                // intent!)  And for paranoia, make sure we have correctly resumed the top activity.
-                resumeTargetStackIfNeeded();
-                if (outActivity != null && outActivity.length > 0) {
-                    outActivity[0] = reusedActivity;
+            if (reusedActivity != null) {
+                setTaskFromIntentActivity(reusedActivity);
+
+                if (!mAddingToTask && mReuseTask == null) {
+                    // We didn't do anything...  but it was needed (a.k.a., client don't use that
+                    // intent!)  And for paranoia, make sure we have correctly resumed the top activity.
+
+                    resumeTargetStackIfNeeded();
+                    if (outActivity != null && outActivity.length > 0) {
+                        outActivity[0] = reusedActivity;
+                    }
+
+                    return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
                 }
-
-                return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
             }
         }
 
@@ -1995,7 +2021,7 @@
             mStartActivity.setTaskToAffiliateWith(taskToAffiliate);
         }
 
-        if (mService.mLockTaskController.isLockTaskModeViolation(mStartActivity.getTask())) {
+        if (mService.getLockTaskController().isLockTaskModeViolation(mStartActivity.getTask())) {
             Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
             return START_RETURN_LOCK_TASK_MODE_VIOLATION;
         }
@@ -2018,7 +2044,7 @@
     }
 
     private int setTaskFromSourceRecord() {
-        if (mService.mLockTaskController.isLockTaskModeViolation(mSourceRecord.getTask())) {
+        if (mService.getLockTaskController().isLockTaskModeViolation(mSourceRecord.getTask())) {
             Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
             return START_RETURN_LOCK_TASK_MODE_VIOLATION;
         }
@@ -2112,7 +2138,7 @@
     private int setTaskFromInTask() {
         // The caller is asking that the new activity be started in an explicit
         // task it has provided to us.
-        if (mService.mLockTaskController.isLockTaskModeViolation(mInTask)) {
+        if (mService.getLockTaskController().isLockTaskModeViolation(mInTask)) {
             Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
             return START_RETURN_LOCK_TASK_MODE_VIOLATION;
         }
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 7ee20fa2..bd1000ac 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -742,8 +742,8 @@
             }
             mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
         } else {
-            TaskRecord affectedTask =
-                    mService.mStackSupervisor.finishTopRunningActivityLocked(app, reason);
+            final TaskRecord affectedTask =
+                    mService.mStackSupervisor.finishTopCrashedActivitiesLocked(app, reason);
             if (data != null) {
                 data.task = affectedTask;
             }
@@ -1041,7 +1041,15 @@
         }
 
         StatsLog.write(StatsLog.ANR_OCCURRED, app.uid, app.processName,
-                activity == null ? "unknown": activity.shortComponentName, annotation);
+                activity == null ? "unknown": activity.shortComponentName, annotation,
+                (app.info != null) ? (app.info.isInstantApp()
+                        ? StatsLog.ANROCCURRED__IS_INSTANT_APP__TRUE
+                        : StatsLog.ANROCCURRED__IS_INSTANT_APP__FALSE)
+                        : StatsLog.ANROCCURRED__IS_INSTANT_APP__UNAVAILABLE,
+                app != null ? (app.isInterestingToUserLocked()
+                        ? StatsLog.ANROCCURRED__FOREGROUND_STATE__FOREGROUND
+                        : StatsLog.ANROCCURRED__FOREGROUND_STATE__BACKGROUND)
+                        : StatsLog.ANROCCURRED__FOREGROUND_STATE__UNKNOWN);
         mService.addErrorToDropBox("anr", app, app.processName, activity, parent, annotation,
                 cpuInfo, tracesFile, null);
 
diff --git a/services/core/java/com/android/server/am/AppWarnings.java b/services/core/java/com/android/server/am/AppWarnings.java
index ab1d7bf..ea0251e 100644
--- a/services/core/java/com/android/server/am/AppWarnings.java
+++ b/services/core/java/com/android/server/am/AppWarnings.java
@@ -122,8 +122,9 @@
             return;
         }
 
-        if (ActivityManager.isRunningInTestHarness()
-                && !mAlwaysShowUnsupportedCompileSdkWarningActivities.contains(r.realActivity)) {
+        // TODO(b/77862563): temp. fix while P is being finalized.  To be reverted
+        if (/*ActivityManager.isRunningInTestHarness()
+                &&*/ !mAlwaysShowUnsupportedCompileSdkWarningActivities.contains(r.realActivity)) {
             // Don't show warning if we are running in a test harness and we don't have to always
             // show for this activity.
             return;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 8ecd93e..9c2b1a5 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -19,16 +19,10 @@
 import android.app.ActivityManager;
 import android.app.job.JobProtoEnums;
 import android.bluetooth.BluetoothActivityEnergyInfo;
-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.hardware.usb.UsbManager;
 import android.net.wifi.WifiActivityEnergyInfo;
-import android.os.PowerManager.ServiceType;
-import android.os.PowerSaveState;
 import android.os.BatteryStats;
 import android.os.BatteryStatsInternal;
 import android.os.Binder;
@@ -37,18 +31,18 @@
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
 import android.os.ParcelFormatException;
+import android.os.PowerManager.ServiceType;
 import android.os.PowerManagerInternal;
+import android.os.PowerSaveState;
 import android.os.Process;
-import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.os.UserManagerInternal;
 import android.os.WorkSource;
-import android.os.WorkSource.WorkChain;
 import android.os.connectivity.CellularBatteryStats;
-import android.os.connectivity.WifiBatteryStats;
 import android.os.connectivity.GpsBatteryStats;
+import android.os.connectivity.WifiBatteryStats;
 import android.os.health.HealthStatsParceler;
 import android.os.health.HealthStatsWriter;
 import android.os.health.UidHealthStats;
@@ -57,6 +51,7 @@
 import android.telephony.SignalStrength;
 import android.telephony.TelephonyManager;
 import android.util.Slog;
+import android.util.StatsLog;
 
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.os.BatteryStatsHelper;
@@ -65,7 +60,6 @@
 import com.android.internal.os.RpmStats;
 import com.android.internal.util.DumpUtils;
 import com.android.server.LocalServices;
-import android.util.StatsLog;
 
 import java.io.File;
 import java.io.FileDescriptor;
@@ -701,13 +695,6 @@
         }
     }
 
-    public void noteUsbConnectionState(boolean connected) {
-        enforceCallingPermission();
-        synchronized (mStats) {
-            mStats.noteUsbConnectionStateLocked(connected);
-        }
-    }
-
     public void notePhoneSignalStrength(SignalStrength signalStrength) {
         enforceCallingPermission();
         synchronized (mStats) {
@@ -1164,35 +1151,6 @@
                 Binder.getCallingPid(), Binder.getCallingUid(), null);
     }
 
-    public final static class UsbConnectionReceiver extends BroadcastReceiver {
-        private static final String TAG = UsbConnectionReceiver.class.getSimpleName();
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            final String action = intent.getAction();
-            if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
-                final Intent usbState = context.registerReceiver(null, new IntentFilter(UsbManager.ACTION_USB_STATE));
-                if (usbState != null) {
-                    handleUsbState(usbState);
-                }
-            } else if (UsbManager.ACTION_USB_STATE.equals(action)) {
-                handleUsbState(intent);
-            }
-        }
-        private void handleUsbState(Intent intent) {
-            IBatteryStats bs = getService();
-            if (bs == null) {
-                Slog.w(TAG, "Could not access batterystats");
-                return;
-            }
-            boolean connected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED);
-            try {
-                bs.noteUsbConnectionState(connected);
-            } catch (RemoteException e) {
-                Slog.w(TAG, "Could not access batterystats: ", e);
-            }
-        }
-    }
-
     final class WakeupReasonThread extends Thread {
         private static final int MAX_REASON_SIZE = 512;
         private CharsetDecoder mDecoder;
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index 9caef4a..40b9e4f 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -133,4 +133,7 @@
 # The activity's onStart has been called.
 30059 am_on_start_called (User|1|5),(Component Name|3),(Reason|3)
 # The activity's onDestroy has been called.
-30060 am_on_destroy_called (User|1|5),(Component Name|3),(Reason|3)
\ No newline at end of file
+30060 am_on_destroy_called (User|1|5),(Component Name|3),(Reason|3)
+
+# The task is being removed from its parent stack
+30061 am_remove_task (Task ID|1|5), (Stack ID|1|5)
\ No newline at end of file
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 03acb84..b7fde1d 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -496,7 +496,7 @@
         uid = _uid;
         userId = UserHandle.getUserId(_uid);
         processName = _processName;
-        pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.versionCode));
+        pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.longVersionCode));
         maxAdj = ProcessList.UNKNOWN_ADJ;
         curRawAdj = setRawAdj = ProcessList.INVALID_ADJ;
         curAdj = setAdj = verifiedAdj = ProcessList.INVALID_ADJ;
@@ -521,7 +521,7 @@
                 origBase.makeInactive();
             }
             baseProcessTracker = tracker.getProcessStateLocked(info.packageName, uid,
-                    info.versionCode, processName);
+                    info.longVersionCode, processName);
             baseProcessTracker.makeActive();
             for (int i=0; i<pkgList.size(); i++) {
                 ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
@@ -529,7 +529,7 @@
                     holder.state.makeInactive();
                 }
                 holder.state = tracker.getProcessStateLocked(pkgList.keyAt(i), uid,
-                        info.versionCode, processName);
+                        info.longVersionCode, processName);
                 if (holder.state != baseProcessTracker) {
                     holder.state.makeActive();
                 }
@@ -828,9 +828,9 @@
                 }
                 pkgList.clear();
                 ProcessState ps = tracker.getProcessStateLocked(
-                        info.packageName, uid, info.versionCode, processName);
+                        info.packageName, uid, info.longVersionCode, processName);
                 ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
-                        info.versionCode);
+                        info.longVersionCode);
                 holder.state = ps;
                 pkgList.put(info.packageName, holder);
                 if (ps != baseProcessTracker) {
@@ -839,7 +839,7 @@
             }
         } else if (N != 1) {
             pkgList.clear();
-            pkgList.put(info.packageName, new ProcessStats.ProcessStateHolder(info.versionCode));
+            pkgList.put(info.packageName, new ProcessStats.ProcessStateHolder(info.longVersionCode));
         }
     }
 
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index 1d305fb..a20452b 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -523,7 +523,7 @@
         }
         for (int i = mTasks.size() - 1; i >= 0; --i) {
             final TaskRecord tr = mTasks.get(i);
-            if (tr.userId == userId && !mService.mLockTaskController.isTaskWhitelisted(tr)) {
+            if (tr.userId == userId && !mService.getLockTaskController().isTaskWhitelisted(tr)) {
                 remove(tr);
             }
         }
@@ -534,8 +534,8 @@
             final TaskRecord tr = mTasks.get(i);
             final String taskPackageName =
                     tr.getBaseIntent().getComponent().getPackageName();
-            if (tr.userId != userId) return;
-            if (!taskPackageName.equals(packageName)) return;
+            if (tr.userId != userId) continue;
+            if (!taskPackageName.equals(packageName)) continue;
 
             mService.mStackSupervisor.removeTaskByIdLocked(tr.taskId, true, REMOVE_FROM_RECENTS,
                     "remove-package-task");
@@ -1156,7 +1156,7 @@
         }
 
         // If we're in lock task mode, ignore the root task
-        if (task == mService.mLockTaskController.getRootTask()) {
+        if (task == mService.getLockTaskController().getRootTask()) {
             return false;
         }
 
@@ -1255,7 +1255,7 @@
         for (int i = 0; i < recentsCount; i++) {
             final TaskRecord tr = mTasks.get(i);
             if (task != tr) {
-                if (!task.hasCompatibleActivityType(tr)) {
+                if (!task.hasCompatibleActivityType(tr) || task.userId != tr.userId) {
                     continue;
                 }
                 final Intent trIntent = tr.intent;
diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java
index 9df321c..17eeb5b 100644
--- a/services/core/java/com/android/server/am/RecentsAnimation.java
+++ b/services/core/java/com/android/server/am/RecentsAnimation.java
@@ -18,20 +18,25 @@
 
 import static android.app.ActivityManager.START_TASK_TO_FRONT;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
 import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
 import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
 import static android.view.WindowManager.TRANSIT_NONE;
 import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
+import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
+import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
+import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_TOP;
 
 import android.app.ActivityOptions;
 import android.content.ComponentName;
 import android.content.Intent;
-import android.os.Handler;
 import android.os.RemoteException;
 import android.os.Trace;
 import android.util.Slog;
 import android.view.IRecentsAnimationRunner;
+import com.android.server.wm.RecentsAnimationController;
 import com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks;
 import com.android.server.wm.WindowManagerService;
 
@@ -47,16 +52,20 @@
     private final ActivityStartController mActivityStartController;
     private final WindowManagerService mWindowManager;
     private final UserController mUserController;
+    private final ActivityDisplay mDefaultDisplay;
     private final int mCallingPid;
 
-    // The stack to restore the home stack behind when the animation is finished
-    private ActivityStack mRestoreHomeBehindStack;
+    private int mTargetActivityType;
+
+    // The stack to restore the target stack behind when the animation is finished
+    private ActivityStack mRestoreTargetBehindStack;
 
     RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor,
             ActivityStartController activityStartController, WindowManagerService wm,
             UserController userController, int callingPid) {
         mService = am;
         mStackSupervisor = stackSupervisor;
+        mDefaultDisplay = stackSupervisor.getDefaultDisplay();
         mActivityStartController = activityStartController;
         mWindowManager = wm;
         mUserController = userController;
@@ -72,18 +81,33 @@
             return;
         }
 
-        // If the existing home activity is already on top, then cancel
-        ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
-        final boolean hasExistingHomeActivity = homeActivity != null;
-        if (hasExistingHomeActivity) {
-            final ActivityDisplay display = homeActivity.getDisplay();
-            mRestoreHomeBehindStack = display.getStackAboveHome();
-            if (mRestoreHomeBehindStack == null) {
+        // If the activity is associated with the recents stack, then try and get that first
+        mTargetActivityType = intent.getComponent() != null
+                && recentsComponent.equals(intent.getComponent())
+                        ? ACTIVITY_TYPE_RECENTS
+                        : ACTIVITY_TYPE_HOME;
+        final ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED,
+                mTargetActivityType);
+        ActivityRecord targetActivity = targetStack != null
+                ? targetStack.getTopActivity()
+                : null;
+        final boolean hasExistingActivity = targetActivity != null;
+        if (hasExistingActivity) {
+            final ActivityDisplay display = targetActivity.getDisplay();
+            mRestoreTargetBehindStack = display.getStackAbove(targetStack);
+            if (mRestoreTargetBehindStack == null) {
                 notifyAnimationCancelBeforeStart(recentsAnimationRunner);
                 return;
             }
         }
 
+        // Send launch hint if we are actually launching the target. If it's already visible
+        // (shouldn't happen in general) we don't need to send it.
+        if (targetActivity == null || !targetActivity.visible) {
+            mStackSupervisor.sendPowerHintForLaunchStartIfNeeded(true /* forceSend */,
+                    targetActivity);
+        }
+
         mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching();
 
         mService.setRunningRemoteAnimation(mCallingPid, true);
@@ -91,48 +115,49 @@
         mWindowManager.deferSurfaceLayout();
         try {
             final ActivityDisplay display;
-            if (hasExistingHomeActivity) {
-                // Move the home activity into place for the animation if it is not already top most
-                display = homeActivity.getDisplay();
-                display.moveHomeStackBehindBottomMostVisibleStack();
+            if (hasExistingActivity) {
+                // Move the recents activity into place for the animation if it is not top most
+                display = targetActivity.getDisplay();
+                display.moveStackBehindBottomMostVisibleStack(targetStack);
             } else {
-                // No home activity
-                final ActivityOptions opts = ActivityOptions.makeBasic();
-                opts.setLaunchActivityType(ACTIVITY_TYPE_HOME);
-                opts.setAvoidMoveToFront();
+                // No recents activity
+                ActivityOptions options = ActivityOptions.makeBasic();
+                options.setLaunchActivityType(mTargetActivityType);
+                options.setAvoidMoveToFront();
                 intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION);
 
                 mActivityStartController
-                        .obtainStarter(intent, "startRecentsActivity_noHomeActivity")
+                        .obtainStarter(intent, "startRecentsActivity_noTargetActivity")
                         .setCallingUid(recentsUid)
                         .setCallingPackage(recentsComponent.getPackageName())
-                        .setActivityOptions(SafeActivityOptions.fromBundle(opts.toBundle()))
+                        .setActivityOptions(SafeActivityOptions.fromBundle(options.toBundle()))
                         .setMayWait(mUserController.getCurrentUserId())
                         .execute();
                 mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
 
-                homeActivity = mStackSupervisor.getHomeActivity();
-                display = homeActivity.getDisplay();
+                targetActivity = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED,
+                        mTargetActivityType).getTopActivity();
+                display = targetActivity.getDisplay();
 
                 // TODO: Maybe wait for app to draw in this particular case?
             }
 
-            // Mark the home activity as launch-behind to bump its visibility for the
+            // Mark the target activity as launch-behind to bump its visibility for the
             // duration of the gesture that is driven by the recents component
-            homeActivity.mLaunchTaskBehind = true;
+            targetActivity.mLaunchTaskBehind = true;
 
             // Fetch all the surface controls and pass them to the client to get the animation
             // started
-            mWindowManager.cancelRecentsAnimation();
-            mWindowManager.initializeRecentsAnimation(recentsAnimationRunner, this,
-                    display.mDisplayId, mStackSupervisor.mRecentTasks.getRecentTaskIds());
+            mWindowManager.cancelRecentsAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
+            mWindowManager.initializeRecentsAnimation(mTargetActivityType, recentsAnimationRunner,
+                    this, display.mDisplayId, mStackSupervisor.mRecentTasks.getRecentTaskIds());
 
             // If we updated the launch-behind state, update the visibility of the activities after
             // we fetch the visible tasks to be controlled by the animation
             mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
 
             mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunched(START_TASK_TO_FRONT,
-                    homeActivity);
+                    targetActivity);
         } finally {
             mWindowManager.continueSurfaceLayout();
             Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
@@ -140,10 +165,16 @@
     }
 
     @Override
-    public void onAnimationFinished(boolean moveHomeToTop) {
+    public void onAnimationFinished(@RecentsAnimationController.ReorderMode int reorderMode) {
         synchronized (mService) {
             if (mWindowManager.getRecentsAnimationController() == null) return;
 
+            // Just to be sure end the launch hint in case the target activity was never launched.
+            // However, if we're keeping the activity and making it visible, we can leave it on.
+            if (reorderMode != REORDER_KEEP_IN_PLACE) {
+                mStackSupervisor.sendPowerHintForLaunchEndIfNeeded();
+            }
+
             mService.setRunningRemoteAnimation(mCallingPid, false);
 
             mWindowManager.inSurfaceTransaction(() -> {
@@ -151,26 +182,30 @@
                         "RecentsAnimation#onAnimationFinished_inSurfaceTransaction");
                 mWindowManager.deferSurfaceLayout();
                 try {
-                    mWindowManager.cleanupRecentsAnimation(moveHomeToTop);
+                    mWindowManager.cleanupRecentsAnimation(reorderMode);
 
-                    // Move the home stack to the front
-                    final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
-                    if (homeActivity == null) {
+                    final ActivityStack targetStack = mDefaultDisplay.getStack(
+                            WINDOWING_MODE_UNDEFINED, mTargetActivityType);
+                    final ActivityRecord targetActivity = targetStack.getTopActivity();
+                    if (targetActivity == null) {
                         return;
                     }
 
                     // Restore the launched-behind state
-                    homeActivity.mLaunchTaskBehind = false;
+                    targetActivity.mLaunchTaskBehind = false;
 
-                    if (moveHomeToTop) {
-                        // Bring the home stack to the front
-                        final ActivityStack homeStack = homeActivity.getStack();
-                        mStackSupervisor.mNoAnimActivities.add(homeActivity);
-                        homeStack.moveToFront("RecentsAnimation.onAnimationFinished()");
+                    if (reorderMode == REORDER_MOVE_TO_TOP) {
+                        // Bring the target stack to the front
+                        mStackSupervisor.mNoAnimActivities.add(targetActivity);
+                        targetStack.moveToFront("RecentsAnimation.onAnimationFinished()");
+                    } else if (reorderMode == REORDER_MOVE_TO_ORIGINAL_POSITION){
+                        // Restore the target stack to its previous position
+                        final ActivityDisplay display = targetActivity.getDisplay();
+                        display.moveStackBehindStack(targetStack, mRestoreTargetBehindStack);
                     } else {
-                        // Restore the home stack to its previous position
-                        final ActivityDisplay display = homeActivity.getDisplay();
-                        display.moveHomeStackBehindStack(mRestoreHomeBehindStack);
+                        // Keep target stack in place, nothing changes, so ignore the transition
+                        // logic below
+                        return;
                     }
 
                     mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
@@ -180,6 +215,12 @@
                     // No reason to wait for the pausing activity in this case, as the hiding of
                     // surfaces needs to be done immediately.
                     mWindowManager.executeAppTransition();
+
+                    // After reordering the stacks, reset the minimized state. At this point, either
+                    // the target activity is now top-most and we will stay minimized (if in
+                    // split-screen), or we will have returned to the app, and the minimized state
+                    // should be reset
+                    mWindowManager.checkSplitScreenMinimizedChanged(true /* animate */);
                 } finally {
                     mWindowManager.continueSurfaceLayout();
                     Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
diff --git a/services/core/java/com/android/server/am/SafeActivityOptions.java b/services/core/java/com/android/server/am/SafeActivityOptions.java
index ac6f01f..2de75273 100644
--- a/services/core/java/com/android/server/am/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/am/SafeActivityOptions.java
@@ -210,7 +210,7 @@
         // Check if someone tries to launch an unwhitelisted activity into LockTask mode.
         final boolean lockTaskMode = options.getLockTaskMode();
         if (aInfo != null && lockTaskMode
-                && !supervisor.mService.mLockTaskController.isPackageWhitelisted(
+                && !supervisor.mService.getLockTaskController().isPackageWhitelisted(
                         UserHandle.getUserId(callingUid), aInfo.packageName)) {
             final String msg = "Permission Denial: starting " + getIntentString(intent)
                     + " from " + callerApp + " (pid=" + callingPid
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 034cb2e..737105d 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -451,7 +451,7 @@
     }
 
     void removeWindowContainer() {
-        mService.mLockTaskController.clearLockedTask(this);
+        mService.getLockTaskController().clearLockedTask(this);
         mWindowContainerController.removeContainer();
         if (!getWindowConfiguration().persistTaskBounds()) {
             // Reset current bounds for task whose bounds shouldn't be persisted so it uses
@@ -1446,9 +1446,10 @@
         }
 
         final String pkg = (realActivity != null) ? realActivity.getPackageName() : null;
+        final LockTaskController lockTaskController = mService.getLockTaskController();
         switch (r.lockTaskLaunchMode) {
             case LOCK_TASK_LAUNCH_MODE_DEFAULT:
-                mLockTaskAuth = mService.mLockTaskController.isPackageWhitelisted(userId, pkg)
+                mLockTaskAuth = lockTaskController.isPackageWhitelisted(userId, pkg)
                         ? LOCK_TASK_AUTH_WHITELISTED : LOCK_TASK_AUTH_PINNABLE;
                 break;
 
@@ -1461,7 +1462,7 @@
                 break;
 
             case LOCK_TASK_LAUNCH_MODE_IF_WHITELISTED:
-                mLockTaskAuth = mService.mLockTaskController.isPackageWhitelisted(userId, pkg)
+                mLockTaskAuth = lockTaskController.isPackageWhitelisted(userId, pkg)
                         ? LOCK_TASK_AUTH_LAUNCHABLE : LOCK_TASK_AUTH_PINNABLE;
                 break;
         }
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f710690..fecb934 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -1184,11 +1184,6 @@
             Slog.w(TAG, "No user info for user #" + targetUserId);
             return false;
         }
-        if (!targetUserInfo.isDemo() && UserManager.isDeviceInDemoMode(mInjector.getContext())) {
-            Slog.w(TAG, "Cannot switch to non-demo user #" + targetUserId
-                    + " when device is in demo mode");
-            return false;
-        }
         if (!targetUserInfo.supportsSwitchTo()) {
             Slog.w(TAG, "Cannot switch to User #" + targetUserId + ": not supported");
             return false;
@@ -1593,6 +1588,7 @@
 
     void onSystemReady() {
         updateCurrentProfileIds();
+        mInjector.reportCurWakefulnessUsageEvent();
     }
 
     /**
@@ -2219,7 +2215,7 @@
 
         protected void clearAllLockedTasks(String reason) {
             synchronized (mService) {
-                mService.mLockTaskController.clearLockedTasks(reason);
+                mService.getLockTaskController().clearLockedTasks(reason);
             }
         }
 
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index c8b6b50..8212463 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -320,13 +320,13 @@
         0,  // STREAM_SYSTEM
         0,  // STREAM_RING
         0,  // STREAM_MUSIC
-        0,  // STREAM_ALARM
+        1,  // STREAM_ALARM
         0,  // STREAM_NOTIFICATION
         0,  // STREAM_BLUETOOTH_SCO
         0,  // STREAM_SYSTEM_ENFORCED
         0,  // STREAM_DTMF
         0,  // STREAM_TTS
-        0   // STREAM_ACCESSIBILITY
+        1   // STREAM_ACCESSIBILITY
     };
 
     /* mStreamVolumeAlias[] indicates for each stream if it uses the volume settings
@@ -588,7 +588,7 @@
             AudioSystem.DEVICE_OUT_HDMI_ARC |
             AudioSystem.DEVICE_OUT_SPDIF |
             AudioSystem.DEVICE_OUT_AUX_LINE;
-    int mFullVolumeDevices = AudioSystem.DEVICE_OUT_HEARING_AID;
+    int mFullVolumeDevices = 0;
 
     private final boolean mMonitorRotation;
 
@@ -1208,6 +1208,8 @@
                             System.VOLUME_SETTINGS_INT[a11yStreamAlias];
                     mStreamStates[AudioSystem.STREAM_ACCESSIBILITY].setAllIndexes(
                             mStreamStates[a11yStreamAlias], caller);
+                    mStreamStates[AudioSystem.STREAM_ACCESSIBILITY].refreshRange(
+                            mStreamVolumeAlias[AudioSystem.STREAM_ACCESSIBILITY]);
                 }
             }
             if (sIndependentA11yVolume) {
@@ -1389,7 +1391,15 @@
     }
 
     private int rescaleIndex(int index, int srcStream, int dstStream) {
-        return (index * mStreamStates[dstStream].getMaxIndex() + mStreamStates[srcStream].getMaxIndex() / 2) / mStreamStates[srcStream].getMaxIndex();
+        final int rescaled =
+                (index * mStreamStates[dstStream].getMaxIndex()
+                        + mStreamStates[srcStream].getMaxIndex() / 2)
+                / mStreamStates[srcStream].getMaxIndex();
+        if (rescaled < mStreamStates[dstStream].getMinIndex()) {
+            return mStreamStates[dstStream].getMinIndex();
+        } else {
+            return rescaled;
+        }
     }
 
     ///////////////////////////////////////////////////////////////////////////
@@ -4602,8 +4612,8 @@
     //  4       VolumeStreamState.class
     public class VolumeStreamState {
         private final int mStreamType;
-        private final int mIndexMin;
-        private final int mIndexMax;
+        private int mIndexMin;
+        private int mIndexMax;
 
         private boolean mIsMuted;
         private String mVolumeIndexSettingName;
@@ -4755,6 +4765,8 @@
                 index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10);
             } else if ((device & mFullVolumeDevices) != 0) {
                 index = (mIndexMax + 5)/10;
+            } else if ((device & AudioSystem.DEVICE_OUT_HEARING_AID) != 0) {
+                index = (mIndexMax + 5)/10;
             } else {
                 index = (getIndex(device) + 5)/10;
             }
@@ -4775,6 +4787,8 @@
                             index = getAbsoluteVolumeIndex((getIndex(device) + 5)/10);
                         } else if ((device & mFullVolumeDevices) != 0) {
                             index = (mIndexMax + 5)/10;
+                        } else if ((device & AudioSystem.DEVICE_OUT_HEARING_AID) != 0) {
+                            index = (mIndexMax + 5)/10;
                         } else {
                             index = (mIndexMap.valueAt(i) + 5)/10;
                         }
@@ -4889,6 +4903,24 @@
         }
 
         /**
+         * Updates the min/max index values from another stream. Use this when changing the alias
+         * for the current stream type.
+         * @param sourceStreamType
+         */
+        // must be sync'd on mSettingsLock before VolumeStreamState.class
+        @GuardedBy("VolumeStreamState.class")
+        public void refreshRange(int sourceStreamType) {
+            mIndexMin = MIN_STREAM_VOLUME[sourceStreamType] * 10;
+            mIndexMax = MAX_STREAM_VOLUME[sourceStreamType] * 10;
+            // verify all current volumes are within bounds
+            for (int i = 0 ; i < mIndexMap.size(); i++) {
+                final int device = mIndexMap.keyAt(i);
+                final int index = mIndexMap.valueAt(i);
+                mIndexMap.put(device, getValidIndex(index));
+            }
+        }
+
+        /**
          * Copies all device/index pairs from the given VolumeStreamState after initializing
          * them with the volume for DEVICE_OUT_DEFAULT. No-op if the source VolumeStreamState
          * has the same stream type as this instance.
diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java
index 36f5a6c..7aaac06 100644
--- a/services/core/java/com/android/server/connectivity/DnsManager.java
+++ b/services/core/java/com/android/server/connectivity/DnsManager.java
@@ -34,27 +34,28 @@
 import android.net.Network;
 import android.net.NetworkUtils;
 import android.net.Uri;
+import android.net.dns.ResolvUtil;
 import android.os.Binder;
 import android.os.INetworkManagementService;
-import android.os.Handler;
 import android.os.UserHandle;
 import android.provider.Settings;
-import android.system.GaiException;
-import android.system.OsConstants;
-import android.system.StructAddrinfo;
 import android.text.TextUtils;
+import android.util.Pair;
 import android.util.Slog;
 
 import com.android.server.connectivity.MockableSystemProperties;
 
-import libcore.io.Libcore;
-
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
+import java.util.Set;
 import java.util.StringJoiner;
 
 
@@ -64,10 +65,56 @@
  * This class it NOT designed for concurrent access. Furthermore, all non-static
  * methods MUST be called from ConnectivityService's thread.
  *
+ * [ Private DNS ]
+ * The code handling Private DNS is spread across several components, but this
+ * seems like the least bad place to collect all the observations.
+ *
+ * Private DNS handling and updating occurs in response to several different
+ * events. Each is described here with its corresponding intended handling.
+ *
+ * [A] Event: A new network comes up.
+ * Mechanics:
+ *     [1] ConnectivityService gets notifications from NetworkAgents.
+ *     [2] in updateNetworkInfo(), the first time the NetworkAgent goes into
+ *         into CONNECTED state, the Private DNS configuration is retrieved,
+ *         programmed, and strict mode hostname resolution (if applicable) is
+ *         enqueued in NetworkAgent's NetworkMonitor, via a call to
+ *         handlePerNetworkPrivateDnsConfig().
+ *     [3] Re-resolution of strict mode hostnames that fail to return any
+ *         IP addresses happens inside NetworkMonitor; it sends itself a
+ *         delayed CMD_EVALUATE_PRIVATE_DNS message in a simple backoff
+ *         schedule.
+ *     [4] Successfully resolved hostnames are sent to ConnectivityService
+ *         inside an EVENT_PRIVATE_DNS_CONFIG_RESOLVED message. The resolved
+ *         IP addresses are programmed into netd via:
+ *
+ *             updatePrivateDns() -> updateDnses()
+ *
+ *         both of which make calls into DnsManager.
+ *     [5] Upon a successful hostname resolution NetworkMonitor initiates a
+ *         validation attempt in the form of a lookup for a one-time hostname
+ *         that uses Private DNS.
+ *
+ * [B] Event: Private DNS settings are changed.
+ * Mechanics:
+ *     [1] ConnectivityService gets notifications from its SettingsObserver.
+ *     [2] handlePrivateDnsSettingsChanged() is called, which calls
+ *         handlePerNetworkPrivateDnsConfig() and the process proceeds
+ *         as if from A.3 above.
+ *
+ * [C] Event: An application calls ConnectivityManager#reportBadNetwork().
+ * Mechanics:
+ *     [1] NetworkMonitor is notified and initiates a reevaluation, which
+ *         always bypasses Private DNS.
+ *     [2] Once completed, NetworkMonitor checks if strict mode is in operation
+ *         and if so enqueues another evaluation of Private DNS, as if from
+ *         step A.5 above.
+ *
  * @hide
  */
 public class DnsManager {
     private static final String TAG = DnsManager.class.getSimpleName();
+    private static final PrivateDnsConfig PRIVATE_DNS_OFF = new PrivateDnsConfig();
 
     /* Defaults for resolver parameters. */
     private static final int DNS_RESOLVER_DEFAULT_SAMPLE_VALIDITY_SECONDS = 1800;
@@ -126,35 +173,104 @@
     }
 
     public static PrivateDnsConfig tryBlockingResolveOf(Network network, String name) {
-        final StructAddrinfo hints = new StructAddrinfo();
-        // Unnecessary, but expressly no AI_ADDRCONFIG.
-        hints.ai_flags = 0;
-        // Fetch all IP addresses at once to minimize re-resolution.
-        hints.ai_family = OsConstants.AF_UNSPEC;
-        hints.ai_socktype = OsConstants.SOCK_DGRAM;
-
         try {
-            final InetAddress[] ips = Libcore.os.android_getaddrinfo(name, hints, network.netId);
-            if (ips != null && ips.length > 0) {
-                return new PrivateDnsConfig(name, ips);
-            }
-        } catch (GaiException ignored) {}
-
-        return null;
+            final InetAddress[] ips = ResolvUtil.blockingResolveAllLocally(network, name);
+            return new PrivateDnsConfig(name, ips);
+        } catch (UnknownHostException uhe) {
+            return new PrivateDnsConfig(name, null);
+        }
     }
 
     public static Uri[] getPrivateDnsSettingsUris() {
-        final Uri[] uris = new Uri[2];
-        uris[0] = Settings.Global.getUriFor(PRIVATE_DNS_MODE);
-        uris[1] = Settings.Global.getUriFor(PRIVATE_DNS_SPECIFIER);
-        return uris;
+        return new Uri[]{
+            Settings.Global.getUriFor(PRIVATE_DNS_MODE),
+            Settings.Global.getUriFor(PRIVATE_DNS_SPECIFIER),
+        };
+    }
+
+    public static class PrivateDnsValidationUpdate {
+        final public int netId;
+        final public InetAddress ipAddress;
+        final public String hostname;
+        final public boolean validated;
+
+        public PrivateDnsValidationUpdate(int netId, InetAddress ipAddress,
+                String hostname, boolean validated) {
+            this.netId = netId;
+            this.ipAddress = ipAddress;
+            this.hostname = hostname;
+            this.validated = validated;
+        }
+    }
+
+    private static class PrivateDnsValidationStatuses {
+        enum ValidationStatus {
+            IN_PROGRESS,
+            FAILED,
+            SUCCEEDED
+        }
+
+        // Validation statuses of <hostname, ipAddress> pairs for a single netId
+        private Map<Pair<String, InetAddress>, ValidationStatus> mValidationMap;
+
+        private PrivateDnsValidationStatuses() {
+            mValidationMap = new HashMap<>();
+        }
+
+        private boolean hasValidatedServer() {
+            for (ValidationStatus status : mValidationMap.values()) {
+                if (status == ValidationStatus.SUCCEEDED) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private void updateTrackedDnses(String[] ipAddresses, String hostname) {
+            Set<Pair<String, InetAddress>> latestDnses = new HashSet<>();
+            for (String ipAddress : ipAddresses) {
+                try {
+                    latestDnses.add(new Pair(hostname,
+                            InetAddress.parseNumericAddress(ipAddress)));
+                } catch (IllegalArgumentException e) {}
+            }
+            // Remove <hostname, ipAddress> pairs that should not be tracked.
+            for (Iterator<Map.Entry<Pair<String, InetAddress>, ValidationStatus>> it =
+                    mValidationMap.entrySet().iterator(); it.hasNext(); ) {
+                Map.Entry<Pair<String, InetAddress>, ValidationStatus> entry = it.next();
+                if (!latestDnses.contains(entry.getKey())) {
+                    it.remove();
+                }
+            }
+            // Add new <hostname, ipAddress> pairs that should be tracked.
+            for (Pair<String, InetAddress> p : latestDnses) {
+                if (!mValidationMap.containsKey(p)) {
+                    mValidationMap.put(p, ValidationStatus.IN_PROGRESS);
+                }
+            }
+        }
+
+        private void updateStatus(PrivateDnsValidationUpdate update) {
+            Pair<String, InetAddress> p = new Pair(update.hostname,
+                    update.ipAddress);
+            if (!mValidationMap.containsKey(p)) {
+                return;
+            }
+            if (update.validated) {
+                mValidationMap.put(p, ValidationStatus.SUCCEEDED);
+            } else {
+                mValidationMap.put(p, ValidationStatus.FAILED);
+            }
+        }
     }
 
     private final Context mContext;
     private final ContentResolver mContentResolver;
     private final INetworkManagementService mNMS;
     private final MockableSystemProperties mSystemProperties;
+    // TODO: Replace these Maps with SparseArrays.
     private final Map<Integer, PrivateDnsConfig> mPrivateDnsMap;
+    private final Map<Integer, PrivateDnsValidationStatuses> mPrivateDnsValidationMap;
 
     private int mNumDnsEntries;
     private int mSampleValidity;
@@ -170,6 +286,7 @@
         mNMS = nms;
         mSystemProperties = sp;
         mPrivateDnsMap = new HashMap<>();
+        mPrivateDnsValidationMap = new HashMap<>();
 
         // TODO: Create and register ContentObservers to track every setting
         // used herein, posting messages to respond to changes.
@@ -181,6 +298,7 @@
 
     public void removeNetwork(Network network) {
         mPrivateDnsMap.remove(network.netId);
+        mPrivateDnsValidationMap.remove(network.netId);
     }
 
     public PrivateDnsConfig updatePrivateDns(Network network, PrivateDnsConfig cfg) {
@@ -190,6 +308,40 @@
                 : mPrivateDnsMap.remove(network.netId);
     }
 
+    public void updatePrivateDnsStatus(int netId, LinkProperties lp) {
+        // Use the PrivateDnsConfig data pushed to this class instance
+        // from ConnectivityService.
+        final PrivateDnsConfig privateDnsCfg = mPrivateDnsMap.getOrDefault(netId,
+                PRIVATE_DNS_OFF);
+
+        final boolean useTls = privateDnsCfg.useTls;
+        final boolean strictMode = privateDnsCfg.inStrictMode();
+        final String tlsHostname = strictMode ? privateDnsCfg.hostname : "";
+
+        if (strictMode) {
+            lp.setUsePrivateDns(true);
+            lp.setPrivateDnsServerName(tlsHostname);
+        } else if (useTls) {
+            // We are in opportunistic mode. Private DNS should be used if there
+            // is a known DNS-over-TLS validated server.
+            boolean validated = mPrivateDnsValidationMap.containsKey(netId) &&
+                    mPrivateDnsValidationMap.get(netId).hasValidatedServer();
+            lp.setUsePrivateDns(validated);
+            lp.setPrivateDnsServerName(null);
+        } else {
+            // Private DNS is disabled.
+            lp.setUsePrivateDns(false);
+            lp.setPrivateDnsServerName(null);
+        }
+    }
+
+    public void updatePrivateDnsValidation(PrivateDnsValidationUpdate update) {
+        final PrivateDnsValidationStatuses statuses =
+                mPrivateDnsValidationMap.get(update.netId);
+        if (statuses == null) return;
+        statuses.updateStatus(update);
+    }
+
     public void setDnsConfigurationForNetwork(
             int netId, LinkProperties lp, boolean isDefaultNetwork) {
         final String[] assignedServers = NetworkUtils.makeStrings(lp.getDnsServers());
@@ -203,12 +355,13 @@
         // NetworkMonitor to decide which networks need validation and runs the
         // blocking calls to resolve Private DNS strict mode hostnames.
         //
-        // At this time we do attempt to enable Private DNS on non-Internet
+        // At this time we do not attempt to enable Private DNS on non-Internet
         // networks like IMS.
-        final PrivateDnsConfig privateDnsCfg = mPrivateDnsMap.get(netId);
+        final PrivateDnsConfig privateDnsCfg = mPrivateDnsMap.getOrDefault(netId,
+                PRIVATE_DNS_OFF);
 
-        final boolean useTls = (privateDnsCfg != null) && privateDnsCfg.useTls;
-        final boolean strictMode = (privateDnsCfg != null) && privateDnsCfg.inStrictMode();
+        final boolean useTls = privateDnsCfg.useTls;
+        final boolean strictMode = privateDnsCfg.inStrictMode();
         final String tlsHostname = strictMode ? privateDnsCfg.hostname : "";
         final String[] tlsServers =
                 strictMode ? NetworkUtils.makeStrings(
@@ -218,6 +371,17 @@
                 : useTls ? assignedServers  // Opportunistic
                 : new String[0];            // Off
 
+        // Prepare to track the validation status of the DNS servers in the
+        // resolver config when private DNS is in opportunistic or strict mode.
+        if (useTls) {
+            if (!mPrivateDnsValidationMap.containsKey(netId)) {
+                mPrivateDnsValidationMap.put(netId, new PrivateDnsValidationStatuses());
+            }
+            mPrivateDnsValidationMap.get(netId).updateTrackedDnses(tlsServers, tlsHostname);
+        } else {
+            mPrivateDnsValidationMap.remove(netId);
+        }
+
         Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)",
                 netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs),
                 Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers)));
diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
index 4eb1930..906a6a3 100644
--- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
+++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
@@ -20,35 +20,59 @@
 import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY;
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
+import static android.provider.Settings.Global.NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES;
 
 import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
+import static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN;
 
 import android.app.usage.NetworkStatsManager;
 import android.app.usage.NetworkStatsManager.UsageCallback;
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.NetworkIdentity;
+import android.net.NetworkPolicy;
 import android.net.NetworkPolicyManager;
 import android.net.NetworkRequest;
 import android.net.NetworkStats;
 import android.net.NetworkTemplate;
 import android.net.StringNetworkSpecifier;
+import android.os.BestClock;
 import android.os.Handler;
+import android.os.SystemClock;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.util.DebugUtils;
+import android.util.Pair;
+import android.util.Range;
 import android.util.Slog;
 
+import com.android.internal.R;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.server.LocalServices;
 import com.android.server.net.NetworkPolicyManagerInternal;
-import com.android.server.net.NetworkPolicyManagerService;
 import com.android.server.net.NetworkStatsManagerInternal;
 
-import java.util.Calendar;
+import java.time.Clock;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Manages multipath data budgets.
@@ -69,6 +93,11 @@
 
     private final Context mContext;
     private final Handler mHandler;
+    private final Clock mClock;
+    private final Dependencies mDeps;
+    private final ContentResolver mResolver;
+    private final SettingsObserver mSettingsObserver;
+    private final ConfigChangeReceiver mConfigChangeReceiver;
 
     private ConnectivityManager mCM;
     private NetworkPolicyManager mNPM;
@@ -77,12 +106,32 @@
     private NetworkCallback mMobileNetworkCallback;
     private NetworkPolicyManager.Listener mPolicyListener;
 
-    // STOPSHIP: replace this with a configurable mechanism.
-    private static final long DEFAULT_DAILY_MULTIPATH_QUOTA = 2_500_000;
+
+    /**
+     * Divider to calculate opportunistic quota from user-set data limit or warning: 5% of user-set
+     * limit.
+     */
+    private static final int OPQUOTA_USER_SETTING_DIVIDER = 20;
+
+    public static class Dependencies {
+        public Clock getClock() {
+            return new BestClock(ZoneOffset.UTC, SystemClock.currentNetworkTimeClock(),
+                    Clock.systemUTC());
+        }
+    }
 
     public MultipathPolicyTracker(Context ctx, Handler handler) {
+        this(ctx, handler, new Dependencies());
+    }
+
+    public MultipathPolicyTracker(Context ctx, Handler handler, Dependencies deps) {
         mContext = ctx;
         mHandler = handler;
+        mClock = deps.getClock();
+        mDeps = deps;
+        mResolver = mContext.getContentResolver();
+        mSettingsObserver = new SettingsObserver(mHandler);
+        mConfigChangeReceiver = new ConfigChangeReceiver();
         // Because we are initialized by the ConnectivityService constructor, we can't touch any
         // connectivity APIs. Service initialization is done in start().
     }
@@ -94,6 +143,14 @@
 
         registerTrackMobileCallback();
         registerNetworkPolicyListener();
+        final Uri defaultSettingUri =
+                Settings.Global.getUriFor(NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES);
+        mResolver.registerContentObserver(defaultSettingUri, false, mSettingsObserver);
+
+        final IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+        mContext.registerReceiverAsUser(
+                mConfigChangeReceiver, UserHandle.ALL, intentFilter, null, mHandler);
     }
 
     public void shutdown() {
@@ -103,6 +160,8 @@
             t.shutdown();
         }
         mMultipathTrackers.clear();
+        mResolver.unregisterContentObserver(mSettingsObserver);
+        mContext.unregisterReceiver(mConfigChangeReceiver);
     }
 
     // Called on an arbitrary binder thread.
@@ -128,9 +187,11 @@
         private long mMultipathBudget;
         private final NetworkTemplate mNetworkTemplate;
         private final UsageCallback mUsageCallback;
+        private NetworkCapabilities mNetworkCapabilities;
 
         public MultipathTracker(Network network, NetworkCapabilities nc) {
             this.network = network;
+            this.mNetworkCapabilities = new NetworkCapabilities(nc);
             try {
                 subId = Integer.parseInt(
                         ((StringNetworkSpecifier) nc.getNetworkSpecifier()).toString());
@@ -167,34 +228,99 @@
             updateMultipathBudget();
         }
 
-        private long getDailyNonDefaultDataUsage() {
-            Calendar start = Calendar.getInstance();
-            Calendar end = (Calendar) start.clone();
-            start.set(Calendar.HOUR_OF_DAY, 0);
-            start.set(Calendar.MINUTE, 0);
-            start.set(Calendar.SECOND, 0);
-            start.set(Calendar.MILLISECOND, 0);
+        public void setNetworkCapabilities(NetworkCapabilities nc) {
+            mNetworkCapabilities = new NetworkCapabilities(nc);
+        }
 
+        // TODO: calculate with proper timezone information
+        private long getDailyNonDefaultDataUsage() {
+            final ZonedDateTime end =
+                    ZonedDateTime.ofInstant(mClock.instant(), ZoneId.systemDefault());
+            final ZonedDateTime start = end.truncatedTo(ChronoUnit.DAYS);
+
+            final long bytes = getNetworkTotalBytes(
+                    start.toInstant().toEpochMilli(),
+                    end.toInstant().toEpochMilli());
+            if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes);
+            return bytes;
+        }
+
+        private long getNetworkTotalBytes(long start, long end) {
             try {
-                final long bytes = LocalServices.getService(NetworkStatsManagerInternal.class)
-                        .getNetworkTotalBytes(mNetworkTemplate, start.getTimeInMillis(),
-                                end.getTimeInMillis());
-                if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes);
-                return bytes;
+                return LocalServices.getService(NetworkStatsManagerInternal.class)
+                        .getNetworkTotalBytes(mNetworkTemplate, start, end);
             } catch (RuntimeException e) {
                 Slog.w(TAG, "Failed to get data usage: " + e);
                 return -1;
             }
         }
 
+        private NetworkIdentity getTemplateMatchingNetworkIdentity(NetworkCapabilities nc) {
+            return new NetworkIdentity(
+                    ConnectivityManager.TYPE_MOBILE,
+                    0 /* subType, unused for template matching */,
+                    subscriberId,
+                    null /* networkId, unused for matching mobile networks */,
+                    !nc.hasCapability(NET_CAPABILITY_NOT_ROAMING),
+                    !nc.hasCapability(NET_CAPABILITY_NOT_METERED),
+                    false /* defaultNetwork, templates should have DEFAULT_NETWORK_ALL */);
+        }
+
+        private long getRemainingDailyBudget(long limitBytes,
+                Range<ZonedDateTime> cycle) {
+            final long start = cycle.getLower().toInstant().toEpochMilli();
+            final long end = cycle.getUpper().toInstant().toEpochMilli();
+            final long totalBytes = getNetworkTotalBytes(start, end);
+            final long remainingBytes = totalBytes == -1 ? 0 : Math.max(0, limitBytes - totalBytes);
+            // 1 + ((end - now - 1) / millisInDay with integers is equivalent to:
+            // ceil((double)(end - now) / millisInDay)
+            final long remainingDays =
+                    1 + ((end - mClock.millis() - 1) / TimeUnit.DAYS.toMillis(1));
+
+            return remainingBytes / Math.max(1, remainingDays);
+        }
+
+        private long getUserPolicyOpportunisticQuotaBytes() {
+            // Keep the most restrictive applicable policy
+            long minQuota = Long.MAX_VALUE;
+            final NetworkIdentity identity = getTemplateMatchingNetworkIdentity(
+                    mNetworkCapabilities);
+
+            final NetworkPolicy[] policies = mNPM.getNetworkPolicies();
+            for (NetworkPolicy policy : policies) {
+                if (hasActiveCycle(policy) && policy.template.matches(identity)) {
+                    // Prefer user-defined warning, otherwise use hard limit
+                    final long policyBytes = (policy.warningBytes == LIMIT_DISABLED)
+                            ? policy.limitBytes : policy.warningBytes;
+
+                    if (policyBytes != LIMIT_DISABLED) {
+                        final long policyBudget = getRemainingDailyBudget(policyBytes,
+                                policy.cycleIterator().next());
+                        minQuota = Math.min(minQuota, policyBudget);
+                    }
+                }
+            }
+
+            if (minQuota == Long.MAX_VALUE) {
+                return OPPORTUNISTIC_QUOTA_UNKNOWN;
+            }
+
+            return minQuota / OPQUOTA_USER_SETTING_DIVIDER;
+        }
+
         void updateMultipathBudget() {
             long quota = LocalServices.getService(NetworkPolicyManagerInternal.class)
                     .getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH);
             if (DBG) Slog.d(TAG, "Opportunistic quota from data plan: " + quota + " bytes");
 
-            if (quota == NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN) {
-                // STOPSHIP: replace this with a configurable mechanism.
-                quota = DEFAULT_DAILY_MULTIPATH_QUOTA;
+            // Fallback to user settings-based quota if not available from phone plan
+            if (quota == OPPORTUNISTIC_QUOTA_UNKNOWN) {
+                quota = getUserPolicyOpportunisticQuotaBytes();
+                if (DBG) Slog.d(TAG, "Opportunistic quota from user policy: " + quota + " bytes");
+            }
+
+            if (quota == OPPORTUNISTIC_QUOTA_UNKNOWN) {
+                quota = getDefaultDailyMultipathQuotaBytes();
                 if (DBG) Slog.d(TAG, "Setting quota: " + quota + " bytes");
             }
 
@@ -262,11 +388,31 @@
         }
     }
 
+    private static boolean hasActiveCycle(NetworkPolicy policy) {
+        return policy.hasCycle() && policy.lastLimitSnooze <
+                policy.cycleIterator().next().getLower().toInstant().toEpochMilli();
+    }
+
     // Only ever updated on the handler thread. Accessed from other binder threads to retrieve
     // the tracker for a specific network.
     private final ConcurrentHashMap <Network, MultipathTracker> mMultipathTrackers =
             new ConcurrentHashMap<>();
 
+    private long getDefaultDailyMultipathQuotaBytes() {
+        final String setting = Settings.Global.getString(mContext.getContentResolver(),
+                NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES);
+        if (setting != null) {
+            try {
+                return Long.parseLong(setting);
+            } catch(NumberFormatException e) {
+                // fall through
+            }
+        }
+
+        return mContext.getResources().getInteger(
+                R.integer.config_networkDefaultDailyMultipathQuotaBytes);
+    }
+
     // TODO: this races with app code that might respond to onAvailable() by immediately calling
     // getMultipathPreference. Fix this by adding to ConnectivityService the ability to directly
     // invoke NetworkCallbacks on tightly-coupled classes such as this one which run on its
@@ -281,6 +427,7 @@
             public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
                 MultipathTracker existing = mMultipathTrackers.get(network);
                 if (existing != null) {
+                    existing.setNetworkCapabilities(nc);
                     existing.updateMultipathBudget();
                     return;
                 }
@@ -307,6 +454,15 @@
         mCM.registerNetworkCallback(request, mMobileNetworkCallback, mHandler);
     }
 
+    /**
+     * Update multipath budgets for all trackers. To be called on the mHandler thread.
+     */
+    private void updateAllMultipathBudgets() {
+        for (MultipathTracker t : mMultipathTrackers.values()) {
+            t.updateMultipathBudget();
+        }
+    }
+
     private void maybeUnregisterTrackMobileCallback() {
         if (mMobileNetworkCallback != null) {
             mCM.unregisterNetworkCallback(mMobileNetworkCallback);
@@ -319,11 +475,7 @@
             @Override
             public void onMeteredIfacesChanged(String[] meteredIfaces) {
                 // Dispatched every time opportunistic quota is recalculated.
-                mHandler.post(() -> {
-                    for (MultipathTracker t : mMultipathTrackers.values()) {
-                        t.updateMultipathBudget();
-                    }
-                });
+                mHandler.post(() -> updateAllMultipathBudgets());
             }
         };
         mNPM.registerListener(mPolicyListener);
@@ -333,6 +485,35 @@
         mNPM.unregisterListener(mPolicyListener);
     }
 
+    private final class SettingsObserver extends ContentObserver {
+        public SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            Slog.wtf(TAG, "Should never be reached.");
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (!Settings.Global.getUriFor(NETWORK_DEFAULT_DAILY_MULTIPATH_QUOTA_BYTES)
+                    .equals(uri)) {
+                Slog.wtf(TAG, "Unexpected settings observation: " + uri);
+            }
+            if (DBG) Slog.d(TAG, "Settings change: updating budgets.");
+            updateAllMultipathBudgets();
+        }
+    }
+
+    private final class ConfigChangeReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (DBG) Slog.d(TAG, "Configuration change: updating budgets.");
+            updateAllMultipathBudgets();
+        }
+    }
+
     public void dump(IndentingPrintWriter pw) {
         // Do not use in production. Access to class data is only safe on the handler thrad.
         pw.println("MultipathPolicyTracker:");
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index 8a2e71c..2845383 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -34,6 +34,7 @@
 import android.net.ProxyInfo;
 import android.net.TrafficStats;
 import android.net.Uri;
+import android.net.dns.ResolvUtil;
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.NetworkEvent;
 import android.net.metrics.ValidationProbeEvent;
@@ -64,6 +65,7 @@
 import com.android.internal.util.Protocol;
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
+import com.android.server.connectivity.DnsManager.PrivateDnsConfig;
 
 import java.io.IOException;
 import java.net.HttpURLConnection;
@@ -77,6 +79,7 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Random;
+import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -165,7 +168,7 @@
      * Force evaluation even if it has succeeded in the past.
      * arg1 = UID responsible for requesting this reeval.  Will be billed for data.
      */
-    public static final int CMD_FORCE_REEVALUATION = BASE + 8;
+    private static final int CMD_FORCE_REEVALUATION = BASE + 8;
 
     /**
      * Message to self indicating captive portal app finished.
@@ -205,9 +208,15 @@
      * Private DNS. If a DNS resolution is required, e.g. for DNS-over-TLS in
      * strict mode, then an event is sent back to ConnectivityService with the
      * result of the resolution attempt.
+     *
+     * A separate message is used to trigger (re)evaluation of the Private DNS
+     * configuration, so that the message can be handled as needed in different
+     * states, including being ignored until after an ongoing captive portal
+     * validation phase is completed.
      */
     private static final int CMD_PRIVATE_DNS_SETTINGS_CHANGED = BASE + 13;
     public static final int EVENT_PRIVATE_DNS_CONFIG_RESOLVED = BASE + 14;
+    private static final int CMD_EVALUATE_PRIVATE_DNS = BASE + 15;
 
     // Start mReevaluateDelayMs at this value and double.
     private static final int INITIAL_REEVALUATE_DELAY_MS = 1000;
@@ -215,6 +224,7 @@
     // Before network has been evaluated this many times, ignore repeated reevaluate requests.
     private static final int IGNORE_REEVALUATE_ATTEMPTS = 5;
     private int mReevaluateToken = 0;
+    private static final int NO_UID = 0;
     private static final int INVALID_UID = -1;
     private int mUidResponsibleForReeval = INVALID_UID;
     // Stop blaming UID that requested re-evaluation after this many attempts.
@@ -224,6 +234,8 @@
 
     private static final int NUM_VALIDATION_LOG_LINES = 20;
 
+    private String mPrivateDnsProviderHostname = "";
+
     public static boolean isValidationRequired(
             NetworkCapabilities dfltNetCap, NetworkCapabilities nc) {
         // TODO: Consider requiring validation for DUN networks.
@@ -261,13 +273,12 @@
 
     public boolean systemReady = false;
 
-    private DnsManager.PrivateDnsConfig mPrivateDnsCfg = null;
-
     private final State mDefaultState = new DefaultState();
     private final State mValidatedState = new ValidatedState();
     private final State mMaybeNotifyState = new MaybeNotifyState();
     private final State mEvaluatingState = new EvaluatingState();
     private final State mCaptivePortalState = new CaptivePortalState();
+    private final State mEvaluatingPrivateDnsState = new EvaluatingPrivateDnsState();
 
     private CustomIntentReceiver mLaunchCaptivePortalAppBroadcastReceiver = null;
 
@@ -293,6 +304,10 @@
         // Add suffix indicating which NetworkMonitor we're talking about.
         super(TAG + networkAgentInfo.name());
 
+        // Logs with a tag of the form given just above, e.g.
+        //     <timestamp>   862  2402 D NetworkMonitor/NetworkAgentInfo [WIFI () - 100]: ...
+        setDbg(VDBG);
+
         mContext = context;
         mMetricsLog = logger;
         mConnectivityServiceHandler = handler;
@@ -305,10 +320,11 @@
         mDefaultRequest = defaultRequest;
 
         addState(mDefaultState);
-        addState(mValidatedState, mDefaultState);
         addState(mMaybeNotifyState, mDefaultState);
             addState(mEvaluatingState, mMaybeNotifyState);
             addState(mCaptivePortalState, mMaybeNotifyState);
+        addState(mEvaluatingPrivateDnsState, mDefaultState);
+        addState(mValidatedState, mDefaultState);
         setInitialState(mDefaultState);
 
         mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled();
@@ -321,6 +337,17 @@
         start();
     }
 
+    public void forceReevaluation(int responsibleUid) {
+        sendMessage(CMD_FORCE_REEVALUATION, responsibleUid, 0);
+    }
+
+    public void notifyPrivateDnsSettingsChanged(PrivateDnsConfig newCfg) {
+        // Cancel any outstanding resolutions.
+        removeMessages(CMD_PRIVATE_DNS_SETTINGS_CHANGED);
+        // Send the update to the proper thread.
+        sendMessage(CMD_PRIVATE_DNS_SETTINGS_CHANGED, newCfg);
+    }
+
     @Override
     protected void log(String s) {
         if (DBG) Log.d(TAG + "/" + mNetworkAgentInfo.name(), s);
@@ -349,6 +376,12 @@
                 mDefaultRequest.networkCapabilities, mNetworkAgentInfo.networkCapabilities);
     }
 
+
+    private void notifyNetworkTestResultInvalid(Object obj) {
+        mConnectivityServiceHandler.sendMessage(obtainMessage(
+                EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_INVALID, mNetId, obj));
+    }
+
     // DefaultState is the parent of all States.  It exists only to handle CMD_* messages but
     // does not entail any real state (hence no enter() or exit() routines).
     private class DefaultState extends State {
@@ -392,41 +425,66 @@
 
                     switch (message.arg1) {
                         case APP_RETURN_DISMISSED:
-                            sendMessage(CMD_FORCE_REEVALUATION, 0 /* no UID */, 0);
+                            sendMessage(CMD_FORCE_REEVALUATION, NO_UID, 0);
                             break;
                         case APP_RETURN_WANTED_AS_IS:
                             mDontDisplaySigninNotification = true;
                             // TODO: Distinguish this from a network that actually validates.
-                            // Displaying the "!" on the system UI icon may still be a good idea.
-                            transitionTo(mValidatedState);
+                            // Displaying the "x" on the system UI icon may still be a good idea.
+                            transitionTo(mEvaluatingPrivateDnsState);
                             break;
                         case APP_RETURN_UNWANTED:
                             mDontDisplaySigninNotification = true;
                             mUserDoesNotWant = true;
-                            mConnectivityServiceHandler.sendMessage(obtainMessage(
-                                    EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_INVALID,
-                                    mNetId, null));
+                            notifyNetworkTestResultInvalid(null);
                             // TODO: Should teardown network.
                             mUidResponsibleForReeval = 0;
                             transitionTo(mEvaluatingState);
                             break;
                     }
                     return HANDLED;
-                case CMD_PRIVATE_DNS_SETTINGS_CHANGED:
-                    if (isValidationRequired()) {
-                        // This performs a blocking DNS resolution of the
-                        // strict mode hostname, if required.
-                        resolvePrivateDnsConfig((DnsManager.PrivateDnsConfig) message.obj);
-                        if ((mPrivateDnsCfg != null) && mPrivateDnsCfg.inStrictMode()) {
-                            mConnectivityServiceHandler.sendMessage(obtainMessage(
-                                    EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0, mNetId,
-                                    new DnsManager.PrivateDnsConfig(mPrivateDnsCfg)));
-                        }
+                case CMD_PRIVATE_DNS_SETTINGS_CHANGED: {
+                    final PrivateDnsConfig cfg = (PrivateDnsConfig) message.obj;
+                    if (!isValidationRequired() || cfg == null || !cfg.inStrictMode()) {
+                        // No DNS resolution required.
+                        //
+                        // We don't force any validation in opportunistic mode
+                        // here. Opportunistic mode nameservers are validated
+                        // separately within netd.
+                        //
+                        // Reset Private DNS settings state.
+                        mPrivateDnsProviderHostname = "";
+                        break;
                     }
-                    return HANDLED;
+
+                    mPrivateDnsProviderHostname = cfg.hostname;
+
+                    // DNS resolutions via Private DNS strict mode block for a
+                    // few seconds (~4.2) checking for any IP addresses to
+                    // arrive and validate. Initiating a (re)evaluation now
+                    // should not significantly alter the validation outcome.
+                    //
+                    // No matter what: enqueue a validation request; one of
+                    // three things can happen with this request:
+                    //     [1] ignored (EvaluatingState or CaptivePortalState)
+                    //     [2] transition to EvaluatingPrivateDnsState
+                    //         (DefaultState and ValidatedState)
+                    //     [3] handled (EvaluatingPrivateDnsState)
+                    //
+                    // The Private DNS configuration to be evaluated will:
+                    //     [1] be skipped (not in strict mode), or
+                    //     [2] validate (huzzah), or
+                    //     [3] encounter some problem (invalid hostname,
+                    //         no resolved IP addresses, IPs unreachable,
+                    //         port 853 unreachable, port 853 is not running a
+                    //         DNS-over-TLS server, et cetera).
+                    sendMessage(CMD_EVALUATE_PRIVATE_DNS);
+                    break;
+                }
                 default:
-                    return HANDLED;
+                    break;
             }
+            return HANDLED;
         }
     }
 
@@ -440,7 +498,7 @@
             maybeLogEvaluationResult(
                     networkEventType(validationStage(), EvaluationResult.VALIDATED));
             mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
-                    NETWORK_TEST_RESULT_VALID, mNetId, mPrivateDnsCfg));
+                    NETWORK_TEST_RESULT_VALID, mNetId, null));
             mValidations++;
         }
 
@@ -449,10 +507,14 @@
             switch (message.what) {
                 case CMD_NETWORK_CONNECTED:
                     transitionTo(mValidatedState);
-                    return HANDLED;
+                    break;
+                case CMD_EVALUATE_PRIVATE_DNS:
+                    transitionTo(mEvaluatingPrivateDnsState);
+                    break;
                 default:
                     return NOT_HANDLED;
             }
+            return HANDLED;
         }
     }
 
@@ -569,11 +631,11 @@
                 case CMD_REEVALUATE:
                     if (message.arg1 != mReevaluateToken || mUserDoesNotWant)
                         return HANDLED;
-                    // Don't bother validating networks that don't satisify the default request.
+                    // Don't bother validating networks that don't satisfy the default request.
                     // This includes:
                     //  - VPNs which can be considered explicitly desired by the user and the
                     //    user's desire trumps whether the network validates.
-                    //  - Networks that don't provide internet access.  It's unclear how to
+                    //  - Networks that don't provide Internet access.  It's unclear how to
                     //    validate such networks.
                     //  - Untrusted networks.  It's unsafe to prompt the user to sign-in to
                     //    such networks and the user didn't express interest in connecting to
@@ -588,7 +650,6 @@
                     //    expensive metered network, or unwanted leaking of the User Agent string.
                     if (!isValidationRequired()) {
                         validationLog("Network would not satisfy default request, not validating");
-                        mPrivateDnsCfg = null;
                         transitionTo(mValidatedState);
                         return HANDLED;
                     }
@@ -601,20 +662,18 @@
                     // if this is found to cause problems.
                     CaptivePortalProbeResult probeResult = isCaptivePortal();
                     if (probeResult.isSuccessful()) {
-                        resolvePrivateDnsConfig();
-                        transitionTo(mValidatedState);
+                        // Transit EvaluatingPrivateDnsState to get to Validated
+                        // state (even if no Private DNS validation required).
+                        transitionTo(mEvaluatingPrivateDnsState);
                     } else if (probeResult.isPortal()) {
-                        mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
-                                NETWORK_TEST_RESULT_INVALID, mNetId, probeResult.redirectUrl));
+                        notifyNetworkTestResultInvalid(probeResult.redirectUrl);
                         mLastPortalProbeResult = probeResult;
                         transitionTo(mCaptivePortalState);
                     } else {
                         final Message msg = obtainMessage(CMD_REEVALUATE, ++mReevaluateToken, 0);
                         sendMessageDelayed(msg, mReevaluateDelayMs);
                         logNetworkEvent(NetworkEvent.NETWORK_VALIDATION_FAILED);
-                        mConnectivityServiceHandler.sendMessage(obtainMessage(
-                                EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_INVALID, mNetId,
-                                probeResult.redirectUrl));
+                        notifyNetworkTestResultInvalid(probeResult.redirectUrl);
                         if (mAttempts >= BLAME_FOR_EVALUATION_ATTEMPTS) {
                             // Don't continue to blame UID forever.
                             TrafficStats.clearThreadStatsUid();
@@ -700,6 +759,110 @@
         }
     }
 
+    private class EvaluatingPrivateDnsState extends State {
+        private int mPrivateDnsReevalDelayMs;
+        private PrivateDnsConfig mPrivateDnsConfig;
+
+        @Override
+        public void enter() {
+            mPrivateDnsReevalDelayMs = INITIAL_REEVALUATE_DELAY_MS;
+            mPrivateDnsConfig = null;
+            sendMessage(CMD_EVALUATE_PRIVATE_DNS);
+        }
+
+        @Override
+        public boolean processMessage(Message msg) {
+            switch (msg.what) {
+                case CMD_EVALUATE_PRIVATE_DNS:
+                    if (inStrictMode()) {
+                        if (!isStrictModeHostnameResolved()) {
+                            resolveStrictModeHostname();
+
+                            if (isStrictModeHostnameResolved()) {
+                                notifyPrivateDnsConfigResolved();
+                            } else {
+                                handlePrivateDnsEvaluationFailure();
+                                break;
+                            }
+                        }
+
+                        // Look up a one-time hostname, to bypass caching.
+                        //
+                        // Note that this will race with ConnectivityService
+                        // code programming the DNS-over-TLS server IP addresses
+                        // into netd (if invoked, above). If netd doesn't know
+                        // the IP addresses yet, or if the connections to the IP
+                        // addresses haven't yet been validated, netd will block
+                        // for up to a few seconds before failing the lookup.
+                        if (!sendPrivateDnsProbe()) {
+                            handlePrivateDnsEvaluationFailure();
+                            break;
+                        }
+                    }
+
+                    // All good!
+                    transitionTo(mValidatedState);
+                    break;
+                default:
+                    return NOT_HANDLED;
+            }
+            return HANDLED;
+        }
+
+        private boolean inStrictMode() {
+            return !TextUtils.isEmpty(mPrivateDnsProviderHostname);
+        }
+
+        private boolean isStrictModeHostnameResolved() {
+            return (mPrivateDnsConfig != null) &&
+                   mPrivateDnsConfig.hostname.equals(mPrivateDnsProviderHostname) &&
+                   (mPrivateDnsConfig.ips.length > 0);
+        }
+
+        private void resolveStrictModeHostname() {
+            try {
+                // Do a blocking DNS resolution using the network-assigned nameservers.
+                mPrivateDnsConfig = new PrivateDnsConfig(
+                        mPrivateDnsProviderHostname,
+                        mNetwork.getAllByName(mPrivateDnsProviderHostname));
+            } catch (UnknownHostException uhe) {
+                mPrivateDnsConfig = null;
+            }
+        }
+
+        private void notifyPrivateDnsConfigResolved() {
+            mConnectivityServiceHandler.sendMessage(obtainMessage(
+                    EVENT_PRIVATE_DNS_CONFIG_RESOLVED, 0, mNetId, mPrivateDnsConfig));
+        }
+
+        private void handlePrivateDnsEvaluationFailure() {
+            notifyNetworkTestResultInvalid(null);
+
+            // Queue up a re-evaluation with backoff.
+            //
+            // TODO: Consider abandoning this state after a few attempts and
+            // transitioning back to EvaluatingState, to perhaps give ourselves
+            // the opportunity to (re)detect a captive portal or something.
+            sendMessageDelayed(CMD_EVALUATE_PRIVATE_DNS, mPrivateDnsReevalDelayMs);
+            mPrivateDnsReevalDelayMs *= 2;
+            if (mPrivateDnsReevalDelayMs > MAX_REEVALUATE_DELAY_MS) {
+                mPrivateDnsReevalDelayMs = MAX_REEVALUATE_DELAY_MS;
+            }
+        }
+
+        private boolean sendPrivateDnsProbe() {
+            // q.v. system/netd/server/dns/DnsTlsTransport.cpp
+            final String ONE_TIME_HOSTNAME_SUFFIX = "-dnsotls-ds.metric.gstatic.com";
+            final String host = UUID.randomUUID().toString().substring(0, 8) +
+                    ONE_TIME_HOSTNAME_SUFFIX;
+            try {
+                final InetAddress[] ips = mNetworkAgentInfo.network().getAllByName(host);
+                return (ips != null && ips.length > 0);
+            } catch (UnknownHostException uhe) {}
+            return false;
+        }
+    }
+
     // Limits the list of IP addresses returned by getAllByName or tried by openConnection to at
     // most one per address family. This ensures we only wait up to 20 seconds for TCP connections
     // to complete, regardless of how many IP addresses a host has.
@@ -710,7 +873,9 @@
 
         @Override
         public InetAddress[] getAllByName(String host) throws UnknownHostException {
-            List<InetAddress> addrs = Arrays.asList(super.getAllByName(host));
+            // Always bypass Private DNS.
+            final List<InetAddress> addrs = Arrays.asList(
+                    ResolvUtil.blockingResolveAllLocally(this, host));
 
             // Ensure the address family of the first address is tried first.
             LinkedHashMap<Class, InetAddress> addressByFamily = new LinkedHashMap<>();
@@ -1065,44 +1230,6 @@
         return null;
     }
 
-    public void notifyPrivateDnsSettingsChanged(DnsManager.PrivateDnsConfig newCfg) {
-        // Cancel any outstanding resolutions.
-        removeMessages(CMD_PRIVATE_DNS_SETTINGS_CHANGED);
-        // Send the update to the proper thread.
-        sendMessage(CMD_PRIVATE_DNS_SETTINGS_CHANGED, newCfg);
-    }
-
-    private void resolvePrivateDnsConfig() {
-        resolvePrivateDnsConfig(DnsManager.getPrivateDnsConfig(mContext.getContentResolver()));
-    }
-
-    private void resolvePrivateDnsConfig(DnsManager.PrivateDnsConfig cfg) {
-        // Nothing to do.
-        if (cfg == null) {
-            mPrivateDnsCfg = null;
-            return;
-        }
-
-        // No DNS resolution required.
-        if (!cfg.inStrictMode()) {
-            mPrivateDnsCfg = cfg;
-            return;
-        }
-
-        if ((mPrivateDnsCfg != null) && mPrivateDnsCfg.inStrictMode() &&
-                (mPrivateDnsCfg.ips.length > 0) && mPrivateDnsCfg.hostname.equals(cfg.hostname)) {
-            // We have already resolved this strict mode hostname. Assume that
-            // Private DNS services won't be changing serving IP addresses very
-            // frequently and save ourselves one re-resolve.
-            return;
-        }
-
-        mPrivateDnsCfg = cfg;
-        final DnsManager.PrivateDnsConfig resolvedCfg = DnsManager.tryBlockingResolveOf(
-                mNetwork, mPrivateDnsCfg.hostname);
-        if (resolvedCfg != null) mPrivateDnsCfg = resolvedCfg;
-    }
-
     /**
      * @param responseReceived - whether or not we received a valid HTTP response to our request.
      * If false, isCaptivePortal and responseTimestampMs are ignored
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 1bc7423..d37dd18 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -19,6 +19,27 @@
 import static android.hardware.usb.UsbManager.USB_CONFIGURED;
 import static android.hardware.usb.UsbManager.USB_CONNECTED;
 import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_ADD_TETHER_TYPE;
+import static android.net.ConnectivityManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_ERRORED_TETHER;
+import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO;
+import static android.net.ConnectivityManager.EXTRA_PROVISION_CALLBACK;
+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_MASTER_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR;
+import static android.net.ConnectivityManager.TETHER_ERROR_SERVICE_UNAVAIL;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
+import static android.net.ConnectivityManager.TETHERING_INVALID;
+import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TETHERING_WIFI;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
 import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
@@ -45,7 +66,6 @@
 import android.content.IntentFilter;
 import android.content.res.Resources;
 import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
 import android.net.INetworkPolicyManager;
 import android.net.INetworkStatsService;
 import android.net.IpPrefix;
@@ -148,7 +168,7 @@
             stateMachine = sm;
             // Assume all state machines start out available and with no errors.
             lastState = IControlsTethering.STATE_AVAILABLE;
-            lastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+            lastError = TETHER_ERROR_NO_ERROR;
         }
 
         public boolean isCurrentlyServing() {
@@ -216,7 +236,7 @@
 
         final Handler smHandler = mTetherMasterSM.getHandler();
         mOffloadController = new OffloadController(smHandler,
-                deps.getOffloadHardwareInterface(smHandler, mLog),
+                mDeps.getOffloadHardwareInterface(smHandler, mLog),
                 mContext.getContentResolver(), mNMService,
                 mLog);
         mUpstreamNetworkMonitor = deps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog,
@@ -243,7 +263,7 @@
         mStateReceiver = new StateReceiver();
         filter = new IntentFilter();
         filter.addAction(UsbManager.ACTION_USB_STATE);
-        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
+        filter.addAction(CONNECTIVITY_ACTION);
         filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
         filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
         mContext.registerReceiver(mStateReceiver, filter, null, smHandler);
@@ -265,12 +285,6 @@
         updateConfiguration();
     }
 
-    // We can't do this once in the Tethering() constructor and cache the value, because the
-    // CONNECTIVITY_SERVICE is registered only after the Tethering() constructor has completed.
-    private ConnectivityManager getConnectivityManager() {
-        return (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-    }
-
     private WifiManager getWifiManager() {
         return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
     }
@@ -296,7 +310,7 @@
             if (up) {
                 maybeTrackNewInterfaceLocked(iface);
             } else {
-                if (ifaceNameToType(iface) == ConnectivityManager.TETHERING_BLUETOOTH) {
+                if (ifaceNameToType(iface) == TETHERING_BLUETOOTH) {
                     stopTrackingInterfaceLocked(iface);
                 } else {
                     // Ignore usb0 down after enabling RNDIS.
@@ -318,13 +332,13 @@
         final TetheringConfiguration cfg = mConfig;
 
         if (cfg.isWifi(iface)) {
-            return ConnectivityManager.TETHERING_WIFI;
+            return TETHERING_WIFI;
         } else if (cfg.isUsb(iface)) {
-            return ConnectivityManager.TETHERING_USB;
+            return TETHERING_USB;
         } else if (cfg.isBluetooth(iface)) {
-            return ConnectivityManager.TETHERING_BLUETOOTH;
+            return TETHERING_BLUETOOTH;
         }
-        return ConnectivityManager.TETHERING_INVALID;
+        return TETHERING_INVALID;
     }
 
     @Override
@@ -426,26 +440,26 @@
         boolean isProvisioningRequired = enable && isTetherProvisioningRequired();
         int result;
         switch (type) {
-            case ConnectivityManager.TETHERING_WIFI:
+            case TETHERING_WIFI:
                 result = setWifiTethering(enable);
-                if (isProvisioningRequired && result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+                if (isProvisioningRequired && result == TETHER_ERROR_NO_ERROR) {
                     scheduleProvisioningRechecks(type);
                 }
                 sendTetherResult(receiver, result);
                 break;
-            case ConnectivityManager.TETHERING_USB:
+            case TETHERING_USB:
                 result = setUsbTethering(enable);
-                if (isProvisioningRequired && result == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+                if (isProvisioningRequired && result == TETHER_ERROR_NO_ERROR) {
                     scheduleProvisioningRechecks(type);
                 }
                 sendTetherResult(receiver, result);
                 break;
-            case ConnectivityManager.TETHERING_BLUETOOTH:
+            case TETHERING_BLUETOOTH:
                 setBluetoothTethering(enable, receiver);
                 break;
             default:
                 Log.w(TAG, "Invalid tether type.");
-                sendTetherResult(receiver, ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE);
+                sendTetherResult(receiver, TETHER_ERROR_UNKNOWN_IFACE);
         }
     }
 
@@ -456,7 +470,7 @@
     }
 
     private int setWifiTethering(final boolean enable) {
-        int rval = ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+        int rval = TETHER_ERROR_MASTER_ERROR;
         final long ident = Binder.clearCallingIdentity();
         try {
             synchronized (mPublicSync) {
@@ -464,7 +478,7 @@
                 final WifiManager mgr = getWifiManager();
                 if ((enable && mgr.startSoftAp(null /* use existing wifi config */)) ||
                     (!enable && mgr.stopSoftAp())) {
-                    rval = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+                    rval = TETHER_ERROR_NO_ERROR;
                 }
             }
         } finally {
@@ -478,7 +492,7 @@
         if (adapter == null || !adapter.isEnabled()) {
             Log.w(TAG, "Tried to enable bluetooth tethering with null or disabled adapter. null: " +
                     (adapter == null));
-            sendTetherResult(receiver, ConnectivityManager.TETHER_ERROR_SERVICE_UNAVAIL);
+            sendTetherResult(receiver, TETHER_ERROR_SERVICE_UNAVAIL);
             return;
         }
 
@@ -491,12 +505,12 @@
                 ((BluetoothPan) proxy).setBluetoothTethering(enable);
                 // TODO: Enabling bluetooth tethering can fail asynchronously here.
                 // We should figure out a way to bubble up that failure instead of sending success.
-                int result = ((BluetoothPan) proxy).isTetheringOn() == enable ?
-                        ConnectivityManager.TETHER_ERROR_NO_ERROR :
-                        ConnectivityManager.TETHER_ERROR_MASTER_ERROR;
+                final int result = (((BluetoothPan) proxy).isTetheringOn() == enable)
+                        ? TETHER_ERROR_NO_ERROR
+                        : TETHER_ERROR_MASTER_ERROR;
                 sendTetherResult(receiver, result);
                 if (enable && isTetherProvisioningRequired()) {
-                    scheduleProvisioningRechecks(ConnectivityManager.TETHERING_BLUETOOTH);
+                    scheduleProvisioningRechecks(TETHERING_BLUETOOTH);
                 }
                 adapter.closeProfileProxy(BluetoothProfile.PAN, proxy);
             }
@@ -510,8 +524,8 @@
 
     private void sendUiTetherProvisionIntent(int type, ResultReceiver receiver) {
         Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING);
-        intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
-        intent.putExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK, receiver);
+        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         final long ident = Binder.clearCallingIdentity();
         try {
@@ -534,7 +548,7 @@
             @Override
             protected void onReceiveResult(int resultCode, Bundle resultData) {
                 // If provisioning is successful, enable tethering, otherwise just send the error.
-                if (resultCode == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+                if (resultCode == TETHER_ERROR_NO_ERROR) {
                     enableTetheringInternal(type, true, receiver);
                 } else {
                     sendTetherResult(receiver, resultCode);
@@ -554,8 +568,8 @@
 
     private void scheduleProvisioningRechecks(int type) {
         Intent intent = new Intent();
-        intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
-        intent.putExtra(ConnectivityManager.EXTRA_SET_ALARM, true);
+        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+        intent.putExtra(EXTRA_SET_ALARM, true);
         intent.setComponent(TETHER_SERVICE);
         final long ident = Binder.clearCallingIdentity();
         try {
@@ -572,9 +586,9 @@
 
     private void sendSilentTetherProvisionIntent(int type, ResultReceiver receiver) {
         Intent intent = new Intent();
-        intent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, type);
-        intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
-        intent.putExtra(ConnectivityManager.EXTRA_PROVISION_CALLBACK, receiver);
+        intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
+        intent.putExtra(EXTRA_RUN_PROVISION, true);
+        intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver);
         intent.setComponent(TETHER_SERVICE);
         final long ident = Binder.clearCallingIdentity();
         try {
@@ -585,9 +599,9 @@
     }
 
     private void cancelTetherProvisioningRechecks(int type) {
-        if (getConnectivityManager().isTetheringSupported()) {
+        if (mDeps.isTetheringSupported()) {
             Intent intent = new Intent();
-            intent.putExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE, type);
+            intent.putExtra(EXTRA_REM_TETHER_TYPE, type);
             intent.setComponent(TETHER_SERVICE);
             final long ident = Binder.clearCallingIdentity();
             try {
@@ -602,8 +616,8 @@
     // TODO: De-duplicate with above code, where possible.
     private void startProvisionIntent(int tetherType) {
         final Intent startProvIntent = new Intent();
-        startProvIntent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, tetherType);
-        startProvIntent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
+        startProvIntent.putExtra(EXTRA_ADD_TETHER_TYPE, tetherType);
+        startProvIntent.putExtra(EXTRA_RUN_PROVISION, true);
         startProvIntent.setComponent(TETHER_SERVICE);
         mContext.startServiceAsUser(startProvIntent, UserHandle.CURRENT);
     }
@@ -618,13 +632,13 @@
             TetherState tetherState = mTetherStates.get(iface);
             if (tetherState == null) {
                 Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring");
-                return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+                return TETHER_ERROR_UNKNOWN_IFACE;
             }
             // Ignore the error status of the interface.  If the interface is available,
             // the errors are referring to past tethering attempts anyway.
             if (tetherState.lastState != IControlsTethering.STATE_AVAILABLE) {
                 Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring");
-                return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+                return TETHER_ERROR_UNAVAIL_IFACE;
             }
             // NOTE: If a CMD_TETHER_REQUESTED message is already in the TISM's
             // queue but not yet processed, this will be a no-op and it will not
@@ -633,7 +647,7 @@
             // TODO: reexamine the threading and messaging model.
             tetherState.stateMachine.sendMessage(
                     TetherInterfaceStateMachine.CMD_TETHER_REQUESTED, requestedState);
-            return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+            return TETHER_ERROR_NO_ERROR;
         }
     }
 
@@ -643,22 +657,22 @@
             TetherState tetherState = mTetherStates.get(iface);
             if (tetherState == null) {
                 Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring");
-                return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+                return TETHER_ERROR_UNKNOWN_IFACE;
             }
             if (!tetherState.isCurrentlyServing()) {
                 Log.e(TAG, "Tried to untether an inactive iface :" + iface + ", ignoring");
-                return ConnectivityManager.TETHER_ERROR_UNAVAIL_IFACE;
+                return TETHER_ERROR_UNAVAIL_IFACE;
             }
             tetherState.stateMachine.sendMessage(
                     TetherInterfaceStateMachine.CMD_TETHER_UNREQUESTED);
-            return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+            return TETHER_ERROR_NO_ERROR;
         }
     }
 
     public void untetherAll() {
-        stopTethering(ConnectivityManager.TETHERING_WIFI);
-        stopTethering(ConnectivityManager.TETHERING_USB);
-        stopTethering(ConnectivityManager.TETHERING_BLUETOOTH);
+        stopTethering(TETHERING_WIFI);
+        stopTethering(TETHERING_USB);
+        stopTethering(TETHERING_BLUETOOTH);
     }
 
     public int getLastTetherError(String iface) {
@@ -667,7 +681,7 @@
             if (tetherState == null) {
                 Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface +
                         ", ignoring");
-                return ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
+                return TETHER_ERROR_UNKNOWN_IFACE;
             }
             return tetherState.lastError;
         }
@@ -675,7 +689,7 @@
 
     // TODO: Figure out how to update for local hotspot mode interfaces.
     private void sendTetherStateChangedBroadcast() {
-        if (!getConnectivityManager().isTetheringSupported()) return;
+        if (!mDeps.isTetheringSupported()) return;
 
         final ArrayList<String> availableList = new ArrayList<>();
         final ArrayList<String> tetherList = new ArrayList<>();
@@ -692,7 +706,7 @@
             for (int i = 0; i < mTetherStates.size(); i++) {
                 TetherState tetherState = mTetherStates.valueAt(i);
                 String iface = mTetherStates.keyAt(i);
-                if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
                     erroredList.add(iface);
                 } else if (tetherState.lastState == IControlsTethering.STATE_AVAILABLE) {
                     availableList.add(iface);
@@ -710,13 +724,13 @@
                 }
             }
         }
-        final Intent bcast = new Intent(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
+        final Intent bcast = new Intent(ACTION_TETHER_STATE_CHANGED);
         bcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING |
                 Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
-        bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_AVAILABLE_TETHER, availableList);
-        bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
-        bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ACTIVE_TETHER, tetherList);
-        bcast.putStringArrayListExtra(ConnectivityManager.EXTRA_ERRORED_TETHER, erroredList);
+        bcast.putStringArrayListExtra(EXTRA_AVAILABLE_TETHER, availableList);
+        bcast.putStringArrayListExtra(EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
+        bcast.putStringArrayListExtra(EXTRA_ACTIVE_TETHER, tetherList);
+        bcast.putStringArrayListExtra(EXTRA_ERRORED_TETHER, erroredList);
         mContext.sendStickyBroadcastAsUser(bcast, UserHandle.ALL);
         if (DBG) {
             Log.d(TAG, String.format(
@@ -839,7 +853,7 @@
 
             if (action.equals(UsbManager.ACTION_USB_STATE)) {
                 handleUsbAction(intent);
-            } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
+            } else if (action.equals(CONNECTIVITY_ACTION)) {
                 handleConnectivityAction(intent);
             } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
                 handleWifiApAction(intent);
@@ -850,8 +864,8 @@
         }
 
         private void handleConnectivityAction(Intent intent) {
-            final NetworkInfo networkInfo = (NetworkInfo)intent.getParcelableExtra(
-                    ConnectivityManager.EXTRA_NETWORK_INFO);
+            final NetworkInfo networkInfo =
+                    (NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO);
             if (networkInfo == null ||
                     networkInfo.getDetailedState() == NetworkInfo.DetailedState.FAILED) {
                 return;
@@ -887,14 +901,10 @@
             synchronized (Tethering.this.mPublicSync) {
                 if (!usbConnected && mRndisEnabled) {
                     // Turn off tethering if it was enabled and there is a disconnect.
-                    tetherMatchingInterfaces(
-                            IControlsTethering.STATE_AVAILABLE,
-                            ConnectivityManager.TETHERING_USB);
+                    tetherMatchingInterfaces(IControlsTethering.STATE_AVAILABLE, TETHERING_USB);
                 } else if (usbConfigured && rndisEnabled) {
                     // Tether if rndis is enabled and usb is configured.
-                    tetherMatchingInterfaces(
-                            IControlsTethering.STATE_TETHERED,
-                            ConnectivityManager.TETHERING_USB);
+                    tetherMatchingInterfaces(IControlsTethering.STATE_TETHERED, TETHERING_USB);
                 }
                 mRndisEnabled = usbConfigured && rndisEnabled;
             }
@@ -975,7 +985,7 @@
 
         for (int i = 0; i < mTetherStates.size(); i++) {
             TetherInterfaceStateMachine tism = mTetherStates.valueAt(i).stateMachine;
-            if (tism.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+            if (tism.interfaceType() == TETHERING_WIFI) {
                 tism.unwanted();
                 return;
             }
@@ -1003,7 +1013,7 @@
         }
 
         if (!TextUtils.isEmpty(ifname)) {
-            maybeTrackNewInterfaceLocked(ifname, ConnectivityManager.TETHERING_WIFI);
+            maybeTrackNewInterfaceLocked(ifname, TETHERING_WIFI);
             changeInterfaceState(ifname, ipServingMode);
         } else {
             mLog.e(String.format(
@@ -1062,7 +1072,7 @@
                 Log.wtf(TAG, "Unknown interface state: " + requestedState);
                 return;
         }
-        if (result != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+        if (result != TETHER_ERROR_NO_ERROR) {
             Log.e(TAG, "unable start or stop tethering on iface " + ifname);
             return;
         }
@@ -1104,7 +1114,7 @@
             usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_RNDIS
                     : UsbManager.FUNCTION_NONE);
         }
-        return ConnectivityManager.TETHER_ERROR_NO_ERROR;
+        return TETHER_ERROR_NO_ERROR;
     }
 
     // TODO review API - figure out how to delete these entirely.
@@ -1143,7 +1153,7 @@
         synchronized (mPublicSync) {
             for (int i = 0; i < mTetherStates.size(); i++) {
                 TetherState tetherState = mTetherStates.valueAt(i);
-                if (tetherState.lastError != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+                if (tetherState.lastError != TETHER_ERROR_NO_ERROR) {
                     list.add(mTetherStates.keyAt(i));
                 }
             }
@@ -1189,7 +1199,7 @@
                 }
                 String iface = mTetherStates.keyAt(i);
                 int interfaceType = ifaceNameToType(iface);
-                if (interfaceType != ConnectivityManager.TETHERING_INVALID) {
+                if (interfaceType != TETHERING_INVALID) {
                     tethered.add(interfaceType);
                 }
             }
@@ -1439,7 +1449,7 @@
             }
 
             // If this is a Wi-Fi interface, notify WifiManager of the active serving state.
-            if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
+            if (who.interfaceType() == TETHERING_WIFI) {
                 final WifiManager mgr = getWifiManager();
                 final String iface = who.interfaceName();
                 switch (mode) {
@@ -1463,8 +1473,8 @@
             mForwardedDownstreams.remove(who);
 
             // If this is a Wi-Fi interface, tell WifiManager of any errors.
-            if (who.interfaceType() == ConnectivityManager.TETHERING_WIFI) {
-                if (who.lastError() != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+            if (who.interfaceType() == TETHERING_WIFI) {
+                if (who.lastError() != TETHER_ERROR_NO_ERROR) {
                     getWifiManager().updateInterfaceIpState(
                             who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR);
                 }
@@ -1669,7 +1679,7 @@
                         who.sendMessage(mErrorNotification);
                         break;
                     case CMD_CLEAR_ERROR:
-                        mErrorNotification = ConnectivityManager.TETHER_ERROR_NO_ERROR;
+                        mErrorNotification = TETHER_ERROR_NO_ERROR;
                         transitionTo(mInitialState);
                         break;
                     default:
@@ -1931,7 +1941,7 @@
         // If TetherMasterSM is in ErrorState, TetherMasterSM stays there.
         // Thus we give a chance for TetherMasterSM to recover to InitialState
         // by sending CMD_CLEAR_ERROR
-        if (error == ConnectivityManager.TETHER_ERROR_MASTER_ERROR) {
+        if (error == TETHER_ERROR_MASTER_ERROR) {
             mTetherMasterSM.sendMessage(TetherMasterSM.CMD_CLEAR_ERROR, who);
         }
         int which;
@@ -1975,7 +1985,7 @@
     private void maybeTrackNewInterfaceLocked(final String iface) {
         // If we don't care about this type of interface, ignore.
         final int interfaceType = ifaceNameToType(iface);
-        if (interfaceType == ConnectivityManager.TETHERING_INVALID) {
+        if (interfaceType == TETHERING_INVALID) {
             mLog.log(iface + " is not a tetherable iface, ignoring");
             return;
         }
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 66afb0f..0ac7a36 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java
@@ -60,4 +60,8 @@
     public INetd getNetdService() {
         return NetdService.getInstance();
     }
+
+    public boolean isTetheringSupported() {
+        return true;
+    }
 }
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index b7bbb3b..e3d0bdd 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -79,7 +79,7 @@
  */
 public final class ContentService extends IContentService.Stub {
     static final String TAG = "ContentService";
-    static final boolean DEBUG = true;
+    static final boolean DEBUG = false;
 
     public static class Lifecycle extends SystemService {
         private ContentService mService;
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 5e1afeb..f403953 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -169,16 +169,6 @@
     // Use -1 if there is no current auto-brightness value available.
     private int mScreenAutoBrightness = -1;
 
-    // The screen auto-brightness adjustment factor in the range -1 (dimmer) to 1 (brighter)
-    private float mScreenAutoBrightnessAdjustment = 0.0f;
-
-    // The maximum range of gamma adjustment possible using the screen
-    // auto-brightness adjustment setting.
-    private float mScreenAutoBrightnessAdjustmentMaxGamma;
-
-    // The last screen auto-brightness gamma.  (For printing in dump() only.)
-    private float mLastScreenAutoBrightnessGamma = 1.0f;
-
     // The current display policy. This is useful, for example,  for knowing when we're dozing,
     // where the light sensor may not be available.
     private int mDisplayPolicy = DisplayPowerRequest.POLICY_OFF;
@@ -186,10 +176,8 @@
     // True if we are collecting a brightness adjustment sample, along with some data
     // for the initial state of the sample.
     private boolean mBrightnessAdjustmentSamplePending;
-    private float mBrightnessAdjustmentSampleOldAdjustment;
     private float mBrightnessAdjustmentSampleOldLux;
     private int mBrightnessAdjustmentSampleOldBrightness;
-    private float mBrightnessAdjustmentSampleOldGamma;
 
     // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
     // user's adjustment) immediately, but wait for a drastic enough change in the ambient light.
@@ -200,12 +188,11 @@
     private float SHORT_TERM_MODEL_THRESHOLD_RATIO = 0.6f;
 
     public AutomaticBrightnessController(Callbacks callbacks, Looper looper,
-            SensorManager sensorManager, BrightnessMappingStrategy mapper, int lightSensorWarmUpTime,
-            int brightnessMin, int brightnessMax, float dozeScaleFactor,
+            SensorManager sensorManager, BrightnessMappingStrategy mapper,
+            int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor,
             int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig,
             long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig,
-            int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma,
-            HysteresisLevels dynamicHysteresis) {
+            int ambientLightHorizon, HysteresisLevels dynamicHysteresis) {
         mCallbacks = callbacks;
         mSensorManager = sensorManager;
         mBrightnessMapper = mapper;
@@ -221,7 +208,6 @@
         mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig;
         mAmbientLightHorizon = ambientLightHorizon;
         mWeightingIntercept = ambientLightHorizon;
-        mScreenAutoBrightnessAdjustmentMaxGamma = autoBrightnessAdjustmentMaxGamma;
         mDynamicHysteresis = dynamicHysteresis;
         mShortTermModelValid = true;
         mShortTermModelAnchor = -1;
@@ -236,6 +222,9 @@
     }
 
     public int getAutomaticScreenBrightness() {
+        if (!mAmbientLuxValid) {
+            return -1;
+        }
         if (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE) {
             return (int) (mScreenAutoBrightness * mDozeScaleFactor);
         }
@@ -243,7 +232,7 @@
     }
 
     public float getAutomaticScreenBrightnessAdjustment() {
-        return mScreenAutoBrightnessAdjustment;
+        return mBrightnessMapper.getAutoBrightnessAdjustment();
     }
 
     public void configure(boolean enable, @Nullable BrightnessConfiguration configuration,
@@ -257,7 +246,9 @@
         boolean dozing = (displayPolicy == DisplayPowerRequest.POLICY_DOZE);
         boolean changed = setBrightnessConfiguration(configuration);
         changed |= setDisplayPolicy(displayPolicy);
-        changed |= setScreenAutoBrightnessAdjustment(adjustment);
+        if (userChangedAutoBrightnessAdjustment) {
+            changed |= setAutoBrightnessAdjustment(adjustment);
+        }
         if (userChangedBrightness && enable) {
             // Update the brightness curve with the new user control point. It's critical this
             // happens after we update the autobrightness adjustment since it may reset it.
@@ -322,9 +313,6 @@
         if (DEBUG) {
             Slog.d(TAG, "ShortTermModel: anchor=" + mShortTermModelAnchor);
         }
-        // Reset the brightness adjustment so that the next time we're queried for brightness we
-        // return the value the user set.
-        mScreenAutoBrightnessAdjustment = 0.0f;
         return true;
     }
 
@@ -361,6 +349,7 @@
         pw.println("  mLightSensorEnabled=" + mLightSensorEnabled);
         pw.println("  mLightSensorEnableTime=" + TimeUtils.formatUptime(mLightSensorEnableTime));
         pw.println("  mAmbientLux=" + mAmbientLux);
+        pw.println("  mAmbientLuxValid=" + mAmbientLuxValid);
         pw.println("  mAmbientLightHorizon=" + mAmbientLightHorizon);
         pw.println("  mBrighteningLuxThreshold=" + mBrighteningLuxThreshold);
         pw.println("  mDarkeningLuxThreshold=" + mDarkeningLuxThreshold);
@@ -369,10 +358,6 @@
         pw.println("  mRecentLightSamples=" + mRecentLightSamples);
         pw.println("  mAmbientLightRingBuffer=" + mAmbientLightRingBuffer);
         pw.println("  mScreenAutoBrightness=" + mScreenAutoBrightness);
-        pw.println("  mScreenAutoBrightnessAdjustment=" + mScreenAutoBrightnessAdjustment);
-        pw.println("  mScreenAutoBrightnessAdjustmentMaxGamma="
-                + mScreenAutoBrightnessAdjustmentMaxGamma);
-        pw.println("  mLastScreenAutoBrightnessGamma=" + mLastScreenAutoBrightnessGamma);
         pw.println("  mDisplayPolicy=" + mDisplayPolicy);
         pw.println("  mShortTermModelAnchor=" + mShortTermModelAnchor);
 
@@ -429,8 +414,8 @@
         if (lightSensorRate != mCurrentLightSensorRate) {
             if (DEBUG) {
                 Slog.d(TAG, "adjustLightSensorRate: " +
-                       "previousRate=" + mCurrentLightSensorRate + ", " +
-                       "currentRate=" + lightSensorRate);
+                        "previousRate=" + mCurrentLightSensorRate + ", " +
+                        "currentRate=" + lightSensorRate);
             }
             mCurrentLightSensorRate = lightSensorRate;
             mSensorManager.unregisterListener(mLightSensorListener);
@@ -439,12 +424,8 @@
         }
     }
 
-    private boolean setScreenAutoBrightnessAdjustment(float adjustment) {
-        if (adjustment != mScreenAutoBrightnessAdjustment) {
-            mScreenAutoBrightnessAdjustment = adjustment;
-            return true;
-        }
-        return false;
+    private boolean setAutoBrightnessAdjustment(float adjustment) {
+        return mBrightnessMapper.setAutoBrightnessAdjustment(adjustment);
     }
 
     private void setAmbientLux(float lux) {
@@ -466,12 +447,14 @@
             final float maxAmbientLux =
                 mShortTermModelAnchor + mShortTermModelAnchor * SHORT_TERM_MODEL_THRESHOLD_RATIO;
             if (minAmbientLux < mAmbientLux && mAmbientLux < maxAmbientLux) {
-                Slog.d(TAG, "ShortTermModel: re-validate user data, ambient lux is " +
-                       minAmbientLux + " < " + mAmbientLux + " < " + maxAmbientLux);
+                if (DEBUG) {
+                    Slog.d(TAG, "ShortTermModel: re-validate user data, ambient lux is " +
+                            minAmbientLux + " < " + mAmbientLux + " < " + maxAmbientLux);
+                }
                 mShortTermModelValid = true;
             } else {
                 Slog.d(TAG, "ShortTermModel: reset data, ambient lux is " + mAmbientLux +
-                       "(" + minAmbientLux + ", " + maxAmbientLux + ")");
+                        "(" + minAmbientLux + ", " + maxAmbientLux + ")");
                 resetShortTermModel();
             }
         }
@@ -498,9 +481,9 @@
             }
         }
         if (DEBUG) {
-            Slog.d(TAG, "calculateAmbientLux: selected endIndex=" + endIndex + ", point=("
-                   + mAmbientLightRingBuffer.getTime(endIndex) + ", "
-                   + mAmbientLightRingBuffer.getLux(endIndex) + ")");
+            Slog.d(TAG, "calculateAmbientLux: selected endIndex=" + endIndex + ", point=(" +
+                    mAmbientLightRingBuffer.getTime(endIndex) + ", " +
+                    mAmbientLightRingBuffer.getLux(endIndex) + ")");
         }
         float sum = 0;
         float totalWeight = 0;
@@ -517,8 +500,8 @@
             float lux = mAmbientLightRingBuffer.getLux(i);
             if (DEBUG) {
                 Slog.d(TAG, "calculateAmbientLux: [" + startTime + ", " + endTime + "]: " +
-                       "lux=" + lux + ", " +
-                       "weight=" + weight);
+                        "lux=" + lux + ", " +
+                        "weight=" + weight);
             }
             totalWeight += weight;
             sum += lux * weight;
@@ -526,8 +509,8 @@
         }
         if (DEBUG) {
             Slog.d(TAG, "calculateAmbientLux: " +
-                   "totalWeight=" + totalWeight + ", " +
-                   "newAmbientLux=" + (sum / totalWeight));
+                    "totalWeight=" + totalWeight + ", " +
+                    "newAmbientLux=" + (sum / totalWeight));
         }
         return sum / totalWeight;
     }
@@ -581,8 +564,8 @@
             if (time < timeWhenSensorWarmedUp) {
                 if (DEBUG) {
                     Slog.d(TAG, "updateAmbientLux: Sensor not  ready yet: " +
-                           "time=" + time + ", " +
-                           "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
+                            "time=" + time + ", " +
+                            "timeWhenSensorWarmedUp=" + timeWhenSensorWarmedUp);
                 }
                 mHandler.sendEmptyMessageAtTime(MSG_UPDATE_AMBIENT_LUX,
                         timeWhenSensorWarmedUp);
@@ -621,10 +604,10 @@
             setAmbientLux(fastAmbientLux);
             if (DEBUG) {
                 Slog.d(TAG, "updateAmbientLux: " +
-                       ((fastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": " +
-                       "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold + ", " +
-                       "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " +
-                       "mAmbientLux=" + mAmbientLux);
+                        ((fastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": " +
+                        "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold + ", " +
+                        "mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", " +
+                        "mAmbientLux=" + mAmbientLux);
             }
             updateAutoBrightness(true);
             nextBrightenTransition = nextAmbientLightBrighteningTransition(time);
@@ -641,7 +624,7 @@
                 nextTransitionTime > time ? nextTransitionTime : time + mNormalLightSensorRate;
         if (DEBUG) {
             Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " +
-                   nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime));
+                    nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime));
         }
         mHandler.sendEmptyMessageAtTime(MSG_UPDATE_AMBIENT_LUX, nextTransitionTime);
     }
@@ -652,40 +635,17 @@
         }
 
         float value = mBrightnessMapper.getBrightness(mAmbientLux);
-        float gamma = 1.0f;
-
-        if (USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT
-                && mScreenAutoBrightnessAdjustment != 0.0f) {
-            final float adjGamma = MathUtils.pow(mScreenAutoBrightnessAdjustmentMaxGamma,
-                    Math.min(1.0f, Math.max(-1.0f, -mScreenAutoBrightnessAdjustment)));
-            gamma *= adjGamma;
-            if (DEBUG) {
-                Slog.d(TAG, "updateAutoBrightness: adjGamma=" + adjGamma);
-            }
-        }
-
-        if (gamma != 1.0f) {
-            final float in = value;
-            value = MathUtils.pow(value, gamma);
-            if (DEBUG) {
-                Slog.d(TAG, "updateAutoBrightness: " +
-                       "gamma=" + gamma + ", " +
-                       "in=" + in + ", " +
-                       "out=" + value);
-            }
-        }
 
         int newScreenAutoBrightness =
                 clampScreenBrightness(Math.round(value * PowerManager.BRIGHTNESS_ON));
         if (mScreenAutoBrightness != newScreenAutoBrightness) {
             if (DEBUG) {
                 Slog.d(TAG, "updateAutoBrightness: " +
-                       "mScreenAutoBrightness=" + mScreenAutoBrightness + ", " +
-                       "newScreenAutoBrightness=" + newScreenAutoBrightness);
+                        "mScreenAutoBrightness=" + mScreenAutoBrightness + ", " +
+                        "newScreenAutoBrightness=" + newScreenAutoBrightness);
             }
 
             mScreenAutoBrightness = newScreenAutoBrightness;
-            mLastScreenAutoBrightnessGamma = gamma;
             if (sendUpdate) {
                 mCallbacks.updateBrightness();
             }
@@ -700,10 +660,8 @@
     private void prepareBrightnessAdjustmentSample() {
         if (!mBrightnessAdjustmentSamplePending) {
             mBrightnessAdjustmentSamplePending = true;
-            mBrightnessAdjustmentSampleOldAdjustment = mScreenAutoBrightnessAdjustment;
             mBrightnessAdjustmentSampleOldLux = mAmbientLuxValid ? mAmbientLux : -1;
             mBrightnessAdjustmentSampleOldBrightness = mScreenAutoBrightness;
-            mBrightnessAdjustmentSampleOldGamma = mLastScreenAutoBrightnessGamma;
         } else {
             mHandler.removeMessages(MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE);
         }
@@ -725,22 +683,16 @@
             if (mAmbientLuxValid && mScreenAutoBrightness >= 0) {
                 if (DEBUG) {
                     Slog.d(TAG, "Auto-brightness adjustment changed by user: " +
-                           "adj=" + mScreenAutoBrightnessAdjustment + ", " +
-                           "lux=" + mAmbientLux + ", " +
-                           "brightness=" + mScreenAutoBrightness + ", " +
-                           "gamma=" + mLastScreenAutoBrightnessGamma + ", " +
-                           "ring=" + mAmbientLightRingBuffer);
+                            "lux=" + mAmbientLux + ", " +
+                            "brightness=" + mScreenAutoBrightness + ", " +
+                            "ring=" + mAmbientLightRingBuffer);
                 }
 
                 EventLog.writeEvent(EventLogTags.AUTO_BRIGHTNESS_ADJ,
-                        mBrightnessAdjustmentSampleOldAdjustment,
                         mBrightnessAdjustmentSampleOldLux,
                         mBrightnessAdjustmentSampleOldBrightness,
-                        mBrightnessAdjustmentSampleOldGamma,
-                        mScreenAutoBrightnessAdjustment,
                         mAmbientLux,
-                        mScreenAutoBrightness,
-                        mLastScreenAutoBrightnessGamma);
+                        mScreenAutoBrightness);
             }
         }
     }
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index 4313d17..f74daf2 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -28,6 +28,7 @@
 
 import com.android.internal.util.Preconditions;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.display.utils.Plog;
 
 import java.io.PrintWriter;
 import java.util.Arrays;
@@ -46,6 +47,8 @@
     private static final float LUX_GRAD_SMOOTHING = 0.25f;
     private static final float MAX_GRAD = 1.0f;
 
+    private static final Plog PLOG = Plog.createSystemPlog(TAG);
+
     @Nullable
     public static BrightnessMappingStrategy create(Resources resources) {
         float[] luxLevels = getLuxLevels(resources.getIntArray(
@@ -54,6 +57,9 @@
                 com.android.internal.R.array.config_autoBrightnessLcdBacklightValues);
         float[] brightnessLevelsNits = getFloatArray(resources.obtainTypedArray(
                 com.android.internal.R.array.config_autoBrightnessDisplayValuesNits));
+        float autoBrightnessAdjustmentMaxGamma = resources.getFraction(
+                com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma,
+                1, 1);
 
         float[] nitsRange = getFloatArray(resources.obtainTypedArray(
                 com.android.internal.R.array.config_screenBrightnessNits));
@@ -68,14 +74,16 @@
                     com.android.internal.R.integer.config_screenBrightnessSettingMaximum);
             if (backlightRange[0] > minimumBacklight
                     || backlightRange[backlightRange.length - 1] < maximumBacklight) {
-                Slog.w(TAG, "Screen brightness mapping does not cover whole range of available"
-                        + " backlight values, autobrightness functionality may be impaired.");
+                Slog.w(TAG, "Screen brightness mapping does not cover whole range of available " +
+                        "backlight values, autobrightness functionality may be impaired.");
             }
             BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder();
             builder.setCurve(luxLevels, brightnessLevelsNits);
-            return new PhysicalMappingStrategy(builder.build(), nitsRange, backlightRange);
+            return new PhysicalMappingStrategy(builder.build(), nitsRange, backlightRange,
+                    autoBrightnessAdjustmentMaxGamma);
         } else if (isValidMapping(luxLevels, brightnessLevelsBacklight)) {
-            return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight);
+            return new SimpleMappingStrategy(luxLevels, brightnessLevelsBacklight,
+                    autoBrightnessAdjustmentMaxGamma);
         } else {
             return null;
         }
@@ -173,6 +181,26 @@
     public abstract float getBrightness(float lux);
 
     /**
+     * Returns the current auto-brightness adjustment.
+     *
+     * The returned adjustment is a value in the range [-1.0, 1.0] such that
+     * {@code config_autoBrightnessAdjustmentMaxGamma<sup>-adjustment</sup>} is used to gamma
+     * correct the brightness curve.
+     */
+    public abstract float getAutoBrightnessAdjustment();
+
+    /**
+     * Sets the auto-brightness adjustment.
+     *
+     * @param adjustment The desired auto-brightness adjustment.
+     * @return Whether the auto-brightness adjustment has changed.
+     *
+     * @Deprecated The auto-brightness adjustment should not be set directly, but rather inferred
+     * from user data points.
+     */
+    public abstract boolean setAutoBrightnessAdjustment(float adjustment);
+
+    /**
      * Converts the provided backlight value to nits if possible.
      *
      * Returns -1.0f if there's no available mapping for the backlight to nits.
@@ -200,12 +228,13 @@
      */
     public abstract void clearUserDataPoints();
 
-    /** @return true if there are any short term adjustments applied to the curve */
+    /** @return True if there are any short term adjustments applied to the curve. */
     public abstract boolean hasUserDataPoints();
 
-    /** @return true if the current brightness config is the default one */
+    /** @return True if the current brightness configuration is the default one. */
     public abstract boolean isDefaultConfig();
 
+    /** @return The default brightness configuration. */
     public abstract BrightnessConfiguration getDefaultConfig();
 
     public abstract void dump(PrintWriter pw);
@@ -216,22 +245,8 @@
         return (float) brightness / PowerManager.BRIGHTNESS_ON;
     }
 
-    private static Spline createSpline(float[] x, float[] y) {
-        Spline spline = Spline.createSpline(x, y);
-        if (DEBUG) {
-            Slog.d(TAG, "Spline: " + spline);
-            for (float v = 1f; v < x[x.length - 1] * 1.25f; v *= 1.25f) {
-                Slog.d(TAG, String.format("  %7.1f: %7.1f", v, spline.interpolate(v)));
-            }
-        }
-        return spline;
-    }
-
     private static Pair<float[], float[]> insertControlPoint(
             float[] luxLevels, float[] brightnessLevels, float lux, float brightness) {
-        if (DEBUG) {
-            Slog.d(TAG, "Inserting new control point at (" + lux + ", " + brightness + ")");
-        }
         final int idx = findInsertionPoint(luxLevels, lux);
         final float[] newLuxLevels;
         final float[] newBrightnessLevels;
@@ -274,9 +289,7 @@
 
     private static void smoothCurve(float[] lux, float[] brightness, int idx) {
         if (DEBUG) {
-            Slog.d(TAG, "smoothCurve(lux=" + Arrays.toString(lux)
-                    + ", brightness=" + Arrays.toString(brightness)
-                    + ", idx=" + idx + ")");
+            PLOG.logCurve("unsmoothed curve", lux, brightness);
         }
         float prevLux = lux[idx];
         float prevBrightness = brightness[idx];
@@ -294,7 +307,6 @@
             prevBrightness = newBrightness;
             brightness[i] = newBrightness;
         }
-
         // Smooth curve for data points below the newly introduced point
         prevLux = lux[idx];
         prevBrightness = brightness[idx];
@@ -312,8 +324,7 @@
             brightness[i] = newBrightness;
         }
         if (DEBUG) {
-            Slog.d(TAG, "Smoothed Curve: lux=" + Arrays.toString(lux)
-                    + ", brightness=" + Arrays.toString(brightness));
+            PLOG.logCurve("smoothed curve", lux, brightness);
         }
     }
 
@@ -323,6 +334,72 @@
                     - MathUtils.log(prevLux + LUX_GRAD_SMOOTHING)));
     }
 
+    private static float inferAutoBrightnessAdjustment(float maxGamma,
+            float desiredBrightness, float currentBrightness) {
+        float adjustment = 0;
+        float gamma = Float.NaN;
+        // Extreme edge cases: use a simpler heuristic, as proper gamma correction around the edges
+        // affects the curve rather drastically.
+        if (currentBrightness <= 0.1f || currentBrightness >= 0.9f) {
+            adjustment = (desiredBrightness - currentBrightness) * 2;
+        // Edge case: darkest adjustment possible.
+        } else if (desiredBrightness == 0) {
+            adjustment = -1;
+        // Edge case: brightest adjustment possible.
+        } else if (desiredBrightness == 1) {
+            adjustment = +1;
+        } else {
+            // current^gamma = desired => gamma = log[current](desired)
+            gamma = MathUtils.log(desiredBrightness) / MathUtils.log(currentBrightness);
+            // max^-adjustment = gamma => adjustment = -log[max](gamma)
+            adjustment = -MathUtils.constrain(
+                    MathUtils.log(gamma) / MathUtils.log(maxGamma), -1, 1);
+        }
+        if (DEBUG) {
+            Slog.d(TAG, "inferAutoBrightnessAdjustment: " + maxGamma + "^" + -adjustment + "=" +
+                    MathUtils.pow(maxGamma, -adjustment) + " == " + gamma);
+            Slog.d(TAG, "inferAutoBrightnessAdjustment: " + currentBrightness + "^" + gamma + "=" +
+                    MathUtils.pow(currentBrightness, gamma) + " == " + desiredBrightness);
+        }
+        return adjustment;
+    }
+
+    private static Pair<float[], float[]> getAdjustedCurve(float[] lux, float[] brightness,
+            float userLux, float userBrightness, float adjustment, float maxGamma) {
+        float[] newLux = lux;
+        float[] newBrightness = Arrays.copyOf(brightness, brightness.length);
+        if (DEBUG) {
+            PLOG.logCurve("unadjusted curve", newLux, newBrightness);
+        }
+        adjustment = MathUtils.constrain(adjustment, -1, 1);
+        float gamma = MathUtils.pow(maxGamma, -adjustment);
+        if (DEBUG) {
+            Slog.d(TAG, "getAdjustedCurve: " + maxGamma + "^" + -adjustment + "=" +
+                    MathUtils.pow(maxGamma, -adjustment) + " == " + gamma);
+        }
+        if (gamma != 1) {
+            for (int i = 0; i < newBrightness.length; i++) {
+                newBrightness[i] = MathUtils.pow(newBrightness[i], gamma);
+            }
+        }
+        if (DEBUG) {
+            PLOG.logCurve("gamma adjusted curve", newLux, newBrightness);
+        }
+        if (userLux != -1) {
+            Pair<float[], float[]> curve = insertControlPoint(newLux, newBrightness, userLux,
+                    userBrightness);
+            newLux = curve.first;
+            newBrightness = curve.second;
+            if (DEBUG) {
+                PLOG.logCurve("gamma and user adjusted curve", newLux, newBrightness);
+                // This is done for comparison.
+                curve = insertControlPoint(lux, brightness, userLux, userBrightness);
+                PLOG.logCurve("user adjusted curve", curve.first ,curve.second);
+            }
+        }
+        return Pair.create(newLux, newBrightness);
+    }
+
     /**
      * A {@link BrightnessMappingStrategy} that maps from ambient room brightness directly to the
      * backlight of the display.
@@ -337,10 +414,12 @@
         private final float[] mBrightness;
 
         private Spline mSpline;
+        private float mMaxGamma;
+        private float mAutoBrightnessAdjustment;
         private float mUserLux;
         private float mUserBrightness;
 
-        public SimpleMappingStrategy(float[] lux, int[] brightness) {
+        public SimpleMappingStrategy(float[] lux, int[] brightness, float maxGamma) {
             Preconditions.checkArgument(lux.length != 0 && brightness.length != 0,
                     "Lux and brightness arrays must not be empty!");
             Preconditions.checkArgument(lux.length == brightness.length,
@@ -357,9 +436,14 @@
                 mBrightness[i] = normalizeAbsoluteBrightness(brightness[i]);
             }
 
-            mSpline = createSpline(mLux, mBrightness);
+            mMaxGamma = maxGamma;
+            mAutoBrightnessAdjustment = 0;
             mUserLux = -1;
             mUserBrightness = -1;
+            if (DEBUG) {
+                PLOG.start("simple mapping strategy");
+            }
+            computeSpline();
         }
 
         @Override
@@ -373,27 +457,65 @@
         }
 
         @Override
+        public float getAutoBrightnessAdjustment() {
+            return mAutoBrightnessAdjustment;
+        }
+
+        @Override
+        public boolean setAutoBrightnessAdjustment(float adjustment) {
+            adjustment = MathUtils.constrain(adjustment, -1, 1);
+            if (adjustment == mAutoBrightnessAdjustment) {
+                return false;
+            }
+            if (DEBUG) {
+                Slog.d(TAG, "setAutoBrightnessAdjustment: " + mAutoBrightnessAdjustment + " => " +
+                        adjustment);
+                PLOG.start("auto-brightness adjustment");
+            }
+            mAutoBrightnessAdjustment = adjustment;
+            computeSpline();
+            return true;
+        }
+
+        @Override
         public float convertToNits(int backlight) {
             return -1.0f;
         }
 
         @Override
         public void addUserDataPoint(float lux, float brightness) {
+            float unadjustedBrightness = getUnadjustedBrightness(lux);
             if (DEBUG){
-                Slog.d(TAG, "addUserDataPoint(lux=" + lux + ", brightness=" + brightness + ")");
+                Slog.d(TAG, "addUserDataPoint: (" + lux + "," + brightness + ")");
+                PLOG.start("add user data point")
+                        .logPoint("user data point", lux, brightness)
+                        .logPoint("current brightness", lux, unadjustedBrightness);
             }
-            Pair<float[], float[]> curve = insertControlPoint(mLux, mBrightness, lux, brightness);
-            mSpline = createSpline(curve.first, curve.second);
+            float adjustment = inferAutoBrightnessAdjustment(mMaxGamma,
+                    brightness /* desiredBrightness */,
+                    unadjustedBrightness /* currentBrightness */);
+            if (DEBUG) {
+                Slog.d(TAG, "addUserDataPoint: " + mAutoBrightnessAdjustment + " => " +
+                        adjustment);
+            }
+            mAutoBrightnessAdjustment = adjustment;
             mUserLux = lux;
             mUserBrightness = brightness;
+            computeSpline();
         }
 
         @Override
         public void clearUserDataPoints() {
             if (mUserLux != -1) {
-                mSpline = createSpline(mLux, mBrightness);
+                if (DEBUG) {
+                    Slog.d(TAG, "clearUserDataPoints: " + mAutoBrightnessAdjustment + " => 0");
+                    PLOG.start("clear user data points")
+                            .logPoint("user data point", mUserLux, mUserBrightness);
+                }
+                mAutoBrightnessAdjustment = 0;
                 mUserLux = -1;
                 mUserBrightness = -1;
+                computeSpline();
             }
         }
 
@@ -408,15 +530,30 @@
         }
 
         @Override
-        public BrightnessConfiguration getDefaultConfig() { return null; }
+        public BrightnessConfiguration getDefaultConfig() {
+            return null;
+        }
 
         @Override
         public void dump(PrintWriter pw) {
             pw.println("SimpleMappingStrategy");
             pw.println("  mSpline=" + mSpline);
+            pw.println("  mMaxGamma=" + mMaxGamma);
+            pw.println("  mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment);
             pw.println("  mUserLux=" + mUserLux);
             pw.println("  mUserBrightness=" + mUserBrightness);
         }
+
+        private void computeSpline() {
+            Pair<float[], float[]> curve = getAdjustedCurve(mLux, mBrightness, mUserLux,
+                    mUserBrightness, mAutoBrightnessAdjustment, mMaxGamma);
+            mSpline = Spline.createSpline(curve.first, curve.second);
+        }
+
+        private float getUnadjustedBrightness(float lux) {
+            Spline spline = Spline.createSpline(mLux, mBrightness);
+            return spline.interpolate(lux);
+        }
     }
 
     /** A {@link BrightnessMappingStrategy} that maps from ambient room brightness to the physical
@@ -445,11 +582,13 @@
         // a brightness in nits.
         private Spline mBacklightToNitsSpline;
 
+        private float mMaxGamma;
+        private float mAutoBrightnessAdjustment;
         private float mUserLux;
         private float mUserBrightness;
 
-        public PhysicalMappingStrategy(BrightnessConfiguration config,
-                float[] nits, int[] backlight) {
+        public PhysicalMappingStrategy(BrightnessConfiguration config, float[] nits,
+                                       int[] backlight, float maxGamma) {
             Preconditions.checkArgument(nits.length != 0 && backlight.length != 0,
                     "Nits and backlight arrays must not be empty!");
             Preconditions.checkArgument(nits.length == backlight.length,
@@ -459,6 +598,8 @@
             Preconditions.checkArrayElementsInRange(backlight,
                     PowerManager.BRIGHTNESS_OFF, PowerManager.BRIGHTNESS_ON, "backlight");
 
+            mMaxGamma = maxGamma;
+            mAutoBrightnessAdjustment = 0;
             mUserLux = -1;
             mUserBrightness = -1;
 
@@ -469,11 +610,15 @@
                 normalizedBacklight[i] = normalizeAbsoluteBrightness(backlight[i]);
             }
 
-            mNitsToBacklightSpline = createSpline(nits, normalizedBacklight);
-            mBacklightToNitsSpline = createSpline(normalizedBacklight, nits);
+            mNitsToBacklightSpline = Spline.createSpline(nits, normalizedBacklight);
+            mBacklightToNitsSpline = Spline.createSpline(normalizedBacklight, nits);
 
             mDefaultConfig = config;
-            setBrightnessConfiguration(config);
+            if (DEBUG) {
+                PLOG.start("physical mapping strategy");
+            }
+            mConfig = config;
+            computeSpline();
         }
 
         @Override
@@ -484,10 +629,11 @@
             if (config.equals(mConfig)) {
                 return false;
             }
-
-            Pair<float[], float[]> curve = config.getCurve();
-            mBrightnessSpline = createSpline(curve.first /*lux*/, curve.second /*nits*/);
+            if (DEBUG) {
+                PLOG.start("brightness configuration");
+            }
             mConfig = config;
+            computeSpline();
             return true;
         }
 
@@ -499,31 +645,65 @@
         }
 
         @Override
+        public float getAutoBrightnessAdjustment() {
+            return mAutoBrightnessAdjustment;
+        }
+
+        @Override
+        public boolean setAutoBrightnessAdjustment(float adjustment) {
+            adjustment = MathUtils.constrain(adjustment, -1, 1);
+            if (adjustment == mAutoBrightnessAdjustment) {
+                return false;
+            }
+            if (DEBUG) {
+                Slog.d(TAG, "setAutoBrightnessAdjustment: " + mAutoBrightnessAdjustment + " => " +
+                        adjustment);
+                PLOG.start("auto-brightness adjustment");
+            }
+            mAutoBrightnessAdjustment = adjustment;
+            computeSpline();
+            return true;
+        }
+
+        @Override
         public float convertToNits(int backlight) {
             return mBacklightToNitsSpline.interpolate(normalizeAbsoluteBrightness(backlight));
         }
 
         @Override
-        public void addUserDataPoint(float lux, float backlight) {
+        public void addUserDataPoint(float lux, float brightness) {
+            float unadjustedBrightness = getUnadjustedBrightness(lux);
             if (DEBUG){
-                Slog.d(TAG, "addUserDataPoint(lux=" + lux + ", backlight=" + backlight + ")");
+                Slog.d(TAG, "addUserDataPoint: (" + lux + "," + brightness + ")");
+                PLOG.start("add user data point")
+                        .logPoint("user data point", lux, brightness)
+                        .logPoint("current brightness", lux, unadjustedBrightness);
             }
-            float brightness = mBacklightToNitsSpline.interpolate(backlight);
-            Pair<float[], float[]> defaultCurve = mConfig.getCurve();
-            Pair<float[], float[]> newCurve =
-                    insertControlPoint(defaultCurve.first, defaultCurve.second, lux, brightness);
-            mBrightnessSpline = createSpline(newCurve.first, newCurve.second);
+            float adjustment = inferAutoBrightnessAdjustment(mMaxGamma,
+                    brightness /* desiredBrightness */,
+                    unadjustedBrightness /* currentBrightness */);
+            if (DEBUG) {
+                Slog.d(TAG, "addUserDataPoint: " + mAutoBrightnessAdjustment + " => " +
+                        adjustment);
+            }
+            mAutoBrightnessAdjustment = adjustment;
             mUserLux = lux;
             mUserBrightness = brightness;
+            computeSpline();
         }
 
         @Override
         public void clearUserDataPoints() {
             if (mUserLux != -1) {
-                Pair<float[], float[]> defaultCurve = mConfig.getCurve();
-                mBrightnessSpline = createSpline(defaultCurve.first, defaultCurve.second);
+                if (DEBUG) {
+                    Slog.d(TAG, "clearUserDataPoints: " + mAutoBrightnessAdjustment + " => 0");
+                    PLOG.start("clear user data points")
+                            .logPoint("user data point", mUserLux, mUserBrightness);
+                }
+                mAutoBrightnessAdjustment = 0;
                 mUserLux = -1;
                 mUserBrightness = -1;
+                computeSpline();
             }
         }
 
@@ -538,7 +718,9 @@
         }
 
         @Override
-        public BrightnessConfiguration getDefaultConfig() { return mDefaultConfig; }
+        public BrightnessConfiguration getDefaultConfig() {
+            return mDefaultConfig;
+        }
 
         @Override
         public void dump(PrintWriter pw) {
@@ -546,8 +728,35 @@
             pw.println("  mConfig=" + mConfig);
             pw.println("  mBrightnessSpline=" + mBrightnessSpline);
             pw.println("  mNitsToBacklightSpline=" + mNitsToBacklightSpline);
+            pw.println("  mMaxGamma=" + mMaxGamma);
+            pw.println("  mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment);
             pw.println("  mUserLux=" + mUserLux);
             pw.println("  mUserBrightness=" + mUserBrightness);
         }
+
+        private void computeSpline() {
+            Pair<float[], float[]> defaultCurve = mConfig.getCurve();
+            float[] defaultLux = defaultCurve.first;
+            float[] defaultNits = defaultCurve.second;
+            float[] defaultBacklight = new float[defaultNits.length];
+            for (int i = 0; i < defaultBacklight.length; i++) {
+                defaultBacklight[i] = mNitsToBacklightSpline.interpolate(defaultNits[i]);
+            }
+            Pair<float[], float[]> curve = getAdjustedCurve(defaultLux, defaultBacklight, mUserLux,
+                    mUserBrightness, mAutoBrightnessAdjustment, mMaxGamma);
+            float[] lux = curve.first;
+            float[] backlight = curve.second;
+            float[] nits = new float[backlight.length];
+            for (int i = 0; i < nits.length; i++) {
+                nits[i] = mBacklightToNitsSpline.interpolate(backlight[i]);
+            }
+            mBrightnessSpline = Spline.createSpline(lux, nits);
+        }
+
+        private float getUnadjustedBrightness(float lux) {
+            Pair<float[], float[]> curve = mConfig.getCurve();
+            Spline spline = Spline.createSpline(curve.first, curve.second);
+            return mNitsToBacklightSpline.interpolate(spline.interpolate(lux));
+        }
     }
 }
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index 88df195..905c7e3 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -686,10 +686,15 @@
     }
 
     public ParceledListSlice<AmbientBrightnessDayStats> getAmbientBrightnessStats(int userId) {
-        ArrayList<AmbientBrightnessDayStats> stats = mAmbientBrightnessStatsTracker.getUserStats(
-                userId);
-        return (stats != null) ? new ParceledListSlice<>(stats) : new ParceledListSlice<>(
-                Collections.EMPTY_LIST);
+        if (mAmbientBrightnessStatsTracker != null) {
+            ArrayList<AmbientBrightnessDayStats> stats =
+                    mAmbientBrightnessStatsTracker.getUserStats(
+                            userId);
+            if (stats != null) {
+                return new ParceledListSlice<>(stats);
+            }
+        }
+        return ParceledListSlice.emptyList();
     }
 
     // Not allowed to keep the SensorEvent so used to copy the data we care about.
diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java
index b3d309d..37035c3 100644
--- a/services/core/java/com/android/server/display/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/ColorDisplayService.java
@@ -300,6 +300,11 @@
         dtm.setColorMode(mode, mIsActivated ? mMatrixNight : MATRIX_IDENTITY);
     }
 
+    @Override
+    public void onAccessibilityTransformChanged(boolean state) {
+        onDisplayColorModeChanged(mController.getColorMode());
+    }
+
     /**
      * Set coefficients based on native mode. Use DisplayTransformManager#isNativeModeEnabled while
      * setting is stable; when setting is changing, pass native mode selection directly.
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index c7ae1f4..0f531a8 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -36,11 +36,13 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ParceledListSlice;
 import android.content.res.Resources;
+import android.content.res.TypedArray;
 import android.graphics.Point;
 import android.hardware.SensorManager;
 import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
 import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.Curve;
 import android.hardware.display.DisplayManagerGlobal;
 import android.hardware.display.DisplayManagerInternal;
 import android.hardware.display.DisplayViewport;
@@ -61,16 +63,21 @@
 import android.os.PowerManager;
 import android.os.Process;
 import android.os.RemoteException;
+import android.os.ResultReceiver;
 import android.os.ServiceManager;
+import android.os.ShellCallback;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.os.Trace;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.IntArray;
+import android.util.Pair;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.Spline;
 import android.view.Display;
 import android.view.DisplayInfo;
 import android.view.Surface;
@@ -273,6 +280,11 @@
 
     private final Injector mInjector;
 
+    // The minimum brightness curve, which guarantess that any brightness curve that dips below it
+    // is rejected by the system.
+    private final Curve mMinimumBrightnessCurve;
+    private final Spline mMinimumBrightnessSpline;
+
     public DisplayManagerService(Context context) {
         this(context, new Injector());
     }
@@ -286,8 +298,15 @@
         mUiHandler = UiThread.getHandler();
         mDisplayAdapterListener = new DisplayAdapterListener();
         mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
+        Resources resources = mContext.getResources();
         mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger(
                 com.android.internal.R.integer.config_defaultDisplayDefaultColorMode);
+        float[] lux = getFloatArray(resources.obtainTypedArray(
+                com.android.internal.R.array.config_minimumBrightnessCurveLux));
+        float[] nits = getFloatArray(resources.obtainTypedArray(
+                com.android.internal.R.array.config_minimumBrightnessCurveNits));
+        mMinimumBrightnessCurve = new Curve(lux, nits);
+        mMinimumBrightnessSpline = Spline.createSpline(lux, nits);
 
         PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting();
@@ -1029,9 +1048,15 @@
         }
     }
 
+    @VisibleForTesting
+    Curve getMinimumBrightnessCurveInternal() {
+        return mMinimumBrightnessCurve;
+    }
+
     private void setBrightnessConfigurationForUserInternal(
-            @NonNull BrightnessConfiguration c, @UserIdInt int userId,
+            @Nullable BrightnessConfiguration c, @UserIdInt int userId,
             @Nullable String packageName) {
+        validateBrightnessConfiguration(c);
         final int userSerial = getUserManager().getUserSerialNumber(userId);
         synchronized (mSyncRoot) {
             try {
@@ -1046,6 +1071,28 @@
         }
     }
 
+    @VisibleForTesting
+    void validateBrightnessConfiguration(BrightnessConfiguration config) {
+        if (config == null) {
+            return;
+        }
+        if (isBrightnessConfigurationTooDark(config)) {
+            throw new IllegalArgumentException("brightness curve is too dark");
+        }
+    }
+
+    private boolean isBrightnessConfigurationTooDark(BrightnessConfiguration config) {
+        Pair<float[], float[]> curve = config.getCurve();
+        float[] lux = curve.first;
+        float[] nits = curve.second;
+        for (int i = 0; i < lux.length; i++) {
+            if (nits[i] < mMinimumBrightnessSpline.interpolate(lux[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void loadBrightnessConfiguration() {
         synchronized (mSyncRoot) {
             final int userSerial = getUserManager().getUserSerialNumber(mCurrentUserId);
@@ -1366,6 +1413,16 @@
         }
     }
 
+    private static float[] getFloatArray(TypedArray array) {
+        int length = array.length();
+        float[] floatArray = new float[length];
+        for (int i = 0; i < length; i++) {
+            floatArray[i] = array.getFloat(i, Float.NaN);
+        }
+        array.recycle();
+        return floatArray;
+    }
+
     /**
      * This is the object that everything in the display manager locks on.
      * We make it an inner class within the {@link DisplayManagerService} to so that it is
@@ -1983,6 +2040,39 @@
             }
         }
 
+        @Override // Binder call
+        public void onShellCommand(FileDescriptor in, FileDescriptor out,
+                FileDescriptor err, String[] args, ShellCallback callback,
+                ResultReceiver resultReceiver) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                DisplayManagerShellCommand command = new DisplayManagerShellCommand(this);
+                command.exec(this, in, out, err, args, callback, resultReceiver);
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        @Override // Binder call
+        public Curve getMinimumBrightnessCurve() {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                return getMinimumBrightnessCurveInternal();
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
+
+        void setBrightness(int brightness) {
+            Settings.System.putIntForUser(mContext.getContentResolver(),
+                    Settings.System.SCREEN_BRIGHTNESS, brightness, UserHandle.USER_CURRENT);
+        }
+
+        void resetBrightnessConfiguration() {
+            setBrightnessConfigurationForUserInternal(null, mContext.getUserId(),
+                    mContext.getPackageName());
+        }
+
         private boolean validatePackageName(int uid, String packageName) {
             if (packageName != null) {
                 String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
diff --git a/services/core/java/com/android/server/display/DisplayManagerShellCommand.java b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
new file mode 100644
index 0000000..27cad1e
--- /dev/null
+++ b/services/core/java/com/android/server/display/DisplayManagerShellCommand.java
@@ -0,0 +1,92 @@
+/*
+ * 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.display;
+
+import android.content.Intent;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
+import android.util.Slog;
+
+import java.io.PrintWriter;
+import java.lang.NumberFormatException;
+
+class DisplayManagerShellCommand extends ShellCommand {
+    private static final String TAG = "DisplayManagerShellCommand";
+
+    private final DisplayManagerService.BinderService mService;
+
+    DisplayManagerShellCommand(DisplayManagerService.BinderService service) {
+        mService = service;
+    }
+
+    @Override
+    public int onCommand(String cmd) {
+        if (cmd == null) {
+            return handleDefaultCommands(cmd);
+        }
+        final PrintWriter pw = getOutPrintWriter();
+        switch(cmd) {
+            case "set-brightness":
+                return setBrightness();
+            case "reset-brightness-configuration":
+                return resetBrightnessConfiguration();
+            default:
+                return handleDefaultCommands(cmd);
+        }
+    }
+
+    @Override
+    public void onHelp() {
+        final PrintWriter pw = getOutPrintWriter();
+        pw.println("Display manager commands:");
+        pw.println("  help");
+        pw.println("    Print this help text.");
+        pw.println();
+        pw.println("  set-brightness BRIGHTNESS");
+        pw.println("    Sets the current brightness to BRIGHTNESS (a number between 0 and 1).");
+        pw.println("  reset-brightness-configuration");
+        pw.println("    Reset the brightness to its default configuration.");
+        pw.println();
+        Intent.printIntentArgsHelp(pw , "");
+    }
+
+    private int setBrightness() {
+        String brightnessText = getNextArg();
+        if (brightnessText == null) {
+            getErrPrintWriter().println("Error: no brightness specified");
+            return 1;
+        }
+        float brightness = -1;
+        try {
+            brightness = Float.parseFloat(brightnessText);
+        } catch (NumberFormatException e) {
+        }
+        if (brightness < 0 || brightness > 1) {
+            getErrPrintWriter().println("Error: brightness should be a number between 0 and 1");
+            return 1;
+        }
+        mService.setBrightness((int) brightness * 255);
+        return 0;
+    }
+
+    private int resetBrightnessConfiguration() {
+        mService.resetBrightnessConfiguration();
+        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 1784ef1..5f4c8ef 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -424,9 +424,6 @@
                     com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp);
             int ambientLightHorizon = resources.getInteger(
                     com.android.internal.R.integer.config_autoBrightnessAmbientLightHorizon);
-            float autoBrightnessAdjustmentMaxGamma = resources.getFraction(
-                    com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma,
-                    1, 1);
 
             int lightSensorWarmUpTimeConfig = resources.getInteger(
                     com.android.internal.R.integer.config_lightSensorWarmupTime);
@@ -450,7 +447,7 @@
                         mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
                         initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
                         autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon,
-                        autoBrightnessAdjustmentMaxGamma, dynamicHysteresis);
+                        dynamicHysteresis);
             } else {
                 mUseSoftwareAutoBrightnessConfig = false;
             }
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 5ca9abc..b9a279a 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -436,6 +436,10 @@
                                 com.android.internal.R.bool.config_localDisplaysMirrorContent)) {
                         mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY;
                     }
+
+                    if (res.getBoolean(com.android.internal.R.bool.config_localDisplaysPrivate)) {
+                        mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE;
+                    }
                 }
             }
             return mInfo;
diff --git a/services/core/java/com/android/server/display/utils/Plog.java b/services/core/java/com/android/server/display/utils/Plog.java
new file mode 100644
index 0000000..3a18387
--- /dev/null
+++ b/services/core/java/com/android/server/display/utils/Plog.java
@@ -0,0 +1,141 @@
+/*
+ * 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 com.android.server.display.utils;
+
+
+import java.lang.StringBuilder;
+import java.lang.System;
+
+import android.util.Slog;
+
+/**
+ * A utility to log multiple points and curves in a structured way so they can be easily consumed
+ * by external tooling
+ *
+ * To start a plot, call {@link Plog.start} with the plot's title; to add a point to it, call
+ * {@link Plog.logPoint} with the point name (that will appear in the legend) and coordinates; and
+ * to log a curve, call {@link Plog.logCurve} with its name and points.
+ */
+public abstract class Plog {
+    // A unique identifier used to group points and curves that belong on the same plot.
+    private long mId;
+
+    /**
+     * Returns a Plog instance that emits messages to the system log.
+     *
+     * @param tag The tag of the emitted messages in the system log.
+     * @return A plog instance that emits messages to the system log.
+     */
+    public static Plog createSystemPlog(String tag) {
+        return new SystemPlog(tag);
+    }
+
+    /**
+     * Start a new plot.
+     *
+     * @param title The plot title.
+     * @return The Plog instance (for chaining).
+     */
+    public Plog start(String title) {
+        mId = System.currentTimeMillis();
+        write(formatTitle(title));
+        return this;
+    }
+
+    /**
+     * Adds a point to the current plot.
+     *
+     * @param name The point name (that will appear in the legend).
+     * @param x The point x coordinate.
+     * @param y The point y coordinate.
+     * @return The Plog instance (for chaining).
+     */
+    public Plog logPoint(String name, float x, float y) {
+        write(formatPoint(name, x, y));
+        return this;
+    }
+
+    /**
+     * Adds a curve to the current plot.
+     *
+     * @param name The curve name (that will appear in the legend).
+     * @param xs The curve x coordinates.
+     * @param ys The curve y coordinates.
+     * @return The Plog instance (for chaining).
+     */
+    public Plog logCurve(String name, float[] xs, float[] ys) {
+        write(formatCurve(name, xs, ys));
+        return this;
+    }
+
+    private String formatTitle(String title) {
+        return "title: " + title;
+    }
+
+    private String formatPoint(String name, float x, float y) {
+        return "point: " + name + ": (" + x + "," + y + ")";
+    }
+
+    private String formatCurve(String name, float[] xs, float[] ys) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("curve: " + name + ": [");
+        int n = xs.length <= ys.length ? xs.length : ys.length;
+        for (int i = 0; i < n; i++) {
+            sb.append("(" + xs[i] + "," + ys[i] + "),");
+        }
+        sb.append("]");
+        return sb.toString();
+    }
+
+    private void write(String message) {
+        emit("[PLOG " + mId + "] " + message);
+    }
+
+    /**
+     * Emits a message (depending on the concrete Plog implementation).
+     *
+     * @param message The message.
+     */
+    protected abstract void emit(String message);
+
+    /**
+     * A Plog that emits messages to the system log.
+     */
+    public static class SystemPlog extends Plog {
+        // The tag of the emitted messages in the system log.
+        private final String mTag;
+
+        /**
+         * Returns a Plog instance that emits messages to the system log.
+         *
+         * @param tag The tag of the emitted messages in the system log.
+         * @return A Plog instance that emits messages to the system log.
+         */
+        public SystemPlog(String tag) {
+            mTag = tag;
+        }
+
+        /**
+         * Emits a message to the system log.
+         *
+         * @param message The message.
+         */
+        protected void emit(String message) {
+            Slog.d(mTag, message);
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index 8be2c9e..afd1a94 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -18,8 +18,8 @@
 
 import android.content.Context;
 import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
-import android.hardware.biometrics.BiometricDialog;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.BiometricPrompt;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.hardware.fingerprint.Fingerprint;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.IFingerprintServiceReceiver;
@@ -46,8 +46,8 @@
     public static final int LOCKOUT_PERMANENT = 2;
 
     // Callback mechanism received from the client
-    // (BiometricDialog -> FingerprintManager -> FingerprintService -> AuthenticationClient)
-    private IBiometricDialogReceiver mDialogReceiverFromClient;
+    // (BiometricPrompt -> FingerprintManager -> FingerprintService -> AuthenticationClient)
+    private IBiometricPromptReceiver mDialogReceiverFromClient;
     private Bundle mBundle;
     private IStatusBarService mStatusBarService;
     private boolean mInLockout;
@@ -55,13 +55,13 @@
     protected boolean mDialogDismissed;
 
     // Receives events from SystemUI and handles them before forwarding them to FingerprintDialog
-    protected IBiometricDialogReceiver mDialogReceiver = new IBiometricDialogReceiver.Stub() {
+    protected IBiometricPromptReceiver mDialogReceiver = new IBiometricPromptReceiver.Stub() {
         @Override // binder call
         public void onDialogDismissed(int reason) {
             if (mBundle != null && mDialogReceiverFromClient != null) {
                 try {
                     mDialogReceiverFromClient.onDialogDismissed(reason);
-                    if (reason == BiometricDialog.DISMISSED_REASON_USER_CANCEL) {
+                    if (reason == BiometricPrompt.DISMISSED_REASON_USER_CANCEL) {
                         onError(FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED,
                                 0 /* vendorCode */);
                     }
@@ -88,7 +88,7 @@
     public AuthenticationClient(Context context, long halDeviceId, IBinder token,
             IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
             boolean restricted, String owner, Bundle bundle,
-            IBiometricDialogReceiver dialogReceiver, IStatusBarService statusBarService) {
+            IBiometricPromptReceiver dialogReceiver, IStatusBarService statusBarService) {
         super(context, halDeviceId, token, receiver, targetUserId, groupId, restricted, owner);
         mOpId = opId;
         mBundle = bundle;
@@ -299,7 +299,7 @@
             // If the user already cancelled authentication (via some interaction with the
             // dialog, we do not need to hide it since it's already hidden.
             // If the device is in lockout, don't hide the dialog - it will automatically hide
-            // after BiometricDialog.HIDE_DIALOG_DELAY
+            // after BiometricPrompt.HIDE_DIALOG_DELAY
             if (mBundle != null && !mDialogDismissed && !mInLockout) {
                 try {
                     mStatusBarService.hideFingerprintDialog();
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 92d3772..4e95bdf 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -38,7 +38,7 @@
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
 import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback;
 import android.hardware.fingerprint.Fingerprint;
@@ -849,7 +849,7 @@
 
     private void startAuthentication(IBinder token, long opId, int callingUserId, int groupId,
                 IFingerprintServiceReceiver receiver, int flags, boolean restricted,
-                String opPackageName, Bundle bundle, IBiometricDialogReceiver dialogReceiver) {
+                String opPackageName, Bundle bundle, IBiometricPromptReceiver dialogReceiver) {
         updateActiveGroup(groupId, opPackageName);
 
         if (DEBUG) Slog.v(TAG, "startAuthentication(" + opPackageName + ")");
@@ -1160,7 +1160,7 @@
         public void authenticate(final IBinder token, final long opId, final int groupId,
                 final IFingerprintServiceReceiver receiver, final int flags,
                 final String opPackageName, final Bundle bundle,
-                final IBiometricDialogReceiver dialogReceiver) {
+                final IBiometricPromptReceiver dialogReceiver) {
             final int callingUid = Binder.getCallingUid();
             final int callingPid = Binder.getCallingPid();
             final int callingUserId = UserHandle.getCallingUserId();
diff --git a/services/core/java/com/android/server/input/InputWindowHandle.java b/services/core/java/com/android/server/input/InputWindowHandle.java
index 3d6f7ad..720eaaa5 100644
--- a/services/core/java/com/android/server/input/InputWindowHandle.java
+++ b/services/core/java/com/android/server/input/InputWindowHandle.java
@@ -92,7 +92,7 @@
     public int inputFeatures;
 
     // Display this input is on.
-    public final int displayId;
+    public int displayId;
 
     private native void nativeDispose();
 
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 66817fa..736aa46 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -127,7 +127,7 @@
  * Any function with the suffix 'Locked' also needs to lock on {@link #mJobs}.
  * @hide
  */
-public final class JobSchedulerService extends com.android.server.SystemService
+public class JobSchedulerService extends com.android.server.SystemService
         implements StateChangedListener, JobCompletedListener {
     public static final String TAG = "JobScheduler";
     public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -781,6 +781,10 @@
         }
     };
 
+    public Context getTestableContext() {
+        return getContext();
+    }
+
     public Object getLock() {
         return mLock;
     }
diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
index 8365fd2..0c66c5b 100644
--- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
@@ -30,12 +30,12 @@
 import android.net.NetworkPolicyManager;
 import android.net.NetworkRequest;
 import android.net.TrafficStats;
-import android.os.Process;
 import android.os.UserHandle;
 import android.text.format.DateUtils;
 import android.util.ArraySet;
 import android.util.Log;
 import android.util.Slog;
+import android.util.SparseArray;
 import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.annotations.GuardedBy;
@@ -46,6 +46,7 @@
 import com.android.server.job.JobServiceContext;
 import com.android.server.job.StateControllerProto;
 
+import java.util.Objects;
 import java.util.function.Predicate;
 
 /**
@@ -63,7 +64,6 @@
 
     private final ConnectivityManager mConnManager;
     private final NetworkPolicyManager mNetPolicyManager;
-    private boolean mConnected;
 
     @GuardedBy("mLock")
     private final ArraySet<JobStatus> mTrackedJobs = new ArraySet<>();
@@ -74,9 +74,11 @@
         mConnManager = mContext.getSystemService(ConnectivityManager.class);
         mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);
 
-        mConnected = false;
+        // We're interested in all network changes; internally we match these
+        // network changes against the active network for each UID with jobs.
+        final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
+        mConnManager.registerNetworkCallback(request, mNetworkCallback);
 
-        mConnManager.registerDefaultNetworkCallback(mNetworkCallback);
         mNetPolicyManager.registerListener(mNetPolicyListener);
     }
 
@@ -198,14 +200,18 @@
     }
 
     private boolean updateConstraintsSatisfied(JobStatus jobStatus) {
+        final Network network = mConnManager.getActiveNetworkForUid(jobStatus.getSourceUid());
+        final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network);
+        return updateConstraintsSatisfied(jobStatus, network, capabilities);
+    }
+
+    private boolean updateConstraintsSatisfied(JobStatus jobStatus, Network network,
+            NetworkCapabilities capabilities) {
         // TODO: consider matching against non-active networks
 
-        final int jobUid = jobStatus.getSourceUid();
         final boolean ignoreBlocked = (jobStatus.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0;
-
-        final Network network = mConnManager.getActiveNetworkForUid(jobUid, ignoreBlocked);
-        final NetworkInfo info = mConnManager.getNetworkInfoForUid(network, jobUid, ignoreBlocked);
-        final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network);
+        final NetworkInfo info = mConnManager.getNetworkInfoForUid(network,
+                jobStatus.getSourceUid(), ignoreBlocked);
 
         final boolean connected = (info != null) && info.isConnected();
         final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants);
@@ -218,12 +224,6 @@
         // using non-default routes.
         jobStatus.network = network;
 
-        // Track system-uid connected/validated as a general reportable proxy for the
-        // overall state of connectivity constraint satisfiability.
-        if (jobUid == Process.SYSTEM_UID) {
-            mConnected = connected;
-        }
-
         if (DEBUG) {
             Slog.i(TAG, "Connectivity " + (changed ? "CHANGED" : "unchanged")
                     + " for " + jobStatus + ": connected=" + connected
@@ -233,18 +233,48 @@
     }
 
     /**
-     * Update all jobs tracked by this controller.
+     * Update any jobs tracked by this controller that match given filters.
      *
-     * @param uid only update jobs belonging to this UID, or {@code -1} to
+     * @param filterUid only update jobs belonging to this UID, or {@code -1} to
      *            update all tracked jobs.
+     * @param filterNetwork only update jobs that would use this
+     *            {@link Network}, or {@code null} to update all tracked jobs.
      */
-    private void updateTrackedJobs(int uid) {
+    private void updateTrackedJobs(int filterUid, Network filterNetwork) {
         synchronized (mLock) {
+            // Since this is a really hot codepath, temporarily cache any
+            // answers that we get from ConnectivityManager.
+            final SparseArray<Network> uidToNetwork = new SparseArray<>();
+            final SparseArray<NetworkCapabilities> networkToCapabilities = new SparseArray<>();
+
             boolean changed = false;
-            for (int i = mTrackedJobs.size()-1; i >= 0; i--) {
+            for (int i = mTrackedJobs.size() - 1; i >= 0; i--) {
                 final JobStatus js = mTrackedJobs.valueAt(i);
-                if (uid == -1 || uid == js.getSourceUid()) {
-                    changed |= updateConstraintsSatisfied(js);
+                final int uid = js.getSourceUid();
+
+                final boolean uidMatch = (filterUid == -1 || filterUid == uid);
+                if (uidMatch) {
+                    Network network = uidToNetwork.get(uid);
+                    if (network == null) {
+                        network = mConnManager.getActiveNetworkForUid(uid);
+                        uidToNetwork.put(uid, network);
+                    }
+
+                    // Update either when we have a network match, or when the
+                    // job hasn't yet been evaluated against the currently
+                    // active network; typically when we just lost a network.
+                    final boolean networkMatch = (filterNetwork == null
+                            || Objects.equals(filterNetwork, network));
+                    final boolean forceUpdate = !Objects.equals(js.network, network);
+                    if (networkMatch || forceUpdate) {
+                        final int netId = network != null ? network.netId : -1;
+                        NetworkCapabilities capabilities = networkToCapabilities.get(netId);
+                        if (capabilities == null) {
+                            capabilities = mConnManager.getNetworkCapabilities(network);
+                            networkToCapabilities.put(netId, capabilities);
+                        }
+                        changed |= updateConstraintsSatisfied(js, network, capabilities);
+                    }
                 }
             }
             if (changed) {
@@ -273,19 +303,19 @@
 
     private final NetworkCallback mNetworkCallback = new NetworkCallback() {
         @Override
-        public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
+        public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) {
             if (DEBUG) {
-                Slog.v(TAG, "onCapabilitiesChanged() : " + networkCapabilities);
+                Slog.v(TAG, "onCapabilitiesChanged: " + network);
             }
-            updateTrackedJobs(-1);
+            updateTrackedJobs(-1, network);
         }
 
         @Override
         public void onLost(Network network) {
             if (DEBUG) {
-                Slog.v(TAG, "Network lost");
+                Slog.v(TAG, "onLost: " + network);
             }
-            updateTrackedJobs(-1);
+            updateTrackedJobs(-1, network);
         }
     };
 
@@ -293,25 +323,9 @@
         @Override
         public void onUidRulesChanged(int uid, int uidRules) {
             if (DEBUG) {
-                Slog.v(TAG, "Uid rules changed for " + uid);
+                Slog.v(TAG, "onUidRulesChanged: " + uid);
             }
-            updateTrackedJobs(uid);
-        }
-
-        @Override
-        public void onRestrictBackgroundChanged(boolean restrictBackground) {
-            if (DEBUG) {
-                Slog.v(TAG, "Background restriction change to " + restrictBackground);
-            }
-            updateTrackedJobs(-1);
-        }
-
-        @Override
-        public void onUidPoliciesChanged(int uid, int uidPolicies) {
-            if (DEBUG) {
-                Slog.v(TAG, "Uid policy changed for " + uid);
-            }
-            updateTrackedJobs(uid);
+            updateTrackedJobs(uid, null);
         }
     };
 
@@ -319,9 +333,6 @@
     @Override
     public void dumpControllerStateLocked(IndentingPrintWriter pw,
             Predicate<JobStatus> predicate) {
-        pw.println("System connected: " + mConnected);
-        pw.println();
-
         for (int i = 0; i < mTrackedJobs.size(); i++) {
             final JobStatus js = mTrackedJobs.valueAt(i);
             if (predicate.test(js)) {
@@ -343,8 +354,6 @@
         final long token = proto.start(fieldId);
         final long mToken = proto.start(StateControllerProto.CONNECTIVITY);
 
-        proto.write(StateControllerProto.ConnectivityController.IS_CONNECTED, mConnected);
-
         for (int i = 0; i < mTrackedJobs.size(); i++) {
             final JobStatus js = mTrackedJobs.valueAt(i);
             if (!predicate.test(js)) {
diff --git a/services/core/java/com/android/server/job/controllers/StateController.java b/services/core/java/com/android/server/job/controllers/StateController.java
index 495109d..c2be283 100644
--- a/services/core/java/com/android/server/job/controllers/StateController.java
+++ b/services/core/java/com/android/server/job/controllers/StateController.java
@@ -41,7 +41,7 @@
     StateController(JobSchedulerService service) {
         mService = service;
         mStateChangedListener = service;
-        mContext = service.getContext();
+        mContext = service.getTestableContext();
         mLock = service.getLock();
         mConstants = service.getConstants();
     }
diff --git a/services/core/java/com/android/server/location/ExponentialBackOff.java b/services/core/java/com/android/server/location/ExponentialBackOff.java
new file mode 100644
index 0000000..8c77b21
--- /dev/null
+++ b/services/core/java/com/android/server/location/ExponentialBackOff.java
@@ -0,0 +1,32 @@
+package com.android.server.location;
+
+/**
+ * A simple implementation of exponential backoff.
+ */
+class ExponentialBackOff {
+    private static final int MULTIPLIER = 2;
+    private final long mInitIntervalMillis;
+    private final long mMaxIntervalMillis;
+    private long mCurrentIntervalMillis;
+
+    ExponentialBackOff(long initIntervalMillis, long maxIntervalMillis) {
+        mInitIntervalMillis = initIntervalMillis;
+        mMaxIntervalMillis = maxIntervalMillis;
+
+        mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
+    }
+
+    long nextBackoffMillis() {
+        if (mCurrentIntervalMillis > mMaxIntervalMillis) {
+            return mMaxIntervalMillis;
+        }
+
+        mCurrentIntervalMillis *= MULTIPLIER;
+        return mCurrentIntervalMillis;
+    }
+
+    void reset() {
+        mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
+    }
+}
+
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 5955c9c..58bca19 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -76,14 +76,18 @@
 import android.telephony.gsm.GsmCellLocation;
 import android.text.TextUtils;
 import android.util.Log;
-import android.util.NtpTrustedTime;
-import com.android.internal.app.IAppOpsService;
+
 import com.android.internal.app.IBatteryStats;
 import com.android.internal.location.GpsNetInitiatedHandler;
 import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
 import com.android.internal.location.ProviderProperties;
 import com.android.internal.location.ProviderRequest;
 import com.android.internal.location.gnssmetrics.GnssMetrics;
+import com.android.server.location.GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback;
+import com.android.server.location.NtpTimeHelper.InjectNtpTimeCallback;
+
+import libcore.io.IoUtils;
+
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
@@ -93,21 +97,19 @@
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
 
-import libcore.io.IoUtils;
-
 /**
  * A GNSS implementation of LocationProvider used by LocationManager.
  *
  * {@hide}
  */
-public class GnssLocationProvider implements LocationProviderInterface {
+public class GnssLocationProvider implements LocationProviderInterface, InjectNtpTimeCallback,
+        GnssSatelliteBlacklistCallback {
 
     private static final String TAG = "GnssLocationProvider";
 
@@ -208,7 +210,6 @@
     private static final int UPDATE_LOCATION = 7;  // Handle external location from network listener
     private static final int ADD_LISTENER = 8;
     private static final int REMOVE_LISTENER = 9;
-    private static final int INJECT_NTP_TIME_FINISHED = 10;
     private static final int DOWNLOAD_XTRA_DATA_FINISHED = 11;
     private static final int SUBSCRIPTION_OR_SIM_CHANGED = 12;
     private static final int INITIALIZE_HANDLER = 13;
@@ -310,7 +311,7 @@
         }
     }
 
-    private Object mLock = new Object();
+    private final Object mLock = new Object();
 
     // current status
     private int mStatus = LocationProvider.TEMPORARILY_UNAVAILABLE;
@@ -329,9 +330,6 @@
     // Typical hot TTTF is ~5 seconds, so 10 seconds seems sane.
     private static final int GPS_POLLING_THRESHOLD_INTERVAL = 10 * 1000;
 
-    // how often to request NTP time, in milliseconds
-    // current setting 24 hours
-    private static final long NTP_INTERVAL = 24 * 60 * 60 * 1000;
     // how long to wait if we have a network error in NTP or XTRA downloading
     // the initial value of the exponential backoff
     // current setting - 5 minutes
@@ -344,8 +342,8 @@
     // Timeout when holding wakelocks for downloading XTRA data.
     private static final long DOWNLOAD_XTRA_DATA_TIMEOUT_MS = 60 * 1000;
 
-    private BackOff mNtpBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL);
-    private BackOff mXtraBackOff = new BackOff(RETRY_INTERVAL, MAX_RETRY_INTERVAL);
+    private final ExponentialBackOff mXtraBackOff = new ExponentialBackOff(RETRY_INTERVAL,
+            MAX_RETRY_INTERVAL);
 
     // true if we are enabled, protected by this
     private boolean mEnabled;
@@ -357,12 +355,8 @@
 
     // flags to trigger NTP or XTRA data download when network becomes available
     // initialized to true so we do NTP and XTRA when the network comes up after booting
-    private int mInjectNtpTimePending = STATE_PENDING_NETWORK;
     private int mDownloadXtraDataPending = STATE_PENDING_NETWORK;
 
-    // set to true if the GPS engine requested on-demand NTP time requests
-    private boolean mOnDemandTimeInjection;
-
     // true if GPS is navigating
     private boolean mNavigating;
 
@@ -417,14 +411,15 @@
     private boolean mSuplEsEnabled = false;
 
     private final Context mContext;
-    private final NtpTrustedTime mNtpTime;
     private final ILocationManager mILocationManager;
     private final LocationExtras mLocationExtras = new LocationExtras();
     private final GnssStatusListenerHelper mListenerHelper;
+    private final GnssSatelliteBlacklistHelper mGnssSatelliteBlacklistHelper;
     private final GnssMeasurementsProvider mGnssMeasurementsProvider;
     private final GnssNavigationMessageProvider mGnssNavigationMessageProvider;
     private final LocationChangeListener mNetworkLocationListener = new NetworkLocationListener();
     private final LocationChangeListener mFusedLocationListener = new FusedLocationListener();
+    private final NtpTimeHelper mNtpTimeHelper;
 
     // Handler for processing events
     private Handler mHandler;
@@ -517,9 +512,7 @@
             new ConnectivityManager.NetworkCallback() {
                 @Override
                 public void onAvailable(Network network) {
-                    if (mInjectNtpTimePending == STATE_PENDING_NETWORK) {
-                        requestUtcTime();
-                    }
+                    mNtpTimeHelper.onNetworkAvailable();
                     if (mDownloadXtraDataPending == STATE_PENDING_NETWORK) {
                         if (mSupportsXtra) {
                             // Download only if supported, (prevents an unneccesary on-boot
@@ -588,6 +581,16 @@
                 }
             };
 
+    /**
+     * Implements {@link GnssSatelliteBlacklistCallback#onUpdateSatelliteBlacklist}.
+     */
+    @Override
+    public void onUpdateSatelliteBlacklist(int[] constellations, int[] svids) {
+        mHandler.post(()->{
+            native_set_satellite_blacklist(constellations, svids);
+        });
+    }
+
     private void subscriptionOrSimChanged(Context context) {
         if (DEBUG) Log.d(TAG, "received SIM related action: ");
         TelephonyManager phone = (TelephonyManager)
@@ -762,7 +765,6 @@
     public GnssLocationProvider(Context context, ILocationManager ilocationManager,
             Looper looper) {
         mContext = context;
-        mNtpTime = NtpTrustedTime.getInstance(context);
         mILocationManager = ilocationManager;
 
         // Create a wake lock
@@ -880,6 +882,11 @@
             }
         };
         mGnssMetrics = new GnssMetrics(mBatteryStats);
+
+        mNtpTimeHelper = new NtpTimeHelper(mContext, looper, this);
+        mGnssSatelliteBlacklistHelper = new GnssSatelliteBlacklistHelper(mContext,
+                looper, this);
+        mHandler.post(mGnssSatelliteBlacklistHelper::updateSatelliteBlacklist);
     }
 
     /**
@@ -895,6 +902,15 @@
         return PROPERTIES;
     }
 
+
+    /**
+     * Implements {@link InjectNtpTimeCallback#injectTime}
+     */
+    @Override
+    public void injectTime(long time, long timeReference, int uncertainty) {
+        native_inject_time(time, timeReference, uncertainty);
+    }
+
     private void handleUpdateNetworkState(Network network) {
         // retrieve NetworkInfo for this UID
         NetworkInfo info = mConnMgr.getNetworkInfo(network);
@@ -1014,79 +1030,7 @@
                 Log.e(TAG, "Invalid status to release SUPL connection: " + agpsDataConnStatus);
         }
     }
-
-    private void handleInjectNtpTime() {
-        if (mInjectNtpTimePending == STATE_DOWNLOADING) {
-            // already downloading data
-            return;
-        }
-        if (!isDataNetworkConnected()) {
-            // try again when network is up
-            mInjectNtpTimePending = STATE_PENDING_NETWORK;
-            return;
-        }
-        mInjectNtpTimePending = STATE_DOWNLOADING;
-
-        // hold wake lock while task runs
-        mWakeLock.acquire();
-        Log.i(TAG, "WakeLock acquired by handleInjectNtpTime()");
-        AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
-            @Override
-            public void run() {
-                long delay;
-
-                // force refresh NTP cache when outdated
-                boolean refreshSuccess = true;
-                if (mNtpTime.getCacheAge() >= NTP_INTERVAL) {
-                    refreshSuccess = mNtpTime.forceRefresh();
-                }
-
-                // only update when NTP time is fresh
-                if (mNtpTime.getCacheAge() < NTP_INTERVAL) {
-                    long time = mNtpTime.getCachedNtpTime();
-                    long timeReference = mNtpTime.getCachedNtpTimeReference();
-                    long certainty = mNtpTime.getCacheCertainty();
-
-                    if (DEBUG) {
-                        long now = System.currentTimeMillis();
-                        Log.d(TAG, "NTP server returned: "
-                                + time + " (" + new Date(time)
-                                + ") reference: " + timeReference
-                                + " certainty: " + certainty
-                                + " system time offset: " + (time - now));
-                    }
-
-                    native_inject_time(time, timeReference, (int) certainty);
-                    delay = NTP_INTERVAL;
-                    mNtpBackOff.reset();
-                } else {
-                    Log.e(TAG, "requestTime failed");
-                    delay = mNtpBackOff.nextBackoffMillis();
-                }
-
-                sendMessage(INJECT_NTP_TIME_FINISHED, 0, null);
-
-                if (DEBUG) {
-                    String message = String.format(
-                            "onDemandTimeInjection=%s, refreshSuccess=%s, delay=%s",
-                            mOnDemandTimeInjection,
-                            refreshSuccess,
-                            delay);
-                    Log.d(TAG, message);
-                }
-                if (mOnDemandTimeInjection || !refreshSuccess) {
-                    // send delayed message for next NTP injection
-                    // since this is delayed and not urgent we do not hold a wake lock here
-                    mHandler.sendEmptyMessageDelayed(INJECT_NTP_TIME, delay);
-                }
-
-                // release wake lock held by task
-                mWakeLock.release();
-                Log.i(TAG, "WakeLock released by handleInjectNtpTime()");
-            }
-        });
-    }
-
+    
     private void handleRequestLocation(boolean independentFromGnss) {
         if (isRequestLocationRateLimited()) {
             if (DEBUG) {
@@ -2006,7 +1950,7 @@
                 mEngineCapabilities = capabilities;
 
                 if (hasCapability(GPS_CAPABILITY_ON_DEMAND_TIME)) {
-                    mOnDemandTimeInjection = true;
+                    mNtpTimeHelper.enablePeriodicTimeInjection();
                     requestUtcTime();
                 }
 
@@ -2467,7 +2411,7 @@
                     handleReleaseSuplConnection(msg.arg1);
                     break;
                 case INJECT_NTP_TIME:
-                    handleInjectNtpTime();
+                    mNtpTimeHelper.retrieveAndInjectNtpTime();
                     break;
                 case REQUEST_LOCATION:
                     handleRequestLocation((boolean) msg.obj);
@@ -2475,9 +2419,6 @@
                 case DOWNLOAD_XTRA_DATA:
                     handleDownloadXtraData();
                     break;
-                case INJECT_NTP_TIME_FINISHED:
-                    mInjectNtpTimePending = STATE_IDLE;
-                    break;
                 case DOWNLOAD_XTRA_DATA_FINISHED:
                     mDownloadXtraDataPending = STATE_IDLE;
                     break;
@@ -2808,8 +2749,6 @@
                 return "REQUEST_LOCATION";
             case DOWNLOAD_XTRA_DATA:
                 return "DOWNLOAD_XTRA_DATA";
-            case INJECT_NTP_TIME_FINISHED:
-                return "INJECT_NTP_TIME_FINISHED";
             case DOWNLOAD_XTRA_DATA_FINISHED:
                 return "DOWNLOAD_XTRA_DATA_FINISHED";
             case UPDATE_LOCATION:
@@ -2856,36 +2795,6 @@
         pw.append(s);
     }
 
-    /**
-     * A simple implementation of exponential backoff.
-     */
-    private static final class BackOff {
-        private static final int MULTIPLIER = 2;
-        private final long mInitIntervalMillis;
-        private final long mMaxIntervalMillis;
-        private long mCurrentIntervalMillis;
-
-        public BackOff(long initIntervalMillis, long maxIntervalMillis) {
-            mInitIntervalMillis = initIntervalMillis;
-            mMaxIntervalMillis = maxIntervalMillis;
-
-            mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
-        }
-
-        public long nextBackoffMillis() {
-            if (mCurrentIntervalMillis > mMaxIntervalMillis) {
-                return mMaxIntervalMillis;
-            }
-
-            mCurrentIntervalMillis *= MULTIPLIER;
-            return mCurrentIntervalMillis;
-        }
-
-        public void reset() {
-            mCurrentIntervalMillis = mInitIntervalMillis / MULTIPLIER;
-        }
-    }
-
     // preallocated to avoid memory allocation in reportNmea()
     private byte[] mNmeaBuffer = new byte[120];
 
@@ -3008,6 +2917,8 @@
 
     private static native boolean native_set_emergency_supl_pdn(int emergencySuplPdn);
 
+    private static native boolean native_set_satellite_blacklist(int[] constellations, int[] svIds);
+
     // GNSS Batching
     private static native int native_get_batch_size();
 
@@ -3022,3 +2933,4 @@
     private static native void native_cleanup_batching();
 
 }
+
diff --git a/services/core/java/com/android/server/location/GnssSatelliteBlacklistHelper.java b/services/core/java/com/android/server/location/GnssSatelliteBlacklistHelper.java
new file mode 100644
index 0000000..77951aa
--- /dev/null
+++ b/services/core/java/com/android/server/location/GnssSatelliteBlacklistHelper.java
@@ -0,0 +1,102 @@
+package com.android.server.location;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Detects blacklist change and updates the blacklist.
+ */
+class GnssSatelliteBlacklistHelper {
+
+    private static final String TAG = "GnssBlacklistHelper";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private static final String BLACKLIST_DELIMITER = ",";
+
+    private final Context mContext;
+    private final GnssSatelliteBlacklistCallback mCallback;
+
+    interface GnssSatelliteBlacklistCallback {
+        void onUpdateSatelliteBlacklist(int[] constellations, int[] svids);
+    }
+
+    GnssSatelliteBlacklistHelper(Context context, Looper looper,
+            GnssSatelliteBlacklistCallback callback) {
+        mContext = context;
+        mCallback = callback;
+        ContentObserver contentObserver = new ContentObserver(new Handler(looper)) {
+            @Override
+            public void onChange(boolean selfChange) {
+                updateSatelliteBlacklist();
+            }
+        };
+        mContext.getContentResolver().registerContentObserver(
+                Settings.Global.getUriFor(
+                        Settings.Global.GNSS_SATELLITE_BLACKLIST),
+                true,
+                contentObserver, UserHandle.USER_ALL);
+    }
+
+    void updateSatelliteBlacklist() {
+        ContentResolver resolver = mContext.getContentResolver();
+        String blacklist = Settings.Global.getString(
+                resolver,
+                Settings.Global.GNSS_SATELLITE_BLACKLIST);
+        if (blacklist == null) {
+            blacklist = "";
+        }
+        if (DEBUG) {
+            Log.d(TAG, String.format("Update GNSS satellite blacklist: %s", blacklist));
+        }
+
+        List<Integer> blacklistValues;
+        try {
+            blacklistValues = parseSatelliteBlacklist(blacklist);
+        } catch (NumberFormatException e) {
+            Log.e(TAG, "Exception thrown when parsing blacklist string.", e);
+            return;
+        }
+
+        if (blacklistValues.size() % 2 != 0) {
+            Log.e(TAG, "blacklist string has odd number of values."
+                    + "Aborting updateSatelliteBlacklist");
+            return;
+        }
+
+        int length = blacklistValues.size() / 2;
+        int[] constellations = new int[length];
+        int[] svids = new int[length];
+        for (int i = 0; i < length; i++) {
+            constellations[i] = blacklistValues.get(i * 2);
+            svids[i] = blacklistValues.get(i * 2 + 1);
+        }
+        mCallback.onUpdateSatelliteBlacklist(constellations, svids);
+    }
+
+    @VisibleForTesting
+    static List<Integer> parseSatelliteBlacklist(String blacklist) throws NumberFormatException {
+        String[] strings = blacklist.split(BLACKLIST_DELIMITER);
+        List<Integer> parsed = new ArrayList<>(strings.length);
+        for (String string : strings) {
+            string = string.trim();
+            if (!"".equals(string)) {
+                int value = Integer.parseInt(string);
+                if (value < 0) {
+                    throw new NumberFormatException("Negative value is invalid.");
+                }
+                parsed.add(value);
+            }
+        }
+        return parsed;
+    }
+}
diff --git a/services/core/java/com/android/server/location/NtpTimeHelper.java b/services/core/java/com/android/server/location/NtpTimeHelper.java
new file mode 100644
index 0000000..296b500
--- /dev/null
+++ b/services/core/java/com/android/server/location/NtpTimeHelper.java
@@ -0,0 +1,191 @@
+package com.android.server.location;
+
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.util.Log;
+import android.util.NtpTrustedTime;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.Date;
+
+/**
+ * Handles inject NTP time to GNSS.
+ *
+ * <p>The client is responsible to call {@link #onNetworkAvailable()} when network is available
+ * for retrieving NTP Time.
+ */
+class NtpTimeHelper {
+
+    private static final String TAG = "NtpTimeHelper";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    // states for injecting ntp
+    private static final int STATE_PENDING_NETWORK = 0;
+    private static final int STATE_RETRIEVING_AND_INJECTING = 1;
+    private static final int STATE_IDLE = 2;
+
+    // how often to request NTP time, in milliseconds
+    // current setting 24 hours
+    @VisibleForTesting
+    static final long NTP_INTERVAL = 24 * 60 * 60 * 1000;
+
+    // how long to wait if we have a network error in NTP
+    // the initial value of the exponential backoff
+    // current setting - 5 minutes
+    @VisibleForTesting
+    static final long RETRY_INTERVAL = 5 * 60 * 1000;
+    // how long to wait if we have a network error in NTP
+    // the max value of the exponential backoff
+    // current setting - 4 hours
+    private static final long MAX_RETRY_INTERVAL = 4 * 60 * 60 * 1000;
+
+    private static final long WAKELOCK_TIMEOUT_MILLIS = 60 * 1000;
+    private static final String WAKELOCK_KEY = "NtpTimeHelper";
+
+    private final ExponentialBackOff mNtpBackOff = new ExponentialBackOff(RETRY_INTERVAL,
+            MAX_RETRY_INTERVAL);
+
+    private final ConnectivityManager mConnMgr;
+    private final NtpTrustedTime mNtpTime;
+    private final WakeLock mWakeLock;
+    private final Handler mHandler;
+
+    @GuardedBy("this")
+    private final InjectNtpTimeCallback mCallback;
+
+    // flags to trigger NTP when network becomes available
+    // initialized to STATE_PENDING_NETWORK so we do NTP when the network comes up after booting
+    @GuardedBy("this")
+    private int mInjectNtpTimeState = STATE_PENDING_NETWORK;
+
+    // set to true if the GPS engine requested on-demand NTP time requests
+    @GuardedBy("this")
+    private boolean mOnDemandTimeInjection;
+
+    interface InjectNtpTimeCallback {
+        void injectTime(long time, long timeReference, int uncertainty);
+    }
+
+    @VisibleForTesting
+    NtpTimeHelper(Context context, Looper looper, InjectNtpTimeCallback callback,
+            NtpTrustedTime ntpTime) {
+        mConnMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        mCallback = callback;
+        mNtpTime = ntpTime;
+        mHandler = new Handler(looper);
+        PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
+    }
+
+    NtpTimeHelper(Context context, Looper looper, InjectNtpTimeCallback callback) {
+        this(context, looper, callback, NtpTrustedTime.getInstance(context));
+    }
+
+    synchronized void enablePeriodicTimeInjection() {
+        mOnDemandTimeInjection = true;
+    }
+
+    synchronized void onNetworkAvailable() {
+        if (mInjectNtpTimeState == STATE_PENDING_NETWORK) {
+            retrieveAndInjectNtpTime();
+        }
+    }
+
+    /**
+     * @return {@code true} if there is a network available for outgoing connections,
+     * {@code false} otherwise.
+     */
+    private boolean isNetworkConnected() {
+        NetworkInfo activeNetworkInfo = mConnMgr.getActiveNetworkInfo();
+        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
+    }
+
+    synchronized void retrieveAndInjectNtpTime() {
+        if (mInjectNtpTimeState == STATE_RETRIEVING_AND_INJECTING) {
+            // already downloading data
+            return;
+        }
+        if (!isNetworkConnected()) {
+            // try again when network is up
+            mInjectNtpTimeState = STATE_PENDING_NETWORK;
+            return;
+        }
+        mInjectNtpTimeState = STATE_RETRIEVING_AND_INJECTING;
+
+        // hold wake lock while task runs
+        mWakeLock.acquire(WAKELOCK_TIMEOUT_MILLIS);
+        new Thread(this::blockingGetNtpTimeAndInject).start();
+    }
+
+    /** {@link NtpTrustedTime#forceRefresh} is a blocking network operation. */
+    private void blockingGetNtpTimeAndInject() {
+        long delay;
+
+        // force refresh NTP cache when outdated
+        boolean refreshSuccess = true;
+        if (mNtpTime.getCacheAge() >= NTP_INTERVAL) {
+            // Blocking network operation.
+            refreshSuccess = mNtpTime.forceRefresh();
+        }
+
+        synchronized (this) {
+            mInjectNtpTimeState = STATE_IDLE;
+
+            // only update when NTP time is fresh
+            // If refreshSuccess is false, cacheAge does not drop down.
+            if (mNtpTime.getCacheAge() < NTP_INTERVAL) {
+                long time = mNtpTime.getCachedNtpTime();
+                long timeReference = mNtpTime.getCachedNtpTimeReference();
+                long certainty = mNtpTime.getCacheCertainty();
+
+                if (DEBUG) {
+                    long now = System.currentTimeMillis();
+                    Log.d(TAG, "NTP server returned: "
+                            + time + " (" + new Date(time)
+                            + ") reference: " + timeReference
+                            + " certainty: " + certainty
+                            + " system time offset: " + (time - now));
+                }
+
+                // Ok to cast to int, as can't rollover in practice
+                mHandler.post(() -> mCallback.injectTime(time, timeReference, (int) certainty));
+
+                delay = NTP_INTERVAL;
+                mNtpBackOff.reset();
+            } else {
+                Log.e(TAG, "requestTime failed");
+                delay = mNtpBackOff.nextBackoffMillis();
+            }
+
+            if (DEBUG) {
+                Log.d(TAG, String.format(
+                        "onDemandTimeInjection=%s, refreshSuccess=%s, delay=%s",
+                        mOnDemandTimeInjection,
+                        refreshSuccess,
+                        delay));
+            }
+            // TODO(b/73893222): reconcile Capabilities bit 'on demand' name vs. de facto periodic
+            // injection.
+            if (mOnDemandTimeInjection || !refreshSuccess) {
+                /* Schedule next NTP injection.
+                 * Since this is delayed, the wake lock is released right away, and will be held
+                 * again when the delayed task runs.
+                 */
+                mHandler.postDelayed(this::retrieveAndInjectNtpTime, delay);
+            }
+        }
+        try {
+            // release wake lock held by task
+            mWakeLock.release();
+        } catch (Exception e) {
+            // This happens when the WakeLock is already released.
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index 88b2a36..0700ab3 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -534,17 +534,33 @@
 
     private void destroyWeaverSlot(long handle, int userId) {
         int slot = loadWeaverSlot(handle, userId);
+        destroyState(WEAVER_SLOT_NAME, handle, userId);
         if (slot != INVALID_WEAVER_SLOT) {
-            try {
-                weaverEnroll(slot, null, null);
-            } catch (RemoteException e) {
-                Log.w(TAG, "Failed to destroy slot", e);
+            Set<Integer> usedSlots = getUsedWeaverSlots();
+            if (!usedSlots.contains(slot)) {
+                Log.i(TAG, "Destroy weaver slot " + slot + " for user " + userId);
+                try {
+                    weaverEnroll(slot, null, null);
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Failed to destroy slot", e);
+                }
+            } else {
+                Log.w(TAG, "Skip destroying reused weaver slot " + slot + " for user " + userId);
             }
         }
-        destroyState(WEAVER_SLOT_NAME, handle, userId);
     }
 
-    private int getNextAvailableWeaverSlot() {
+    /**
+     * Return the set of weaver slots that are currently in use by all users on the device.
+     * <p>
+     * <em>Note:</em> Users who are in the process of being deleted are not tracked here
+     * (due to them being marked as partial in UserManager so not visible from
+     * {@link UserManager#getUsers}). As a result their weaver slots will not be considered
+     * taken and can be reused by new users. Care should be taken when cleaning up the
+     * deleted user in {@link #removeUser}, to prevent a reused slot from being erased
+     * unintentionally.
+     */
+    private Set<Integer> getUsedWeaverSlots() {
         Map<Integer, List<Long>> slotHandles = mStorage.listSyntheticPasswordHandlesForAllUsers(
                 WEAVER_SLOT_NAME);
         HashSet<Integer> slots = new HashSet<>();
@@ -554,8 +570,13 @@
                 slots.add(slot);
             }
         }
+        return slots;
+    }
+
+    private int getNextAvailableWeaverSlot() {
+        Set<Integer> usedSlots = getUsedWeaverSlots();
         for (int i = 0; i < mWeaverConfig.slots; i++) {
-            if (!slots.contains(i)) {
+            if (!usedSlots.contains(i)) {
                 return i;
             }
         }
@@ -592,6 +613,7 @@
         if (isWeaverAvailable()) {
             // Weaver based user password
             int weaverSlot = getNextAvailableWeaverSlot();
+            Log.i(TAG, "Weaver enroll password to slot " + weaverSlot + " for user " + userId);
             byte[] weaverSecret = weaverEnroll(weaverSlot, passwordTokenToWeaverKey(pwdToken), null);
             if (weaverSecret == null) {
                 Log.e(TAG, "Fail to enroll user password under weaver " + userId);
@@ -749,6 +771,7 @@
         if (isWeaverAvailable()) {
             int slot = getNextAvailableWeaverSlot();
             try {
+                Log.i(TAG, "Weaver enroll token to slot " + slot + " for user " + userId);
                 weaverEnroll(slot, null, tokenData.weaverSecret);
             } catch (RemoteException e) {
                 Log.e(TAG, "Failed to enroll weaver secret when activating token", e);
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index 4c4176a..567eaaa 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -20,6 +20,7 @@
 
 import android.annotation.Nullable;
 import android.content.Context;
+import android.security.Scrypt;
 import android.security.keystore.recovery.KeyChainProtectionParams;
 import android.security.keystore.recovery.KeyChainSnapshot;
 import android.security.keystore.recovery.KeyDerivationParams;
@@ -69,6 +70,17 @@
     private static final String LOCK_SCREEN_HASH_ALGORITHM = "SHA-256";
     private static final int TRUSTED_HARDWARE_MAX_ATTEMPTS = 10;
 
+    // TODO: Reduce the minimal length once all other components are updated
+    private static final int MIN_CREDENTIAL_LEN_TO_USE_SCRYPT = 24;
+    @VisibleForTesting
+    static final int SCRYPT_PARAM_N = 4096;
+    @VisibleForTesting
+    static final int SCRYPT_PARAM_R = 8;
+    @VisibleForTesting
+    static final int SCRYPT_PARAM_P = 1;
+    @VisibleForTesting
+    static final int SCRYPT_PARAM_OUTLEN_BYTES = 32;
+
     private final RecoverableKeyStoreDb mRecoverableKeyStoreDb;
     private final int mUserId;
     private final int mCredentialType;
@@ -78,6 +90,7 @@
     private final RecoverySnapshotStorage mRecoverySnapshotStorage;
     private final RecoverySnapshotListenersStorage mSnapshotListenersStorage;
     private final TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
+    private final Scrypt mScrypt;
 
     public static KeySyncTask newInstance(
             Context context,
@@ -98,7 +111,8 @@
                 credential,
                 credentialUpdated,
                 PlatformKeyManager.getInstance(context, recoverableKeyStoreDb),
-                new TestOnlyInsecureCertificateHelper());
+                new TestOnlyInsecureCertificateHelper(),
+                new Scrypt());
     }
 
     /**
@@ -110,7 +124,7 @@
      * @param credential The credential, encoded as a {@link String}.
      * @param credentialUpdated signals weather credentials were updated.
      * @param platformKeyManager platform key manager
-     * @param TestOnlyInsecureCertificateHelper utility class used for end-to-end tests
+     * @param testOnlyInsecureCertificateHelper utility class used for end-to-end tests
      */
     @VisibleForTesting
     KeySyncTask(
@@ -122,7 +136,8 @@
             String credential,
             boolean credentialUpdated,
             PlatformKeyManager platformKeyManager,
-            TestOnlyInsecureCertificateHelper TestOnlyInsecureCertificateHelper) {
+            TestOnlyInsecureCertificateHelper testOnlyInsecureCertificateHelper,
+            Scrypt scrypt) {
         mSnapshotListenersStorage = recoverySnapshotListenersStorage;
         mRecoverableKeyStoreDb = recoverableKeyStoreDb;
         mUserId = userId;
@@ -131,7 +146,8 @@
         mCredentialUpdated = credentialUpdated;
         mPlatformKeyManager = platformKeyManager;
         mRecoverySnapshotStorage = snapshotStorage;
-        mTestOnlyInsecureCertificateHelper = TestOnlyInsecureCertificateHelper;
+        mTestOnlyInsecureCertificateHelper = testOnlyInsecureCertificateHelper;
+        mScrypt = scrypt;
     }
 
     @Override
@@ -230,8 +246,14 @@
             }
         }
 
+        boolean useScryptToHashCredential = shouldUseScryptToHashCredential(rootCertAlias);
         byte[] salt = generateSalt();
-        byte[] localLskfHash = hashCredentials(salt, mCredential);
+        byte[] localLskfHash;
+        if (useScryptToHashCredential) {
+            localLskfHash = hashCredentialsByScrypt(salt, mCredential);
+        } else {
+            localLskfHash = hashCredentialsBySaltedSha256(salt, mCredential);
+        }
 
         Map<String, SecretKey> rawKeys;
         try {
@@ -303,10 +325,17 @@
             Log.e(TAG,"Could not encrypt with recovery key", e);
             return;
         }
+        KeyDerivationParams keyDerivationParams;
+        if (useScryptToHashCredential) {
+            keyDerivationParams = KeyDerivationParams.createScryptParams(
+                    salt, /*memoryDifficulty=*/ SCRYPT_PARAM_N);
+        } else {
+            keyDerivationParams = KeyDerivationParams.createSha256Params(salt);
+        }
         KeyChainProtectionParams metadata = new KeyChainProtectionParams.Builder()
                 .setUserSecretType(TYPE_LOCKSCREEN)
                 .setLockScreenUiFormat(getUiFormat(mCredentialType, mCredential))
-                .setKeyDerivationParams(KeyDerivationParams.createSha256Params(salt))
+                .setKeyDerivationParams(keyDerivationParams)
                 .setSecret(new byte[0])
                 .build();
 
@@ -443,7 +472,7 @@
      * @return The SHA-256 hash.
      */
     @VisibleForTesting
-    static byte[] hashCredentials(byte[] salt, String credentials) {
+    static byte[] hashCredentialsBySaltedSha256(byte[] salt, String credentials) {
         byte[] credentialsBytes = credentials.getBytes(StandardCharsets.UTF_8);
         ByteBuffer byteBuffer = ByteBuffer.allocate(
                 salt.length + credentialsBytes.length + LENGTH_PREFIX_BYTES * 2);
@@ -462,6 +491,12 @@
         }
     }
 
+    private byte[] hashCredentialsByScrypt(byte[] salt, String credentials) {
+        return mScrypt.scrypt(
+                credentials.getBytes(StandardCharsets.UTF_8), salt,
+                SCRYPT_PARAM_N, SCRYPT_PARAM_R, SCRYPT_PARAM_P, SCRYPT_PARAM_OUTLEN_BYTES);
+    }
+
     private static SecretKey generateRecoveryKey() throws NoSuchAlgorithmException {
         KeyGenerator keyGenerator = KeyGenerator.getInstance(RECOVERY_KEY_ALGORITHM);
         keyGenerator.init(RECOVERY_KEY_SIZE_BITS);
@@ -479,4 +514,11 @@
         }
         return keyEntries;
     }
+
+    private boolean shouldUseScryptToHashCredential(String rootCertAlias) {
+        return mCredentialType == LockPatternUtils.CREDENTIAL_TYPE_PASSWORD
+                && mCredential.length() >= MIN_CREDENTIAL_LEN_TO_USE_SCRYPT
+                // TODO: Remove the test cert check once all other components are updated
+                && mTestOnlyInsecureCertificateHelper.isTestOnlyCertificateAlias(rootCertAlias);
+    }
 }
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java
index e5ff5b8..52394d2 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java
@@ -375,6 +375,8 @@
             throws NoSuchAlgorithmException, KeyStoreException {
         String encryptAlias = getEncryptAlias(userId, generationId);
         String decryptAlias = getDecryptAlias(userId, generationId);
+        // SecretKey implementation doesn't provide reliable way to destroy the secret
+        // so it may live in memory for some time.
         SecretKey secretKey = generateAesKey();
 
         // Store decryption key first since it is more likely to fail.
@@ -398,8 +400,6 @@
                     .build());
 
         setGenerationId(userId, generationId);
-
-        // TODO: Use a reliable way to destroy the temporary secretKey in memory.
     }
 
     /**
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
index 7ebe8bf..396862d 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGenerator.java
@@ -29,7 +29,6 @@
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
-// TODO: Rename RecoverableKeyGenerator to RecoverableKeyManager as it can import a key too now
 /**
  * Generates/imports keys and stores them both in AndroidKeyStore and on disk, in wrapped form.
  *
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index c09d725..c484251 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -18,6 +18,7 @@
 
 import static android.security.keystore.recovery.RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT;
 import static android.security.keystore.recovery.RecoveryController.ERROR_DECRYPTION_FAILED;
+import static android.security.keystore.recovery.RecoveryController.ERROR_DOWNGRADE_CERTIFICATE;
 import static android.security.keystore.recovery.RecoveryController.ERROR_INSECURE_USER;
 import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_KEY_FORMAT;
 import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
@@ -46,12 +47,12 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.HexDump;
 import com.android.internal.util.Preconditions;
-import com.android.server.locksettings.recoverablekeystore.certificate.CertUtils;
-import com.android.server.locksettings.recoverablekeystore.certificate.SigXml;
-import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage;
 import com.android.server.locksettings.recoverablekeystore.certificate.CertParsingException;
+import com.android.server.locksettings.recoverablekeystore.certificate.CertUtils;
 import com.android.server.locksettings.recoverablekeystore.certificate.CertValidationException;
 import com.android.server.locksettings.recoverablekeystore.certificate.CertXml;
+import com.android.server.locksettings.recoverablekeystore.certificate.SigXml;
+import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage;
 import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb;
 import com.android.server.locksettings.recoverablekeystore.storage.RecoverySessionStorage;
 import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage;
@@ -212,6 +213,8 @@
                 Log.i(TAG, "The cert file serial number is the same, so skip updating.");
             } else {
                 Log.e(TAG, "The cert file serial number is older than the one in database.");
+                throw new ServiceSpecificException(ERROR_DOWNGRADE_CERTIFICATE,
+                        "The cert file serial number is older than the one in database.");
             }
             return;
         }
@@ -295,20 +298,6 @@
         initRecoveryService(rootCertificateAlias, recoveryServiceCertFile);
     }
 
-    private PublicKey parseEcPublicKey(@NonNull byte[] bytes) throws ServiceSpecificException {
-        try {
-            KeyFactory kf = KeyFactory.getInstance("EC");
-            X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(bytes);
-            return kf.generatePublic(pkSpec);
-        } catch (NoSuchAlgorithmException e) {
-            Log.wtf(TAG, "EC algorithm not available. AOSP must support this.", e);
-            throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
-        } catch (InvalidKeySpecException e) {
-            throw new ServiceSpecificException(
-                    ERROR_BAD_CERTIFICATE_FORMAT, "Not a valid X509 certificate.");
-        }
-    }
-
     /**
      * Gets all data necessary to recover application keys on new device.
      *
@@ -747,8 +736,6 @@
         int uid = Binder.getCallingUid();
         int userId = UserHandle.getCallingUserId();
 
-        // TODO: Refactor RecoverableKeyGenerator to wrap the PlatformKey logic
-
         PlatformEncryptionKey encryptionKey;
         try {
             encryptionKey = mPlatformKeyManager.getEncryptKey(userId);
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
index 53c972f..7c4360e 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDb.java
@@ -291,7 +291,7 @@
     }
 
     /**
-     * Sets the {@code generationId} of the platform key for the account owned by {@code userId}.
+     * Sets the {@code generationId} of the platform key for user {@code userId}.
      *
      * @return The primary key ID of the relation.
      */
@@ -630,7 +630,6 @@
      * @hide
      */
     public long setActiveRootOfTrust(int userId, int uid, @Nullable String rootAlias) {
-        // TODO: Call getDefaultCertificateAliasIfEmpty() here too?
         SQLiteDatabase db = mKeyStoreDbHelper.getWritableDatabase();
         ContentValues values = new ContentValues();
         values.put(RecoveryServiceMetadataEntry.COLUMN_NAME_ACTIVE_ROOT_OF_TRUST, rootAlias);
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 6413ba9..a3c6c80 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -1515,6 +1515,24 @@
             final int uid = Binder.getCallingUid();
             final long token = Binder.clearCallingIdentity();
             try {
+                int controllerUserId = UserHandle.getUserId(controllerUid);
+                int controllerUidFromPackageName;
+                try {
+                    controllerUidFromPackageName = getContext().getPackageManager()
+                            .getPackageUidAsUser(controllerPackageName, controllerUserId);
+                } catch (NameNotFoundException e) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Package " + controllerPackageName + " doesn't exist");
+                    }
+                    return false;
+                }
+                if (controllerUidFromPackageName != controllerUid) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Package name " + controllerPackageName
+                                + " doesn't match with the uid " + controllerUid);
+                    }
+                    return false;
+                }
                 return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName,
                         controllerPid, controllerUid);
             } finally {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index d5522a8..8e77373 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -39,6 +39,7 @@
 import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkPolicy.LIMIT_DISABLED;
 import static android.net.NetworkPolicy.SNOOZE_NEVER;
@@ -70,6 +71,12 @@
 import static android.net.NetworkTemplate.MATCH_WIFI;
 import static android.net.NetworkTemplate.buildTemplateMobileAll;
 import static android.net.TrafficStats.MB_IN_BYTES;
+import static android.provider.Settings.Global.NETPOLICY_OVERRIDE_ENABLED;
+import static android.provider.Settings.Global.NETPOLICY_QUOTA_ENABLED;
+import static android.provider.Settings.Global.NETPOLICY_QUOTA_FRAC_JOBS;
+import static android.provider.Settings.Global.NETPOLICY_QUOTA_FRAC_MULTIPATH;
+import static android.provider.Settings.Global.NETPOLICY_QUOTA_LIMITED;
+import static android.provider.Settings.Global.NETPOLICY_QUOTA_UNLIMITED;
 import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
 import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
 import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
@@ -115,6 +122,7 @@
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -149,7 +157,6 @@
 import android.net.wifi.WifiManager;
 import android.os.BestClock;
 import android.os.Binder;
-import android.os.Build;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -189,6 +196,7 @@
 import android.util.DataUnit;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Range;
 import android.util.RecurrenceRule;
 import android.util.Slog;
 import android.util.SparseArray;
@@ -230,9 +238,11 @@
 import java.lang.annotation.RetentionPolicy;
 import java.nio.charset.StandardCharsets;
 import java.time.Clock;
+import java.time.Instant;
 import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
@@ -350,6 +360,11 @@
      */
     private static final long WAIT_FOR_ADMIN_DATA_TIMEOUT_MS = 10_000;
 
+    private static final long QUOTA_UNLIMITED_DEFAULT = DataUnit.MEBIBYTES.toBytes(20);
+    private static final float QUOTA_LIMITED_DEFAULT = 0.1f;
+    private static final float QUOTA_FRAC_JOBS_DEFAULT = 0.5f;
+    private static final float QUOTA_FRAC_MULTIPATH_DEFAULT = 0.5f;
+
     private static final int MSG_RULES_CHANGED = 1;
     private static final int MSG_METERED_IFACES_CHANGED = 2;
     private static final int MSG_LIMIT_REACHED = 5;
@@ -361,10 +376,13 @@
     private static final int MSG_RESET_FIREWALL_RULES_BY_UID = 15;
     private static final int MSG_SUBSCRIPTION_OVERRIDE = 16;
     private static final int MSG_METERED_RESTRICTED_PACKAGES_CHANGED = 17;
+    private static final int MSG_SET_NETWORK_TEMPLATE_ENABLED = 18;
 
     private static final int UID_MSG_STATE_CHANGED = 100;
     private static final int UID_MSG_GONE = 101;
 
+    private static final String PROP_SUB_PLAN_OWNER = "persist.sys.sub_plan_owner";
+
     private final Context mContext;
     private final IActivityManager mActivityManager;
     private NetworkStatsManagerInternal mNetworkStats;
@@ -487,6 +505,10 @@
     @GuardedBy("mNetworkPoliciesSecondLock")
     private final SparseBooleanArray mNetworkMetered = new SparseBooleanArray();
 
+    /** Map from network ID to last observed roaming state */
+    @GuardedBy("mNetworkPoliciesSecondLock")
+    private final SparseBooleanArray mNetworkRoaming = new SparseBooleanArray();
+
     /** Map from netId to subId as of last update */
     @GuardedBy("mNetworkPoliciesSecondLock")
     private final SparseIntArray mNetIdToSubId = new SparseIntArray();
@@ -1002,6 +1024,16 @@
         }
     };
 
+    private static boolean updateCapabilityChange(SparseBooleanArray lastValues, boolean newValue,
+            Network network) {
+        final boolean lastValue = lastValues.get(network.netId, false);
+        final boolean changed = (lastValue != newValue) || lastValues.indexOfKey(network.netId) < 0;
+        if (changed) {
+            lastValues.put(network.netId, newValue);
+        }
+        return changed;
+    }
+
     private final NetworkCallback mNetworkCallback = new NetworkCallback() {
         @Override
         public void onCapabilitiesChanged(Network network,
@@ -1009,13 +1041,18 @@
             if (network == null || networkCapabilities == null) return;
 
             synchronized (mNetworkPoliciesSecondLock) {
-                final boolean oldMetered = mNetworkMetered.get(network.netId, false);
                 final boolean newMetered = !networkCapabilities
                         .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
+                final boolean meteredChanged = updateCapabilityChange(
+                        mNetworkMetered, newMetered, network);
 
-                if ((oldMetered != newMetered) || mNetworkMetered.indexOfKey(network.netId) < 0) {
+                final boolean newRoaming = !networkCapabilities
+                        .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
+                final boolean roamingChanged = updateCapabilityChange(
+                        mNetworkRoaming, newRoaming, network);
+
+                if (meteredChanged || roamingChanged) {
                     mLogger.meterednessChanged(network.netId, newMetered);
-                    mNetworkMetered.put(network.netId, newMetered);
                     updateNetworkRulesNL();
                 }
             }
@@ -1563,6 +1600,13 @@
      * {@link NetworkTemplate}.
      */
     private void setNetworkTemplateEnabled(NetworkTemplate template, boolean enabled) {
+        // Don't call setNetworkTemplateEnabledInner() directly because we may have a lock
+        // held. Call it via the handler.
+        mHandler.obtainMessage(MSG_SET_NETWORK_TEMPLATE_ENABLED, enabled ? 1 : 0, 0, template)
+                .sendToTarget();
+    }
+
+    private void setNetworkTemplateEnabledInner(NetworkTemplate template, boolean enabled) {
         // TODO: reach into ConnectivityManager to proactively disable bringing
         // up this network, since we know that traffic will be blocked.
 
@@ -1728,10 +1772,18 @@
         }
         mMeteredIfaces = newMeteredIfaces;
 
+        final ContentResolver cr = mContext.getContentResolver();
+        final boolean quotaEnabled = Settings.Global.getInt(cr,
+                NETPOLICY_QUOTA_ENABLED, 1) != 0;
+        final long quotaUnlimited = Settings.Global.getLong(cr,
+                NETPOLICY_QUOTA_UNLIMITED, QUOTA_UNLIMITED_DEFAULT);
+        final float quotaLimited = Settings.Global.getFloat(cr,
+                NETPOLICY_QUOTA_LIMITED, QUOTA_LIMITED_DEFAULT);
+
         // Finally, calculate our opportunistic quotas
-        // TODO: add experiments support to disable or tweak ratios
         mSubscriptionOpportunisticQuota.clear();
         for (NetworkState state : states) {
+            if (!quotaEnabled) continue;
             if (state.network == null) continue;
             final int subId = getSubIdLocked(state.network);
             final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId);
@@ -1739,23 +1791,32 @@
 
             final long quotaBytes;
             final long limitBytes = plan.getDataLimitBytes();
-            if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) {
+            if (!state.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
+                // Clamp to 0 when roaming
+                quotaBytes = 0;
+            } else if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) {
                 quotaBytes = OPPORTUNISTIC_QUOTA_UNKNOWN;
             } else if (limitBytes == SubscriptionPlan.BYTES_UNLIMITED) {
                 // Unlimited data; let's use 20MiB/day (600MiB/month)
-                quotaBytes = DataUnit.MEBIBYTES.toBytes(20);
+                quotaBytes = quotaUnlimited;
             } else {
                 // Limited data; let's only use 10% of remaining budget
-                final Pair<ZonedDateTime, ZonedDateTime> cycle = plan.cycleIterator().next();
-                final long start = cycle.first.toInstant().toEpochMilli();
-                final long end = cycle.second.toInstant().toEpochMilli();
+                final Range<ZonedDateTime> cycle = plan.cycleIterator().next();
+                final long start = cycle.getLower().toInstant().toEpochMilli();
+                final long end = cycle.getUpper().toInstant().toEpochMilli();
+                final Instant now = mClock.instant();
+                final long startOfDay = ZonedDateTime.ofInstant(now, cycle.getLower().getZone())
+                        .truncatedTo(ChronoUnit.DAYS)
+                        .toInstant().toEpochMilli();
                 final long totalBytes = getTotalBytes(
-                        NetworkTemplate.buildTemplateMobileAll(state.subscriberId), start, end);
+                        NetworkTemplate.buildTemplateMobileAll(state.subscriberId),
+                        start, startOfDay);
                 final long remainingBytes = limitBytes - totalBytes;
-                final long remainingDays = Math.max(1, (end - mClock.millis())
-                        / TimeUnit.DAYS.toMillis(1));
+                // Number of remaining days including current day
+                final long remainingDays =
+                        1 + ((end - now.toEpochMilli() - 1) / TimeUnit.DAYS.toMillis(1));
 
-                quotaBytes = Math.max(0, (remainingBytes / remainingDays) / 10);
+                quotaBytes = Math.max(0, (long) ((remainingBytes / remainingDays) * quotaLimited));
             }
 
             mSubscriptionOpportunisticQuota.put(subId, quotaBytes);
@@ -2788,10 +2849,17 @@
             return;
         }
 
-        // Fourth check: is caller a testing app on a debug build?
-        final boolean enableDebug = Build.IS_USERDEBUG || Build.IS_ENG;
-        if (enableDebug && callingPackage
-                .equals(SystemProperties.get("fw.sub_plan_owner." + subId, null))) {
+        // Fourth check: is caller a testing app?
+        final String testPackage = SystemProperties.get(PROP_SUB_PLAN_OWNER + "." + subId, null);
+        if (!TextUtils.isEmpty(testPackage)
+                && Objects.equals(testPackage, callingPackage)) {
+            return;
+        }
+
+        // Fifth check: is caller a legacy testing app?
+        final String legacyTestPackage = SystemProperties.get("fw.sub_plan_owner." + subId, null);
+        if (!TextUtils.isEmpty(legacyTestPackage)
+                && Objects.equals(legacyTestPackage, callingPackage)) {
             return;
         }
 
@@ -2992,6 +3060,14 @@
         }
     }
 
+    /**
+     * Only visible for testing purposes. This doesn't give any access to
+     * existing plans; it simply lets the debug package define new plans.
+     */
+    void setSubscriptionPlansOwner(int subId, String packageName) {
+        SystemProperties.set(PROP_SUB_PLAN_OWNER + "." + subId, packageName);
+    }
+
     @Override
     public String getSubscriptionPlansOwner(int subId) {
         if (UserHandle.getCallingAppId() != android.os.Process.SYSTEM_UID) {
@@ -3016,11 +3092,17 @@
             }
         }
 
-        mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
-                overrideMask, overrideValue, subId));
-        if (timeoutMillis > 0) {
-            mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
-                    overrideMask, 0, subId), timeoutMillis);
+        // Only allow overrides when feature is enabled. However, we always
+        // allow disabling of overrides for safety reasons.
+        final boolean overrideEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+                NETPOLICY_OVERRIDE_ENABLED, 1) != 0;
+        if (overrideEnabled || overrideValue == 0) {
+            mHandler.sendMessage(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
+                    overrideMask, overrideValue, subId));
+            if (timeoutMillis > 0) {
+                mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SUBSCRIPTION_OVERRIDE,
+                        overrideMask, 0, subId), timeoutMillis);
+            }
         }
     }
 
@@ -3210,20 +3292,14 @@
                 this, in, out, err, args, callback, resultReceiver);
     }
 
-    @Override
+    @VisibleForTesting
     public boolean isUidForeground(int uid) {
-        mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
-
         synchronized (mUidRulesFirstLock) {
-            return isUidForegroundUL(uid);
+            return isUidStateForeground(
+                    mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY));
         }
     }
 
-    private boolean isUidForegroundUL(int uid) {
-        return isUidStateForegroundUL(
-                mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY));
-    }
-
     private boolean isUidForegroundOnRestrictBackgroundUL(int uid) {
         final int procState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
         return isProcStateAllowedWhileOnRestrictBackground(procState);
@@ -3234,9 +3310,9 @@
         return isProcStateAllowedWhileIdleOrPowerSaveMode(procState);
     }
 
-    private boolean isUidStateForegroundUL(int state) {
+    private boolean isUidStateForeground(int state) {
         // only really in foreground when screen is also on
-        return state <= ActivityManager.PROCESS_STATE_TOP;
+        return state <= NetworkPolicyManager.FOREGROUND_THRESHOLD_STATE;
     }
 
     /**
@@ -3263,7 +3339,7 @@
                     }
                     updateRulesForPowerRestrictionsUL(uid);
                 }
-                updateNetworkStats(uid, isUidStateForegroundUL(uidState));
+                updateNetworkStats(uid, isUidStateForeground(uidState));
             }
         } finally {
             Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
@@ -4164,6 +4240,12 @@
                     setMeteredRestrictedPackagesInternal(packageNames, userId);
                     return true;
                 }
+                case MSG_SET_NETWORK_TEMPLATE_ENABLED: {
+                    final NetworkTemplate template = (NetworkTemplate) msg.obj;
+                    final boolean enabled = msg.arg1 != 0;
+                    setNetworkTemplateEnabledInner(template, enabled);
+                    return true;
+                }
                 default: {
                     return false;
                 }
@@ -4663,11 +4745,24 @@
 
         @Override
         public long getSubscriptionOpportunisticQuota(Network network, int quotaType) {
+            final long quotaBytes;
             synchronized (mNetworkPoliciesSecondLock) {
-                // TODO: handle splitting quota between use-cases
-                return mSubscriptionOpportunisticQuota.get(getSubIdLocked(network),
+                quotaBytes = mSubscriptionOpportunisticQuota.get(getSubIdLocked(network),
                         OPPORTUNISTIC_QUOTA_UNKNOWN);
             }
+            if (quotaBytes == OPPORTUNISTIC_QUOTA_UNKNOWN) {
+                return OPPORTUNISTIC_QUOTA_UNKNOWN;
+            }
+
+            if (quotaType == QUOTA_TYPE_JOBS) {
+                return (long) (quotaBytes * Settings.Global.getFloat(mContext.getContentResolver(),
+                        NETPOLICY_QUOTA_FRAC_JOBS, QUOTA_FRAC_JOBS_DEFAULT));
+            } else if (quotaType == QUOTA_TYPE_MULTIPATH) {
+                return (long) (quotaBytes * Settings.Global.getFloat(mContext.getContentResolver(),
+                        NETPOLICY_QUOTA_FRAC_MULTIPATH, QUOTA_FRAC_MULTIPATH_DEFAULT));
+            } else {
+                return OPPORTUNISTIC_QUOTA_UNKNOWN;
+            }
         }
 
         @Override
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
index b65b9d7..56d41c5 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
@@ -21,7 +21,6 @@
 import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
 
 import android.content.Context;
-import android.net.INetworkPolicyManager;
 import android.net.NetworkPolicyManager;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
@@ -33,10 +32,10 @@
 
 class NetworkPolicyManagerShellCommand extends ShellCommand {
 
-    private final INetworkPolicyManager mInterface;
+    private final NetworkPolicyManagerService mInterface;
     private final WifiManager mWifiManager;
 
-    NetworkPolicyManagerShellCommand(Context context, INetworkPolicyManager service) {
+    NetworkPolicyManagerShellCommand(Context context, NetworkPolicyManagerService service) {
         mInterface = service;
         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
     }
@@ -97,6 +96,8 @@
         pw.println("    Toggles whether the given wi-fi network is metered.");
         pw.println("  set restrict-background BOOLEAN");
         pw.println("    Sets the global restrict background usage status.");
+        pw.println("  set sub-plan-owner subId [packageName]");
+        pw.println("    Sets the data plan owner package for subId.");
     }
 
     private int runGet() throws RemoteException {
@@ -126,6 +127,8 @@
                 return setMeteredWifiNetwork();
             case "restrict-background":
                 return setRestrictBackground();
+            case "sub-plan-owner":
+                return setSubPlanOwner();
         }
         pw.println("Error: unknown set type '" + type + "'");
         return -1;
@@ -227,6 +230,13 @@
         return 0;
     }
 
+    private int setSubPlanOwner() throws RemoteException {
+        final int subId = Integer.parseInt(getNextArgRequired());
+        final String packageName = getNextArg();
+        mInterface.setSubscriptionPlansOwner(subId, packageName);
+        return 0;
+    }
+
     private int setUidPolicy(int policy) throws RemoteException {
         final int uid = getUidFromNextArg();
         if (uid < 0) {
diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java
index 2ef754e..ab52523 100644
--- a/services/core/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java
@@ -47,7 +47,7 @@
 import android.util.AtomicFile;
 import android.util.IntArray;
 import android.util.MathUtils;
-import android.util.Pair;
+import android.util.Range;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
@@ -266,11 +266,11 @@
         long collectEnd = end;
 
         if (augmentEnd != SubscriptionPlan.TIME_UNKNOWN) {
-            final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = augmentPlan.cycleIterator();
+            final Iterator<Range<ZonedDateTime>> it = augmentPlan.cycleIterator();
             while (it.hasNext()) {
-                final Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
-                final long cycleStart = cycle.first.toInstant().toEpochMilli();
-                final long cycleEnd = cycle.second.toInstant().toEpochMilli();
+                final Range<ZonedDateTime> cycle = it.next();
+                final long cycleStart = cycle.getLower().toInstant().toEpochMilli();
+                final long cycleEnd = cycle.getUpper().toInstant().toEpochMilli();
                 if (cycleStart <= augmentEnd && augmentEnd < cycleEnd) {
                     augmentStart = cycleStart;
                     collectStart = Long.min(collectStart, augmentStart);
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 57828ca..4e848f8 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -148,7 +148,6 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Collect and persist detailed network statistics, and provide this data to
@@ -769,7 +768,7 @@
     public NetworkStats getDetailedUidStats(String[] requiredIfaces) {
         try {
             final String[] ifacesToQuery =
-                    NetworkStatsFactory.augmentWithStackedInterfacesLocked(requiredIfaces);
+                    NetworkStatsFactory.augmentWithStackedInterfaces(requiredIfaces);
             return getNetworkStatsUidDetail(ifacesToQuery);
         } catch (RemoteException e) {
             Log.wtf(TAG, "Error compiling UID stats", e);
@@ -1527,12 +1526,14 @@
     private NetworkStats getNetworkStatsUidDetail(String[] ifaces)
             throws RemoteException {
 
+        // TODO: remove 464xlat adjustments from NetworkStatsFactory and apply all at once here.
         final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL,
                 ifaces);
 
         // fold tethering stats and operations into uid snapshot
         final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID);
         tetherSnapshot.filter(UID_ALL, ifaces, TAG_ALL);
+        NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, tetherSnapshot);
         uidSnapshot.combineAllValues(tetherSnapshot);
 
         final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
@@ -1542,13 +1543,12 @@
         final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID);
         if (vtStats != null) {
             vtStats.filter(UID_ALL, ifaces, TAG_ALL);
+            NetworkStatsFactory.apply464xlatAdjustments(uidSnapshot, vtStats);
             uidSnapshot.combineAllValues(vtStats);
         }
 
         uidSnapshot.combineAllValues(mUidOperations);
 
-        // TODO: apply tethering & VC 464xlat adjustments here
-
         return uidSnapshot;
     }
 
diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
index 17c5868..766d8ca 100644
--- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
+++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java
@@ -91,7 +91,7 @@
         final long ident = Binder.clearCallingIdentity();
         try {
             // Reset last report time
-            if (!WatchlistConfig.getInstance().isConfigSecure()) {
+            if (WatchlistConfig.getInstance().isConfigSecure()) {
                 pw.println("Error: Cannot force generate report under production config");
                 return -1;
             }
diff --git a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
index 2a8f4d5..a482e05 100644
--- a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
+++ b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java
@@ -49,6 +49,7 @@
      * Apply DP on watchlist results, and generate a serialized watchlist report ready to store
      * in DropBox.
      */
+    @Nullable
     static byte[] encodeWatchlistReport(WatchlistConfig config, byte[] userSecret,
             List<String> appDigestList, WatchlistReportDbHelper.AggregatedResult aggregatedResult) {
         Map<String, Boolean> resultMap = PrivacyUtils.createDpEncodedReportMap(
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
index d793842..8352ca6 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistConfig.java
@@ -16,6 +16,7 @@
 
 package com.android.server.net.watchlist;
 
+import android.annotation.Nullable;
 import android.os.FileUtils;
 import android.util.AtomicFile;
 import android.util.Log;
@@ -55,9 +56,6 @@
     private static final String NETWORK_WATCHLIST_DB_FOR_TEST_PATH =
             "/data/misc/network_watchlist/network_watchlist_for_test.xml";
 
-    // Hash for null / unknown config, a 32 byte array filled with content 0x00
-    private static final byte[] UNKNOWN_CONFIG_HASH = new byte[32];
-
     private static class XmlTags {
         private static final String WATCHLIST_CONFIG = "watchlist-config";
         private static final String SHA256_DOMAIN = "sha256-domain";
@@ -228,16 +226,21 @@
         return mIsSecureConfig;
     }
 
+    @Nullable
+    /**
+     * Get watchlist config SHA-256 digest.
+     * Return null if watchlist config does not exist.
+     */
     public byte[] getWatchlistConfigHash() {
         if (!mXmlFile.exists()) {
-            return UNKNOWN_CONFIG_HASH;
+            return null;
         }
         try {
             return DigestUtils.getSha256Hash(mXmlFile);
         } catch (IOException | NoSuchAlgorithmException e) {
             Log.e(TAG, "Unable to get watchlist config hash", e);
         }
-        return UNKNOWN_CONFIG_HASH;
+        return null;
     }
 
     /**
@@ -271,8 +274,10 @@
     }
 
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        pw.println("Watchlist config hash: " + HexDump.toHexString(getWatchlistConfigHash()));
+        final byte[] hash = getWatchlistConfigHash();
+        pw.println("Watchlist config hash: " + (hash != null ? HexDump.toHexString(hash) : null));
         pw.println("Domain CRC32 digest list:");
+        // mDomainDigests won't go from non-null to null so it's safe
         if (mDomainDigests != null) {
             mDomainDigests.crc32Digests.dump(fd, pw, args);
         }
@@ -281,6 +286,7 @@
             mDomainDigests.sha256Digests.dump(fd, pw, args);
         }
         pw.println("Ip CRC32 digest list:");
+        // mIpDigests won't go from non-null to null so it's safe
         if (mIpDigests != null) {
             mIpDigests.crc32Digests.dump(fd, pw, args);
         }
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
index b331b9c..864ce5d 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistLoggingHandler.java
@@ -346,6 +346,7 @@
      * @param ipAddresses Ip address that you want to search in watchlist.
      * @return Ip address that exists in watchlist, null if it does not match anything.
      */
+    @Nullable
     private String searchIpInWatchlist(String[] ipAddresses) {
         for (String ipAddress : ipAddresses) {
             if (isIpInWatchlist(ipAddress)) {
@@ -377,6 +378,7 @@
      * @param host Host that we want to search.
      * @return Domain that exists in watchlist, null if it does not match anything.
      */
+    @Nullable
     private String searchAllSubDomainsInWatchlist(String host) {
         if (host == null) {
             return null;
@@ -392,6 +394,7 @@
 
     /** Get all sub-domains in a host */
     @VisibleForTesting
+    @Nullable
     static String[] getAllSubDomains(String host) {
         if (host == null) {
             return null;
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java b/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
index 632ab81..c69934a 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistReportDbHelper.java
@@ -144,6 +144,7 @@
      * Aggregate all records in database before input timestamp, and return a
      * rappor encoded result.
      */
+    @Nullable
     public AggregatedResult getAggregatedRecords(long untilTimestamp) {
         final String selectStatement = WhiteListReportContract.TIMESTAMP + " < ?";
 
diff --git a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
index e20a510..c2f3ba0 100644
--- a/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
+++ b/services/core/java/com/android/server/net/watchlist/WatchlistSettings.java
@@ -86,7 +86,7 @@
         }
     }
 
-    public void reloadSettings() {
+    private void reloadSettings() {
         if (!mXmlFile.exists()) {
             // No settings config
             return;
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index d5a32aa..c98f6a2 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -110,7 +110,7 @@
     protected final Object mMutex;
     private final UserProfiles mUserProfiles;
     private final IPackageManager mPm;
-    private final UserManager mUm;
+    protected final UserManager mUm;
     private final Config mConfig;
     private final Handler mHandler = new Handler(Looper.getMainLooper());
 
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f31ca0a..7e04d33 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -114,6 +114,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ParceledListSlice;
+import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.database.ContentObserver;
 import android.media.AudioAttributes;
@@ -492,8 +493,8 @@
                                     | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId);
             for (ComponentName cn : approvedAssistants) {
                 try {
-                    getBinderService().setNotificationAssistantAccessGrantedForUser(cn,
-                            userId, true);
+                    getBinderService().setNotificationAssistantAccessGrantedForUser(
+                            cn, userId, true);
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 }
@@ -535,6 +536,8 @@
             mConditionProviders.migrateToXml();
             savePolicyFile();
         }
+
+        mAssistants.ensureAssistant();
     }
 
     private void loadPolicyFile() {
@@ -2063,7 +2066,7 @@
 
         @Override
         public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
-            checkCallerIsSystem();
+            enforceSystemOrSystemUI("setNotificationsEnabledForPackage");
 
             mRankingHelper.setEnabled(pkg, uid, enabled);
             // Now, cancel any outstanding notifications that are part of a just-disabled app
@@ -2286,6 +2289,12 @@
         }
 
         @Override
+        public int getBlockedChannelCount(String pkg, int uid) {
+            enforceSystemOrSystemUI("getBlockedChannelCount");
+            return mRankingHelper.getBlockedChannelCount(pkg, uid);
+        }
+
+        @Override
         public ParceledListSlice<NotificationChannelGroup> getNotificationChannelGroupsForPackage(
                 String pkg, int uid, boolean includeDeleted) {
             checkCallerIsSystem();
@@ -6134,11 +6143,14 @@
             return !getServices().isEmpty();
         }
 
-        protected void upgradeXml(final int xmlVersion, final int userId) {
-            if (xmlVersion == 0) {
-                // one time approval of the OOB assistant
-                Slog.d(TAG, "Approving default notification assistant for user " + userId);
-                readDefaultAssistant(userId);
+        protected void ensureAssistant() {
+            final List<UserInfo> activeUsers = mUm.getUsers(true);
+            for (UserInfo userInfo : activeUsers) {
+                int userId = userInfo.getUserHandle().getIdentifier();
+                if (getAllowedPackages(userId).isEmpty()) {
+                    Slog.d(TAG, "Approving default notification assistant for user " + userId);
+                    readDefaultAssistant(userId);
+                }
             }
         }
     }
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 98d5c9a..43d393a 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -15,6 +15,8 @@
  */
 package com.android.server.notification;
 
+import static android.app.NotificationManager.IMPORTANCE_NONE;
+
 import com.android.internal.R;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
@@ -619,7 +621,7 @@
             updateConfig();
             return;
         }
-        if (channel.getImportance() < NotificationManager.IMPORTANCE_NONE
+        if (channel.getImportance() < IMPORTANCE_NONE
                 || channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
             throw new IllegalArgumentException("Invalid importance level");
         }
@@ -959,6 +961,23 @@
         return deletedCount;
     }
 
+    public int getBlockedChannelCount(String pkg, int uid) {
+        Preconditions.checkNotNull(pkg);
+        int blockedCount = 0;
+        Record r = getRecord(pkg, uid);
+        if (r == null) {
+            return blockedCount;
+        }
+        int N = r.channels.size();
+        for (int i = 0; i < N; i++) {
+            final NotificationChannel nc = r.channels.valueAt(i);
+            if (!nc.isDeleted() && IMPORTANCE_NONE == nc.getImportance()) {
+                blockedCount++;
+            }
+        }
+        return blockedCount;
+    }
+
     /**
      * Sets importance.
      */
@@ -969,12 +988,12 @@
     }
 
     public void setEnabled(String packageName, int uid, boolean enabled) {
-        boolean wasEnabled = getImportance(packageName, uid) != NotificationManager.IMPORTANCE_NONE;
+        boolean wasEnabled = getImportance(packageName, uid) != IMPORTANCE_NONE;
         if (wasEnabled == enabled) {
             return;
         }
         setImportance(packageName, uid,
-                enabled ? DEFAULT_IMPORTANCE : NotificationManager.IMPORTANCE_NONE);
+                enabled ? DEFAULT_IMPORTANCE : IMPORTANCE_NONE);
     }
 
     @VisibleForTesting
@@ -1199,7 +1218,7 @@
             ArrayMap<Integer, String> packageBans = new ArrayMap<>(N);
             for (int i = 0; i < N; i++) {
                 final Record r = mRecords.valueAt(i);
-                if (r.importance == NotificationManager.IMPORTANCE_NONE) {
+                if (r.importance == IMPORTANCE_NONE) {
                     packageBans.put(r.uid, r.pkg);
                 }
             }
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index 6cf8f86..639cc70 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -18,6 +18,7 @@
 
 import android.annotation.Nullable;
 import android.app.Notification;
+import android.app.Person;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.database.ContentObserver;
@@ -332,8 +333,8 @@
                 return array;
             }
 
-            if (arrayList.get(0) instanceof Notification.Person) {
-                ArrayList<Notification.Person> list = (ArrayList<Notification.Person>) arrayList;
+            if (arrayList.get(0) instanceof Person) {
+                ArrayList<Person> list = (ArrayList<Person>) arrayList;
                 final int N = list.size();
                 String[] array = new String[N];
                 for (int i = 0; i < N; i++) {
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 586abc1..156f702 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -32,6 +32,7 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.database.ContentObserver;
+import android.graphics.drawable.Icon;
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.media.AudioManagerInternal;
@@ -1198,8 +1199,6 @@
 
     @VisibleForTesting
     protected Notification createZenUpgradeNotification() {
-        Intent intent = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         final Bundle extras = new Bundle();
         extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME,
                 mContext.getResources().getString(R.string.global_action_settings));
@@ -1210,15 +1209,20 @@
             title = R.string.zen_upgrade_notification_visd_title;
             content = R.string.zen_upgrade_notification_visd_content;
         }
+        Intent onboardingIntent = new Intent(Settings.ZEN_MODE_ONBOARDING);
+        onboardingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         return new Notification.Builder(mContext, SystemNotificationChannels.DO_NOT_DISTURB)
+                .setAutoCancel(true)
                 .setSmallIcon(R.drawable.ic_settings_24dp)
+                .setLargeIcon(Icon.createWithResource(mContext, R.drawable.ic_zen_24dp))
                 .setContentTitle(mContext.getResources().getString(title))
                 .setContentText(mContext.getResources().getString(content))
+                .setContentIntent(PendingIntent.getActivity(mContext, 0, onboardingIntent,
+                        PendingIntent.FLAG_UPDATE_CURRENT))
                 .setAutoCancel(true)
                 .setLocalOnly(true)
                 .addExtras(extras)
                 .setStyle(new Notification.BigTextStyle())
-                .setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0, null))
                 .build();
     }
 
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index 863045c..e176351 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -179,15 +179,19 @@
 
     List<OverlayInfo> getOverlaysForTarget(@NonNull final String targetPackageName,
             final int userId) {
+        // Static RROs targeting "android" are loaded from AssetManager, and so they should be
+        // ignored in OverlayManagerService.
         return selectWhereTarget(targetPackageName, userId)
-                .filter((i) -> !i.isStatic())
+                .filter((i) -> !(i.isStatic() && "android".equals(i.getTargetPackageName())))
                 .map(SettingsItem::getOverlayInfo)
                 .collect(Collectors.toList());
     }
 
     ArrayMap<String, List<OverlayInfo>> getOverlaysForUser(final int userId) {
+        // Static RROs targeting "android" are loaded from AssetManager, and so they should be
+        // ignored in OverlayManagerService.
         return selectWhereUser(userId)
-                .filter((i) -> !i.isStatic())
+                .filter((i) -> !(i.isStatic() && "android".equals(i.getTargetPackageName())))
                 .map(SettingsItem::getOverlayInfo)
                 .collect(Collectors.groupingBy(info -> info.targetPackageName, ArrayMap::new,
                         Collectors.toList()));
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index 9d3f48b..45f1a2b 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -67,6 +67,8 @@
     public static final int DEXOPT_ENABLE_HIDDEN_API_CHECKS = 1 << 10;
     /** Indicates that dexopt should convert to CompactDex. */
     public static final int DEXOPT_GENERATE_COMPACT_DEX = 1 << 11;
+    /** Indicates that dexopt should generate an app image */
+    public static final int DEXOPT_GENERATE_APP_IMAGE = 1 << 12;
 
     // NOTE: keep in sync with installd
     public static final int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java
index bc9fa4b..dbf0940 100644
--- a/services/core/java/com/android/server/pm/InstantAppResolver.java
+++ b/services/core/java/com/android/server/pm/InstantAppResolver.java
@@ -256,8 +256,6 @@
         int flags = origIntent.getFlags();
         final Intent intent = new Intent();
         intent.setFlags(flags
-                | Intent.FLAG_ACTIVITY_NEW_TASK
-                | Intent.FLAG_ACTIVITY_CLEAR_TASK
                 | Intent.FLAG_ACTIVITY_NO_HISTORY
                 | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         if (token != null) {
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index 8e78703f..595de9e 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -39,6 +39,7 @@
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutServiceInternal;
 import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
+import android.content.pm.UserInfo;
 import android.graphics.Rect;
 import android.net.Uri;
 import android.os.Binder;
@@ -49,6 +50,7 @@
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.os.UserManagerInternal;
 import android.provider.Settings;
 import android.util.Log;
@@ -101,6 +103,7 @@
         private static final boolean DEBUG = false;
         private static final String TAG = "LauncherAppsService";
         private final Context mContext;
+        private final UserManager mUm;
         private final UserManagerInternal mUserManagerInternal;
         private final ActivityManagerInternal mActivityManagerInternal;
         private final ShortcutServiceInternal mShortcutServiceInternal;
@@ -113,6 +116,7 @@
 
         public LauncherAppsImpl(Context context) {
             mContext = context;
+            mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
             mUserManagerInternal = Preconditions.checkNotNull(
                     LocalServices.getService(UserManagerInternal.class));
             mActivityManagerInternal = Preconditions.checkNotNull(
@@ -233,6 +237,22 @@
          * group.
          */
         private boolean canAccessProfile(int targetUserId, String message) {
+            final int callingUserId = injectCallingUserId();
+
+            if (targetUserId == callingUserId) return true;
+
+            long ident = injectClearCallingIdentity();
+            try {
+                final UserInfo callingUserInfo = mUm.getUserInfo(callingUserId);
+                if (callingUserInfo != null && callingUserInfo.isManagedProfile()) {
+                    Slog.w(TAG, message + " for another profile "
+                            + targetUserId + " from " + callingUserId + " not allowed");
+                    return false;
+                }
+            } finally {
+                injectRestoreCallingIdentity(ident);
+            }
+
             return mUserManagerInternal.isProfileAccessible(injectCallingUserId(), targetUserId,
                     message, true);
         }
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index 5a7893a..320affb 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -267,7 +267,7 @@
                 final StringBuilder builder = new StringBuilder();
 
                 // The current version.
-                builder.append("8 ");
+                builder.append("9 ");
 
                 builder.append("dexopt");
 
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
index 892fa12..ebab1a7 100644
--- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java
+++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java
@@ -60,6 +60,7 @@
 import static com.android.server.pm.Installer.DEXOPT_IDLE_BACKGROUND_JOB;
 import static com.android.server.pm.Installer.DEXOPT_ENABLE_HIDDEN_API_CHECKS;
 import static com.android.server.pm.Installer.DEXOPT_GENERATE_COMPACT_DEX;
+import static com.android.server.pm.Installer.DEXOPT_GENERATE_APP_IMAGE;
 import static com.android.server.pm.InstructionSets.getAppDexInstructionSets;
 import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets;
 
@@ -521,6 +522,10 @@
         return getDexFlags(pkg.applicationInfo, compilerFilter, options);
     }
 
+    private boolean isAppImageEnabled() {
+        return SystemProperties.get("dalvik.vm.appimageformat", "").length() > 0;
+    }
+
     private int getDexFlags(ApplicationInfo info, String compilerFilter, DexoptOptions options) {
         int flags = info.flags;
         boolean debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
@@ -547,6 +552,14 @@
             case PackageManagerService.REASON_INSTALL:
                  generateCompactDex = false;
         }
+        // Use app images only if it is enabled and we are compiling
+        // profile-guided (so the app image doesn't conservatively contain all classes).
+        // If the app didn't request for the splits to be loaded in isolation or if it does not
+        // declare inter-split dependencies, then all the splits will be loaded in the base
+        // apk class loader (in the order of their definition, otherwise disable app images
+        // because they are unsupported for multiple class loaders. b/7269679
+        boolean generateAppImage = isProfileGuidedFilter && (info.splitDependencies == null ||
+                !info.requestsIsolatedSplitLoading()) && isAppImageEnabled();
         int dexFlags =
                 (isPublic ? DEXOPT_PUBLIC : 0)
                 | (debuggable ? DEXOPT_DEBUGGABLE : 0)
@@ -554,6 +567,7 @@
                 | (options.isBootComplete() ? DEXOPT_BOOTCOMPLETE : 0)
                 | (options.isDexoptIdleBackgroundJob() ? DEXOPT_IDLE_BACKGROUND_JOB : 0)
                 | (generateCompactDex ? DEXOPT_GENERATE_COMPACT_DEX : 0)
+                | (generateAppImage ? DEXOPT_GENERATE_APP_IMAGE : 0)
                 | hiddenApiFlag;
         return adjustDexoptFlags(dexFlags);
     }
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index ee32618..f7a0215 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -122,8 +122,9 @@
     private static final boolean LOGD = true;
     private static final String REMOVE_SPLIT_MARKER_EXTENSION = ".removed";
 
-    private static final int MSG_COMMIT = 0;
-    private static final int MSG_ON_PACKAGE_INSTALLED = 1;
+    private static final int MSG_EARLY_BIND = 0;
+    private static final int MSG_COMMIT = 1;
+    private static final int MSG_ON_PACKAGE_INSTALLED = 2;
 
     /** XML constants used for persisting a session */
     static final String TAG_SESSION = "session";
@@ -280,6 +281,9 @@
         @Override
         public boolean handleMessage(Message msg) {
             switch (msg.what) {
+                case MSG_EARLY_BIND:
+                    earlyBindToDefContainer();
+                    break;
                 case MSG_COMMIT:
                     synchronized (mLock) {
                         try {
@@ -315,6 +319,10 @@
         }
     };
 
+    private void earlyBindToDefContainer() {
+        mPm.earlyBindToDefContainer();
+    }
+
     /**
      * @return {@code true} iff the installing is app an device owner or affiliated profile owner.
      */
@@ -410,6 +418,10 @@
         } finally {
             Binder.restoreCallingIdentity(identity);
         }
+        // attempt to bind to the DefContainer as early as possible
+        if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0) {
+            mHandler.sendMessage(mHandler.obtainMessage(MSG_EARLY_BIND));
+        }
     }
 
     public SessionInfo generateInfo() {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 52bdea6..f2d812e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -17,12 +17,12 @@
 package com.android.server.pm;
 
 import static android.Manifest.permission.DELETE_PACKAGES;
-import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
-import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
 import static android.Manifest.permission.INSTALL_PACKAGES;
+import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
 import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
 import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
+import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
 import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
 import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
 import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
@@ -167,8 +167,8 @@
 import android.content.pm.PackageInstaller;
 import android.content.pm.PackageList;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
 import android.content.pm.PackageManager.LegacyPackageDeleteObserver;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.PackageManagerInternal.PackageListObserver;
 import android.content.pm.PackageParser;
 import android.content.pm.PackageParser.ActivityIntentInfo;
@@ -186,6 +186,7 @@
 import android.content.pm.PermissionInfo;
 import android.content.pm.ProviderInfo;
 import android.content.pm.ResolveInfo;
+import android.content.pm.SELinuxUtil;
 import android.content.pm.ServiceInfo;
 import android.content.pm.SharedLibraryInfo;
 import android.content.pm.Signature;
@@ -273,6 +274,7 @@
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.app.IMediaContainerService;
 import com.android.internal.app.ResolverActivity;
+import com.android.internal.app.SuspendedAppActivity;
 import com.android.internal.content.NativeLibraryHelper;
 import com.android.internal.content.PackageHelper;
 import com.android.internal.logging.MetricsLogger;
@@ -309,10 +311,10 @@
 import com.android.server.pm.dex.PackageDexUsage;
 import com.android.server.pm.permission.BasePermission;
 import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
-import com.android.server.pm.permission.PermissionManagerService;
-import com.android.server.pm.permission.PermissionManagerInternal;
 import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
+import com.android.server.pm.permission.PermissionManagerInternal;
 import com.android.server.pm.permission.PermissionManagerInternal.PermissionCallback;
+import com.android.server.pm.permission.PermissionManagerService;
 import com.android.server.pm.permission.PermissionsState;
 import com.android.server.pm.permission.PermissionsState.PermissionState;
 import com.android.server.security.VerityUtils;
@@ -1325,6 +1327,7 @@
     static final int INTENT_FILTER_VERIFIED = 18;
     static final int WRITE_PACKAGE_LIST = 19;
     static final int INSTANT_APP_RESOLUTION_PHASE_TWO = 20;
+    static final int DEF_CONTAINER_BIND = 21;
 
     static final int WRITE_SETTINGS_DELAY = 10*1000;  // 10 seconds
 
@@ -1416,8 +1419,7 @@
             new ArrayList<HandlerParams>();
 
         private boolean connectToService() {
-            if (DEBUG_SD_INSTALL) Log.i(TAG, "Trying to bind to" +
-                    " DefaultContainerService");
+            if (DEBUG_INSTALL) Log.i(TAG, "Trying to bind to DefaultContainerService");
             Intent service = new Intent().setComponent(DEFAULT_CONTAINER_COMPONENT);
             Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
             if (mContext.bindServiceAsUser(service, mDefContainerConn,
@@ -1452,6 +1454,17 @@
 
         void doHandleMessage(Message msg) {
             switch (msg.what) {
+                case DEF_CONTAINER_BIND:
+                    if (!mBound) {
+                        Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "earlyBindingMCS",
+                                System.identityHashCode(mHandler));
+                        if (!connectToService()) {
+                            Slog.e(TAG, "Failed to bind to media container service");
+                        }
+                        Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "earlyBindingMCS",
+                                System.identityHashCode(mHandler));
+                    }
+                    break;
                 case INIT_COPY: {
                     HandlerParams params = (HandlerParams) msg.obj;
                     int idx = mPendingInstalls.size();
@@ -1510,7 +1523,6 @@
                                     Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER,
                                             params.traceMethod, params.traceCookie);
                                 }
-                                return;
                             }
                             mPendingInstalls.clear();
                         } else {
@@ -3934,7 +3946,7 @@
             ai.uid = UserHandle.getUid(userId, ps.appId);
             ai.primaryCpuAbi = ps.primaryCpuAbiString;
             ai.secondaryCpuAbi = ps.secondaryCpuAbiString;
-            ai.versionCode = ps.versionCode;
+            ai.setVersionCode(ps.versionCode);
             ai.flags = ps.pkgFlags;
             ai.privateFlags = ps.pkgPrivateFlags;
             pi.applicationInfo = PackageParser.generateApplicationInfo(ai, flags, state, userId);
@@ -5292,7 +5304,7 @@
         synchronized (mPackages) {
             final String[] packageNames = getPackagesForUid(uid);
             final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0)
-                    ? mPackages.get(packageNames[0])
+                    ? mSettings.getPackageLPr(packageNames[0]).getPackage()
                     : null;
             return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid());
         }
@@ -5931,8 +5943,8 @@
     @Override
     public ResolveInfo resolveIntent(Intent intent, String resolvedType,
             int flags, int userId) {
-        return resolveIntentInternal(
-                intent, resolvedType, flags, userId, false /*resolveForStart*/);
+        return resolveIntentInternal(intent, resolvedType, flags, userId, false,
+                Binder.getCallingUid());
     }
 
     /**
@@ -5941,19 +5953,19 @@
      * since we need to allow the system to start any installed application.
      */
     private ResolveInfo resolveIntentInternal(Intent intent, String resolvedType,
-            int flags, int userId, boolean resolveForStart) {
+            int flags, int userId, boolean resolveForStart, int filterCallingUid) {
         try {
             Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveIntent");
 
             if (!sUserManager.exists(userId)) return null;
             final int callingUid = Binder.getCallingUid();
-            flags = updateFlagsForResolve(flags, userId, intent, callingUid, resolveForStart);
+            flags = updateFlagsForResolve(flags, userId, intent, filterCallingUid, resolveForStart);
             mPermissionManager.enforceCrossUserPermission(callingUid, userId,
                     false /*requireFullPermission*/, false /*checkShell*/, "resolve intent");
 
             Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
             final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType,
-                    flags, callingUid, userId, resolveForStart, true /*allowDynamicSplits*/);
+                    flags, filterCallingUid, userId, resolveForStart, true /*allowDynamicSplits*/);
             Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
 
             final ResolveInfo bestChoice =
@@ -6761,7 +6773,7 @@
                 // the instant application, we'll do the right thing.
                 final ApplicationInfo ai = localInstantApp.activityInfo.applicationInfo;
                 auxiliaryResponse = new AuxiliaryResolveInfo(null /* failureActivity */,
-                                        ai.packageName, ai.versionCode, null /* splitName */);
+                                        ai.packageName, ai.longVersionCode, null /* splitName */);
             }
         }
         if (intent.isWebIntent() && auxiliaryResponse == null) {
@@ -6945,7 +6957,7 @@
                 installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
                         installFailureActivity,
                         info.activityInfo.packageName,
-                        info.activityInfo.applicationInfo.versionCode,
+                        info.activityInfo.applicationInfo.longVersionCode,
                         info.activityInfo.splitName);
                 // add a non-generic filter
                 installerInfo.filter = new IntentFilter();
@@ -7691,7 +7703,7 @@
                     installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
                             null /* installFailureActivity */,
                             info.serviceInfo.packageName,
-                            info.serviceInfo.applicationInfo.versionCode,
+                            info.serviceInfo.applicationInfo.longVersionCode,
                             info.serviceInfo.splitName);
                     // add a non-generic filter
                     installerInfo.filter = new IntentFilter();
@@ -7809,7 +7821,7 @@
                     installerInfo.auxiliaryInfo = new AuxiliaryResolveInfo(
                             null /*failureActivity*/,
                             info.providerInfo.packageName,
-                            info.providerInfo.applicationInfo.versionCode,
+                            info.providerInfo.applicationInfo.longVersionCode,
                             info.providerInfo.splitName);
                     // add a non-generic filter
                     installerInfo.filter = new IntentFilter();
@@ -8058,7 +8070,6 @@
                 callingUid = mIsolatedOwners.get(callingUid);
             }
             final PackageSetting ps = mSettings.mPackages.get(packageName);
-            PackageParser.Package pkg = mPackages.get(packageName);
             final boolean returnAllowed =
                     ps != null
                     && (isCallerSameApp(packageName, callingUid)
@@ -8129,7 +8140,7 @@
     }
 
     private boolean isCallerSameApp(String packageName, int uid) {
-        PackageParser.Package pkg = mPackages.get(packageName);
+        PackageParser.Package pkg = mSettings.getPackageLPr(packageName).getPackage();
         return pkg != null
                 && UserHandle.getAppId(uid) == pkg.applicationInfo.uid;
     }
@@ -8184,35 +8195,22 @@
     private ProviderInfo resolveContentProviderInternal(String name, int flags, int userId) {
         if (!sUserManager.exists(userId)) return null;
         flags = updateFlagsForComponent(flags, userId, name);
-        final String instantAppPkgName = getInstantAppPackageName(Binder.getCallingUid());
-        // reader
+        final int callingUid = Binder.getCallingUid();
         synchronized (mPackages) {
             final PackageParser.Provider provider = mProvidersByAuthority.get(name);
             PackageSetting ps = provider != null
                     ? mSettings.mPackages.get(provider.owner.packageName)
                     : null;
             if (ps != null) {
-                final boolean isInstantApp = ps.getInstantApp(userId);
-                // normal application; filter out instant application provider
-                if (instantAppPkgName == null && isInstantApp) {
-                    return null;
-                }
-                // instant application; filter out other instant applications
-                if (instantAppPkgName != null
-                        && isInstantApp
-                        && !provider.owner.packageName.equals(instantAppPkgName)) {
-                    return null;
-                }
-                // instant application; filter out non-exposed provider
-                if (instantAppPkgName != null
-                        && !isInstantApp
-                        && (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0) {
-                    return null;
-                }
                 // provider not enabled
                 if (!mSettings.isEnabledAndMatchLPr(provider.info, flags, userId)) {
                     return null;
                 }
+                final ComponentName component =
+                        new ComponentName(provider.info.packageName, provider.info.name);
+                if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
+                    return null;
+                }
                 return PackageParser.generateProviderInfo(
                         provider, flags, ps.readUserState(userId), userId);
             }
@@ -8701,7 +8699,7 @@
                             disabledPkgSetting /* pkgSetting */, null /* disabledPkgSetting */,
                             null /* originalPkgSetting */, null, parseFlags, scanFlags,
                             (pkg == mPlatformPackage), user);
-                    applyPolicy(pkg, parseFlags, scanFlags);
+                    applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage);
                     scanPackageOnlyLI(request, mFactoryTest, -1L);
                 }
             }
@@ -8765,7 +8763,10 @@
                 && !pkgSetting.isSystem()) {
 
             if (!pkg.mSigningDetails.checkCapability(pkgSetting.signatures.mSigningDetails,
-                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+                            && !pkgSetting.signatures.mSigningDetails.checkCapability(
+                                    pkg.mSigningDetails,
+                                    PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
                 logCriticalInfo(Log.WARN,
                         "System package signature mismatch;"
                         + " name: " + pkgSetting.name);
@@ -10017,7 +10018,7 @@
 
         scanFlags = adjustScanFlags(scanFlags, pkgSetting, disabledPkgSetting, user, pkg);
         synchronized (mPackages) {
-            applyPolicy(pkg, parseFlags, scanFlags);
+            applyPolicy(pkg, parseFlags, scanFlags, mPlatformPackage);
             assertPackageIsValid(pkg, parseFlags, scanFlags);
 
             SharedUserSetting sharedUserSetting = null;
@@ -10226,7 +10227,7 @@
         }
 
         if (changedAbiCodePath != null && changedAbiCodePath.size() > 0) {
-            for (int i = changedAbiCodePath.size() - 1; i <= 0; --i) {
+            for (int i = changedAbiCodePath.size() - 1; i >= 0; --i) {
                 final String codePathString = changedAbiCodePath.get(i);
                 try {
                     mInstaller.rmdex(codePathString,
@@ -10447,6 +10448,14 @@
             reportSettingsProblem(Log.WARN, msg);
         }
 
+        final int userId = (user == null ? UserHandle.USER_SYSTEM : user.getIdentifier());
+        // for existing packages, change the install state; but, only if it's explicitly specified
+        if (!createNewPackage) {
+            final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
+            final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
+            setInstantAppForUser(pkgSetting, userId, instantApp, fullApp);
+        }
+
         if (disabledPkgSetting != null) {
             pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
         }
@@ -10469,6 +10478,8 @@
 
         pkg.applicationInfo.seInfo = SELinuxMMAC.getSeInfo(pkg, isPrivileged,
                 pkg.applicationInfo.targetSandboxVersion, targetSdkVersion);
+        pkg.applicationInfo.seInfoUser = SELinuxUtil.assignSeinfoUser(pkgSetting.readUserState(
+                userId == UserHandle.USER_ALL ? UserHandle.USER_SYSTEM : userId));
 
         pkg.mExtras = pkgSetting;
         pkg.applicationInfo.processName = fixProcessName(
@@ -10687,7 +10698,7 @@
      * ideally be static, but, it requires locks to read system state.
      */
     private static void applyPolicy(PackageParser.Package pkg, final @ParseFlags int parseFlags,
-            final @ScanFlags int scanFlags) {
+            final @ScanFlags int scanFlags, PackageParser.Package platformPkg) {
         if ((scanFlags & SCAN_AS_SYSTEM) != 0) {
             pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
             if (pkg.applicationInfo.isDirectBootAware()) {
@@ -10773,6 +10784,15 @@
             pkg.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_PRODUCT;
         }
 
+        // Check if the package is signed with the same key as the platform package.
+        if (PLATFORM_PACKAGE_NAME.equals(pkg.packageName) ||
+                (platformPkg != null && compareSignatures(
+                        platformPkg.mSigningDetails.signatures,
+                        pkg.mSigningDetails.signatures) == PackageManager.SIGNATURE_MATCH)) {
+            pkg.applicationInfo.privateFlags |=
+                ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY;
+        }
+
         if (!isSystemApp(pkg)) {
             // Only system apps can use these features.
             pkg.mOriginalPackages = null;
@@ -13620,6 +13640,14 @@
         return installReason;
     }
 
+    /**
+     * Attempts to bind to the default container service explicitly instead of doing so lazily on
+     * install commit.
+     */
+    void earlyBindToDefContainer() {
+        mHandler.sendMessage(mHandler.obtainMessage(DEF_CONTAINER_BIND));
+    }
+
     void installStage(String packageName, File stagedDir,
             IPackageInstallObserver2 observer, PackageInstaller.SessionParams sessionParams,
             String installerPackageName, int installerUid, UserHandle user,
@@ -13943,7 +13971,7 @@
         return PackageManager.INSTALL_SUCCEEDED;
     }
 
-    void setInstantAppForUser(PackageSetting pkgSetting, int userId,
+    static void setInstantAppForUser(PackageSetting pkgSetting, int userId,
             boolean instantApp, boolean fullApp) {
         // no state specified; do nothing
         if (!instantApp && !fullApp) {
@@ -13977,8 +14005,8 @@
 
     @Override
     public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended,
-            PersistableBundle appExtras, PersistableBundle launcherExtras, String callingPackage,
-            int userId) {
+            PersistableBundle appExtras, PersistableBundle launcherExtras, String dialogMessage,
+            String callingPackage, int userId) {
         try {
             mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS, null);
         } catch (SecurityException e) {
@@ -13992,7 +14020,7 @@
                 "setPackagesSuspended for user " + userId);
         if (callingUid != Process.ROOT_UID &&
                 !UserHandle.isSameApp(getPackageUid(callingPackage, 0, userId), callingUid)) {
-            throw new IllegalArgumentException("callingPackage " + callingPackage + " does not"
+            throw new IllegalArgumentException("CallingPackage " + callingPackage + " does not"
                     + " belong to calling app id " + UserHandle.getAppId(callingUid));
         }
 
@@ -14016,20 +14044,18 @@
                     final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
                     if (pkgSetting == null
                             || filterAppAccessLPr(pkgSetting, callingUid, userId)) {
-                        Slog.w(TAG, "Could not find package setting for package \"" + packageName
-                                + "\". Skipping suspending/un-suspending.");
+                        Slog.w(TAG, "Could not find package setting for package: " + packageName
+                                + ". Skipping suspending/un-suspending.");
                         unactionedPackages.add(packageName);
                         continue;
                     }
-                    if (pkgSetting.getSuspended(userId) != suspended) {
-                        if (!canSuspendPackageForUserLocked(packageName, userId)) {
-                            unactionedPackages.add(packageName);
-                            continue;
-                        }
-                        pkgSetting.setSuspended(suspended, callingPackage, appExtras,
-                                launcherExtras, userId);
-                        changedPackagesList.add(packageName);
+                    if (!canSuspendPackageForUserLocked(packageName, userId)) {
+                        unactionedPackages.add(packageName);
+                        continue;
                     }
+                    pkgSetting.setSuspended(suspended, callingPackage, dialogMessage, appExtras,
+                            launcherExtras, userId);
+                    changedPackagesList.add(packageName);
                 }
             }
         } finally {
@@ -14044,7 +14070,6 @@
                 scheduleWritePackageRestrictionsLocked(userId);
             }
         }
-
         return unactionedPackages.toArray(new String[unactionedPackages.size()]);
     }
 
@@ -14052,7 +14077,8 @@
     public PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId) {
         final int callingUid = Binder.getCallingUid();
         if (getPackageUid(packageName, 0, userId) != callingUid) {
-            mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
+            throw new SecurityException("Calling package " + packageName
+                    + " does not belong to calling uid " + callingUid);
         }
         synchronized (mPackages) {
             final PackageSetting ps = mSettings.mPackages.get(packageName);
@@ -14067,25 +14093,6 @@
         }
     }
 
-    @Override
-    public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras,
-            int userId) {
-        final int callingUid = Binder.getCallingUid();
-        mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null);
-        synchronized (mPackages) {
-            final PackageSetting ps = mSettings.mPackages.get(packageName);
-            if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
-                throw new IllegalArgumentException("Unknown target package: " + packageName);
-            }
-            final PackageUserState packageUserState = ps.readUserState(userId);
-            if (packageUserState.suspended) {
-                packageUserState.suspendedAppExtras = appExtras;
-                sendMyPackageSuspendedOrUnsuspended(new String[] {packageName}, true, appExtras,
-                        userId);
-            }
-        }
-    }
-
     private void sendMyPackageSuspendedOrUnsuspended(String[] affectedPackages, boolean suspended,
             PersistableBundle appExtras, int userId) {
         final String action;
@@ -14140,18 +14147,26 @@
         }
     }
 
-    void onSuspendingPackageRemoved(String packageName, int userId) {
-        final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds()
-                : new int[] {userId};
-        synchronized (mPackages) {
-            for (PackageSetting ps : mSettings.mPackages.values()) {
-                for (int user : userIds) {
-                    final PackageUserState pus = ps.readUserState(user);
+    void onSuspendingPackageRemoved(String packageName, int removedForUser) {
+        final int[] userIds = (removedForUser == UserHandle.USER_ALL) ? sUserManager.getUserIds()
+                : new int[] {removedForUser};
+        for (int userId : userIds) {
+            List<String> affectedPackages = new ArrayList<>();
+            synchronized (mPackages) {
+                for (PackageSetting ps : mSettings.mPackages.values()) {
+                    final PackageUserState pus = ps.readUserState(userId);
                     if (pus.suspended && packageName.equals(pus.suspendingPackage)) {
-                        ps.setSuspended(false, null, null, null, user);
+                        ps.setSuspended(false, null, null, null, null, userId);
+                        affectedPackages.add(ps.name);
                     }
                 }
             }
+            if (!affectedPackages.isEmpty()) {
+                final String[] packageArray = affectedPackages.toArray(
+                        new String[affectedPackages.size()]);
+                sendMyPackageSuspendedOrUnsuspended(packageArray, false, null, userId);
+                sendPackagesSuspendedForUser(packageArray, userId, false, null);
+            }
         }
     }
 
@@ -16206,7 +16221,10 @@
 
                 // default to original signature matching
                 if (!pkg.mSigningDetails.checkCapability(oldPackage.mSigningDetails,
-                        PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+                        PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+                                && !oldPackage.mSigningDetails.checkCapability(
+                                        pkg.mSigningDetails,
+                                        PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
                     res.setError(INSTALL_FAILED_UPDATE_INCOMPATIBLE,
                             "New package has a different signature: " + pkgName);
                     return;
@@ -16452,10 +16470,6 @@
                         childPs.oldCodePaths = ps.oldCodePaths;
                     }
                 }
-                // set instant app status, but, only if it's explicitly specified
-                final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
-                final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
-                setInstantAppForUser(ps, user.getIdentifier(), instantApp, fullApp);
                 prepareAppDataAfterInstallLIF(newPackage);
                 addedPkg = true;
                 mDexManager.notifyPackageUpdated(newPackage.packageName,
@@ -18883,6 +18897,7 @@
                     false /*hidden*/,
                     false /*suspended*/,
                     null, /*suspendingPackage*/
+                    null, /*dialogMessage*/
                     null, /*suspendedAppExtras*/
                     null, /*suspendedLauncherExtras*/
                     false /*instantApp*/,
@@ -22422,17 +22437,25 @@
                     + Integer.toHexString(flags));
         }
 
+        final PackageSetting ps;
+        synchronized (mPackages) {
+            ps = mSettings.mPackages.get(pkg.packageName);
+        }
         final String volumeUuid = pkg.volumeUuid;
         final String packageName = pkg.packageName;
-        final ApplicationInfo app = pkg.applicationInfo;
+        final ApplicationInfo app = (ps == null)
+                ? pkg.applicationInfo
+                : PackageParser.generateApplicationInfo(pkg, 0, ps.readUserState(userId), userId);
+
         final int appId = UserHandle.getAppId(app.uid);
 
         Preconditions.checkNotNull(app.seInfo);
 
+        final String seInfo = app.seInfo + (app.seInfoUser != null ? app.seInfoUser : "");
         long ceDataInode = -1;
         try {
             ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
-                    appId, app.seInfo, app.targetSdkVersion);
+                    appId, seInfo, app.targetSdkVersion);
         } catch (InstallerException e) {
             if (app.isSystemApp()) {
                 logCriticalInfo(Log.ERROR, "Failed to create app data for " + packageName
@@ -22440,7 +22463,7 @@
                 destroyAppDataLeafLIF(pkg, userId, flags);
                 try {
                     ceDataInode = mInstaller.createAppData(volumeUuid, packageName, userId, flags,
-                            appId, app.seInfo, app.targetSdkVersion);
+                            appId, seInfo, app.targetSdkVersion);
                     logCriticalInfo(Log.DEBUG, "Recovery succeeded!");
                 } catch (InstallerException e2) {
                     logCriticalInfo(Log.DEBUG, "Recovery failed!");
@@ -22463,7 +22486,6 @@
         if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 && ceDataInode != -1) {
             // TODO: mark this structure as dirty so we persist it!
             synchronized (mPackages) {
-                final PackageSetting ps = mSettings.mPackages.get(packageName);
                 if (ps != null) {
                     ps.setCeDataInode(ceDataInode, userId);
                 }
@@ -23588,6 +23610,13 @@
         }
 
         @Override
+        public Object getPackageSetting(String packageName) {
+            synchronized (mPackages) {
+                return mSettings.getPackageLPr(packageName);
+            }
+        }
+
+        @Override
         public PackageList getPackageList(PackageListObserver observer) {
             synchronized (mPackages) {
                 final int N = mPackages.size();
@@ -23760,6 +23789,30 @@
         }
 
         @Override
+        public boolean isPackageSuspended(String packageName, int userId) {
+            synchronized (mPackages) {
+                final PackageSetting ps = mSettings.mPackages.get(packageName);
+                return (ps != null) ? ps.getSuspended(userId) : false;
+            }
+        }
+
+        @Override
+        public String getSuspendingPackage(String suspendedPackage, int userId) {
+            synchronized (mPackages) {
+                final PackageSetting ps = mSettings.mPackages.get(suspendedPackage);
+                return (ps != null) ? ps.readUserState(userId).suspendingPackage : null;
+            }
+        }
+
+        @Override
+        public String getSuspendedDialogMessage(String suspendedPackage, int userId) {
+            synchronized (mPackages) {
+                final PackageSetting ps = mSettings.mPackages.get(suspendedPackage);
+                return (ps != null) ? ps.readUserState(userId).dialogMessage : null;
+            }
+        }
+
+        @Override
         public int getPackageUid(String packageName, int flags, int userId) {
             return PackageManagerService.this
                     .getPackageUid(packageName, flags, userId);
@@ -23981,9 +24034,9 @@
 
         @Override
         public ResolveInfo resolveIntent(Intent intent, String resolvedType,
-                int flags, int userId, boolean resolveForStart) {
+                int flags, int userId, boolean resolveForStart, int filterCallingUid) {
             return resolveIntentInternal(
-                    intent, resolvedType, flags, userId, resolveForStart);
+                    intent, resolvedType, flags, userId, resolveForStart, filterCallingUid);
         }
 
         @Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 853081a..4b907f4 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -576,7 +576,10 @@
             PackageParser.collectCertificates(disabledPkgSetting.pkg, true /* skipVerify */);
             if (pkgSetting.signatures.mSigningDetails.checkCapability(
                     disabledPkgSetting.signatures.mSigningDetails,
-                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)) {
+                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+                    || disabledPkgSetting.signatures.mSigningDetails.checkCapability(
+                            pkgSetting.signatures.mSigningDetails,
+                            PackageParser.SigningDetails.CertCapabilities.ROLLBACK)) {
                 return true;
             } else {
                 logCriticalInfo(Log.ERROR, "Updated system app mismatches cert on /system: " +
@@ -616,7 +619,10 @@
             // Already existing package. Make sure signatures match
             boolean match = parsedSignatures.checkCapability(
                     pkgSetting.signatures.mSigningDetails,
-                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA);
+                    PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+                            || pkgSetting.signatures.mSigningDetails.checkCapability(
+                                    parsedSignatures,
+                                    PackageParser.SigningDetails.CertCapabilities.ROLLBACK);
             if (!match && compareCompat) {
                 match = matchSignaturesCompat(packageName, pkgSetting.signatures,
                         parsedSignatures);
@@ -627,7 +633,12 @@
                         packageName,
                         pkgSetting.signatures.mSigningDetails,
                         parsedSignatures,
-                        PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA);
+                        PackageParser.SigningDetails.CertCapabilities.INSTALLED_DATA)
+                                || matchSignaturesRecover(
+                                        packageName,
+                                        parsedSignatures,
+                                        pkgSetting.signatures.mSigningDetails,
+                                        PackageParser.SigningDetails.CertCapabilities.ROLLBACK);
             }
 
             if (!match && isApkVerificationForced(disabledPkgSetting)) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 28e32a5..a92fbb6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1505,6 +1505,7 @@
     private int runSuspend(boolean suspendedState) {
         final PrintWriter pw = getOutPrintWriter();
         int userId = UserHandle.USER_SYSTEM;
+        String dialogMessage = null;
         final PersistableBundle appExtras = new PersistableBundle();
         final PersistableBundle launcherExtras = new PersistableBundle();
         String opt;
@@ -1513,6 +1514,9 @@
                 case "--user":
                     userId = UserHandle.parseUserArg(getNextArgRequired());
                     break;
+                case "--dialogMessage":
+                    dialogMessage = getNextArgRequired();
+                    break;
                 case "--ael":
                 case "--aes":
                 case "--aed":
@@ -1553,7 +1557,7 @@
                 (Binder.getCallingUid() == Process.ROOT_UID) ? "root" : "com.android.shell";
         try {
             mInterface.setPackagesSuspendedAsUser(new String[]{packageName}, suspendedState,
-                    appExtras, launcherExtras, callingPackage, userId);
+                    appExtras, launcherExtras, dialogMessage, callingPackage, userId);
             pw.println("Package " + packageName + " new suspended state: "
                     + mInterface.isPackageSuspendedForUser(packageName, userId));
             return 0;
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 008a81c..138594c 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -20,8 +20,6 @@
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
 
-import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
-
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IntentFilterVerificationInfo;
 import android.content.pm.PackageManager;
@@ -398,11 +396,12 @@
         return readUserState(userId).suspended;
     }
 
-    void setSuspended(boolean suspended, String suspendingPackage, PersistableBundle appExtras,
-            PersistableBundle launcherExtras, int userId) {
+    void setSuspended(boolean suspended, String suspendingPackage, String dialogMessage,
+            PersistableBundle appExtras, PersistableBundle launcherExtras, int userId) {
         final PackageUserState existingUserState = modifyUserState(userId);
         existingUserState.suspended = suspended;
         existingUserState.suspendingPackage = suspended ? suspendingPackage : null;
+        existingUserState.dialogMessage = suspended ? dialogMessage : null;
         existingUserState.suspendedAppExtras = suspended ? appExtras : null;
         existingUserState.suspendedLauncherExtras = suspended ? launcherExtras : null;
     }
@@ -425,8 +424,8 @@
 
     void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped,
             boolean notLaunched, boolean hidden, boolean suspended, String suspendingPackage,
-            PersistableBundle suspendedAppExtras, PersistableBundle suspendedLauncherExtras,
-            boolean instantApp,
+            String dialogMessage, PersistableBundle suspendedAppExtras,
+            PersistableBundle suspendedLauncherExtras, boolean instantApp,
             boolean virtualPreload, String lastDisableAppCaller,
             ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
             int domainVerifState, int linkGeneration, int installReason,
@@ -440,6 +439,7 @@
         state.hidden = hidden;
         state.suspended = suspended;
         state.suspendingPackage = suspendingPackage;
+        state.dialogMessage = dialogMessage;
         state.suspendedAppExtras = suspendedAppExtras;
         state.suspendedLauncherExtras = suspendedLauncherExtras;
         state.lastDisableAppCaller = lastDisableAppCaller;
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index d0e8544..898ecf3 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -222,6 +222,7 @@
     private static final String ATTR_HIDDEN = "hidden";
     private static final String ATTR_SUSPENDED = "suspended";
     private static final String ATTR_SUSPENDING_PACKAGE = "suspending-package";
+    private static final String ATTR_SUSPEND_DIALOG_MESSAGE = "suspend_dialog_message";
     // Legacy, uninstall blocks are stored separately.
     @Deprecated
     private static final String ATTR_BLOCK_UNINSTALL = "blockUninstall";
@@ -734,6 +735,7 @@
                                 false /*hidden*/,
                                 false /*suspended*/,
                                 null, /*suspendingPackage*/
+                                null, /*dialogMessage*/
                                 null, /*suspendedAppExtras*/
                                 null, /*suspendedLauncherExtras*/
                                 instantApp,
@@ -1628,6 +1630,7 @@
                                 false /*hidden*/,
                                 false /*suspended*/,
                                 null, /*suspendingPackage*/
+                                null, /*dialogMessage*/
                                 null, /*suspendedAppExtras*/
                                 null, /*suspendedLauncherExtras*/
                                 false /*instantApp*/,
@@ -1704,6 +1707,8 @@
                             false);
                     String suspendingPackage = parser.getAttributeValue(null,
                             ATTR_SUSPENDING_PACKAGE);
+                    final String dialogMessage = parser.getAttributeValue(null,
+                            ATTR_SUSPEND_DIALOG_MESSAGE);
                     if (suspended && suspendingPackage == null) {
                         suspendingPackage = PLATFORM_PACKAGE_NAME;
                     }
@@ -1767,7 +1772,7 @@
                         setBlockUninstallLPw(userId, name, true);
                     }
                     ps.setUserState(userId, ceDataInode, enabled, installed, stopped, notLaunched,
-                            hidden, suspended, suspendingPackage, suspendedAppExtras,
+                            hidden, suspended, suspendingPackage, dialogMessage, suspendedAppExtras,
                             suspendedLauncherExtras, instantApp, virtualPreload, enabledCaller,
                             enabledComponents, disabledComponents, verifState, linkGeneration,
                             installReason, harmfulAppWarning);
@@ -2077,7 +2082,14 @@
                 }
                 if (ustate.suspended) {
                     serializer.attribute(null, ATTR_SUSPENDED, "true");
-                    serializer.attribute(null, ATTR_SUSPENDING_PACKAGE, ustate.suspendingPackage);
+                    if (ustate.suspendingPackage != null) {
+                        serializer.attribute(null, ATTR_SUSPENDING_PACKAGE,
+                                ustate.suspendingPackage);
+                    }
+                    if (ustate.dialogMessage != null) {
+                        serializer.attribute(null, ATTR_SUSPEND_DIALOG_MESSAGE,
+                                ustate.dialogMessage);
+                    }
                     if (ustate.suspendedAppExtras != null) {
                         serializer.startTag(null, TAG_SUSPENDED_APP_EXTRAS);
                         try {
@@ -4750,8 +4762,11 @@
             pw.print(" suspended=");
             pw.print(ps.getSuspended(user.id));
             if (ps.getSuspended(user.id)) {
+                final PackageUserState pus = ps.readUserState(user.id);
                 pw.print(" suspendingPackage=");
-                pw.print(ps.readUserState(user.id).suspendingPackage);
+                pw.print(pus.suspendingPackage);
+                pw.print(" dialogMessage=");
+                pw.print(pus.dialogMessage);
             }
             pw.print(" stopped=");
             pw.print(ps.getStopped(user.id));
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 bcf4b07..1d002ef 100644
--- a/services/core/java/com/android/server/pm/permission/BasePermission.java
+++ b/services/core/java/com/android/server/pm/permission/BasePermission.java
@@ -411,17 +411,23 @@
     }
 
     public @NonNull PermissionInfo generatePermissionInfo(int adjustedProtectionLevel, int flags) {
-        final boolean protectionLevelChanged = protectionLevel != adjustedProtectionLevel;
-        // if we return different protection level, don't use the cached info
-        if (perm != null && !protectionLevelChanged) {
-            return PackageParser.generatePermissionInfo(perm, flags);
+        PermissionInfo permissionInfo;
+        if (perm != null) {
+            final boolean protectionLevelChanged = protectionLevel != adjustedProtectionLevel;
+            permissionInfo = PackageParser.generatePermissionInfo(perm, flags);
+            if (protectionLevelChanged && permissionInfo == perm.info) {
+                // if we return different protection level, don't use the cached info
+                permissionInfo = new PermissionInfo(permissionInfo);
+                permissionInfo.protectionLevel = adjustedProtectionLevel;
+            }
+            return permissionInfo;
         }
-        final PermissionInfo pi = new PermissionInfo();
-        pi.name = name;
-        pi.packageName = sourcePackageName;
-        pi.nonLocalizedLabel = name;
-        pi.protectionLevel = protectionLevelChanged ? adjustedProtectionLevel : protectionLevel;
-        return pi;
+        permissionInfo = new PermissionInfo();
+        permissionInfo.name = name;
+        permissionInfo.packageName = sourcePackageName;
+        permissionInfo.nonLocalizedLabel = name;
+        permissionInfo.protectionLevel = protectionLevel;
+        return permissionInfo;
     }
 
     public static boolean readLPw(@NonNull Map<String, BasePermission> out,
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 518d464..4055a47 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -1052,7 +1052,8 @@
     private PackageParser.Package getDefaultSystemHandlerActivityPackage(
             Intent intent, int userId) {
         ResolveInfo handler = mServiceInternal.resolveIntent(intent,
-                intent.resolveType(mContext.getContentResolver()), DEFAULT_FLAGS, userId, false);
+                intent.resolveType(mContext.getContentResolver()), DEFAULT_FLAGS, userId, false,
+                Binder.getCallingUid());
         if (handler == null || handler.activityInfo == null) {
             return null;
         }
@@ -1093,7 +1094,7 @@
 
             ResolveInfo homeActivity = mServiceInternal.resolveIntent(homeIntent,
                     homeIntent.resolveType(mContext.getContentResolver()), DEFAULT_FLAGS,
-                    userId, false);
+                    userId, false, Binder.getCallingUid());
             if (homeActivity != null) {
                 continue;
             }
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 f5b52fc..065133b 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -212,12 +212,11 @@
             return PackageManager.PERMISSION_DENIED;
         }
 
-        final PackageParser.Package pkg = mPackageManagerInt.getPackage(pkgName);
-        if (pkg != null && pkg.mExtras != null) {
-            if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) {
+        final PackageSetting ps = (PackageSetting) mPackageManagerInt.getPackageSetting(pkgName);
+        if (ps != null && ps.getPackage() != null) {
+            if (mPackageManagerInt.filterAppAccess(ps.getPackage(), callingUid, userId)) {
                 return PackageManager.PERMISSION_DENIED;
             }
-            final PackageSetting ps = (PackageSetting) pkg.mExtras;
             final boolean instantApp = ps.getInstantApp(userId);
             final PermissionsState permissionsState = ps.getPermissionsState();
             if (permissionsState.hasPermission(permName, userId)) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index fd02347..46a636c 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -87,6 +87,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
 import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS;
 import static android.view.WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
@@ -618,6 +619,7 @@
     boolean mTranslucentDecorEnabled = true;
     boolean mUseTvRouting;
     int mVeryLongPressTimeout;
+    boolean mAllowStartActivityForLongPressOnPowerDuringSetup;
 
     private boolean mHandleVolumeKeysInWM;
 
@@ -1622,7 +1624,11 @@
                     : mKeyguardDelegate.isShowing();
             if (!keyguardActive) {
                 Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
-                startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+                if (mAllowStartActivityForLongPressOnPowerDuringSetup) {
+                    mContext.startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+                } else {
+                    startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+                }
             }
             break;
         }
@@ -2134,6 +2140,8 @@
                 com.android.internal.R.integer.config_shortPressOnSleepBehavior);
         mVeryLongPressTimeout = mContext.getResources().getInteger(
                 com.android.internal.R.integer.config_veryLongPressTimeout);
+        mAllowStartActivityForLongPressOnPowerDuringSetup = mContext.getResources().getBoolean(
+                com.android.internal.R.bool.config_allowStartActivityForLongPressOnPowerInSetup);
 
         mUseTvRouting = AudioSystem.getPlatformType(mContext) == AudioSystem.PLATFORM_TELEVISION;
 
@@ -4976,13 +4984,14 @@
     private void setAttachedWindowFrames(WindowState win, int fl, int adjust, WindowState attached,
             boolean insetDecors, Rect pf, Rect df, Rect of, Rect cf, Rect vf,
             DisplayFrames displayFrames) {
-        if (win.getSurfaceLayer() > mDockLayer && attached.getSurfaceLayer() < mDockLayer) {
-            // Here's a special case: if this attached window is a panel that is above the dock
-            // window, and the window it is attached to is below the dock window, then the frames we
-            // computed for the window it is attached to can not be used because the dock is
-            // effectively part of the underlying window and the attached window is floating on top
-            // of the whole thing. So, we ignore the attached window and explicitly compute the
-            // frames that would be appropriate without the dock.
+        if (!win.isInputMethodTarget() && attached.isInputMethodTarget()) {
+            // Here's a special case: if the child window is not the 'dock window'
+            // or input method target, and the window it is attached to is below
+            // the dock window, then the frames we computed for the window it is
+            // attached to can not be used because the dock is effectively part
+            // of the underlying window and the attached window is floating on top
+            // of the whole thing. So, we ignore the attached window and explicitly
+            // compute the frames that would be appropriate without the dock.
             vf.set(displayFrames.mDock);
             cf.set(displayFrames.mDock);
             of.set(displayFrames.mDock);
@@ -5009,7 +5018,7 @@
                 cf.set(attached.getContentFrameLw());
                 if (attached.isVoiceInteraction()) {
                     cf.intersectUnchecked(displayFrames.mVoiceContent);
-                } else if (attached.getSurfaceLayer() < mDockLayer) {
+                } else if (win.isInputMethodTarget() || attached.isInputMethodTarget()) {
                     cf.intersectUnchecked(displayFrames.mContent);
                 }
             }
@@ -5403,6 +5412,12 @@
         final boolean attachedInParent = attached != null && !layoutInScreen;
         final boolean requestedHideNavigation =
                 (requestedSysUiFl & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;
+
+        // TYPE_BASE_APPLICATION windows are never considered floating here because they don't get
+        // cropped / shifted to the displayFrame in WindowState.
+        final boolean floatingInScreenWindow = !attrs.isFullscreen() && layoutInScreen
+                && type != TYPE_BASE_APPLICATION;
+
         // Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in
         // the cutout safe zone.
         if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) {
@@ -5437,7 +5452,10 @@
             }
             // Windows that are attached to a parent and laid out in said parent already avoid
             // the cutout according to that parent and don't need to be further constrained.
-            if (!attachedInParent) {
+            // Floating IN_SCREEN windows get what they ask for and lay out in the full screen.
+            // They will later be cropped or shifted using the displayFrame in WindowState,
+            // which prevents overlap with the DisplayCutout.
+            if (!attachedInParent && !floatingInScreenWindow) {
                 mTmpRect.set(pf);
                 pf.intersectUnchecked(displayCutoutSafeExceptMaybeBars);
                 parentFrameWasClippedByDisplayCutout |= !mTmpRect.equals(pf);
@@ -5500,7 +5518,6 @@
 
         win.computeFrameLw(pf, df, of, cf, vf, dcf, sf, osf, displayFrames.mDisplayCutout,
                 parentFrameWasClippedByDisplayCutout);
-
         // Dock windows carve out the bottom of the screen, so normal windows
         // can't appear underneath them.
         if (type == TYPE_INPUT_METHOD && win.isVisibleLw()
@@ -8013,29 +8030,35 @@
     private VibrationEffect getVibrationEffect(int effectId) {
         long[] pattern;
         switch (effectId) {
-            case HapticFeedbackConstants.LONG_PRESS:
-                pattern = mLongPressVibePattern;
-                break;
             case HapticFeedbackConstants.CLOCK_TICK:
+            case HapticFeedbackConstants.CONTEXT_CLICK:
                 return VibrationEffect.get(VibrationEffect.EFFECT_TICK);
+            case HapticFeedbackConstants.KEYBOARD_RELEASE:
+            case HapticFeedbackConstants.TEXT_HANDLE_MOVE:
+            case HapticFeedbackConstants.VIRTUAL_KEY_RELEASE:
+            case HapticFeedbackConstants.ENTRY_BUMP:
+            case HapticFeedbackConstants.DRAG_CROSSING:
+            case HapticFeedbackConstants.GESTURE_END:
+                return VibrationEffect.get(VibrationEffect.EFFECT_TICK, false);
+            case HapticFeedbackConstants.KEYBOARD_TAP: // == KEYBOARD_PRESS
+            case HapticFeedbackConstants.VIRTUAL_KEY:
+            case HapticFeedbackConstants.EDGE_RELEASE:
+            case HapticFeedbackConstants.CONFIRM:
+            case HapticFeedbackConstants.GESTURE_START:
+                return VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+            case HapticFeedbackConstants.LONG_PRESS:
+            case HapticFeedbackConstants.EDGE_SQUEEZE:
+                return VibrationEffect.get(VibrationEffect.EFFECT_HEAVY_CLICK);
+            case HapticFeedbackConstants.REJECT:
+                return VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
+
             case HapticFeedbackConstants.CALENDAR_DATE:
                 pattern = mCalendarDateVibePattern;
                 break;
             case HapticFeedbackConstants.SAFE_MODE_ENABLED:
                 pattern = mSafeModeEnabledVibePattern;
                 break;
-            case HapticFeedbackConstants.CONTEXT_CLICK:
-                return VibrationEffect.get(VibrationEffect.EFFECT_TICK);
-            case HapticFeedbackConstants.VIRTUAL_KEY:
-                return VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-            case HapticFeedbackConstants.VIRTUAL_KEY_RELEASE:
-                return VibrationEffect.get(VibrationEffect.EFFECT_TICK, false);
-            case HapticFeedbackConstants.KEYBOARD_PRESS:  // == HapticFeedbackConstants.KEYBOARD_TAP
-                return VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-            case HapticFeedbackConstants.KEYBOARD_RELEASE:
-                return VibrationEffect.get(VibrationEffect.EFFECT_TICK, false);
-            case HapticFeedbackConstants.TEXT_HANDLE_MOVE:
-                return VibrationEffect.get(VibrationEffect.EFFECT_TICK, false);
+
             default:
                 return null;
         }
@@ -8655,6 +8678,9 @@
                 pw.print("mShortPressOnWindowBehavior=");
                 pw.println(shortPressOnWindowBehaviorToString(mShortPressOnWindowBehavior));
         pw.print(prefix);
+                pw.print("mAllowStartActivityForLongPressOnPowerDuringSetup=");
+                pw.println(mAllowStartActivityForLongPressOnPowerDuringSetup);
+        pw.print(prefix);
                 pw.print("mHasSoftInput="); pw.print(mHasSoftInput);
                 pw.print(" mDismissImeOnBackKeyPressed="); pw.println(mDismissImeOnBackKeyPressed);
         pw.print(prefix);
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index 0a6ae4e..ccbf502 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -474,6 +474,8 @@
 
         public boolean isInputMethodWindow();
 
+        public boolean isInputMethodTarget();
+
         public int getDisplayId();
 
         /**
diff --git a/services/core/java/com/android/server/slice/DirtyTracker.java b/services/core/java/com/android/server/slice/DirtyTracker.java
new file mode 100644
index 0000000..4288edc
--- /dev/null
+++ b/services/core/java/com/android/server/slice/DirtyTracker.java
@@ -0,0 +1,35 @@
+/*
+ * 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.slice;
+
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+
+/**
+ * A parent object that cares when a Persistable changes and will schedule a serialization
+ * in response to the onPersistableDirty callback.
+ */
+public interface DirtyTracker {
+    void onPersistableDirty(Persistable obj);
+
+    /**
+     * An object that can be written to XML.
+     */
+    interface Persistable {
+        String getFileName();
+        void writeTo(XmlSerializer out) throws IOException;
+    }
+}
diff --git a/services/core/java/com/android/server/slice/SliceClientPermissions.java b/services/core/java/com/android/server/slice/SliceClientPermissions.java
new file mode 100644
index 0000000..e461e0d
--- /dev/null
+++ b/services/core/java/com/android/server/slice/SliceClientPermissions.java
@@ -0,0 +1,354 @@
+/*
+ * 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.slice;
+
+import android.annotation.NonNull;
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.server.slice.DirtyTracker.Persistable;
+import com.android.server.slice.SlicePermissionManager.PkgUser;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+public class SliceClientPermissions implements DirtyTracker, Persistable {
+
+    private static final String TAG = "SliceClientPermissions";
+
+    static final String TAG_CLIENT = "client";
+    private static final String TAG_AUTHORITY = "authority";
+    private static final String TAG_PATH = "path";
+    private static final String NAMESPACE = null;
+
+    private static final String ATTR_PKG = "pkg";
+    private static final String ATTR_AUTHORITY = "authority";
+    private static final String ATTR_FULL_ACCESS = "fullAccess";
+
+    private final PkgUser mPkg;
+    // Keyed off (authority, userId) rather than the standard (pkg, userId)
+    private final ArrayMap<PkgUser, SliceAuthority> mAuths = new ArrayMap<>();
+    private final DirtyTracker mTracker;
+    private boolean mHasFullAccess;
+
+    public SliceClientPermissions(@NonNull PkgUser pkg, @NonNull DirtyTracker tracker) {
+        mPkg = pkg;
+        mTracker = tracker;
+    }
+
+    public PkgUser getPkg() {
+        return mPkg;
+    }
+
+    public synchronized Collection<SliceAuthority> getAuthorities() {
+        return new ArrayList<>(mAuths.values());
+    }
+
+    public synchronized SliceAuthority getOrCreateAuthority(PkgUser authority, PkgUser provider) {
+        SliceAuthority ret = mAuths.get(authority);
+        if (ret == null) {
+            ret = new SliceAuthority(authority.getPkg(), provider, this);
+            mAuths.put(authority, ret);
+            onPersistableDirty(ret);
+        }
+        return ret;
+    }
+
+    public synchronized SliceAuthority getAuthority(PkgUser authority) {
+        return mAuths.get(authority);
+    }
+
+    public boolean hasFullAccess() {
+        return mHasFullAccess;
+    }
+
+    public void setHasFullAccess(boolean hasFullAccess) {
+        if (mHasFullAccess == hasFullAccess) return;
+        mHasFullAccess = hasFullAccess;
+        mTracker.onPersistableDirty(this);
+    }
+
+    public void removeAuthority(String authority, int userId) {
+        if (mAuths.remove(new PkgUser(authority, userId)) != null) {
+            mTracker.onPersistableDirty(this);
+        }
+    }
+
+    public synchronized boolean hasPermission(Uri uri, int userId) {
+        if (!Objects.equals(ContentResolver.SCHEME_CONTENT, uri.getScheme())) return false;
+        SliceAuthority authority = getAuthority(new PkgUser(uri.getAuthority(), userId));
+        return authority != null && authority.hasPermission(uri.getPathSegments());
+    }
+
+    public void grantUri(Uri uri, PkgUser providerPkg) {
+        SliceAuthority authority = getOrCreateAuthority(
+                new PkgUser(uri.getAuthority(), providerPkg.getUserId()),
+                providerPkg);
+        authority.addPath(uri.getPathSegments());
+    }
+
+    public void revokeUri(Uri uri, PkgUser providerPkg) {
+        SliceAuthority authority = getOrCreateAuthority(
+                new PkgUser(uri.getAuthority(), providerPkg.getUserId()),
+                providerPkg);
+        authority.removePath(uri.getPathSegments());
+    }
+
+    public void clear() {
+        if (!mHasFullAccess && mAuths.isEmpty()) return;
+        mHasFullAccess = false;
+        mAuths.clear();
+        onPersistableDirty(this);
+    }
+
+    @Override
+    public void onPersistableDirty(Persistable obj) {
+        mTracker.onPersistableDirty(this);
+    }
+
+    @Override
+    public String getFileName() {
+        return getFileName(mPkg);
+    }
+
+    public synchronized void writeTo(XmlSerializer out) throws IOException {
+        out.startTag(NAMESPACE, TAG_CLIENT);
+        out.attribute(NAMESPACE, ATTR_PKG, mPkg.toString());
+        out.attribute(NAMESPACE, ATTR_FULL_ACCESS, mHasFullAccess ? "1" : "0");
+
+        final int N = mAuths.size();
+        for (int i = 0; i < N; i++) {
+            out.startTag(NAMESPACE, TAG_AUTHORITY);
+            out.attribute(NAMESPACE, ATTR_AUTHORITY, mAuths.valueAt(i).mAuthority);
+            out.attribute(NAMESPACE, ATTR_PKG, mAuths.valueAt(i).mPkg.toString());
+
+            mAuths.valueAt(i).writeTo(out);
+
+            out.endTag(NAMESPACE, TAG_AUTHORITY);
+        }
+
+        out.endTag(NAMESPACE, TAG_CLIENT);
+    }
+
+    public static SliceClientPermissions createFrom(XmlPullParser parser, DirtyTracker tracker)
+            throws XmlPullParserException, IOException {
+        // Get to the beginning of the provider.
+        while (parser.getEventType() != XmlPullParser.START_TAG
+                || !TAG_CLIENT.equals(parser.getName())) {
+            parser.next();
+        }
+        int depth = parser.getDepth();
+        PkgUser pkgUser = new PkgUser(parser.getAttributeValue(NAMESPACE, ATTR_PKG));
+        SliceClientPermissions provider = new SliceClientPermissions(pkgUser, tracker);
+        String fullAccess = parser.getAttributeValue(NAMESPACE, ATTR_FULL_ACCESS);
+        if (fullAccess == null) {
+            fullAccess = "0";
+        }
+        provider.mHasFullAccess = Integer.parseInt(fullAccess) != 0;
+        parser.next();
+
+        while (parser.getDepth() > depth) {
+            if (parser.getEventType() == XmlPullParser.START_TAG
+                    && TAG_AUTHORITY.equals(parser.getName())) {
+                try {
+                    PkgUser pkg = new PkgUser(parser.getAttributeValue(NAMESPACE, ATTR_PKG));
+                    SliceAuthority authority = new SliceAuthority(
+                            parser.getAttributeValue(NAMESPACE, ATTR_AUTHORITY), pkg, provider);
+                    authority.readFrom(parser);
+                    provider.mAuths.put(new PkgUser(authority.getAuthority(), pkg.getUserId()),
+                            authority);
+                } catch (IllegalArgumentException e) {
+                    Slog.e(TAG, "Couldn't read PkgUser", e);
+                }
+            }
+
+            parser.next();
+        }
+        return provider;
+    }
+
+    public static String getFileName(PkgUser pkg) {
+        return String.format("client_%s", pkg.toString());
+    }
+
+    public static class SliceAuthority implements Persistable {
+        public static final String DELIMITER = "/";
+        private final String mAuthority;
+        private final DirtyTracker mTracker;
+        private final PkgUser mPkg;
+        private final ArraySet<String[]> mPaths = new ArraySet<>();
+
+        public SliceAuthority(String authority, PkgUser pkg, DirtyTracker tracker) {
+            mAuthority = authority;
+            mPkg = pkg;
+            mTracker = tracker;
+        }
+
+        public String getAuthority() {
+            return mAuthority;
+        }
+
+        public PkgUser getPkg() {
+            return mPkg;
+        }
+
+        void addPath(List<String> path) {
+            String[] pathSegs = path.toArray(new String[path.size()]);
+            for (int i = mPaths.size() - 1; i >= 0; i--) {
+                String[] existing = mPaths.valueAt(i);
+                if (isPathPrefixMatch(existing, pathSegs)) {
+                    // Nothing to add here.
+                    return;
+                }
+                if (isPathPrefixMatch(pathSegs, existing)) {
+                    mPaths.removeAt(i);
+                }
+            }
+            mPaths.add(pathSegs);
+            mTracker.onPersistableDirty(this);
+        }
+
+        void removePath(List<String> path) {
+            boolean changed = false;
+            String[] pathSegs = path.toArray(new String[path.size()]);
+            for (int i = mPaths.size() - 1; i >= 0; i--) {
+                String[] existing = mPaths.valueAt(i);
+                if (isPathPrefixMatch(pathSegs, existing)) {
+                    changed = true;
+                    mPaths.removeAt(i);
+                }
+            }
+            if (changed) {
+                mTracker.onPersistableDirty(this);
+            }
+        }
+
+        public synchronized Collection<String[]> getPaths() {
+            return new ArraySet<>(mPaths);
+        }
+
+        public boolean hasPermission(List<String> path) {
+            for (String[] p : mPaths) {
+                if (isPathPrefixMatch(p, path.toArray(new String[path.size()]))) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private boolean isPathPrefixMatch(String[] prefix, String[] path) {
+            final int prefixSize = prefix.length;
+            if (path.length < prefixSize) return false;
+
+            for (int i = 0; i < prefixSize; i++) {
+                if (!Objects.equals(path[i], prefix[i])) {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        @Override
+        public String getFileName() {
+            return null;
+        }
+
+        public synchronized void writeTo(XmlSerializer out) throws IOException {
+            final int N = mPaths.size();
+            for (int i = 0; i < N; i++) {
+                out.startTag(NAMESPACE, TAG_PATH);
+                out.text(encodeSegments(mPaths.valueAt(i)));
+                out.endTag(NAMESPACE, TAG_PATH);
+            }
+        }
+
+        public synchronized void readFrom(XmlPullParser parser)
+                throws IOException, XmlPullParserException {
+            parser.next();
+            int depth = parser.getDepth();
+            while (parser.getDepth() >= depth) {
+                if (parser.getEventType() == XmlPullParser.START_TAG
+                        && TAG_PATH.equals(parser.getName())) {
+                    mPaths.add(decodeSegments(parser.nextText()));
+                }
+                parser.next();
+            }
+        }
+
+        private String encodeSegments(String[] s) {
+            String[] out = new String[s.length];
+            for (int i = 0; i < s.length; i++) {
+                out[i] = Uri.encode(s[i]);
+            }
+            return TextUtils.join(DELIMITER, out);
+        }
+
+        private String[] decodeSegments(String s) {
+            String[] sets = s.split(DELIMITER, -1);
+            for (int i = 0; i < sets.length; i++) {
+                sets[i] = Uri.decode(sets[i]);
+            }
+            return sets;
+        }
+
+        /**
+         * Only for testing, no deep equality of these are done normally.
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (!getClass().equals(obj != null ? obj.getClass() : null)) return false;
+            SliceAuthority other = (SliceAuthority) obj;
+            if (mPaths.size() != other.mPaths.size()) return false;
+            ArrayList<String[]> p1 = new ArrayList<>(mPaths);
+            ArrayList<String[]> p2 = new ArrayList<>(other.mPaths);
+            p1.sort(Comparator.comparing(o -> TextUtils.join(",", o)));
+            p2.sort(Comparator.comparing(o -> TextUtils.join(",", o)));
+            for (int i = 0; i < p1.size(); i++) {
+                String[] a1 = p1.get(i);
+                String[] a2 = p2.get(i);
+                if (a1.length != a2.length) return false;
+                for (int j = 0; j < a1.length; j++) {
+                    if (!Objects.equals(a1[j], a2[j])) return false;
+                }
+            }
+            return Objects.equals(mAuthority, other.mAuthority)
+                    && Objects.equals(mPkg, other.mPkg);
+        }
+
+        @Override
+        public String toString() {
+            return String.format("(%s, %s: %s)", mAuthority, mPkg.toString(), pathToString(mPaths));
+        }
+
+        private String pathToString(ArraySet<String[]> paths) {
+            return TextUtils.join(", ", paths.stream().map(s -> TextUtils.join("/", s))
+                    .collect(Collectors.toList()));
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index fd0b6f1..b7b9612 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -31,14 +31,15 @@
 import android.app.ContentProviderHolder;
 import android.app.IActivityManager;
 import android.app.slice.ISliceManager;
-import android.app.slice.SliceManager;
 import android.app.slice.SliceSpec;
 import android.app.usage.UsageStatsManagerInternal;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
+import android.content.ContentProvider;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
@@ -51,7 +52,6 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.ArrayMap;
-import android.util.ArraySet;
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.Xml.Encoding;
@@ -72,7 +72,6 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -91,13 +90,9 @@
 
     @GuardedBy("mLock")
     private final ArrayMap<Uri, PinnedSliceState> mPinnedSlicesByUri = new ArrayMap<>();
-    @GuardedBy("mLock")
-    private final ArraySet<SliceGrant> mUserGrants = new ArraySet<>();
     private final Handler mHandler;
-    @GuardedBy("mSliceAccessFile")
-    private final AtomicFile mSliceAccessFile;
-    @GuardedBy("mAccessList")
-    private final SliceFullAccessList mAccessList;
+
+    private final SlicePermissionManager mPermissions;
     private final UsageStatsManagerInternal mAppUsageStats;
 
     public SliceManagerService(Context context) {
@@ -113,24 +108,9 @@
         mAssistUtils = new AssistUtils(context);
         mHandler = new Handler(looper);
 
-        final File systemDir = new File(Environment.getDataDirectory(), "system");
-        mSliceAccessFile = new AtomicFile(new File(systemDir, "slice_access.xml"));
-        mAccessList = new SliceFullAccessList(mContext);
         mAppUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
 
-        synchronized (mSliceAccessFile) {
-            if (!mSliceAccessFile.exists()) return;
-            try {
-                InputStream input = mSliceAccessFile.openRead();
-                XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
-                parser.setInput(input, Encoding.UTF_8.name());
-                synchronized (mAccessList) {
-                    mAccessList.readXml(parser);
-                }
-            } catch (IOException | XmlPullParserException e) {
-                Slog.d(TAG, "Can't read slice access file", e);
-            }
-        }
+        mPermissions = new SlicePermissionManager(mContext, looper);
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED);
@@ -211,26 +191,58 @@
     }
 
     @Override
+    public void grantSlicePermission(String pkg, String toPkg, Uri uri) throws RemoteException {
+        verifyCaller(pkg);
+        int user = Binder.getCallingUserHandle().getIdentifier();
+        enforceOwner(pkg, uri, user);
+        mPermissions.grantSliceAccess(toPkg, user, pkg, user, uri);
+    }
+
+    @Override
+    public void revokeSlicePermission(String pkg, String toPkg, Uri uri) throws RemoteException {
+        verifyCaller(pkg);
+        int user = Binder.getCallingUserHandle().getIdentifier();
+        enforceOwner(pkg, uri, user);
+        mPermissions.revokeSliceAccess(toPkg, user, pkg, user, uri);
+    }
+
+    @Override
     public int checkSlicePermission(Uri uri, String pkg, int pid, int uid,
-            String[] autoGrantPermissions) throws RemoteException {
+            String[] autoGrantPermissions) {
+        int userId = UserHandle.getUserId(uid);
+        if (pkg == null) {
+            for (String p : mContext.getPackageManager().getPackagesForUid(uid)) {
+                if (checkSlicePermission(uri, p, pid, uid, autoGrantPermissions)
+                        == PERMISSION_GRANTED) {
+                    return PERMISSION_GRANTED;
+                }
+            }
+            return PERMISSION_DENIED;
+        }
+        if (hasFullSliceAccess(pkg, userId)) {
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        if (mPermissions.hasPermission(pkg, userId, uri)) {
+            return PackageManager.PERMISSION_GRANTED;
+        }
+        if (autoGrantPermissions != null) {
+            // Need to own the Uri to call in with permissions to grant.
+            enforceOwner(pkg, uri, userId);
+            for (String perm : autoGrantPermissions) {
+                if (mContext.checkPermission(perm, pid, uid) == PERMISSION_GRANTED) {
+                    int providerUser = ContentProvider.getUserIdFromUri(uri, userId);
+                    String providerPkg = getProviderPkg(uri, providerUser);
+                    mPermissions.grantSliceAccess(pkg, userId, providerPkg, providerUser, uri);
+                    return PackageManager.PERMISSION_GRANTED;
+                }
+            }
+        }
+        // Fallback to allowing uri permissions through.
         if (mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                 == PERMISSION_GRANTED) {
-            return SliceManager.PERMISSION_GRANTED;
+            return PackageManager.PERMISSION_GRANTED;
         }
-        if (hasFullSliceAccess(pkg, UserHandle.getUserId(uid))) {
-            return SliceManager.PERMISSION_GRANTED;
-        }
-        for (String perm : autoGrantPermissions) {
-            if (mContext.checkPermission(perm, pid, uid) == PERMISSION_GRANTED) {
-                return SliceManager.PERMISSION_USER_GRANTED;
-            }
-        }
-        synchronized (mLock) {
-            if (mUserGrants.contains(new SliceGrant(uri, pkg, UserHandle.getUserId(uid)))) {
-                return SliceManager.PERMISSION_USER_GRANTED;
-            }
-        }
-        return SliceManager.PERMISSION_DENIED;
+        return PackageManager.PERMISSION_DENIED;
     }
 
     @Override
@@ -238,16 +250,17 @@
         verifyCaller(callingPkg);
         getContext().enforceCallingOrSelfPermission(permission.MANAGE_SLICE_PERMISSIONS,
                 "Slice granting requires MANAGE_SLICE_PERMISSIONS");
+        int userId = Binder.getCallingUserHandle().getIdentifier();
         if (allSlices) {
-            synchronized (mAccessList) {
-                mAccessList.grantFullAccess(pkg, Binder.getCallingUserHandle().getIdentifier());
-            }
-            mHandler.post(mSaveAccessList);
+            mPermissions.grantFullAccess(pkg, userId);
         } else {
-            synchronized (mLock) {
-                mUserGrants.add(new SliceGrant(uri, pkg,
-                        Binder.getCallingUserHandle().getIdentifier()));
-            }
+            // When granting, grant to all slices in the provider.
+            Uri grantUri = uri.buildUpon()
+                    .path("")
+                    .build();
+            int providerUser = ContentProvider.getUserIdFromUri(grantUri, userId);
+            String providerPkg = getProviderPkg(grantUri, providerUser);
+            mPermissions.grantSliceAccess(pkg, userId, providerPkg, providerUser, grantUri);
         }
         long ident = Binder.clearCallingIdentity();
         try {
@@ -268,19 +281,17 @@
             Slog.w(TAG, "getBackupPayload: cannot backup policy for user " + user);
             return null;
         }
-        synchronized(mSliceAccessFile) {
-            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            try {
-                XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer();
-                out.setOutput(baos, Encoding.UTF_8.name());
-                synchronized (mAccessList) {
-                    mAccessList.writeXml(out, user);
-                }
-                out.flush();
-                return baos.toByteArray();
-            } catch (IOException | XmlPullParserException e) {
-                Slog.w(TAG, "getBackupPayload: error writing payload for user " + user, e);
-            }
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try {
+            XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer();
+            out.setOutput(baos, Encoding.UTF_8.name());
+
+            mPermissions.writeBackup(out);
+
+            out.flush();
+            return baos.toByteArray();
+        } catch (IOException | XmlPullParserException e) {
+            Slog.w(TAG, "getBackupPayload: error writing payload for user " + user, e);
         }
         return null;
     }
@@ -299,27 +310,21 @@
             Slog.w(TAG, "applyRestore: cannot restore policy for user " + user);
             return;
         }
-        synchronized(mSliceAccessFile) {
-            final ByteArrayInputStream bais = new ByteArrayInputStream(payload);
-            try {
-                XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
-                parser.setInput(bais, Encoding.UTF_8.name());
-                synchronized (mAccessList) {
-                    mAccessList.readXml(parser);
-                }
-                mHandler.post(mSaveAccessList);
-            } catch (NumberFormatException | XmlPullParserException | IOException e) {
-                Slog.w(TAG, "applyRestore: error reading payload", e);
-            }
+        final ByteArrayInputStream bais = new ByteArrayInputStream(payload);
+        try {
+            XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
+            parser.setInput(bais, Encoding.UTF_8.name());
+            mPermissions.readRestore(parser);
+        } catch (NumberFormatException | XmlPullParserException | IOException e) {
+            Slog.w(TAG, "applyRestore: error reading payload", e);
         }
     }
 
     ///  ----- internal code -----
-    private void removeFullAccess(String pkg, int userId) {
-        synchronized (mAccessList) {
-            mAccessList.removeGrant(pkg, userId);
+    private void enforceOwner(String pkg, Uri uri, int user) {
+        if (!Objects.equals(getProviderPkg(uri, user), pkg) || pkg == null) {
+            throw new SecurityException("Caller must own " + uri);
         }
-        mHandler.post(mSaveAccessList);
     }
 
     protected void removePinnedSlice(Uri uri) {
@@ -368,19 +373,7 @@
     }
 
     protected int checkAccess(String pkg, Uri uri, int uid, int pid) {
-        int user = UserHandle.getUserId(uid);
-        // Check for default launcher/assistant.
-        if (!hasFullSliceAccess(pkg, user)) {
-            // Also allow things with uri access.
-            if (getContext().checkUriPermission(uri, pid, uid,
-                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != PERMISSION_GRANTED) {
-                // Last fallback (if the calling app owns the authority, then it can have access).
-                if (!Objects.equals(getProviderPkg(uri, user), pkg)) {
-                    return PERMISSION_DENIED;
-                }
-            }
-        }
-        return PERMISSION_GRANTED;
+        return checkSlicePermission(uri, pkg, uid, pid, null);
     }
 
     private String getProviderPkg(Uri uri, int user) {
@@ -425,15 +418,11 @@
     private void enforceAccess(String pkg, Uri uri) throws RemoteException {
         if (checkAccess(pkg, uri, Binder.getCallingUid(), Binder.getCallingPid())
                 != PERMISSION_GRANTED) {
-            throw new SecurityException("Access to slice " + uri + " is required");
-        }
-        enforceCrossUser(pkg, uri);
-    }
-
-    private void enforceFullAccess(String pkg, String name, Uri uri) {
-        int user = Binder.getCallingUserHandle().getIdentifier();
-        if (!hasFullSliceAccess(pkg, user)) {
-            throw new SecurityException(String.format("Call %s requires full slice access", name));
+            int userId = ContentProvider.getUserIdFromUri(uri,
+                    Binder.getCallingUserHandle().getIdentifier());
+            if (!Objects.equals(pkg, getProviderPkg(uri, userId))) {
+                throw new SecurityException("Access to slice " + uri + " is required");
+            }
         }
         enforceCrossUser(pkg, uri);
     }
@@ -513,9 +502,7 @@
     }
 
     private boolean isGrantedFullAccess(String pkg, int userId) {
-        synchronized (mAccessList) {
-            return mAccessList.hasFullAccess(pkg, userId);
-        }
+        return mPermissions.hasFullAccess(pkg, userId);
     }
 
     private static ServiceThread createHandler() {
@@ -525,34 +512,6 @@
         return handlerThread;
     }
 
-    private final Runnable mSaveAccessList = new Runnable() {
-        @Override
-        public void run() {
-            synchronized (mSliceAccessFile) {
-                final FileOutputStream stream;
-                try {
-                    stream = mSliceAccessFile.startWrite();
-                } catch (IOException e) {
-                    Slog.w(TAG, "Failed to save access file", e);
-                    return;
-                }
-
-                try {
-                    XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer();
-                    out.setOutput(stream, Encoding.UTF_8.name());
-                    synchronized (mAccessList) {
-                        mAccessList.writeXml(out, UserHandle.USER_ALL);
-                    }
-                    out.flush();
-                    mSliceAccessFile.finishWrite(stream);
-                } catch (IOException | XmlPullParserException e) {
-                    Slog.w(TAG, "Failed to save access file, restoring backup", e);
-                    mSliceAccessFile.failWrite(stream);
-                }
-            }
-        }
-    };
-
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -572,11 +531,11 @@
                     final boolean replacing =
                             intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
                     if (!replacing) {
-                        removeFullAccess(pkg, userId);
+                        mPermissions.removePkg(pkg, userId);
                     }
                     break;
                 case Intent.ACTION_PACKAGE_DATA_CLEARED:
-                    removeFullAccess(pkg, userId);
+                    mPermissions.removePkg(pkg, userId);
                     break;
             }
         }
diff --git a/services/core/java/com/android/server/slice/SlicePermissionManager.java b/services/core/java/com/android/server/slice/SlicePermissionManager.java
new file mode 100644
index 0000000..d25ec89
--- /dev/null
+++ b/services/core/java/com/android/server/slice/SlicePermissionManager.java
@@ -0,0 +1,432 @@
+/*
+ * 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.slice;
+
+import android.content.ContentProvider;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.text.format.DateUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.AtomicFile;
+import android.util.Log;
+import android.util.Slog;
+import android.util.Xml.Encoding;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.XmlUtils;
+import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Objects;
+
+public class SlicePermissionManager implements DirtyTracker {
+
+    private static final String TAG = "SlicePermissionManager";
+
+    /**
+     * The amount of time we'll cache a SliceProviderPermissions or SliceClientPermissions
+     * in case they are used again.
+     */
+    private static final long PERMISSION_CACHE_PERIOD = 5 * DateUtils.MINUTE_IN_MILLIS;
+
+    /**
+     * The amount of time we delay flushing out permission changes to disk because they usually
+     * come in short bursts.
+     */
+    private static final long WRITE_GRACE_PERIOD = 500;
+
+    private static final String SLICE_DIR = "slice";
+
+    // If/when this bumps again we'll need to write it out in the disk somewhere.
+    // Currently we don't have a central file for this in version 2 and there is no
+    // reason to add one until we actually have incompatible version bumps.
+    // This does however block us from reading backups from P-DP1 which may contain
+    // a very different XML format for perms.
+    static final int DB_VERSION = 2;
+
+    private static final String TAG_LIST = "slice-access-list";
+    private final String ATT_VERSION = "version";
+
+    private final File mSliceDir;
+    private final Context mContext;
+    private final Handler mHandler;
+    private final ArrayMap<PkgUser, SliceProviderPermissions> mCachedProviders = new ArrayMap<>();
+    private final ArrayMap<PkgUser, SliceClientPermissions> mCachedClients = new ArrayMap<>();
+    private final ArraySet<Persistable> mDirty = new ArraySet<>();
+
+    @VisibleForTesting
+    SlicePermissionManager(Context context, Looper looper, File sliceDir) {
+        mContext = context;
+        mHandler = new H(looper);
+        mSliceDir = sliceDir;
+    }
+
+    public SlicePermissionManager(Context context, Looper looper) {
+        this(context, looper, new File(Environment.getDataDirectory(), "system/" + SLICE_DIR));
+    }
+
+    public void grantFullAccess(String pkg, int userId) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        SliceClientPermissions client = getClient(pkgUser);
+        client.setHasFullAccess(true);
+    }
+
+    public void grantSliceAccess(String pkg, int userId, String providerPkg, int providerUser,
+            Uri uri) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        PkgUser providerPkgUser = new PkgUser(providerPkg, providerUser);
+
+        SliceClientPermissions client = getClient(pkgUser);
+        client.grantUri(uri, providerPkgUser);
+
+        SliceProviderPermissions provider = getProvider(providerPkgUser);
+        provider.getOrCreateAuthority(ContentProvider.getUriWithoutUserId(uri).getAuthority())
+                .addPkg(pkgUser);
+    }
+
+    public void revokeSliceAccess(String pkg, int userId, String providerPkg, int providerUser,
+            Uri uri) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        PkgUser providerPkgUser = new PkgUser(providerPkg, providerUser);
+
+        SliceClientPermissions client = getClient(pkgUser);
+        client.revokeUri(uri, providerPkgUser);
+    }
+
+    public void removePkg(String pkg, int userId) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        SliceProviderPermissions provider = getProvider(pkgUser);
+
+        for (SliceAuthority authority : provider.getAuthorities()) {
+            for (PkgUser p : authority.getPkgs()) {
+                getClient(p).removeAuthority(authority.getAuthority(), userId);
+            }
+        }
+        SliceClientPermissions client = getClient(pkgUser);
+        client.clear();
+        mHandler.obtainMessage(H.MSG_REMOVE, pkgUser);
+    }
+
+    public boolean hasFullAccess(String pkg, int userId) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        return getClient(pkgUser).hasFullAccess();
+    }
+
+    public boolean hasPermission(String pkg, int userId, Uri uri) {
+        PkgUser pkgUser = new PkgUser(pkg, userId);
+        SliceClientPermissions client = getClient(pkgUser);
+        int providerUserId = ContentProvider.getUserIdFromUri(uri, userId);
+        return client.hasFullAccess()
+                || client.hasPermission(ContentProvider.getUriWithoutUserId(uri), providerUserId);
+    }
+
+    @Override
+    public void onPersistableDirty(Persistable obj) {
+        mHandler.removeMessages(H.MSG_PERSIST);
+        mHandler.obtainMessage(H.MSG_ADD_DIRTY, obj).sendToTarget();
+        mHandler.sendEmptyMessageDelayed(H.MSG_PERSIST, WRITE_GRACE_PERIOD);
+    }
+
+    public void writeBackup(XmlSerializer out) throws IOException, XmlPullParserException {
+        synchronized (this) {
+            out.startTag(null, TAG_LIST);
+            out.attribute(null, ATT_VERSION, String.valueOf(DB_VERSION));
+
+            // Don't do anything with changes from the backup, because there shouldn't be any.
+            DirtyTracker tracker = obj -> { };
+            if (mHandler.hasMessages(H.MSG_PERSIST)) {
+                mHandler.removeMessages(H.MSG_PERSIST);
+                handlePersist();
+            }
+            for (String file : new File(mSliceDir.getAbsolutePath()).list()) {
+                if (file.isEmpty()) continue;
+                try (ParserHolder parser = getParser(file)) {
+                    Persistable p;
+                    while (parser.parser.getEventType() != XmlPullParser.START_TAG) {
+                        parser.parser.next();
+                    }
+                    if (SliceClientPermissions.TAG_CLIENT.equals(parser.parser.getName())) {
+                        p = SliceClientPermissions.createFrom(parser.parser, tracker);
+                    } else {
+                        p = SliceProviderPermissions.createFrom(parser.parser, tracker);
+                    }
+                    p.writeTo(out);
+                }
+            }
+
+            out.endTag(null, TAG_LIST);
+        }
+    }
+
+    public void readRestore(XmlPullParser parser) throws IOException, XmlPullParserException {
+        synchronized (this) {
+            while ((parser.getEventType() != XmlPullParser.START_TAG
+                    || !TAG_LIST.equals(parser.getName()))
+                    && parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+                parser.next();
+            }
+            int xmlVersion = XmlUtils.readIntAttribute(parser, ATT_VERSION, 0);
+            if (xmlVersion < DB_VERSION) {
+                // No conversion support right now.
+                return;
+            }
+            while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+                if (parser.getEventType() == XmlPullParser.START_TAG) {
+                    if (SliceClientPermissions.TAG_CLIENT.equals(parser.getName())) {
+                        SliceClientPermissions client = SliceClientPermissions.createFrom(parser,
+                                this);
+                        synchronized (mCachedClients) {
+                            mCachedClients.put(client.getPkg(), client);
+                        }
+                        onPersistableDirty(client);
+                        mHandler.sendMessageDelayed(
+                                mHandler.obtainMessage(H.MSG_CLEAR_CLIENT, client.getPkg()),
+                                PERMISSION_CACHE_PERIOD);
+                    } else if (SliceProviderPermissions.TAG_PROVIDER.equals(parser.getName())) {
+                        SliceProviderPermissions provider = SliceProviderPermissions.createFrom(
+                                parser, this);
+                        synchronized (mCachedProviders) {
+                            mCachedProviders.put(provider.getPkg(), provider);
+                        }
+                        onPersistableDirty(provider);
+                        mHandler.sendMessageDelayed(
+                                mHandler.obtainMessage(H.MSG_CLEAR_PROVIDER, provider.getPkg()),
+                                PERMISSION_CACHE_PERIOD);
+                    } else {
+                        parser.next();
+                    }
+                } else {
+                    parser.next();
+                }
+            }
+        }
+    }
+
+    private SliceClientPermissions getClient(PkgUser pkgUser) {
+        SliceClientPermissions client;
+        synchronized (mCachedClients) {
+            client = mCachedClients.get(pkgUser);
+        }
+        if (client == null) {
+            try (ParserHolder parser = getParser(SliceClientPermissions.getFileName(pkgUser))) {
+                client = SliceClientPermissions.createFrom(parser.parser, this);
+                synchronized (mCachedClients) {
+                    mCachedClients.put(pkgUser, client);
+                }
+                mHandler.sendMessageDelayed(mHandler.obtainMessage(H.MSG_CLEAR_CLIENT, pkgUser),
+                        PERMISSION_CACHE_PERIOD);
+                return client;
+            } catch (FileNotFoundException e) {
+                // No client exists yet.
+            } catch (IOException e) {
+                Log.e(TAG, "Can't read client", e);
+            } catch (XmlPullParserException e) {
+                Log.e(TAG, "Can't read client", e);
+            }
+            // Can't read or no permissions exist, create a clean object.
+            client = new SliceClientPermissions(pkgUser, this);
+        }
+        return client;
+    }
+
+    private SliceProviderPermissions getProvider(PkgUser pkgUser) {
+        SliceProviderPermissions provider;
+        synchronized (mCachedProviders) {
+            provider = mCachedProviders.get(pkgUser);
+        }
+        if (provider == null) {
+            try (ParserHolder parser = getParser(SliceProviderPermissions.getFileName(pkgUser))) {
+                provider = SliceProviderPermissions.createFrom(parser.parser, this);
+                synchronized (mCachedProviders) {
+                    mCachedProviders.put(pkgUser, provider);
+                }
+                mHandler.sendMessageDelayed(mHandler.obtainMessage(H.MSG_CLEAR_PROVIDER, pkgUser),
+                        PERMISSION_CACHE_PERIOD);
+                return provider;
+            } catch (FileNotFoundException e) {
+                // No provider exists yet.
+            } catch (IOException e) {
+                Log.e(TAG, "Can't read provider", e);
+            } catch (XmlPullParserException e) {
+                Log.e(TAG, "Can't read provider", e);
+            }
+            // Can't read or no permissions exist, create a clean object.
+            provider = new SliceProviderPermissions(pkgUser, this);
+        }
+        return provider;
+    }
+
+    private ParserHolder getParser(String fileName)
+            throws FileNotFoundException, XmlPullParserException {
+        AtomicFile file = getFile(fileName);
+        ParserHolder holder = new ParserHolder();
+        holder.input = file.openRead();
+        holder.parser = XmlPullParserFactory.newInstance().newPullParser();
+        holder.parser.setInput(holder.input, Encoding.UTF_8.name());
+        return holder;
+    }
+
+    private AtomicFile getFile(String fileName) {
+        if (!mSliceDir.exists()) {
+            mSliceDir.mkdir();
+        }
+        return new AtomicFile(new File(mSliceDir, fileName));
+    }
+
+    private void handlePersist() {
+        synchronized (this) {
+            for (Persistable persistable : mDirty) {
+                AtomicFile file = getFile(persistable.getFileName());
+                final FileOutputStream stream;
+                try {
+                    stream = file.startWrite();
+                } catch (IOException e) {
+                    Slog.w(TAG, "Failed to save access file", e);
+                    return;
+                }
+
+                try {
+                    XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer();
+                    out.setOutput(stream, Encoding.UTF_8.name());
+
+                    persistable.writeTo(out);
+
+                    out.flush();
+                    file.finishWrite(stream);
+                } catch (IOException | XmlPullParserException e) {
+                    Slog.w(TAG, "Failed to save access file, restoring backup", e);
+                    file.failWrite(stream);
+                }
+            }
+            mDirty.clear();
+        }
+    }
+
+    private void handleRemove(PkgUser pkgUser) {
+        getFile(SliceClientPermissions.getFileName(pkgUser)).delete();
+        getFile(SliceProviderPermissions.getFileName(pkgUser)).delete();
+        mDirty.remove(mCachedClients.remove(pkgUser));
+        mDirty.remove(mCachedProviders.remove(pkgUser));
+    }
+
+    private final class H extends Handler {
+        private static final int MSG_ADD_DIRTY = 1;
+        private static final int MSG_PERSIST = 2;
+        private static final int MSG_REMOVE = 3;
+        private static final int MSG_CLEAR_CLIENT = 4;
+        private static final int MSG_CLEAR_PROVIDER = 5;
+
+        public H(Looper looper) {
+            super(looper);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_ADD_DIRTY:
+                    mDirty.add((Persistable) msg.obj);
+                    break;
+                case MSG_PERSIST:
+                    handlePersist();
+                    break;
+                case MSG_REMOVE:
+                    handleRemove((PkgUser) msg.obj);
+                    break;
+                case MSG_CLEAR_CLIENT:
+                    synchronized (mCachedClients) {
+                        mCachedClients.remove(msg.obj);
+                    }
+                    break;
+                case MSG_CLEAR_PROVIDER:
+                    synchronized (mCachedProviders) {
+                        mCachedProviders.remove(msg.obj);
+                    }
+                    break;
+            }
+        }
+    }
+
+    public static class PkgUser {
+        private static final String SEPARATOR = "@";
+        private static final String FORMAT = "%s" + SEPARATOR + "%d";
+        private final String mPkg;
+        private final int mUserId;
+
+        public PkgUser(String pkg, int userId) {
+            mPkg = pkg;
+            mUserId = userId;
+        }
+
+        public PkgUser(String pkgUserStr) throws IllegalArgumentException {
+            try {
+                String[] vals = pkgUserStr.split(SEPARATOR, 2);
+                mPkg = vals[0];
+                mUserId = Integer.parseInt(vals[1]);
+            } catch (Exception e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        public String getPkg() {
+            return mPkg;
+        }
+
+        public int getUserId() {
+            return mUserId;
+        }
+
+        @Override
+        public int hashCode() {
+            return mPkg.hashCode() + mUserId;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!getClass().equals(obj != null ? obj.getClass() : null)) return false;
+            PkgUser other = (PkgUser) obj;
+            return Objects.equals(other.mPkg, mPkg) && other.mUserId == mUserId;
+        }
+
+        @Override
+        public String toString() {
+            return String.format(FORMAT, mPkg, mUserId);
+        }
+    }
+
+    private class ParserHolder implements AutoCloseable {
+
+        private InputStream input;
+        private XmlPullParser parser;
+
+        @Override
+        public void close() throws IOException {
+            input.close();
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/slice/SliceProviderPermissions.java b/services/core/java/com/android/server/slice/SliceProviderPermissions.java
new file mode 100644
index 0000000..6e602d5
--- /dev/null
+++ b/services/core/java/com/android/server/slice/SliceProviderPermissions.java
@@ -0,0 +1,204 @@
+/*
+ * 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.slice;
+
+import android.annotation.NonNull;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.server.slice.DirtyTracker.Persistable;
+import com.android.server.slice.SlicePermissionManager.PkgUser;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Objects;
+
+public class SliceProviderPermissions implements DirtyTracker, Persistable {
+
+    private static final String TAG = "SliceProviderPermissions";
+
+    static final String TAG_PROVIDER = "provider";
+    private static final String TAG_AUTHORITY = "authority";
+    private static final String TAG_PKG = "pkg";
+    private static final String NAMESPACE = null;
+
+    private static final String ATTR_PKG = "pkg";
+    private static final String ATTR_AUTHORITY = "authority";
+
+    private final PkgUser mPkg;
+    private final ArrayMap<String, SliceAuthority> mAuths = new ArrayMap<>();
+    private final DirtyTracker mTracker;
+
+    public SliceProviderPermissions(@NonNull PkgUser pkg, @NonNull DirtyTracker tracker) {
+        mPkg = pkg;
+        mTracker = tracker;
+    }
+
+    public PkgUser getPkg() {
+        return mPkg;
+    }
+
+    public synchronized Collection<SliceAuthority> getAuthorities() {
+        return new ArrayList<>(mAuths.values());
+    }
+
+    public synchronized SliceAuthority getOrCreateAuthority(String authority) {
+        SliceAuthority ret = mAuths.get(authority);
+        if (ret == null) {
+            ret = new SliceAuthority(authority, this);
+            mAuths.put(authority, ret);
+            onPersistableDirty(ret);
+        }
+        return ret;
+    }
+
+    @Override
+    public void onPersistableDirty(Persistable obj) {
+        mTracker.onPersistableDirty(this);
+    }
+
+    @Override
+    public String getFileName() {
+        return getFileName(mPkg);
+    }
+
+    public synchronized void writeTo(XmlSerializer out) throws IOException {
+        out.startTag(NAMESPACE, TAG_PROVIDER);
+        out.attribute(NAMESPACE, ATTR_PKG, mPkg.toString());
+
+        final int N = mAuths.size();
+        for (int i = 0; i < N; i++) {
+            out.startTag(NAMESPACE, TAG_AUTHORITY);
+            out.attribute(NAMESPACE, ATTR_AUTHORITY, mAuths.valueAt(i).mAuthority);
+
+            mAuths.valueAt(i).writeTo(out);
+
+            out.endTag(NAMESPACE, TAG_AUTHORITY);
+        }
+
+        out.endTag(NAMESPACE, TAG_PROVIDER);
+    }
+
+    public static SliceProviderPermissions createFrom(XmlPullParser parser, DirtyTracker tracker)
+            throws XmlPullParserException, IOException {
+        // Get to the beginning of the provider.
+        while (parser.getEventType() != XmlPullParser.START_TAG
+                || !TAG_PROVIDER.equals(parser.getName())) {
+            parser.next();
+        }
+        int depth = parser.getDepth();
+        PkgUser pkgUser = new PkgUser(parser.getAttributeValue(NAMESPACE, ATTR_PKG));
+        SliceProviderPermissions provider = new SliceProviderPermissions(pkgUser, tracker);
+        parser.next();
+
+        while (parser.getDepth() > depth) {
+            if (parser.getEventType() == XmlPullParser.START_TAG
+                    && TAG_AUTHORITY.equals(parser.getName())) {
+                try {
+                    SliceAuthority authority = new SliceAuthority(
+                            parser.getAttributeValue(NAMESPACE, ATTR_AUTHORITY), provider);
+                    authority.readFrom(parser);
+                    provider.mAuths.put(authority.getAuthority(), authority);
+                } catch (IllegalArgumentException e) {
+                    Slog.e(TAG, "Couldn't read PkgUser", e);
+                }
+            }
+
+            parser.next();
+        }
+        return provider;
+    }
+
+    public static String getFileName(PkgUser pkg) {
+        return String.format("provider_%s", pkg.toString());
+    }
+
+    public static class SliceAuthority implements Persistable {
+        private final String mAuthority;
+        private final DirtyTracker mTracker;
+        private final ArraySet<PkgUser> mPkgs = new ArraySet<>();
+
+        public SliceAuthority(String authority, DirtyTracker tracker) {
+            mAuthority = authority;
+            mTracker = tracker;
+        }
+
+        public String getAuthority() {
+            return mAuthority;
+        }
+
+        public synchronized void addPkg(PkgUser pkg) {
+            if (mPkgs.add(pkg)) {
+                mTracker.onPersistableDirty(this);
+            }
+        }
+
+        public synchronized void removePkg(PkgUser pkg) {
+            if (mPkgs.remove(pkg)) {
+                mTracker.onPersistableDirty(this);
+            }
+        }
+
+        public synchronized Collection<PkgUser> getPkgs() {
+            return new ArraySet<>(mPkgs);
+        }
+
+        @Override
+        public String getFileName() {
+            return null;
+        }
+
+        public synchronized void writeTo(XmlSerializer out) throws IOException {
+            final int N = mPkgs.size();
+            for (int i = 0; i < N; i++) {
+                out.startTag(NAMESPACE, TAG_PKG);
+                out.text(mPkgs.valueAt(i).toString());
+                out.endTag(NAMESPACE, TAG_PKG);
+            }
+        }
+
+        public synchronized void readFrom(XmlPullParser parser)
+                throws IOException, XmlPullParserException {
+            parser.next();
+            int depth = parser.getDepth();
+            while (parser.getDepth() >= depth) {
+                if (parser.getEventType() == XmlPullParser.START_TAG
+                        && TAG_PKG.equals(parser.getName())) {
+                    mPkgs.add(new PkgUser(parser.nextText()));
+                }
+                parser.next();
+            }
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (!getClass().equals(obj != null ? obj.getClass() : null)) return false;
+            SliceAuthority other = (SliceAuthority) obj;
+            return Objects.equals(mAuthority, other.mAuthority)
+                    && Objects.equals(mPkgs, other.mPkgs);
+        }
+
+        @Override
+        public String toString() {
+            return String.format("(%s: %s)", mAuthority, mPkgs.toString());
+        }
+    }
+}
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index fae0b24..5f2ac4f 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -273,7 +273,8 @@
 
         // Add in all the apps for every user/profile.
         for (UserInfo profile : users) {
-            List<PackageInfo> pi = pm.getInstalledPackagesAsUser(0, profile.id);
+            List<PackageInfo> pi =
+                pm.getInstalledPackagesAsUser(PackageManager.MATCH_DISABLED_COMPONENTS, profile.id);
             for (int j = 0; j < pi.size(); j++) {
                 if (pi.get(j).applicationInfo != null) {
                     uids.add(pi.get(j).applicationInfo.uid);
@@ -379,7 +380,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             if (DEBUG)
-                Slog.d(TAG, "Time to poll something.");
+                Slog.d(TAG, "Time to trigger periodic alarm.");
             synchronized (sStatsdLock) {
                 if (sStatsd == null) {
                     Slog.w(TAG, "Could not access statsd to inform it of periodic alarm firing.");
@@ -455,13 +456,13 @@
     public void setAlarmForSubscriberTriggering(long timestampMs) {
         enforceCallingPermission();
         if (DEBUG)
-            Slog.d(TAG, "Setting periodic alarm at " + timestampMs);
+            Slog.d(TAG, "Setting periodic alarm in about " +
+                    (timestampMs - SystemClock.elapsedRealtime()));
         final long callingToken = Binder.clearCallingIdentity();
         try {
             // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will
             // only fire when it awakens.
-            // This alarm is inexact, leaving its exactness completely up to the OS optimizations.
-            mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
+            mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, mPeriodicAlarmIntent);
         } finally {
             Binder.restoreCallingIdentity(callingToken);
         }
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 8af1101..2db8039 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -23,7 +23,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.Rect;
-import android.hardware.biometrics.IBiometricDialogReceiver;
+import android.hardware.biometrics.IBiometricPromptReceiver;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
@@ -547,7 +547,7 @@
     }
 
     @Override
-    public void showFingerprintDialog(Bundle bundle, IBiometricDialogReceiver receiver) {
+    public void showFingerprintDialog(Bundle bundle, IBiometricPromptReceiver receiver) {
         if (mBar != null) {
             try {
                 mBar.showFingerprintDialog(bundle, receiver);
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index 6df7092..2742b0f 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -37,7 +37,8 @@
 import android.util.SparseArray;
 import android.view.textclassifier.SelectionEvent;
 import android.view.textclassifier.TextClassification;
-import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextClassificationContext;
+import android.view.textclassifier.TextClassificationSessionId;
 import android.view.textclassifier.TextLinks;
 import android.view.textclassifier.TextSelection;
 
@@ -121,22 +122,21 @@
 
     @Override
     public void onSuggestSelection(
-            CharSequence text, int selectionStartIndex, int selectionEndIndex,
-            TextSelection.Options options, ITextSelectionCallback callback)
+            TextClassificationSessionId sessionId,
+            TextSelection.Request request, ITextSelectionCallback callback)
             throws RemoteException {
-        validateInput(text, selectionStartIndex, selectionEndIndex, callback);
+        Preconditions.checkNotNull(request);
+        Preconditions.checkNotNull(callback);
 
         synchronized (mLock) {
             UserState userState = getCallingUserStateLocked();
             if (!userState.bindLocked()) {
                 callback.onFailure();
             } else if (userState.isBoundLocked()) {
-                userState.mService.onSuggestSelection(
-                        text, selectionStartIndex, selectionEndIndex, options, callback);
+                userState.mService.onSuggestSelection(sessionId, request, callback);
             } else {
                 userState.mPendingRequests.add(new PendingRequest(
-                        () -> onSuggestSelection(
-                                text, selectionStartIndex, selectionEndIndex, options, callback),
+                        () -> onSuggestSelection(sessionId, request, callback),
                         callback::onFailure, callback.asBinder(), this, userState));
             }
         }
@@ -144,20 +144,21 @@
 
     @Override
     public void onClassifyText(
-            CharSequence text, int startIndex, int endIndex,
-            TextClassification.Options options, ITextClassificationCallback callback)
+            TextClassificationSessionId sessionId,
+            TextClassification.Request request, ITextClassificationCallback callback)
             throws RemoteException {
-        validateInput(text, startIndex, endIndex, callback);
+        Preconditions.checkNotNull(request);
+        Preconditions.checkNotNull(callback);
 
         synchronized (mLock) {
             UserState userState = getCallingUserStateLocked();
             if (!userState.bindLocked()) {
                 callback.onFailure();
             } else if (userState.isBoundLocked()) {
-                userState.mService.onClassifyText(text, startIndex, endIndex, options, callback);
+                userState.mService.onClassifyText(sessionId, request, callback);
             } else {
                 userState.mPendingRequests.add(new PendingRequest(
-                        () -> onClassifyText(text, startIndex, endIndex, options, callback),
+                        () -> onClassifyText(sessionId, request, callback),
                         callback::onFailure, callback.asBinder(), this, userState));
             }
         }
@@ -165,35 +166,77 @@
 
     @Override
     public void onGenerateLinks(
-            CharSequence text, TextLinks.Options options, ITextLinksCallback callback)
+            TextClassificationSessionId sessionId,
+            TextLinks.Request request, ITextLinksCallback callback)
             throws RemoteException {
-        validateInput(text, callback);
+        Preconditions.checkNotNull(request);
+        Preconditions.checkNotNull(callback);
 
         synchronized (mLock) {
             UserState userState = getCallingUserStateLocked();
             if (!userState.bindLocked()) {
                 callback.onFailure();
             } else if (userState.isBoundLocked()) {
-                userState.mService.onGenerateLinks(text, options, callback);
+                userState.mService.onGenerateLinks(sessionId, request, callback);
             } else {
                 userState.mPendingRequests.add(new PendingRequest(
-                        () -> onGenerateLinks(text, options, callback),
+                        () -> onGenerateLinks(sessionId, request, callback),
                         callback::onFailure, callback.asBinder(), this, userState));
             }
         }
     }
 
     @Override
-    public void onSelectionEvent(SelectionEvent event) throws RemoteException {
-        validateInput(event, mContext);
+    public void onSelectionEvent(
+            TextClassificationSessionId sessionId, SelectionEvent event) throws RemoteException {
+        Preconditions.checkNotNull(event);
+        validateInput(event.getPackageName(), mContext);
 
         synchronized (mLock) {
             UserState userState = getCallingUserStateLocked();
             if (userState.isBoundLocked()) {
-                userState.mService.onSelectionEvent(event);
+                userState.mService.onSelectionEvent(sessionId, event);
             } else {
                 userState.mPendingRequests.add(new PendingRequest(
-                        () -> onSelectionEvent(event),
+                        () -> onSelectionEvent(sessionId, event),
+                        null /* onServiceFailure */, null /* binder */, this, userState));
+            }
+        }
+    }
+
+    @Override
+    public void onCreateTextClassificationSession(
+            TextClassificationContext classificationContext, TextClassificationSessionId sessionId)
+            throws RemoteException {
+        Preconditions.checkNotNull(sessionId);
+        Preconditions.checkNotNull(classificationContext);
+        validateInput(classificationContext.getPackageName(), mContext);
+
+        synchronized (mLock) {
+            UserState userState = getCallingUserStateLocked();
+            if (userState.isBoundLocked()) {
+                userState.mService.onCreateTextClassificationSession(
+                        classificationContext, sessionId);
+            } else {
+                userState.mPendingRequests.add(new PendingRequest(
+                        () -> onCreateTextClassificationSession(classificationContext, sessionId),
+                        null /* onServiceFailure */, null /* binder */, this, userState));
+            }
+        }
+    }
+
+    @Override
+    public void onDestroyTextClassificationSession(TextClassificationSessionId sessionId)
+            throws RemoteException {
+        Preconditions.checkNotNull(sessionId);
+
+        synchronized (mLock) {
+            UserState userState = getCallingUserStateLocked();
+            if (userState.isBoundLocked()) {
+                userState.mService.onDestroyTextClassificationSession(sessionId);
+            } else {
+                userState.mPendingRequests.add(new PendingRequest(
+                        () -> onDestroyTextClassificationSession(sessionId),
                         null /* onServiceFailure */, null /* binder */, this, userState));
             }
         }
@@ -277,31 +320,11 @@
                 e -> Slog.d(LOG_TAG, "Error " + opDesc + ": " + e.getMessage()));
     }
 
-    private static void validateInput(
-            CharSequence text, int startIndex, int endIndex, Object callback)
-            throws RemoteException {
-        try {
-            TextClassifier.Utils.validate(text, startIndex, endIndex, true /* allowInMainThread */);
-            Preconditions.checkNotNull(callback);
-        } catch (IllegalArgumentException | NullPointerException e) {
-            throw new RemoteException(e.getMessage());
-        }
-    }
-
-    private static void validateInput(CharSequence text, Object callback) throws RemoteException {
-        try {
-            TextClassifier.Utils.validate(text, true /* allowInMainThread */);
-            Preconditions.checkNotNull(callback);
-        } catch (IllegalArgumentException | NullPointerException e) {
-            throw new RemoteException(e.getMessage());
-        }
-    }
-
-    private static void validateInput(SelectionEvent event, Context context)
+    private static void validateInput(String packageName, Context context)
             throws RemoteException {
         try {
             final int uid = context.getPackageManager()
-                    .getPackageUid(event.getPackageName(), 0);
+                    .getPackageUid(packageName, 0);
             Preconditions.checkArgument(Binder.getCallingUid() == uid);
         } catch (IllegalArgumentException | NullPointerException |
                 PackageManager.NameNotFoundException e) {
@@ -335,7 +358,6 @@
 
         @GuardedBy("mLock")
         private void handlePendingRequestsLocked() {
-            // TODO(b/72481146): Implement PendingRequest similar to that in RemoteFillService.
             PendingRequest request;
             while ((request = mPendingRequests.poll()) != null) {
                 if (isBoundLocked()) {
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 641a1ba..608d0aa 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -1102,35 +1102,37 @@
                         }
                     }
 
-                    // Account for the space this window takes if the window
-                    // is not an accessibility overlay which does not change
-                    // the reported windows.
                     if (windowState.mAttrs.type !=
                             WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+
+                        // Account for the space this window takes if the window
+                        // is not an accessibility overlay which does not change
+                        // the reported windows.
                         unaccountedSpace.op(boundsInScreen, unaccountedSpace,
                                 Region.Op.REVERSE_DIFFERENCE);
-                    }
 
-                    // If a window is modal it prevents other windows from being touched
-                    if ((flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
-                            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
-                        // Account for all space in the task, whether the windows in it are
-                        // touchable or not. The modal window blocks all touches from the task's
-                        // area.
-                        unaccountedSpace.op(windowState.getDisplayFrameLw(), unaccountedSpace,
-                                Region.Op.REVERSE_DIFFERENCE);
+                        // If a window is modal it prevents other windows from being touched
+                        if ((flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
+                            // Account for all space in the task, whether the windows in it are
+                            // touchable or not. The modal window blocks all touches from the task's
+                            // area.
+                            unaccountedSpace.op(windowState.getDisplayFrameLw(), unaccountedSpace,
+                                    Region.Op.REVERSE_DIFFERENCE);
 
-                        if (task != null) {
-                            // If the window is associated with a particular task, we can skip the
-                            // rest of the windows for that task.
-                            skipRemainingWindowsForTasks.add(task.mTaskId);
-                            continue;
-                        } else {
-                            // If the window is not associated with a particular task, then it is
-                            // globally modal. In this case we can skip all remaining windows.
-                            break;
+                            if (task != null) {
+                                // If the window is associated with a particular task, we can skip the
+                                // rest of the windows for that task.
+                                skipRemainingWindowsForTasks.add(task.mTaskId);
+                                continue;
+                            } else {
+                                // If the window is not associated with a particular task, then it is
+                                // globally modal. In this case we can skip all remaining windows.
+                                break;
+                            }
                         }
                     }
+
                     // We figured out what is touchable for the entire screen - done.
                     if (unaccountedSpace.isEmpty()) {
                         break;
diff --git a/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
index 416469b..9c00d1a 100644
--- a/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
+++ b/services/core/java/com/android/server/wm/AnimatingAppWindowTokenRegistry.java
@@ -37,6 +37,8 @@
 
     private ArrayList<Runnable> mTmpRunnableList = new ArrayList<>();
 
+    private boolean mEndingDeferredFinish;
+
     /**
      * Notifies that an {@link AppWindowToken} has started animating.
      */
@@ -50,6 +52,11 @@
     void notifyFinished(AppWindowToken token) {
         mAnimatingTokens.remove(token);
         mFinishedTokens.remove(token);
+
+        // If we were the last token, make sure the end all deferred finishes.
+        if (mAnimatingTokens.isEmpty()) {
+            endDeferringFinished();
+        }
     }
 
     /**
@@ -78,16 +85,28 @@
     }
 
     private void endDeferringFinished() {
-        // Copy it into a separate temp list to avoid modifying the collection while iterating as
-        // calling the callback may call back into notifyFinished.
-        for (int i = mFinishedTokens.size() - 1; i >= 0; i--) {
-            mTmpRunnableList.add(mFinishedTokens.valueAt(i));
+
+        // Don't start recursing. Running the finished listener invokes notifyFinished, which may
+        // invoked us again.
+        if (mEndingDeferredFinish) {
+            return;
         }
-        mFinishedTokens.clear();
-        for (int i = mTmpRunnableList.size() - 1; i >= 0; i--) {
-            mTmpRunnableList.get(i).run();
+        try {
+            mEndingDeferredFinish = true;
+
+            // Copy it into a separate temp list to avoid modifying the collection while iterating
+            // as calling the callback may call back into notifyFinished.
+            for (int i = mFinishedTokens.size() - 1; i >= 0; i--) {
+                mTmpRunnableList.add(mFinishedTokens.valueAt(i));
+            }
+            mFinishedTokens.clear();
+            for (int i = mTmpRunnableList.size() - 1; i >= 0; i--) {
+                mTmpRunnableList.get(i).run();
+            }
+            mTmpRunnableList.clear();
+        } finally {
+            mEndingDeferredFinish = false;
         }
-        mTmpRunnableList.clear();
     }
 
     void dump(PrintWriter pw, String header, String prefix) {
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index 1575694..165a409 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -113,63 +113,73 @@
         mListener.onWindowsGone();
     };
 
-    private final Runnable mAddStartingWindow = () -> {
-        final StartingData startingData;
-        final AppWindowToken container;
+    private final Runnable mAddStartingWindow = new Runnable() {
 
-        synchronized (mWindowMap) {
-            if (mContainer == null) {
-                if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "mContainer was null while trying to"
-                        + " add starting window");
+        @Override
+        public void run() {
+            final StartingData startingData;
+            final AppWindowToken container;
+
+            synchronized (mWindowMap) {
+                if (mContainer == null) {
+                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "mContainer was null while trying to"
+                            + " add starting window");
+                    return;
+                }
+
+                // There can only be one adding request, silly caller!
+                mService.mAnimationHandler.removeCallbacks(this);
+
+                startingData = mContainer.startingData;
+                container = mContainer;
+            }
+
+            if (startingData == null) {
+                // Animation has been canceled... do nothing.
+                if (DEBUG_STARTING_WINDOW)
+                    Slog.v(TAG_WM, "startingData was nulled out before handling"
+                            + " mAddStartingWindow: " + mContainer);
                 return;
             }
-            startingData = mContainer.startingData;
-            container = mContainer;
-        }
 
-        if (startingData == null) {
-            // Animation has been canceled... do nothing.
-            if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "startingData was nulled out before handling"
-                    + " mAddStartingWindow: " + mContainer);
-            return;
-        }
+            if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Add starting "
+                    + AppWindowContainerController.this + ": startingData="
+                    + container.startingData);
 
-        if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Add starting "
-                + this + ": startingData=" + container.startingData);
-
-        StartingSurface surface = null;
-        try {
-            surface = startingData.createStartingSurface(container);
-        } catch (Exception e) {
-            Slog.w(TAG_WM, "Exception when adding starting window", e);
-        }
-        if (surface != null) {
-            boolean abort = false;
-            synchronized(mWindowMap) {
-                // If the window was successfully added, then
-                // we need to remove it.
-                if (container.removed || container.startingData == null) {
-                    if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
-                            "Aborted starting " + container
-                                    + ": removed=" + container.removed
-                                    + " startingData=" + container.startingData);
-                    container.startingWindow = null;
-                    container.startingData = null;
-                    abort = true;
-                } else {
-                    container.startingSurface = surface;
+            StartingSurface surface = null;
+            try {
+                surface = startingData.createStartingSurface(container);
+            } catch (Exception e) {
+                Slog.w(TAG_WM, "Exception when adding starting window", e);
+            }
+            if (surface != null) {
+                boolean abort = false;
+                synchronized (mWindowMap) {
+                    // If the window was successfully added, then
+                    // we need to remove it.
+                    if (container.removed || container.startingData == null) {
+                        if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+                                "Aborted starting " + container
+                                        + ": removed=" + container.removed
+                                        + " startingData=" + container.startingData);
+                        container.startingWindow = null;
+                        container.startingData = null;
+                        abort = true;
+                    } else {
+                        container.startingSurface = surface;
+                    }
+                    if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG_WM,
+                            "Added starting " + mContainer
+                                    + ": startingWindow="
+                                    + container.startingWindow + " startingView="
+                                    + container.startingSurface);
                 }
-                if (DEBUG_STARTING_WINDOW && !abort) Slog.v(TAG_WM,
-                        "Added starting " + mContainer
-                                + ": startingWindow="
-                                + container.startingWindow + " startingView="
-                                + container.startingSurface);
+                if (abort) {
+                    surface.remove();
+                }
+            } else if (DEBUG_STARTING_WINDOW) {
+                Slog.v(TAG_WM, "Surface returned was null: " + mContainer);
             }
-            if (abort) {
-                surface.remove();
-            }
-        } else if (DEBUG_STARTING_WINDOW) {
-            Slog.v(TAG_WM, "Surface returned was null: " + mContainer);
         }
     };
 
@@ -558,8 +568,10 @@
         // Note: we really want to do sendMessageAtFrontOfQueue() because we
         // want to process the message ASAP, before any other queued
         // messages.
-        if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");
-        mService.mAnimationHandler.postAtFrontOfQueue(mAddStartingWindow);
+        if (!mService.mAnimationHandler.hasCallbacks(mAddStartingWindow)) {
+            if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Enqueueing ADD_STARTING");
+            mService.mAnimationHandler.postAtFrontOfQueue(mAddStartingWindow);
+        }
     }
 
     private boolean createSnapshot(TaskSnapshot snapshot) {
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index f19c554..9a4db65 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -1714,7 +1714,8 @@
                     adapter = new LocalAnimationAdapter(
                             new WindowAnimationSpec(a, mTmpPoint, mTmpRect,
                                     mService.mAppTransition.canSkipFirstFrame(),
-                                    mService.mAppTransition.getAppStackClipMode()),
+                                    mService.mAppTransition.getAppStackClipMode(),
+                                    true /* isAppAnimation */),
                             mService.mSurfaceAnimationRunner);
                     if (a.getZAdjustment() == Animation.ZORDER_TOP) {
                         mNeedsZBoost = true;
@@ -1887,7 +1888,7 @@
                 "AppWindowToken");
 
         clearThumbnail();
-        setClientHidden(hiddenRequested);
+        setClientHidden(isHidden() && hiddenRequested);
 
         if (mService.mInputMethodTarget != null && mService.mInputMethodTarget.mAppToken == this) {
             getDisplayContent().computeImeTarget(true /* updateImeTarget */);
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index ba67ff6..112d93c 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -161,7 +161,10 @@
 
         // Timeout callback to ensure we continue the animation if waiting for resuming or app
         // windows drawn fails
-        private final Runnable mResumeRunnable = () -> resume();
+        private final Runnable mResumeRunnable = () -> {
+            if (DEBUG) Slog.d(TAG, "pause: timed out waiting for windows drawn");
+            resume();
+        };
 
         BoundsAnimator(BoundsAnimationTarget target, Rect from, Rect to,
                 @SchedulePipModeChangedState int schedulePipModeChangedState,
@@ -213,7 +216,7 @@
 
                 // When starting an animation from fullscreen, pause here and wait for the
                 // windows-drawn signal before we start the rest of the transition down into PiP.
-                if (mMoveFromFullscreen) {
+                if (mMoveFromFullscreen && mTarget.shouldDeferStartOnMoveToFullscreen()) {
                     pause();
                 }
             } else if (mPrevSchedulePipModeChangedState == SCHEDULE_PIP_MODE_CHANGED_ON_END &&
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationTarget.java b/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
index 647a2d6..68be4e8 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationTarget.java
@@ -34,6 +34,12 @@
     void onAnimationStart(boolean schedulePipModeChangedCallback, boolean forceUpdate);
 
     /**
+     * @return Whether the animation should be paused waiting for the windows to draw before
+     *         entering PiP.
+     */
+    boolean shouldDeferStartOnMoveToFullscreen();
+
+    /**
      * Sets the size of the target (without any intermediate steps, like scheduling animation)
      * but freezes the bounds of any tasks in the target at taskBounds, to allow for more
      * flexibility during resizing. Only works for the pinned stack at the moment.  This will
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c4f2bd4..79eb2c9 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -3568,7 +3568,8 @@
                     if (s.inSplitScreenWindowingMode() && mSplitScreenDividerAnchor != null) {
                         t.setLayer(mSplitScreenDividerAnchor, layer++);
                     }
-                    if (s.isAppAnimating() && state != ALWAYS_ON_TOP_STATE) {
+                    if ((s.isTaskAnimating() || s.isAppAnimating())
+                            && state != ALWAYS_ON_TOP_STATE) {
                         // Ensure the animation layer ends up above the
                         // highest animating stack and no higher.
                         layerForAnimationLayer = layer++;
@@ -3727,8 +3728,12 @@
 
             mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
 
-            if (policy.isKeyguardShowingAndNotOccluded()
-                    || mService.mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE) {
+            // Only allow force setting the orientation when all unknown visibilities have been
+            // resolved, as otherwise we just may be starting another occluding activity.
+            final boolean isUnoccluding =
+                    mService.mAppTransition.getAppTransition() == TRANSIT_KEYGUARD_UNOCCLUDE
+                            && mService.mUnknownAppVisibilityController.allResolved();
+            if (policy.isKeyguardShowingAndNotOccluded() || isUnoccluding) {
                 return mLastKeyguardForcedOrientation;
             }
 
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 5e2bb10..2cd2ef1 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -666,13 +666,16 @@
         }
         final TaskStack topSecondaryStack = mDisplayContent.getTopStackInWindowingMode(
                 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
+        final RecentsAnimationController recentsAnim = mService.getRecentsAnimationController();
+        final boolean minimizedForRecentsAnimation = recentsAnim != null &&
+                recentsAnim.isSplitScreenMinimized();
         boolean homeVisible = homeTask.getTopVisibleAppToken() != null;
         if (homeVisible && topSecondaryStack != null) {
             // Home should only be considered visible if it is greater or equal to the top secondary
             // stack in terms of z-order.
             homeVisible = homeStack.compareTo(topSecondaryStack) >= 0;
         }
-        setMinimizedDockedStack(homeVisible, animate);
+        setMinimizedDockedStack(homeVisible || minimizedForRecentsAnimation, animate);
     }
 
     private boolean isWithinDisplay(Task task) {
diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
index 529aacc..d89d6f0 100644
--- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
@@ -146,6 +146,13 @@
             return false;
         }
 
+        /**
+         * @return {@code true} if we need to wake-up SurfaceFlinger earlier during this animation.
+         *
+         * @see Transaction#setEarlyWakeup
+         */
+        default boolean needsEarlyWakeup() { return false; }
+
         void dump(PrintWriter pw, String prefix);
 
         default void writeToProto(ProtoOutputStream proto, long fieldId) {
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 7274aee..bae93f3 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -18,8 +18,10 @@
 
 import static android.app.ActivityManagerInternal.APP_TRANSITION_RECENTS_ANIM;
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
 import static android.view.RemoteAnimationTarget.MODE_CLOSING;
 import static android.view.WindowManager.INPUT_CONSUMER_RECENTS_ANIMATION;
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
@@ -29,6 +31,7 @@
 import static com.android.server.wm.RemoteAnimationAdapterWrapperProto.TARGET;
 import static com.android.server.wm.AnimationAdapterProto.REMOTE;
 
+import android.annotation.IntDef;
 import android.app.ActivityManager.TaskSnapshot;
 import android.app.WindowConfiguration;
 import android.graphics.Point;
@@ -48,6 +51,7 @@
 import android.view.SurfaceControl;
 import android.view.SurfaceControl.Transaction;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.google.android.collect.Sets;
 
 import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
@@ -67,15 +71,28 @@
     private static final boolean DEBUG = false;
     private static final long FAILSAFE_DELAY = 1000;
 
+    public static final int REORDER_KEEP_IN_PLACE = 0;
+    public static final int REORDER_MOVE_TO_TOP = 1;
+    public static final int REORDER_MOVE_TO_ORIGINAL_POSITION = 2;
+
+    @IntDef(prefix = { "REORDER_MODE_" }, value = {
+            REORDER_KEEP_IN_PLACE,
+            REORDER_MOVE_TO_TOP,
+            REORDER_MOVE_TO_ORIGINAL_POSITION
+    })
+    public @interface ReorderMode {}
+
     private final WindowManagerService mService;
     private final IRecentsAnimationRunner mRunner;
     private final RecentsAnimationCallbacks mCallbacks;
     private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>();
     private final int mDisplayId;
-    private final Runnable mFailsafeRunnable = this::cancelAnimation;
+    private final Runnable mFailsafeRunnable = () -> {
+        cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
+    };
 
     // The recents component app token that is shown behind the visibile tasks
-    private AppWindowToken mHomeAppToken;
+    private AppWindowToken mTargetAppToken;
     private Rect mMinimizedHomeBounds = new Rect();
 
     // We start the RecentsAnimationController in a pending-start state since we need to wait for
@@ -84,16 +101,22 @@
     private boolean mPendingStart = true;
 
     // Set when the animation has been canceled
-    private boolean mCanceled = false;
+    private boolean mCanceled;
 
     // Whether or not the input consumer is enabled. The input consumer must be both registered and
     // enabled for it to start intercepting touch events.
     private boolean mInputConsumerEnabled;
 
-    private Rect mTmpRect = new Rect();
+    // Whether or not the recents animation should cause the primary split-screen stack to be
+    // minimized
+    private boolean mSplitScreenMinimized;
+
+    private final Rect mTmpRect = new Rect();
+
+    private boolean mLinkedToDeathOfRunner;
 
     public interface RecentsAnimationCallbacks {
-        void onAnimationFinished(boolean moveHomeToTop);
+        void onAnimationFinished(@ReorderMode int reorderMode);
     }
 
     private final IRecentsAnimationController mController =
@@ -102,7 +125,7 @@
         @Override
         public TaskSnapshot screenshotTask(int taskId) {
             if (DEBUG) Log.d(TAG, "screenshotTask(" + taskId + "): mCanceled=" + mCanceled);
-            long token = Binder.clearCallingIdentity();
+            final long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mService.getWindowManagerLock()) {
                     if (mCanceled) {
@@ -131,7 +154,7 @@
         @Override
         public void finish(boolean moveHomeToTop) {
             if (DEBUG) Log.d(TAG, "finish(" + moveHomeToTop + "): mCanceled=" + mCanceled);
-            long token = Binder.clearCallingIdentity();
+            final long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mService.getWindowManagerLock()) {
                     if (mCanceled) {
@@ -141,7 +164,9 @@
 
                 // Note, the callback will handle its own synchronization, do not lock on WM lock
                 // prior to calling the callback
-                mCallbacks.onAnimationFinished(moveHomeToTop);
+                mCallbacks.onAnimationFinished(moveHomeToTop
+                        ? REORDER_MOVE_TO_TOP
+                        : REORDER_MOVE_TO_ORIGINAL_POSITION);
             } finally {
                 Binder.restoreCallingIdentity(token);
             }
@@ -150,7 +175,7 @@
         @Override
         public void setAnimationTargetsBehindSystemBars(boolean behindSystemBars)
                 throws RemoteException {
-            long token = Binder.clearCallingIdentity();
+            final long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mService.getWindowManagerLock()) {
                     for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
@@ -167,7 +192,7 @@
         public void setInputConsumerEnabled(boolean enabled) {
             if (DEBUG) Log.d(TAG, "setInputConsumerEnabled(" + enabled + "): mCanceled="
                     + mCanceled);
-            long token = Binder.clearCallingIdentity();
+            final long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mService.getWindowManagerLock()) {
                     if (mCanceled) {
@@ -182,6 +207,23 @@
                 Binder.restoreCallingIdentity(token);
             }
         }
+
+        @Override
+        public void setSplitScreenMinimized(boolean minimized) {
+            final long token = Binder.clearCallingIdentity();
+            try {
+                synchronized (mService.getWindowManagerLock()) {
+                    if (mCanceled) {
+                        return;
+                    }
+
+                    mSplitScreenMinimized = minimized;
+                    mService.checkSplitScreenMinimizedChanged(true /* animate */);
+                }
+            } finally {
+                Binder.restoreCallingIdentity(token);
+            }
+        }
     };
 
     /**
@@ -203,7 +245,7 @@
      * because it may call cancelAnimation() which needs to properly clean up the controller
      * in the window manager.
      */
-    public void initialize(SparseBooleanArray recentTaskIds) {
+    public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) {
         // Make leashes for each of the visible tasks and add it to the recents animation to be
         // started
         final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId);
@@ -214,7 +256,7 @@
             final WindowConfiguration config = task.getWindowConfiguration();
             if (config.tasksAreFloating()
                     || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
-                    || config.getActivityType() == ACTIVITY_TYPE_HOME) {
+                    || config.getActivityType() == targetActivityType) {
                 continue;
             }
             addAnimation(task, !recentTaskIds.get(task.mTaskId));
@@ -222,23 +264,23 @@
 
         // Skip the animation if there is nothing to animate
         if (mPendingAnimations.isEmpty()) {
-            cancelAnimation();
+            cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
             return;
         }
 
         try {
-            mRunner.asBinder().linkToDeath(this, 0);
+            linkToDeathOfRunner();
         } catch (RemoteException e) {
-            cancelAnimation();
+            cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
             return;
         }
 
-        // Adjust the wallpaper visibility for the showing home activity
-        final AppWindowToken recentsComponentAppToken =
-                dc.getHomeStack().getTopChild().getTopFullscreenAppToken();
+        // Adjust the wallpaper visibility for the showing target activity
+        final AppWindowToken recentsComponentAppToken = dc.getStack(WINDOWING_MODE_UNDEFINED,
+                targetActivityType).getTopChild().getTopFullscreenAppToken();
         if (recentsComponentAppToken != null) {
             if (DEBUG) Log.d(TAG, "setHomeApp(" + recentsComponentAppToken.getName() + ")");
-            mHomeAppToken = recentsComponentAppToken;
+            mTargetAppToken = recentsComponentAppToken;
             if (recentsComponentAppToken.windowsCanBeWallpaperTarget()) {
                 dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
                 dc.setLayoutNeeded();
@@ -251,8 +293,10 @@
         mService.mWindowPlacerLocked.performSurfacePlacement();
     }
 
-    private void addAnimation(Task task, boolean isRecentTaskInvisible) {
+    @VisibleForTesting
+    AnimationAdapter addAnimation(Task task, boolean isRecentTaskInvisible) {
         if (DEBUG) Log.d(TAG, "addAnimation(" + task.getName() + ")");
+        // TODO: Refactor this to use the task's animator
         final SurfaceAnimator anim = new SurfaceAnimator(task, null /* animationFinishedCallback */,
                 mService);
         final TaskAnimationAdapter taskAdapter = new TaskAnimationAdapter(task,
@@ -260,6 +304,15 @@
         anim.startAnimation(task.getPendingTransaction(), taskAdapter, false /* hidden */);
         task.commitPendingTransaction();
         mPendingAnimations.add(taskAdapter);
+        return taskAdapter;
+    }
+
+    @VisibleForTesting
+    void removeAnimation(TaskAnimationAdapter taskAdapter) {
+        if (DEBUG) Log.d(TAG, "removeAnimation(" + taskAdapter.mTask.getName() + ")");
+        taskAdapter.mTask.setCanAffectSystemUiFlags(true);
+        taskAdapter.mCapturedFinishCallback.onAnimationFinished(taskAdapter);
+        mPendingAnimations.remove(taskAdapter);
     }
 
     void startAnimation() {
@@ -272,22 +325,33 @@
         try {
             final ArrayList<RemoteAnimationTarget> appAnimations = new ArrayList<>();
             for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
-                final RemoteAnimationTarget target =
-                        mPendingAnimations.get(i).createRemoteAnimationApp();
+                final TaskAnimationAdapter taskAdapter = mPendingAnimations.get(i);
+                final RemoteAnimationTarget target = taskAdapter.createRemoteAnimationApp();
                 if (target != null) {
                     appAnimations.add(target);
+                } else {
+                    removeAnimation(taskAdapter);
                 }
             }
+
+            // Skip the animation if there is nothing to animate
+            if (appAnimations.isEmpty()) {
+                cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
+                return;
+            }
+
             final RemoteAnimationTarget[] appTargets = appAnimations.toArray(
                     new RemoteAnimationTarget[appAnimations.size()]);
             mPendingStart = false;
 
-            final Rect minimizedHomeBounds =
-                    mHomeAppToken != null && mHomeAppToken.inSplitScreenSecondaryWindowingMode()
-                            ? mMinimizedHomeBounds : null;
-            final Rect contentInsets =
-                    mHomeAppToken != null && mHomeAppToken.findMainWindow() != null
-                            ? mHomeAppToken.findMainWindow().mContentInsets : null;
+            final Rect minimizedHomeBounds = mTargetAppToken != null
+                    && mTargetAppToken.inSplitScreenSecondaryWindowingMode()
+                            ? mMinimizedHomeBounds
+                            : null;
+            final Rect contentInsets = mTargetAppToken != null
+                    && mTargetAppToken.findMainWindow() != null
+                            ? mTargetAppToken.findMainWindow().mContentInsets
+                            : null;
             mRunner.onAnimationStart_New(mController, appTargets, contentInsets,
                     minimizedHomeBounds);
         } catch (RemoteException e) {
@@ -299,7 +363,7 @@
                 reasons).sendToTarget();
     }
 
-    void cancelAnimation() {
+    void cancelAnimation(@ReorderMode int reorderMode) {
         if (DEBUG) Log.d(TAG, "cancelAnimation()");
         synchronized (mService.getWindowManagerLock()) {
             if (mCanceled) {
@@ -314,26 +378,25 @@
                 Slog.e(TAG, "Failed to cancel recents animation", e);
             }
         }
+
         // Clean up and return to the previous app
         // Don't hold the WM lock here as it calls back to AM/RecentsAnimation
-        mCallbacks.onAnimationFinished(false /* moveHomeToTop */);
+        mCallbacks.onAnimationFinished(reorderMode);
     }
 
-    void cleanupAnimation(boolean moveHomeToTop) {
+    void cleanupAnimation(@ReorderMode int reorderMode) {
         if (DEBUG) Log.d(TAG, "cleanupAnimation(): mPendingAnimations="
                 + mPendingAnimations.size());
         for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
-            final TaskAnimationAdapter adapter = mPendingAnimations.get(i);
-            adapter.mTask.setCanAffectSystemUiFlags(true);
-            if (moveHomeToTop) {
-                adapter.mTask.dontAnimateDimExit();
+            final TaskAnimationAdapter taskAdapter = mPendingAnimations.get(i);
+            if (reorderMode == REORDER_MOVE_TO_TOP || reorderMode == REORDER_KEEP_IN_PLACE) {
+                taskAdapter.mTask.dontAnimateDimExit();
             }
-            adapter.mCapturedFinishCallback.onAnimationFinished(adapter);
+            removeAnimation(taskAdapter);
         }
-        mPendingAnimations.clear();
 
-        mRunner.asBinder().unlinkToDeath(this, 0);
-
+        unlinkToDeathOfRunner();
+        // Clear associated input consumers
         mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
         mService.destroyInputConsumer(INPUT_CONSUMER_RECENTS_ANIMATION);
     }
@@ -342,14 +405,28 @@
         mService.mH.postDelayed(mFailsafeRunnable, FAILSAFE_DELAY);
     }
 
+    private void linkToDeathOfRunner() throws RemoteException {
+        if (!mLinkedToDeathOfRunner) {
+            mRunner.asBinder().linkToDeath(this, 0);
+            mLinkedToDeathOfRunner = true;
+        }
+    }
+
+    private void unlinkToDeathOfRunner() {
+        if (mLinkedToDeathOfRunner) {
+            mRunner.asBinder().unlinkToDeath(this, 0);
+            mLinkedToDeathOfRunner = false;
+        }
+    }
+
     @Override
     public void binderDied() {
-        cancelAnimation();
+        cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
     }
 
     void checkAnimationReady(WallpaperController wallpaperController) {
         if (mPendingStart) {
-            final boolean wallpaperReady = !isHomeAppOverWallpaper()
+            final boolean wallpaperReady = !isTargetOverWallpaper()
                     || (wallpaperController.getWallpaperTarget() != null
                             && wallpaperController.wallpaperTransitionReady());
             if (wallpaperReady) {
@@ -358,9 +435,13 @@
         }
     }
 
+    boolean isSplitScreenMinimized() {
+        return mSplitScreenMinimized;
+    }
+
     boolean isWallpaperVisible(WindowState w) {
-        return w != null && w.mAppToken != null && mHomeAppToken == w.mAppToken
-                && isHomeAppOverWallpaper();
+        return w != null && w.mAppToken != null && mTargetAppToken == w.mAppToken
+                && isTargetOverWallpaper();
     }
 
     boolean hasInputConsumerForApp(AppWindowToken appToken) {
@@ -369,12 +450,12 @@
 
     boolean updateInputConsumerForApp(InputConsumerImpl recentsAnimationInputConsumer,
             boolean hasFocus) {
-        // Update the input consumer touchable region to match the home app main window
-        final WindowState homeAppMainWindow = mHomeAppToken != null
-                ? mHomeAppToken.findMainWindow()
+        // Update the input consumer touchable region to match the target app main window
+        final WindowState targetAppMainWindow = mTargetAppToken != null
+                ? mTargetAppToken.findMainWindow()
                 : null;
-        if (homeAppMainWindow != null) {
-            homeAppMainWindow.getBounds(mTmpRect);
+        if (targetAppMainWindow != null) {
+            targetAppMainWindow.getBounds(mTmpRect);
             recentsAnimationInputConsumer.mWindowHandle.hasFocus = hasFocus;
             recentsAnimationInputConsumer.mWindowHandle.touchableRegion.set(mTmpRect);
             return true;
@@ -382,11 +463,20 @@
         return false;
     }
 
-    private boolean isHomeAppOverWallpaper() {
-        if (mHomeAppToken == null) {
+    private boolean isTargetOverWallpaper() {
+        if (mTargetAppToken == null) {
             return false;
         }
-        return mHomeAppToken.windowsCanBeWallpaperTarget();
+        return mTargetAppToken.windowsCanBeWallpaperTarget();
+    }
+
+    boolean isAnimatingTask(Task task) {
+        for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
+            if (task == mPendingAnimations.get(i).mTask) {
+                return true;
+            }
+        }
+        return false;
     }
 
     private boolean isAnimatingApp(AppWindowToken appToken) {
@@ -402,25 +492,26 @@
         return false;
     }
 
-    private class TaskAnimationAdapter implements AnimationAdapter {
+    @VisibleForTesting
+    class TaskAnimationAdapter implements AnimationAdapter {
 
         private final Task mTask;
         private SurfaceControl mCapturedLeash;
         private OnAnimationFinishedCallback mCapturedFinishCallback;
         private final boolean mIsRecentTaskInvisible;
         private RemoteAnimationTarget mTarget;
+        private final Point mPosition = new Point();
+        private final Rect mBounds = new Rect();
 
         TaskAnimationAdapter(Task task, boolean isRecentTaskInvisible) {
             mTask = task;
             mIsRecentTaskInvisible = isRecentTaskInvisible;
+            final WindowContainer container = mTask.getParent();
+            container.getRelativePosition(mPosition);
+            container.getBounds(mBounds);
         }
 
         RemoteAnimationTarget createRemoteAnimationApp() {
-            final Point position = new Point();
-            final Rect bounds = new Rect();
-            final WindowContainer container = mTask.getParent();
-            container.getRelativePosition(position);
-            container.getBounds(bounds);
             final WindowState mainWindow = mTask.getTopVisibleAppMainWindow();
             if (mainWindow == null) {
                 return null;
@@ -429,7 +520,7 @@
             InsetUtils.addInsets(insets, mainWindow.mAppToken.getLetterboxInsets());
             mTarget = new RemoteAnimationTarget(mTask.mTaskId, MODE_CLOSING, mCapturedLeash,
                     !mTask.fillsParent(), mainWindow.mWinAnimator.mLastClipRect,
-                    insets, mTask.getPrefixOrderIndex(), position, bounds,
+                    insets, mTask.getPrefixOrderIndex(), mPosition, mBounds,
                     mTask.getWindowConfiguration(), mIsRecentTaskInvisible);
             return mTarget;
         }
@@ -452,13 +543,14 @@
         @Override
         public void startAnimation(SurfaceControl animationLeash, Transaction t,
                 OnAnimationFinishedCallback finishCallback) {
+            t.setPosition(animationLeash, mPosition.x, mPosition.y);
             mCapturedLeash = animationLeash;
             mCapturedFinishCallback = finishCallback;
         }
 
         @Override
         public void onAnimationCancelled(SurfaceControl animationLeash) {
-            cancelAnimation();
+            cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION);
         }
 
         @Override
@@ -496,6 +588,6 @@
         final String innerPrefix = prefix + "  ";
         pw.print(prefix); pw.println(RecentsAnimationController.class.getSimpleName() + ":");
         pw.print(innerPrefix); pw.println("mPendingStart=" + mPendingStart);
-        pw.print(innerPrefix); pw.println("mHomeAppToken=" + mHomeAppToken);
+        pw.print(innerPrefix); pw.println("mTargetAppToken=" + mTargetAppToken);
     }
 }
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 3be7b235..16f4cd0 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -61,6 +61,7 @@
 
     private FinishedCallback mFinishedCallback;
     private boolean mCanceled;
+    private boolean mLinkedToDeathOfRunner;
 
     RemoteAnimationController(WindowManagerService service,
             RemoteAnimationAdapter remoteAnimationAdapter, Handler handler) {
@@ -106,7 +107,7 @@
         }
         mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
             try {
-                mRemoteAnimationAdapter.getRunner().asBinder().linkToDeath(this, 0);
+                linkToDeathOfRunner();
                 mRemoteAnimationAdapter.getRunner().onAnimationStart(animations, mFinishedCallback);
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to start remote animation", e);
@@ -164,8 +165,8 @@
 
     private void onAnimationFinished() {
         mHandler.removeCallbacks(mTimeoutRunnable);
-        mRemoteAnimationAdapter.getRunner().asBinder().unlinkToDeath(this, 0);
         synchronized (mService.mWindowMap) {
+            unlinkToDeathOfRunner();
             releaseFinishedCallback();
             mService.openSurfaceTransaction();
             try {
@@ -204,6 +205,20 @@
         mService.sendSetRunningRemoteAnimation(pid, running);
     }
 
+    private void linkToDeathOfRunner() throws RemoteException {
+        if (!mLinkedToDeathOfRunner) {
+            mRemoteAnimationAdapter.getRunner().asBinder().linkToDeath(this, 0);
+            mLinkedToDeathOfRunner = true;
+        }
+    }
+
+    private void unlinkToDeathOfRunner() {
+        if (mLinkedToDeathOfRunner) {
+            mRemoteAnimationAdapter.getRunner().asBinder().unlinkToDeath(this, 0);
+            mLinkedToDeathOfRunner = false;
+        }
+    }
+
     @Override
     public void binderDied() {
         cancelAnimation();
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 52d8177..fd965fb 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -417,6 +417,14 @@
         }, true /* traverseTopToBottom */);
     }
 
+    void updateHiddenWhileSuspendedState(final ArraySet<String> packages, final boolean suspended) {
+        forAllWindows((w) -> {
+            if (packages.contains(w.getOwningPackage())) {
+                w.setHiddenWhileSuspended(suspended);
+            }
+        }, false);
+    }
+
     void updateAppOpsState() {
         forAllWindows((w) -> {
             w.updateAppOpsState();
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index 98fcb0b..7211533 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -220,6 +220,9 @@
     }
 
     private void applyTransformation(RunningAnimation a, Transaction t, long currentPlayTime) {
+        if (a.mAnimSpec.needsEarlyWakeup()) {
+            t.setEarlyWakeup();
+        }
         a.mAnimSpec.apply(t, a.mLeash, currentPlayTime);
     }
 
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index e8d3210..95223d8 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -44,6 +44,7 @@
 import android.util.proto.ProtoOutputStream;
 import android.view.Surface;
 
+import android.view.SurfaceControl;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.PrintWriter;
@@ -559,6 +560,23 @@
                 && !mStack.isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState;
     }
 
+    @Override
+    public SurfaceControl getAnimationLeashParent() {
+        // Reparent to the animation layer so that we aren't clipped by the non-minimized
+        // stack bounds, currently we only animate the task for the recents animation
+        return getAppAnimationLayer(false /* boosted */);
+    }
+
+    boolean isTaskAnimating() {
+        final RecentsAnimationController recentsAnim = mService.getRecentsAnimationController();
+        if (recentsAnim != null) {
+            if (recentsAnim.isAnimatingTask(this)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     WindowState getTopVisibleAppMainWindow() {
         final AppWindowToken token = getTopVisibleAppToken();
         return token != null ? token.findMainWindow() : null;
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index a9e53a1..597b39e 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -173,6 +173,8 @@
             windowFlags = topFullscreenWindow.getAttrs().flags;
             windowPrivateFlags = topFullscreenWindow.getAttrs().privateFlags;
 
+            layoutParams.packageName = mainWindow.getAttrs().packageName;
+            layoutParams.windowAnimations = mainWindow.getAttrs().windowAnimations;
             layoutParams.dimAmount = mainWindow.getAttrs().dimAmount;
             layoutParams.type = TYPE_APPLICATION_STARTING;
             layoutParams.format = snapshot.getSnapshot().getFormat();
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 62754ad..2175c6b 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -33,8 +33,6 @@
 import static android.view.WindowManager.DOCKED_RIGHT;
 import static android.view.WindowManager.DOCKED_TOP;
 import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
-import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 import static com.android.server.wm.StackProto.ADJUSTED_BOUNDS;
 import static com.android.server.wm.StackProto.ADJUSTED_FOR_IME;
 import static com.android.server.wm.StackProto.ADJUST_DIVIDER_AMOUNT;
@@ -47,6 +45,8 @@
 import static com.android.server.wm.StackProto.MINIMIZE_AMOUNT;
 import static com.android.server.wm.StackProto.TASKS;
 import static com.android.server.wm.StackProto.WINDOW_CONTAINER;
+import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT;
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
 
 import android.annotation.CallSuper;
 import android.content.res.Configuration;
@@ -62,12 +62,10 @@
 import android.view.DisplayInfo;
 import android.view.Surface;
 import android.view.SurfaceControl;
-
 import com.android.internal.policy.DividerSnapAlgorithm;
 import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget;
 import com.android.internal.policy.DockedDividerUtils;
 import com.android.server.EventLogTags;
-
 import java.io.PrintWriter;
 
 public class TaskStack extends WindowContainer<Task> implements
@@ -1333,6 +1331,20 @@
         return mMinimizeAmount != 0f;
     }
 
+    /**
+     * @return {@code true} if we have a {@link Task} that is animating (currently only used for the
+     *         recents animation); {@code false} otherwise.
+     */
+    boolean isTaskAnimating() {
+        for (int j = mChildren.size() - 1; j >= 0; j--) {
+            final Task task = mChildren.get(j);
+            if (task.isTaskAnimating()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @CallSuper
     @Override
     public void writeToProto(ProtoOutputStream proto, long fieldId, boolean trim) {
@@ -1687,6 +1699,25 @@
         }
     }
 
+    @Override
+    public boolean shouldDeferStartOnMoveToFullscreen() {
+        // Workaround for the recents animation -- normally we need to wait for the new activity to
+        // show before starting the PiP animation, but because we start and show the home activity
+        // early for the recents animation prior to the PiP animation starting, there is no
+        // subsequent all-drawn signal. In this case, we can skip the pause when the home stack is
+        // already visible and drawn.
+        final TaskStack homeStack = mDisplayContent.getHomeStack();
+        if (homeStack == null) {
+            return true;
+        }
+        final Task homeTask = homeStack.getTopChild();
+        final AppWindowToken homeApp = homeTask.getTopVisibleAppToken();
+        if (!homeTask.isVisible() || homeApp == null) {
+            return true;
+        }
+        return !homeApp.allDrawn;
+    }
+
     /**
      * @return True if we are currently animating the pinned stack from fullscreen to non-fullscreen
      *         bounds and we have a deferred PiP mode changed callback set with the animation.
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index c509980..7eaca5d 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -26,6 +26,7 @@
 
 import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
 import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
+import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SCREENSHOT;
 import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER;
@@ -618,7 +619,8 @@
 
             // If there was a recents animation in progress, cancel that animation
             if (mService.getRecentsAnimationController() != null) {
-                mService.getRecentsAnimationController().cancelAnimation();
+                mService.getRecentsAnimationController().cancelAnimation(
+                        REORDER_MOVE_TO_ORIGINAL_POSITION);
             }
             return true;
         }
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index 7b7cb30..548e23a 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -47,21 +47,24 @@
     private final Point mPosition = new Point();
     private final ThreadLocal<TmpValues> mThreadLocalTmps = ThreadLocal.withInitial(TmpValues::new);
     private final boolean mCanSkipFirstFrame;
+    private final boolean mIsAppAnimation;
     private final Rect mStackBounds = new Rect();
     private int mStackClipMode;
     private final Rect mTmpRect = new Rect();
 
     public WindowAnimationSpec(Animation animation, Point position, boolean canSkipFirstFrame)  {
-        this(animation, position, null /* stackBounds */, canSkipFirstFrame, STACK_CLIP_NONE);
+        this(animation, position, null /* stackBounds */, canSkipFirstFrame, STACK_CLIP_NONE,
+                false /* isAppAnimation */);
     }
 
     public WindowAnimationSpec(Animation animation, Point position, Rect stackBounds,
-            boolean canSkipFirstFrame, int stackClipMode) {
+            boolean canSkipFirstFrame, int stackClipMode, boolean isAppAnimation) {
         mAnimation = animation;
         if (position != null) {
             mPosition.set(position.x, position.y);
         }
         mCanSkipFirstFrame = canSkipFirstFrame;
+        mIsAppAnimation = isAppAnimation;
         mStackClipMode = stackClipMode;
         if (stackBounds != null) {
             mStackBounds.set(stackBounds);
@@ -135,6 +138,11 @@
     }
 
     @Override
+    public boolean needsEarlyWakeup() {
+        return mIsAppAnimation;
+    }
+
+    @Override
     public void dump(PrintWriter pw, String prefix) {
         pw.print(prefix); pw.println(mAnimation);
     }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f1cd46b..2b5620c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -128,6 +128,7 @@
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
 import android.content.res.Configuration;
 import android.database.ContentObserver;
 import android.graphics.Bitmap;
@@ -264,6 +265,7 @@
 import java.net.Socket;
 import java.text.DateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 /** {@hide} */
@@ -426,6 +428,7 @@
     final ActivityManagerInternal mAmInternal;
 
     final AppOpsManager mAppOps;
+    final PackageManagerInternal mPmInternal;
 
     final DisplaySettings mDisplaySettings;
 
@@ -1006,6 +1009,22 @@
         mAppOps.startWatchingMode(OP_SYSTEM_ALERT_WINDOW, null, opListener);
         mAppOps.startWatchingMode(AppOpsManager.OP_TOAST_WINDOW, null, opListener);
 
+        mPmInternal = LocalServices.getService(PackageManagerInternal.class);
+        final IntentFilter suspendPackagesFilter = new IntentFilter();
+        suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_SUSPENDED);
+        suspendPackagesFilter.addAction(Intent.ACTION_PACKAGES_UNSUSPENDED);
+        context.registerReceiverAsUser(new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                final String[] affectedPackages =
+                        intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+                final boolean suspended =
+                        Intent.ACTION_PACKAGES_SUSPENDED.equals(intent.getAction());
+                updateHiddenWhileSuspendedState(new ArraySet<>(Arrays.asList(affectedPackages)),
+                        suspended);
+            }
+        }, UserHandle.ALL, suspendPackagesFilter, null, null);
+
         // Get persisted window scale setting
         mWindowAnimationScaleSetting = Settings.Global.getFloat(context.getContentResolver(),
                 Settings.Global.WINDOW_ANIMATION_SCALE, mWindowAnimationScaleSetting);
@@ -1224,6 +1243,10 @@
                     Slog.w(TAG_WM, "Attempted to add window with exiting application token "
                           + token + ".  Aborting.");
                     return WindowManagerGlobal.ADD_APP_EXITING;
+                } else if (type == TYPE_APPLICATION_STARTING && atoken.startingWindow != null) {
+                    Slog.w(TAG_WM, "Attempted to add starting window to token with already existing"
+                            + " starting window");
+                    return WindowManagerGlobal.ADD_DUPLICATE_ADD;
                 }
             } else if (rootType == TYPE_INPUT_METHOD) {
                 if (token.windowType != TYPE_INPUT_METHOD) {
@@ -1360,6 +1383,10 @@
 
             win.initAppOpsState();
 
+            final boolean suspended = mPmInternal.isPackageSuspended(win.getOwningPackage(),
+                    UserHandle.getUserId(win.getOwningUid()));
+            win.setHiddenWhileSuspended(suspended);
+
             final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
             win.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
 
@@ -1619,6 +1646,8 @@
         if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "postWindowRemoveCleanupLocked: " + win);
         mWindowMap.remove(win.mClient.asBinder());
 
+        markForSeamlessRotation(win, false);
+
         win.resetAppOpsState();
 
         if (mCurrentFocus == null) {
@@ -1683,6 +1712,12 @@
         dc.computeImeTarget(true /* updateImeTarget */);
     }
 
+    private void updateHiddenWhileSuspendedState(ArraySet<String> packages, boolean suspended) {
+        synchronized (mWindowMap) {
+            mRoot.updateHiddenWhileSuspendedState(packages, suspended);
+        }
+    }
+
     private void updateAppOpsState() {
         synchronized(mWindowMap) {
             mRoot.updateAppOpsState();
@@ -1899,7 +1934,15 @@
                 winAnimator.setOpaqueLocked(false);
             }
 
-            boolean imMayMove = (flagChanges & (FLAG_ALT_FOCUSABLE_IM | FLAG_NOT_FOCUSABLE)) != 0;
+            final int oldVisibility = win.mViewVisibility;
+
+            // If the window is becoming visible, visibleOrAdding may change which may in turn
+            // change the IME target.
+            final boolean becameVisible =
+                    (oldVisibility == View.INVISIBLE || oldVisibility == View.GONE)
+                            && viewVisibility == View.VISIBLE;
+            boolean imMayMove = (flagChanges & (FLAG_ALT_FOCUSABLE_IM | FLAG_NOT_FOCUSABLE)) != 0
+                    || becameVisible;
             final boolean isDefaultDisplay = win.isDefaultDisplay();
             boolean focusMayChange = isDefaultDisplay && (win.mViewVisibility != viewVisibility
                     || ((flagChanges & FLAG_NOT_FOCUSABLE) != 0)
@@ -1915,7 +1958,6 @@
             win.mRelayoutCalled = true;
             win.mInRelayout = true;
 
-            final int oldVisibility = win.mViewVisibility;
             win.mViewVisibility = viewVisibility;
             if (DEBUG_SCREEN_ON) {
                 RuntimeException stack = new RuntimeException();
@@ -2658,7 +2700,7 @@
         }
     }
 
-    public void initializeRecentsAnimation(
+    public void initializeRecentsAnimation(int targetActivityType,
             IRecentsAnimationRunner recentsAnimationRunner,
             RecentsAnimationController.RecentsAnimationCallbacks callbacks, int displayId,
             SparseBooleanArray recentTaskIds) {
@@ -2666,7 +2708,7 @@
             mRecentsAnimationController = new RecentsAnimationController(this,
                     recentsAnimationRunner, callbacks, displayId);
             mAppTransition.updateBooster();
-            mRecentsAnimationController.initialize(recentTaskIds);
+            mRecentsAnimationController.initialize(targetActivityType, recentTaskIds);
         }
     }
 
@@ -2687,20 +2729,20 @@
         }
     }
 
-    public void cancelRecentsAnimation() {
+    public void cancelRecentsAnimation(@RecentsAnimationController.ReorderMode int reorderMode) {
         // Note: Do not hold the WM lock, this will lock appropriately in the call which also
         // calls through to AM/RecentsAnimation.onAnimationFinished()
         if (mRecentsAnimationController != null) {
             // This call will call through to cleanupAnimation() below after the animation is
             // canceled
-            mRecentsAnimationController.cancelAnimation();
+            mRecentsAnimationController.cancelAnimation(reorderMode);
         }
     }
 
-    public void cleanupRecentsAnimation(boolean moveHomeToTop) {
+    public void cleanupRecentsAnimation(@RecentsAnimationController.ReorderMode int reorderMode) {
         synchronized (mWindowMap) {
             if (mRecentsAnimationController != null) {
-                mRecentsAnimationController.cleanupAnimation(moveHomeToTop);
+                mRecentsAnimationController.cleanupAnimation(reorderMode);
                 mRecentsAnimationController = null;
                 mAppTransition.updateBooster();
             }
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 30bbfe0..c5269e1 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -20,6 +20,8 @@
 import static android.app.AppOpsManager.MODE_ALLOWED;
 import static android.app.AppOpsManager.MODE_DEFAULT;
 import static android.app.AppOpsManager.OP_NONE;
+import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
+import static android.app.AppOpsManager.OP_TOAST_WINDOW;
 import static android.os.PowerManager.DRAW_WAKE_LOCK;
 import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
 import static android.view.Display.DEFAULT_DISPLAY;
@@ -64,7 +66,6 @@
 import static android.view.WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
-import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
 import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
 import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
@@ -178,6 +179,7 @@
 import android.util.Slog;
 import android.util.TimeUtils;
 import android.util.proto.ProtoOutputStream;
+import android.view.Display;
 import android.view.DisplayCutout;
 import android.view.DisplayInfo;
 import android.view.Gravity;
@@ -266,6 +268,8 @@
      * animation is done.
      */
     boolean mPolicyVisibilityAfterAnim = true;
+    // overlay window is hidden because the owning app is suspended
+    private boolean mHiddenWhileSuspended;
     private boolean mAppOpVisibility = true;
     boolean mPermanentlyHidden; // the window should never be shown again
     // This is a non-system overlay window that is currently force hidden.
@@ -897,7 +901,7 @@
             }
             final WindowState imeWin = mService.mInputMethodWindow;
             // IME is up and obscuring this window. Adjust the window position so it is visible.
-            if (imeWin != null && imeWin.isVisibleNow() && mService.mInputMethodTarget == this) {
+            if (imeWin != null && imeWin.isVisibleNow() && isInputMethodTarget()) {
                 if (inFreeformWindowingMode()
                         && mContainingFrame.bottom > contentFrame.bottom) {
                     // In freeform we want to move the top up directly.
@@ -1366,6 +1370,7 @@
         // Window was not laid out for this display yet, so make sure mLayoutSeq does not match.
         if (dc != null) {
             mLayoutSeq = dc.mLayoutSeq - 1;
+            mInputWindowHandle.displayId = dc.getDisplayId();
         }
     }
 
@@ -1378,7 +1383,7 @@
     public int getDisplayId() {
         final DisplayContent displayContent = getDisplayContent();
         if (displayContent == null) {
-            return -1;
+            return Display.INVALID_DISPLAY;
         }
         return displayContent.getDisplayId();
     }
@@ -1691,13 +1696,6 @@
             return changed;
         }
 
-        // Next up we will notify the client that it's visibility has changed.
-        // We need to prevent it from destroying child surfaces until
-        // the animation has finished.
-        if (!visible && isVisibleNow()) {
-            mWinAnimator.detachChildren();
-        }
-
         if (visible != isVisibleNow()) {
             if (!runningAppAnimation) {
                 final AccessibilityController accessibilityController =
@@ -1885,7 +1883,7 @@
         }
 
         final DisplayContent dc = getDisplayContent();
-        if (mService.mInputMethodTarget == this) {
+        if (isInputMethodTarget()) {
             dc.computeImeTarget(true /* updateImeTarget */);
         }
 
@@ -2003,6 +2001,11 @@
                     // Try starting an animation.
                     if (mWinAnimator.applyAnimationLocked(transit, false)) {
                         mAnimatingExit = true;
+
+                        // mAnimatingExit affects canAffectSystemUiFlags(). Run layout such that
+                        // any change from that is performed immediately.
+                        setDisplayLayoutNeeded();
+                        mService.requestTraversal();
                     }
                     //TODO (multidisplay): Magnification is supported only for the default display.
                     if (mService.mAccessibilityController != null && displayId == DEFAULT_DISPLAY) {
@@ -2489,6 +2492,10 @@
             // to handle their windows being removed from under them.
             return false;
         }
+        if (mHiddenWhileSuspended) {
+            // Being hidden due to owner package being suspended.
+            return false;
+        }
         if (mForceHideNonSystemOverlayWindow) {
             // This is an alert window that is currently force hidden.
             return false;
@@ -2585,6 +2592,22 @@
         }
     }
 
+    void setHiddenWhileSuspended(boolean hide) {
+        if (mOwnerCanAddInternalSystemWindow
+                || (!isSystemAlertWindowType(mAttrs.type) && mAttrs.type != TYPE_TOAST)) {
+            return;
+        }
+        if (mHiddenWhileSuspended == hide) {
+            return;
+        }
+        mHiddenWhileSuspended = hide;
+        if (hide) {
+            hideLw(true, true);
+        } else {
+            showLw(true, true);
+        }
+    }
+
     private void setAppOpVisibilityLw(boolean state) {
         if (mAppOpVisibility != state) {
             mAppOpVisibility = state;
@@ -3305,7 +3328,8 @@
             pw.println(Integer.toHexString(mSystemUiVisibility));
         }
         if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility
-                || isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow) {
+                || isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow
+                || mHiddenWhileSuspended) {
             pw.print(prefix); pw.print("mPolicyVisibility=");
                     pw.print(mPolicyVisibility);
                     pw.print(" mPolicyVisibilityAfterAnim=");
@@ -3314,6 +3338,7 @@
                     pw.print(mAppOpVisibility);
                     pw.print(" parentHidden="); pw.print(isParentWindowHidden());
                     pw.print(" mPermanentlyHidden="); pw.print(mPermanentlyHidden);
+                    pw.print(" mHiddenWhileSuspended="); pw.print(mHiddenWhileSuspended);
                     pw.print(" mForceHideNonSystemOverlayWindow="); pw.println(
                     mForceHideNonSystemOverlayWindow);
         }
@@ -3949,7 +3974,7 @@
     private boolean applyInOrderWithImeWindows(ToBooleanFunction<WindowState> callback,
             boolean traverseTopToBottom) {
         if (traverseTopToBottom) {
-            if (mService.mInputMethodTarget == this) {
+            if (isInputMethodTarget()) {
                 // This window is the current IME target, so we need to process the IME windows
                 // directly above it.
                 if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -3963,7 +3988,7 @@
             if (callback.apply(this)) {
                 return true;
             }
-            if (mService.mInputMethodTarget == this) {
+            if (isInputMethodTarget()) {
                 // This window is the current IME target, so we need to process the IME windows
                 // directly above it.
                 if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
@@ -4673,7 +4698,7 @@
     void assignLayer(Transaction t, int layer) {
         // See comment in assignRelativeLayerForImeTargetChild
         if (!isChildWindow()
-                || (mService.mInputMethodTarget != getParentWindow())
+                || (!getParentWindow().isInputMethodTarget())
                 || !inSplitScreenWindowingMode()) {
             super.assignLayer(t, layer);
             return;
@@ -4741,6 +4766,11 @@
         mTapExcludeRegionHolder.amendRegion(region, getBounds());
     }
 
+    @Override
+    public boolean isInputMethodTarget() {
+        return mService.mInputMethodTarget == this;
+    }
+
     private final class MoveAnimationSpec implements AnimationSpec {
 
         private final long mDuration;
diff --git a/services/core/jni/BroadcastRadio/Tuner.cpp b/services/core/jni/BroadcastRadio/Tuner.cpp
index 36d2994..a04697f 100644
--- a/services/core/jni/BroadcastRadio/Tuner.cpp
+++ b/services/core/jni/BroadcastRadio/Tuner.cpp
@@ -90,11 +90,12 @@
     bool mIsAudioConnected = false;
     Band mBand;
     wp<V1_0::IBroadcastRadio> mHalModule;
-    wp<V1_1::IBroadcastRadio> mHalModule11;
     sp<V1_0::ITuner> mHalTuner;
     sp<V1_1::ITuner> mHalTuner11;
     sp<HalDeathRecipient> mHalDeathRecipient;
 
+    sp<V1_1::IBroadcastRadio> getHalModule11() const;
+
 private:
     DISALLOW_COPY_AND_ASSIGN(TunerContext);
 };
@@ -143,6 +144,16 @@
     tunerCallback->hardwareFailure();
 }
 
+sp<V1_1::IBroadcastRadio> TunerContext::getHalModule11() const {
+    auto halModule = mHalModule.promote();
+    if (halModule == nullptr) {
+        ALOGE("HAL module is gone");
+        return nullptr;
+    }
+
+    return V1_1::IBroadcastRadio::castFrom(halModule).withDefault(nullptr);
+}
+
 // TODO(b/62713378): implement support for multiple tuners open at the same time
 static void notifyAudioService(TunerContext& ctx, bool connected) {
     if (!ctx.mWithAudio) return;
@@ -175,8 +186,6 @@
     }
 
     ctx.mHalModule = halModule;
-    ctx.mHalModule11 = V1_1::IBroadcastRadio::castFrom(halModule).withDefault(nullptr);
-
     ctx.mHalTuner = halTuner;
     ctx.mHalTuner11 = V1_1::ITuner::castFrom(halTuner).withDefault(nullptr);
     ALOGW_IF(ctx.mHalRev >= HalRevision::V1_1 && ctx.mHalTuner11 == nullptr,
@@ -388,18 +397,13 @@
     lock_guard<mutex> lk(gContextMutex);
     auto& ctx = getNativeContext(nativeContext);
 
-    if (ctx.mHalModule11 == nullptr) {
+    auto halModule = ctx.getHalModule11();
+    if (halModule == nullptr) {
         jniThrowException(env, "java/lang/IllegalStateException",
                 "Out-of-band images are not supported with HAL < 1.1");
         return nullptr;
     }
 
-    auto halModule = ctx.mHalModule11.promote();
-    if (halModule == nullptr) {
-        ALOGE("HAL module is gone");
-        return nullptr;
-    }
-
     JavaRef<jbyteArray> jRawImage = nullptr;
 
     auto hidlResult = halModule->getImage(id, [&](hidl_vec<uint8_t> rawImage) {
@@ -418,7 +422,7 @@
 
     if (convert::ThrowIfFailed(env, hidlResult)) return nullptr;
 
-    return jRawImage.get();
+    return jRawImage.release();
 }
 
 static bool nativeIsAnalogForced(JNIEnv *env, jobject obj, jlong nativeContext) {
diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp
index 61b48c2..d2b7c7d 100644
--- a/services/core/jni/BroadcastRadio/convert.cpp
+++ b/services/core/jni/BroadcastRadio/convert.cpp
@@ -510,19 +510,16 @@
         jint status = 0;
         switch (item.type) {
             case MetadataType::INT:
-                ALOGV("metadata INT %d", key);
                 status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putIntFromNative,
                         key, item.intValue);
                 break;
             case MetadataType::TEXT: {
-                ALOGV("metadata TEXT %d", key);
                 auto value = make_javastr(env, item.stringValue);
                 status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putStringFromNative,
                         key, value.get());
                 break;
             }
             case MetadataType::RAW: {
-                ALOGV("metadata RAW %d", key);
                 auto len = item.rawValue.size();
                 if (len == 0) break;
                 auto value = make_javaref(env, env->NewByteArray(len));
@@ -537,7 +534,6 @@
                 break;
             }
             case MetadataType::CLOCK:
-                ALOGV("metadata CLOCK %d", key);
                 status = env->CallIntMethod(jMetadata.get(), gjni.RadioMetadata.putClockFromNative,
                         key, item.clockValue.utcSecondsSinceEpoch,
                         item.clockValue.timezoneOffsetInMinutes);
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 21fea1c..e18eee2 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -81,6 +81,7 @@
 using android::hardware::Void;
 using android::hardware::hidl_vec;
 using android::hardware::hidl_death_recipient;
+using android::hardware::gnss::V1_0::GnssConstellationType;
 using android::hardware::gnss::V1_0::GnssLocation;
 using android::hardware::gnss::V1_0::GnssLocationFlags;
 
@@ -91,7 +92,6 @@
 using android::hardware::gnss::V1_0::IAGnssRilCallback;
 using android::hardware::gnss::V1_0::IGnssBatching;
 using android::hardware::gnss::V1_0::IGnssBatchingCallback;
-using android::hardware::gnss::V1_0::IGnssConfiguration;
 using android::hardware::gnss::V1_0::IGnssDebug;
 using android::hardware::gnss::V1_0::IGnssGeofenceCallback;
 using android::hardware::gnss::V1_0::IGnssGeofencing;
@@ -108,6 +108,8 @@
 
 using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss;
 using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss;
+using IGnssConfiguration_V1_0 = android::hardware::gnss::V1_0::IGnssConfiguration;
+using IGnssConfiguration_V1_1 = android::hardware::gnss::V1_1::IGnssConfiguration;
 using IGnssMeasurement_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurement;
 using IGnssMeasurement_V1_1 = android::hardware::gnss::V1_1::IGnssMeasurement;
 using IGnssMeasurementCallback_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback;
@@ -137,7 +139,8 @@
 sp<IAGnss> agnssIface = nullptr;
 sp<IGnssBatching> gnssBatchingIface = nullptr;
 sp<IGnssDebug> gnssDebugIface = nullptr;
-sp<IGnssConfiguration> gnssConfigurationIface = nullptr;
+sp<IGnssConfiguration_V1_0> gnssConfigurationIface = nullptr;
+sp<IGnssConfiguration_V1_1> gnssConfigurationIface_V1_1 = nullptr;
 sp<IGnssNi> gnssNiIface = nullptr;
 sp<IGnssMeasurement_V1_0> gnssMeasurementIface = nullptr;
 sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr;
@@ -1098,13 +1101,11 @@
     * Methods from ::android::hardware::gps::V1_0::IGnssBatchingCallback
     * follow.
     */
-    Return<void> gnssLocationBatchCb(
-        const ::android::hardware::hidl_vec<GnssLocation> & locations)
+    Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation> & locations)
         override;
 };
 
-Return<void> GnssBatchingCallback::gnssLocationBatchCb(
-        const ::android::hardware::hidl_vec<GnssLocation> & locations) {
+Return<void> GnssBatchingCallback::gnssLocationBatchCb(const hidl_vec<GnssLocation> & locations) {
     JNIEnv* env = getJniEnv();
 
     jobjectArray jLocations = env->NewObjectArray(locations.size(),
@@ -1257,11 +1258,21 @@
             gnssNiIface = gnssNi;
         }
 
-        auto gnssConfiguration = gnssHal->getExtensionGnssConfiguration();
-        if (!gnssConfiguration.isOk()) {
-            ALOGD("Unable to get a handle to GnssConfiguration");
+        if (gnssHal_V1_1 != nullptr) {
+            auto gnssConfiguration = gnssHal_V1_1->getExtensionGnssConfiguration_1_1();
+            if (!gnssConfiguration.isOk()) {
+                ALOGD("Unable to get a handle to GnssConfiguration");
+            } else {
+                gnssConfigurationIface_V1_1 = gnssConfiguration;
+                gnssConfigurationIface = gnssConfigurationIface_V1_1;
+            }
         } else {
-            gnssConfigurationIface = gnssConfiguration;
+            auto gnssConfiguration_V1_0 = gnssHal->getExtensionGnssConfiguration();
+            if (!gnssConfiguration_V1_0.isOk()) {
+                ALOGD("Unable to get a handle to GnssConfiguration");
+            } else {
+                gnssConfigurationIface = gnssConfiguration_V1_0;
+            }
         }
 
         auto gnssGeofencing = gnssHal->getExtensionGnssGeofencing();
@@ -1997,6 +2008,48 @@
     }
 }
 
+static jboolean android_location_GnssLocationProvider_set_satellite_blacklist(
+        JNIEnv* env, jobject, jintArray constellations, jintArray sv_ids) {
+    if (gnssConfigurationIface_V1_1 == nullptr) {
+        ALOGI("No GNSS Satellite Blacklist interface available");
+        return JNI_FALSE;
+    }
+
+    jint *constellation_array = env->GetIntArrayElements(constellations, 0);
+    if (NULL == constellation_array) {
+        ALOGI("GetIntArrayElements returns NULL.");
+        return JNI_FALSE;
+    }
+    jsize length = env->GetArrayLength(constellations);
+
+    jint *sv_id_array = env->GetIntArrayElements(sv_ids, 0);
+    if (NULL == sv_id_array) {
+        ALOGI("GetIntArrayElements returns NULL.");
+        return JNI_FALSE;
+    }
+
+    if (length != env->GetArrayLength(sv_ids)) {
+        ALOGI("Lengths of constellations and sv_ids are inconsistent.");
+        return JNI_FALSE;
+    }
+
+    hidl_vec<IGnssConfiguration_V1_1::BlacklistedSource> sources;
+    sources.resize(length);
+
+    for (int i = 0; i < length; i++) {
+        sources[i].constellation = static_cast<GnssConstellationType>(constellation_array[i]);
+        sources[i].svid = sv_id_array[i];
+    }
+
+    auto result = gnssConfigurationIface_V1_1->setBlacklist(sources);
+    if (result.isOk()) {
+        return result;
+    } else {
+        return JNI_FALSE;
+    }
+}
+
+
 static jint android_location_GnssLocationProvider_get_batch_size(JNIEnv*, jclass) {
     if (gnssBatchingIface == nullptr) {
         return 0; // batching not supported, size = 0
@@ -2185,6 +2238,9 @@
     {"native_set_emergency_supl_pdn",
             "(I)Z",
             reinterpret_cast<void *>(android_location_GnssLocationProvider_set_emergency_supl_pdn)},
+    {"native_set_satellite_blacklist",
+            "([I[I)Z",
+            reinterpret_cast<void *>(android_location_GnssLocationProvider_set_satellite_blacklist)},
     {"native_get_batch_size",
             "()I",
             reinterpret_cast<void *>(android_location_GnssLocationProvider_get_batch_size)},
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 90e8a9c..82d2f3c 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -108,7 +108,6 @@
 import android.app.admin.SecurityLog.SecurityEvent;
 import android.app.admin.SystemUpdateInfo;
 import android.app.admin.SystemUpdatePolicy;
-import android.app.backup.BackupManager;
 import android.app.backup.IBackupManager;
 import android.app.backup.ISelectBackupTransportCallback;
 import android.app.trust.TrustManager;
@@ -220,6 +219,8 @@
 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.server.StatLogger;
 import com.android.server.SystemServerInitThreadPool;
 import com.android.server.SystemService;
 import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
@@ -462,21 +463,60 @@
      * Whether or not device admin feature is supported. If it isn't return defaults for all
      * public methods.
      */
-    boolean mHasFeature;
+    final boolean mHasFeature;
 
     /**
      * Whether or not this device is a watch.
      */
-    boolean mIsWatch;
+    final boolean mIsWatch;
 
     private final CertificateMonitor mCertificateMonitor;
     private final SecurityLogMonitor mSecurityLogMonitor;
+
+    @GuardedBy("getLockObject()")
     private NetworkLogger mNetworkLogger;
 
     private final AtomicBoolean mRemoteBugreportServiceIsActive = new AtomicBoolean();
     private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean();
 
-    private SetupContentObserver mSetupContentObserver;
+    private final SetupContentObserver mSetupContentObserver;
+
+    private static boolean ENABLE_LOCK_GUARD = Build.IS_ENG
+            || (SystemProperties.getInt("debug.dpm.lock_guard", 0) == 1);
+
+    interface Stats {
+        int LOCK_GUARD_GUARD = 0;
+
+        int COUNT = LOCK_GUARD_GUARD + 1;
+    }
+
+    private final StatLogger mStatLogger = new StatLogger(new String[] {
+            "LockGuard.guard()",
+    });
+
+    private final Object mLockDoNoUseDirectly = LockGuard.installNewLock(
+            LockGuard.INDEX_DPMS, /* doWtf=*/ true);
+
+    final Object getLockObject() {
+        if (ENABLE_LOCK_GUARD) {
+            final long start = mStatLogger.getTime();
+            LockGuard.guard(LockGuard.INDEX_DPMS);
+            mStatLogger.logDurationStat(Stats.LOCK_GUARD_GUARD, start);
+        }
+        return mLockDoNoUseDirectly;
+    }
+
+    /**
+     * Check if the current thread holds the DPMS lock, and if not, do a WTF.
+     *
+     * (Doing this check too much may be costly, so don't call it in a hot path.)
+     */
+    final void ensureLocked() {
+        if (Thread.holdsLock(mLockDoNoUseDirectly)) {
+            return;
+        }
+        Slog.wtfStack(LOG_TAG, "Not holding DPMS lock.");
+    }
 
     @VisibleForTesting
     final TransferOwnershipMetadataManager mTransferOwnershipMetadataManager;
@@ -627,8 +667,10 @@
         }
     }
 
+    @GuardedBy("getLockObject()")
     final SparseArray<DevicePolicyData> mUserData = new SparseArray<>();
-    @GuardedBy("DevicePolicyManagerService.this")
+
+    @GuardedBy("getLockObject()")
     final SparseArray<PasswordMetrics> mUserPasswordMetrics = new SparseArray<>();
 
     final Handler mHandler;
@@ -649,7 +691,7 @@
              */
             if (Intent.ACTION_USER_STARTED.equals(action)
                     && userHandle == mOwners.getDeviceOwnerUserId()) {
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     if (isNetworkLoggingEnabledInternalLocked()) {
                         setNetworkLoggingActiveInternal(true);
                     }
@@ -684,14 +726,14 @@
 
             if (Intent.ACTION_USER_ADDED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_ADDED, userHandle);
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     // It might take a while for the user to become affiliated. Make security
                     // and network logging unavailable in the meantime.
                     maybePauseDeviceWideLoggingLocked();
                 }
             } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_REMOVED, userHandle);
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     // Check whether the user is affiliated, *before* removing its data.
                     boolean isRemovedUserAffiliated = isUserAffiliatedWithDeviceLocked(userHandle);
                     removeUserData(userHandle);
@@ -705,7 +747,7 @@
                 }
             } else if (Intent.ACTION_USER_STARTED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_STARTED, userHandle);
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     maybeSendAdminEnabledBroadcastLocked(userHandle);
                     // Reset the policy data
                     mUserData.remove(userHandle);
@@ -716,7 +758,7 @@
             } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
                 sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_SWITCHED, userHandle);
             } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     maybeSendAdminEnabledBroadcastLocked(userHandle);
                 }
             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
@@ -741,7 +783,7 @@
         }
 
         private void sendDeviceOwnerUserCommand(String action, int userHandle) {
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
                 if (deviceOwner != null) {
                     Bundle extras = new Bundle();
@@ -1662,7 +1704,7 @@
                     + " for user " + userHandle);
         }
         DevicePolicyData policy = getUserData(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             for (int i = policy.mAdminList.size() - 1; i >= 0; i--) {
                 ActiveAdmin aa = policy.mAdminList.get(i);
                 try {
@@ -2091,6 +2133,7 @@
 
         if (!mHasFeature) {
             // Skip the rest of the initialization
+            mSetupContentObserver = null;
             return;
         }
 
@@ -2132,7 +2175,7 @@
      */
     @NonNull
     DevicePolicyData getUserData(int userHandle) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = mUserData.get(userHandle);
             if (policy == null) {
                 policy = new DevicePolicyData(userHandle);
@@ -2173,7 +2216,7 @@
     }
 
     void removeUserData(int userHandle) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (userHandle == UserHandle.USER_SYSTEM) {
                 Slog.w(LOG_TAG, "Tried to remove device policy file for user 0! Ignoring.");
                 return;
@@ -2199,7 +2242,7 @@
     }
 
     void loadOwners() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             mOwners.load();
             setDeviceOwnerSystemPropertyLocked();
             findOwnerComponentIfNecessaryLocked();
@@ -2223,7 +2266,7 @@
 
     /** Apply default restrictions that haven't been applied to profile owners yet. */
     private void maybeSetDefaultProfileOwnerUserRestrictions() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             for (final int userId : mOwners.getProfileOwnerKeys()) {
                 final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
                 // The following restrictions used to be applied to managed profiles by different
@@ -2513,6 +2556,7 @@
     }
 
     ActiveAdmin getActiveAdminUncheckedLocked(ComponentName who, int userHandle) {
+        ensureLocked();
         ActiveAdmin admin = getUserData(userHandle).mAdminMap.get(who);
         if (admin != null
                 && who.getPackageName().equals(admin.info.getActivityInfo().packageName)
@@ -2523,6 +2567,7 @@
     }
 
     ActiveAdmin getActiveAdminUncheckedLocked(ComponentName who, int userHandle, boolean parent) {
+        ensureLocked();
         if (parent) {
             enforceManagedProfile(userHandle, "call APIs on the parent profile");
         }
@@ -2535,6 +2580,7 @@
 
     ActiveAdmin getActiveAdminForCallerLocked(ComponentName who, int reqPolicy)
             throws SecurityException {
+        ensureLocked();
         final int callingUid = mInjector.binderGetCallingUid();
 
         ActiveAdmin result = getActiveAdminWithPolicyForUidLocked(who, reqPolicy, callingUid);
@@ -2565,6 +2611,7 @@
 
     ActiveAdmin getActiveAdminForCallerLocked(ComponentName who, int reqPolicy, boolean parent)
             throws SecurityException {
+        ensureLocked();
         if (parent) {
             enforceManagedProfile(mInjector.userHandleGetCallingUserId(),
                     "call APIs on the parent profile");
@@ -2577,6 +2624,7 @@
      * the admin's uid matches the uid.
      */
     private ActiveAdmin getActiveAdminForUidLocked(ComponentName who, int uid) {
+        ensureLocked();
         final int userId = UserHandle.getUserId(uid);
         final DevicePolicyData policy = getUserData(userId);
         ActiveAdmin admin = policy.mAdminMap.get(who);
@@ -2591,6 +2639,7 @@
 
     private ActiveAdmin getActiveAdminWithPolicyForUidLocked(ComponentName who, int reqPolicy,
             int uid) {
+        ensureLocked();
         // Try to find an admin which can use reqPolicy
         final int userId = UserHandle.getUserId(uid);
         final DevicePolicyData policy = getUserData(userId);
@@ -2620,6 +2669,7 @@
     @VisibleForTesting
     boolean isActiveAdminWithPolicyForUserLocked(ActiveAdmin admin, int reqPolicy,
             int userId) {
+        ensureLocked();
         final boolean ownsDevice = isDeviceOwner(admin.info.getComponent(), userId);
         final boolean ownsProfile = isProfileOwner(admin.info.getComponent(), userId);
 
@@ -3319,14 +3369,14 @@
         updateUserSetupCompleteAndPaired();
 
         List<String> packageList;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             packageList = getKeepUninstalledPackagesLocked();
         }
         if (packageList != null) {
             mInjector.getPackageManagerInternal().setKeepUninstalledPackages(packageList);
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
             if (deviceOwner != null) {
                 // Push the force-ephemeral-users policy to the user manager.
@@ -3379,7 +3429,7 @@
 
     private void ensureDeviceOwnerUserStarted() {
         final int userId;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!mOwners.hasDeviceOwner()) {
                 return;
             }
@@ -3436,7 +3486,7 @@
         // before reboot
         Set<Integer> usersWithProfileOwners;
         Set<Integer> usersWithData;
-        synchronized(this) {
+        synchronized (getLockObject()) {
             usersWithProfileOwners = mOwners.getProfileOwnerKeys();
             usersWithData = new ArraySet<>();
             for (int i = 0; i < mUserData.size(); i++) {
@@ -3460,7 +3510,7 @@
         final Bundle adminExtras = new Bundle();
         adminExtras.putParcelable(Intent.EXTRA_USER, UserHandle.of(userHandle));
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final long now = System.currentTimeMillis();
 
             List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
@@ -3496,7 +3546,7 @@
         }
         enforceManageUsers();
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final DevicePolicyData policy = getUserData(userHandle.getIdentifier());
 
             boolean changed = false;
@@ -3515,7 +3565,7 @@
         if (!mHasFeature) {
             return Collections.<String> emptySet();
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final DevicePolicyData policy = getUserData(userHandle.getIdentifier());
             return policy.mAcceptedCaCertificates;
         }
@@ -3542,7 +3592,7 @@
         DevicePolicyData policy = getUserData(userHandle);
         DeviceAdminInfo info = findAdmin(adminReceiver, userHandle,
                 /* throwForMissingPermission= */ true);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             checkActiveAdminPrecondition(adminReceiver, info, policy);
             long ident = mInjector.binderClearCallingIdentity();
             try {
@@ -3592,7 +3642,7 @@
     }
 
     private void pushActiveAdminPackages() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final List<UserInfo> users = mUserManager.getUsers();
             for (int i = users.size() - 1; i >= 0; --i) {
                 final int userId = users.get(i).id;
@@ -3603,7 +3653,7 @@
     }
 
     private void pushAllMeteredRestrictedPackages() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final List<UserInfo> users = mUserManager.getUsers();
             for (int i = users.size() - 1; i >= 0; --i) {
                 final int userId = users.get(i).id;
@@ -3681,7 +3731,7 @@
             return false;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return getActiveAdminUncheckedLocked(adminReceiver, userHandle) != null;
         }
     }
@@ -3692,7 +3742,7 @@
             return false;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policyData = getUserData(userHandle);
             return policyData.mRemovingAdmins.contains(adminReceiver);
         }
@@ -3704,7 +3754,7 @@
             return false;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin administrator = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
             if (administrator == null) {
                 throw new SecurityException("No active admin " + adminReceiver);
@@ -3721,7 +3771,7 @@
         }
 
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(userHandle);
             final int N = policy.mAdminList.size();
             if (N <= 0) {
@@ -3741,7 +3791,7 @@
             return false;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(userHandle);
             final int N = policy.mAdminList.size();
             for (int i=0; i<N; i++) {
@@ -3762,7 +3812,7 @@
         enforceShell("forceRemoveActiveAdmin");
         long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this)  {
+            synchronized (getLockObject()) {
                 if (!isAdminTestOnlyLocked(adminReceiver, userHandle)) {
                     throw new SecurityException("Attempt to remove non-test admin "
                             + adminReceiver + " " + userHandle);
@@ -3842,7 +3892,7 @@
         }
         enforceFullCrossUsersPermission(userHandle);
         enforceUserUnlocked(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
             if (admin == null) {
                 return;
@@ -3884,7 +3934,7 @@
         validateQualityConstant(quality);
 
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -3903,7 +3953,6 @@
      * be the correct one upon boot.
      * This should be called whenever the password or the admin policies have changed.
      */
-    @GuardedBy("DevicePolicyManagerService.this")
     private void updatePasswordValidityCheckpointLocked(int userHandle, boolean parent) {
         final int credentialOwner = getCredentialOwner(userHandle, parent);
         DevicePolicyData policy = getUserData(credentialOwner);
@@ -3926,7 +3975,7 @@
             return PASSWORD_QUALITY_UNSPECIFIED;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             int mode = PASSWORD_QUALITY_UNSPECIFIED;
 
             if (who != null) {
@@ -3998,7 +4047,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4023,7 +4072,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             if (ap.passwordHistoryLength != length) {
@@ -4052,7 +4101,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkArgumentNonnegative(timeout, "Timeout must be >= 0 ms");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD, parent);
             // Calling this API automatically bumps the expiration date
@@ -4086,7 +4135,7 @@
             return 0L;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             long timeout = 0L;
 
             if (who != null) {
@@ -4114,7 +4163,7 @@
         final int userId = UserHandle.getCallingUserId();
         List<String> changedProviders = null;
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (activeAdmin.crossProfileWidgetProviders == null) {
@@ -4141,7 +4190,7 @@
         final int userId = UserHandle.getCallingUserId();
         List<String> changedProviders = null;
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (activeAdmin.crossProfileWidgetProviders == null
@@ -4165,7 +4214,7 @@
 
     @Override
     public List<String> getCrossProfileWidgetProviders(ComponentName admin) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (activeAdmin.crossProfileWidgetProviders == null
@@ -4211,7 +4260,7 @@
             return 0L;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return getPasswordExpirationLocked(who, userHandle, parent);
         }
     }
@@ -4223,7 +4272,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4245,7 +4294,7 @@
     public void setPasswordMinimumLowerCase(ComponentName who, int length, boolean parent) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4270,7 +4319,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4295,7 +4344,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4320,7 +4369,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4345,7 +4394,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
             final PasswordMetrics metrics = ap.minimumPasswordMetrics;
@@ -4372,7 +4421,7 @@
             return 0;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
                 return admin != null ? getter.apply(admin) : 0;
@@ -4404,7 +4453,7 @@
         enforceFullCrossUsersPermission(userHandle);
         enforceUserUnlocked(userHandle, parent);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // This API can only be called by an active device admin,
             // so try to retrieve it to check that the caller is one.
             getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
@@ -4435,7 +4484,7 @@
         enforceFullCrossUsersPermission(userHandle);
         enforceManagedProfile(userHandle, "call APIs refering to the parent profile");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int targetUser = getProfileParentId(userHandle);
             enforceUserUnlocked(targetUser, false);
             int credentialOwner = getCredentialOwner(userHandle, false);
@@ -4502,7 +4551,7 @@
     @Override
     public int getCurrentFailedPasswordAttempts(int userHandle, boolean parent) {
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!isCallerWithSystemUid()) {
                 // This API can only be called by an active device admin,
                 // so try to retrieve it to check that the caller is one.
@@ -4523,7 +4572,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // This API can only be called by an active device admin,
             // so try to retrieve it to check that the caller is one.
             getActiveAdminForCallerLocked(
@@ -4548,7 +4597,7 @@
             return 0;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = (who != null)
                     ? getActiveAdminUncheckedLocked(who, userHandle, parent)
                     : getAdminWithMinimumFailedPasswordsForWipeLocked(userHandle, parent);
@@ -4562,7 +4611,7 @@
             return UserHandle.USER_NULL;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getAdminWithMinimumFailedPasswordsForWipeLocked(
                     userHandle, parent);
             return admin != null ? admin.getUserHandle().getIdentifier() : UserHandle.USER_NULL;
@@ -4623,7 +4672,7 @@
 
     /* PO or DO could do an untrusted reset in certain conditions. */
     private boolean canUserHaveUntrustedCredentialReset(@UserIdInt int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // An active DO or PO might be able to fo an untrusted credential reset
             for (final ActiveAdmin admin : getUserData(userId).mAdminList) {
                 if (!isActiveAdminWithPolicyForUserLocked(admin,
@@ -4649,7 +4698,7 @@
             enforceNotManagedProfile(userHandle, "clear the active password");
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // If caller has PO (or DO) it can change the password, so see if that's the case first.
             ActiveAdmin admin = getActiveAdminWithPolicyForUidLocked(
                     null, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, callingUid);
@@ -4719,7 +4768,7 @@
     private boolean resetPasswordInternal(String password, long tokenHandle, byte[] token,
             int flags, int callingUid, int userHandle) {
         int quality;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             quality = getPasswordQuality(null, userHandle, /* parent */ false);
             if (quality == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
                 quality = PASSWORD_QUALITY_UNSPECIFIED;
@@ -4829,7 +4878,7 @@
                 mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW,
                         UserHandle.USER_ALL);
             }
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 int newOwner = requireEntry ? callingUid : -1;
                 if (policy.mPasswordOwner != newOwner) {
                     policy.mPasswordOwner = newOwner;
@@ -4852,7 +4901,7 @@
     }
 
     private void setDoNotAskCredentialsOnBoot() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
             if (!policyData.doNotAskCredentialsOnBoot) {
                 policyData.doNotAskCredentialsOnBoot = true;
@@ -4865,7 +4914,7 @@
     public boolean getDoNotAskCredentialsOnBoot() {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT, null);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
             return policyData.doNotAskCredentialsOnBoot;
         }
@@ -4878,7 +4927,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_FORCE_LOCK, parent);
             if (ap.maximumTimeToUnlock != timeMs) {
@@ -4952,7 +5001,7 @@
             return 0;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
                 return admin != null ? admin.maximumTimeToUnlock : 0;
@@ -4994,7 +5043,7 @@
         }
 
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, parent);
             if (ap.strongAuthUnlockTimeout != timeoutMs) {
@@ -5015,7 +5064,7 @@
             return DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS;
         }
         enforceFullCrossUsersPermission(userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId, parent);
                 return admin != null ? admin.strongAuthUnlockTimeout : 0;
@@ -5053,7 +5102,7 @@
         }
 
         final int callingUserId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // This API can only be called by an active device admin,
             // so try to retrieve it to check that the caller is one.
             final ActiveAdmin admin = getActiveAdminForCallerLocked(
@@ -5122,7 +5171,7 @@
     }
 
     private void enforceProfileOrDeviceOwner(ComponentName who) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
         }
     }
@@ -5130,7 +5179,7 @@
     @Override
     public boolean approveCaCert(String alias, int userId, boolean approval) {
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             Set<String> certs = getUserData(userId).mAcceptedCaCertificates;
             boolean changed = (approval ? certs.add(alias) : certs.remove(alias));
             if (!changed) {
@@ -5145,7 +5194,7 @@
     @Override
     public boolean isCaCertApproved(String alias, int userId) {
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return getUserData(userId).mAcceptedCaCertificates.contains(alias);
         }
     }
@@ -5157,7 +5206,7 @@
                 isSecure |= mLockPatternUtils.isSecure(getProfileParentId(userInfo.id));
             }
             if (!isSecure) {
-                synchronized (this) {
+                synchronized (getLockObject()) {
                     getUserData(userInfo.id).mAcceptedCaCertificates.clear();
                     saveSettingsLocked(userInfo.id);
                 }
@@ -5188,7 +5237,7 @@
             mInjector.binderRestoreCallingIdentity(id);
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getUserData(userHandle.getIdentifier()).mOwnerInstalledCaCerts.add(alias);
             saveSettingsLocked(userHandle.getIdentifier());
         }
@@ -5210,7 +5259,7 @@
             mInjector.binderRestoreCallingIdentity(id);
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (getUserData(userId).mOwnerInstalledCaCerts.removeAll(Arrays.asList(aliases))) {
                 saveSettingsLocked(userId);
             }
@@ -5295,7 +5344,7 @@
             }
         } else {
             // Caller provided - check it is the device owner.
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             }
         }
@@ -5555,7 +5604,7 @@
 
         // Retrieve the user ID of the calling process.
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure calling process is device/profile owner.
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             // Ensure the delegate is installed (skip this for DELEGATION_CERT_INSTALL in pre-N).
@@ -5616,7 +5665,7 @@
         // Retrieve the user ID of the calling process.
         final int callingUid = mInjector.binderGetCallingUid();
         final int userId = UserHandle.getUserId(callingUid);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure calling process is device/profile owner.
             if (who != null) {
                 getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
@@ -5659,7 +5708,7 @@
 
         // Retrieve the user ID of the calling process.
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure calling process is device/profile owner.
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             final DevicePolicyData policy = getUserData(userId);
@@ -5698,7 +5747,7 @@
         // Retrieve the UID and user ID of the calling process.
         final int callingUid = mInjector.binderGetCallingUid();
         final int userId = UserHandle.getUserId(callingUid);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Retrieve user policy data.
             final DevicePolicyData policy = getUserData(userId);
             // Retrieve the list of delegation scopes granted to callerPackage.
@@ -5737,7 +5786,7 @@
             String scope) {
         // If a ComponentName is given ensure it is a device or profile owner according to policy.
         if (who != null) {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 getActiveAdminForCallerLocked(who, reqPolicy);
             }
         // If no ComponentName is given ensure calling process has scope delegation.
@@ -5756,7 +5805,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
 
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized(this) {
+        synchronized (getLockObject()) {
             // Ensure calling process is device/profile owner.
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             final DevicePolicyData policy = getUserData(userId);
@@ -5887,7 +5936,7 @@
         enforceFullCrossUsersPermission(mInjector.userHandleGetCallingUserId());
 
         final ActiveAdmin admin;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             admin = getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_WIPE_DATA);
         }
         String internalReason = "DevicePolicyManager.wipeDataWithReason() from "
@@ -5970,7 +6019,7 @@
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.BIND_DEVICE_ADMIN, null);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(comp, userHandle);
             if (admin == null) {
                 result.sendResult(null);
@@ -6009,7 +6058,7 @@
         }
 
         validateQualityConstant(metrics.quality);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             mUserPasswordMetrics.put(userHandle, metrics);
         }
     }
@@ -6033,7 +6082,7 @@
 
         long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 policy.mFailedPasswordAttempts = 0;
                 updatePasswordValidityCheckpointLocked(userId, /* parent */ false);
                 updatePasswordExpirationsLocked(userId);
@@ -6086,7 +6135,7 @@
         ActiveAdmin strictestAdmin = null;
         final long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 DevicePolicyData policy = getUserData(userHandle);
                 policy.mFailedPasswordAttempts++;
                 saveSettingsLocked(userHandle);
@@ -6146,7 +6195,7 @@
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.BIND_DEVICE_ADMIN, null);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(userHandle);
             if (policy.mFailedPasswordAttempts != 0 || policy.mPasswordOwner >= 0) {
                 long ident = mInjector.binderClearCallingIdentity();
@@ -6221,7 +6270,7 @@
         if (!mHasFeature) {
             return null;
         }
-        synchronized(this) {
+        synchronized (getLockObject()) {
             Preconditions.checkNotNull(who, "ComponentName is null");
 
             // Only check if system user has set global proxy. We don't allow other users to set it.
@@ -6276,7 +6325,7 @@
             return null;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized(this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
             // Scan through active admins and find if anyone has already
             // set the global proxy.
@@ -6296,7 +6345,7 @@
 
     @Override
     public void setRecommendedGlobalProxy(ComponentName who, ProxyInfo proxyInfo) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
         long token = mInjector.binderClearCallingIdentity();
@@ -6365,7 +6414,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Check for permissions
             // Only system user can set storage encryption
             if (userHandle != UserHandle.USER_SYSTEM) {
@@ -6416,7 +6465,7 @@
             return false;
         }
         enforceFullCrossUsersPermission(userHandle);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Check for permissions if a particular caller is specified
             if (who != null) {
                 // When checking for a single caller, status is based on caller's request
@@ -6519,7 +6568,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (ap.disableScreenCapture != disabled) {
@@ -6539,7 +6588,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
                 return (admin != null) ? admin.disableScreenCapture : false;
@@ -6581,7 +6630,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (admin.requireAutoTime != required) {
@@ -6609,7 +6658,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
             if (deviceOwner != null && deviceOwner.requireAutoTime) {
                 // If the device owner enforces auto time, we don't need to check the PO's
@@ -6640,7 +6689,7 @@
                     "Cannot force ephemeral users on systems without split system user.");
         }
         boolean removeAllUsers = false;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             if (deviceOwner.forceEphemeralUsers != forceEphemeralUsers) {
@@ -6666,7 +6715,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             return deviceOwner.forceEphemeralUsers;
@@ -6674,7 +6723,7 @@
     }
 
     private void ensureDeviceOwnerAndAllUsersAffiliated(ComponentName who) throws SecurityException {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             if (!areAllUsersAffiliatedWithDeviceLocked()) {
                 throw new SecurityException("Not all users are affiliated.");
@@ -6701,7 +6750,7 @@
         }
 
         final long currentTime = System.currentTimeMillis();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
             if (currentTime > policyData.mLastBugReportRequestTime) {
                 policyData.mLastBugReportRequestTime = currentTime;
@@ -6736,7 +6785,7 @@
     void sendDeviceOwnerCommand(String action, Bundle extras) {
         int deviceOwnerUserId;
         ComponentName deviceOwnerComponent;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             deviceOwnerUserId = mOwners.getDeviceOwnerUserId();
             deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
         }
@@ -6765,13 +6814,17 @@
         mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
     }
 
-    private synchronized String getDeviceOwnerRemoteBugreportUri() {
-        return mOwners.getDeviceOwnerRemoteBugreportUri();
+    private String getDeviceOwnerRemoteBugreportUri() {
+        synchronized (getLockObject()) {
+            return mOwners.getDeviceOwnerRemoteBugreportUri();
+        }
     }
 
-    private synchronized void setDeviceOwnerRemoteBugreportUriAndHash(String bugreportUri,
+    private void setDeviceOwnerRemoteBugreportUriAndHash(String bugreportUri,
             String bugreportHash) {
-        mOwners.setDeviceOwnerRemoteBugreportUriAndHash(bugreportUri, bugreportHash);
+        synchronized (getLockObject()) {
+            mOwners.setDeviceOwnerRemoteBugreportUriAndHash(bugreportUri, bugreportHash);
+        }
     }
 
     private void registerRemoteBugreportReceivers() {
@@ -6833,7 +6886,7 @@
         mRemoteBugreportSharingAccepted.set(true);
         String bugreportUriString = null;
         String bugreportHash = null;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             bugreportUriString = getDeviceOwnerRemoteBugreportUri();
             bugreportHash = mOwners.getDeviceOwnerRemoteBugreportHash();
         }
@@ -6870,7 +6923,7 @@
             Uri bugreportUri = Uri.parse(bugreportUriString);
             pfd = mContext.getContentResolver().openFileDescriptor(bugreportUri, "r");
 
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 Intent intent = new Intent(DeviceAdminReceiver.ACTION_BUGREPORT_SHARE);
                 intent.setComponent(mOwners.getDeviceOwnerComponent());
                 intent.setDataAndType(bugreportUri, RemoteBugreportUtils.BUGREPORT_MIMETYPE);
@@ -6911,7 +6964,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_DISABLE_CAMERA);
             if (ap.disableCamera != disabled) {
@@ -6937,7 +6990,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
                 return (admin != null) ? admin.disableCamera : false;
@@ -6978,7 +7031,7 @@
                 which = which & PROFILE_KEYGUARD_FEATURES;
             }
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
             if (ap.disabledKeyguardFeatures != which) {
@@ -7005,7 +7058,7 @@
         enforceFullCrossUsersPermission(userHandle);
         final long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 if (who != null) {
                     ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
                     return (admin != null) ? admin.disabledKeyguardFeatures : 0;
@@ -7053,7 +7106,7 @@
         }
         Preconditions.checkNotNull(packageList, "packageList is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO or a keep uninstalled packages delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
                     DELEGATION_KEEP_UNINSTALLED_PACKAGES);
@@ -7074,7 +7127,7 @@
             return null;
         }
         // TODO In split system user mode, allow apps on user 0 to query the list
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO or a keep uninstalled packages delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
                     DELEGATION_KEEP_UNINSTALLED_PACKAGES);
@@ -7099,7 +7152,7 @@
         }
         final boolean hasIncompatibleAccountsOrNonAdb =
                 hasIncompatibleAccountsOrNonAdbNoLock(userId, admin);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanSetDeviceOwnerLocked(admin, userId, hasIncompatibleAccountsOrNonAdb);
             final ActiveAdmin activeAdmin = getActiveAdminUncheckedLocked(admin, userId);
             if (activeAdmin == null
@@ -7168,7 +7221,7 @@
     }
 
     public boolean isDeviceOwner(ComponentName who, int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mOwners.hasDeviceOwner()
                     && mOwners.getDeviceOwnerUserId() == userId
                     && mOwners.getDeviceOwnerComponent().equals(who);
@@ -7176,7 +7229,7 @@
     }
 
     private boolean isDeviceOwnerPackage(String packageName, int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mOwners.hasDeviceOwner()
                     && mOwners.getDeviceOwnerUserId() == userId
                     && mOwners.getDeviceOwnerPackageName().equals(packageName);
@@ -7184,7 +7237,7 @@
     }
 
     private boolean isProfileOwnerPackage(String packageName, int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mOwners.hasProfileOwner(userId)
                     && mOwners.getProfileOwnerPackage(userId).equals(packageName);
         }
@@ -7203,7 +7256,7 @@
         if (!callingUserOnly) {
             enforceManageUsers();
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!mOwners.hasDeviceOwner()) {
                 return null;
             }
@@ -7221,7 +7274,7 @@
             return UserHandle.USER_NULL;
         }
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mOwners.hasDeviceOwner() ? mOwners.getDeviceOwnerUserId() : UserHandle.USER_NULL;
         }
     }
@@ -7236,7 +7289,7 @@
             return null;
         }
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!mOwners.hasDeviceOwner()) {
                 return null;
             }
@@ -7250,6 +7303,7 @@
     /** Returns the active device owner or {@code null} if there is no device owner. */
     @VisibleForTesting
     ActiveAdmin getDeviceOwnerAdminLocked() {
+        ensureLocked();
         ComponentName component = mOwners.getDeviceOwnerComponent();
         if (component == null) {
             return null;
@@ -7280,7 +7334,7 @@
         } catch (NameNotFoundException e) {
             throw new SecurityException(e);
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
             final int deviceOwnerUserId = mOwners.getDeviceOwnerUserId();
             if (!mOwners.hasDeviceOwner()
@@ -7368,7 +7422,7 @@
         }
         final boolean hasIncompatibleAccountsOrNonAdb =
                 hasIncompatibleAccountsOrNonAdbNoLock(userHandle, who);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanSetProfileOwnerLocked(who, userHandle, hasIncompatibleAccountsOrNonAdb);
 
             final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
@@ -7414,7 +7468,7 @@
         final int userId = mInjector.userHandleGetCallingUserId();
         enforceNotManagedProfile(userId, "clear profile owner");
         enforceUserUnlocked(userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Check if this is the profile owner who is calling
             final ActiveAdmin admin =
                     getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
@@ -7457,7 +7511,7 @@
             return;
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             long token = mInjector.binderClearCallingIdentity();
             try {
@@ -7546,7 +7600,7 @@
                       + "device or profile owner is set.");
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             boolean transitionCheckNeeded = true;
 
             // Calling identity/permission checks.
@@ -7616,7 +7670,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Check if this is the profile owner who is calling
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             final int userId = UserHandle.getCallingUserId();
@@ -7664,7 +7718,7 @@
             return null;
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mOwners.getProfileOwnerComponent(userHandle);
         }
     }
@@ -7881,7 +7935,7 @@
     }
 
     private void enforceDeviceOwnerOrManageUsers() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (getActiveAdminWithPolicyForUidLocked(null, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
                     mInjector.binderGetCallingUid()) != null) {
                 return;
@@ -7891,7 +7945,7 @@
     }
 
     private void enforceProfileOwnerOrSystemUser() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (getActiveAdminWithPolicyForUidLocked(null,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, mInjector.binderGetCallingUid())
                             != null) {
@@ -7904,7 +7958,7 @@
 
     private void enforceProfileOwnerOrFullCrossUsersPermission(int userId) {
         if (userId == mInjector.userHandleGetCallingUserId()) {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 if (getActiveAdminWithPolicyForUidLocked(null,
                         DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, mInjector.binderGetCallingUid())
                                 != null) {
@@ -8017,7 +8071,7 @@
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return;
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             pw.println("Current Device Policy Manager state:");
 
             mOwners.dump("  ", pw);
@@ -8048,6 +8102,8 @@
             pw.println();
             mConstants.dump("  ", pw);
             pw.println();
+            mStatLogger.dump(pw, "  ");
+            pw.println();
             pw.println("  Encryption Status: " + getEncryptionStatusName(getEncryptionStatus()));
         }
     }
@@ -8076,7 +8132,7 @@
             ComponentName activity) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             long id = mInjector.binderClearCallingIdentity();
@@ -8095,7 +8151,7 @@
     public void clearPackagePersistentPreferredActivities(ComponentName who, String packageName) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             long id = mInjector.binderClearCallingIdentity();
@@ -8113,7 +8169,7 @@
     @Override
     public void setDefaultSmsApplication(ComponentName admin, String packageName) {
         Preconditions.checkNotNull(admin, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
         mInjector.binderWithCleanCallingIdentity(() ->
@@ -8167,7 +8223,7 @@
         Preconditions.checkNotNull(admin, "admin is null");
         Preconditions.checkNotNull(agent, "agent is null");
         final int userHandle = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(admin,
                     DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
             ap.trustAgentInfos.put(agent.flattenToString(), new TrustAgentInfo(args));
@@ -8184,7 +8240,7 @@
         Preconditions.checkNotNull(agent, "agent null");
         enforceFullCrossUsersPermission(userHandle);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final String componentName = agent.flattenToString();
             if (admin != null) {
                 final ActiveAdmin ap = getActiveAdminUncheckedLocked(admin, userHandle, parent);
@@ -8234,7 +8290,7 @@
     @Override
     public void setRestrictionsProvider(ComponentName who, ComponentName permissionProvider) {
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             int userHandle = UserHandle.getCallingUserId();
@@ -8246,7 +8302,7 @@
 
     @Override
     public ComponentName getRestrictionsProvider(int userHandle) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!isCallerWithSystemUid()) {
                 throw new SecurityException("Only the system can query the permission provider");
             }
@@ -8259,7 +8315,7 @@
     public void addCrossProfileIntentFilter(ComponentName who, IntentFilter filter, int flags) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             long id = mInjector.binderClearCallingIdentity();
@@ -8290,7 +8346,7 @@
     public void clearCrossProfileIntentFilters(ComponentName who) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             long id = mInjector.binderClearCallingIdentity();
             try {
@@ -8397,7 +8453,7 @@
             }
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             admin.permittedAccessiblityServices = packageList;
@@ -8413,7 +8469,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.permittedAccessiblityServices;
@@ -8425,7 +8481,8 @@
         if (!mHasFeature) {
             return null;
         }
-        synchronized (this) {
+        enforceManageUsers();
+        synchronized (getLockObject()) {
             List<String> result = null;
             // If we have multiple profiles we return the intersection of the
             // permitted lists. This can happen in cases where we have a device
@@ -8492,7 +8549,7 @@
             throw new SecurityException(
                     "Only the system can query if an accessibility service is disabled by admin");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
             if (admin == null) {
                 return false;
@@ -8570,7 +8627,7 @@
             }
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             admin.permittedInputMethods = packageList;
@@ -8586,7 +8643,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.permittedInputMethods;
@@ -8606,7 +8663,7 @@
         }
 
         int userId = currentUser.id;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             List<String> result = null;
             // If we have multiple profiles we return the intersection of the
             // permitted lists. This can happen in cases where we have a device
@@ -8666,7 +8723,7 @@
             throw new SecurityException(
                     "Only the system can query if an input method is disabled by admin");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
             if (admin == null) {
                 return false;
@@ -8692,7 +8749,7 @@
             return false;
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             admin.permittedNotificationListeners = packageList;
@@ -8708,7 +8765,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(
                     who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.permittedNotificationListeners;
@@ -8726,7 +8783,7 @@
             throw new SecurityException(
                     "Only the system can query if a notification listener service is permitted");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
             if (profileOwner == null || profileOwner.permittedNotificationListeners == null) {
                 return true;
@@ -8782,7 +8839,7 @@
 
         // Create user.
         UserHandle user = null;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
             final int callingUid = mInjector.binderGetCallingUid();
@@ -8871,7 +8928,7 @@
             final String ownerName = getProfileOwnerName(Process.myUserHandle().getIdentifier());
             setProfileOwner(profileOwner, ownerName, userHandle);
 
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 DevicePolicyData policyData = getUserData(userHandle);
                 policyData.mInitBundle = adminExtras;
                 policyData.mAdminBroadcastPending = true;
@@ -8902,7 +8959,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkNotNull(userHandle, "UserHandle is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -8941,7 +8998,7 @@
     public boolean switchUser(ComponentName who, UserHandle userHandle) {
         Preconditions.checkNotNull(who, "ComponentName is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
             long id = mInjector.binderClearCallingIdentity();
@@ -8965,7 +9022,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkNotNull(userHandle, "UserHandle is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -9000,7 +9057,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkNotNull(userHandle, "UserHandle is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -9018,7 +9075,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
 
         final int callingUserId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (!isUserAffiliatedWithDeviceLocked(callingUserId)) {
                 throw new SecurityException("Admin " + who +
@@ -9070,7 +9127,7 @@
     @Override
     public List<UserHandle> getSecondaryUsers(ComponentName who) {
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -9094,7 +9151,7 @@
     @Override
     public boolean isEphemeralUser(ComponentName who) {
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
         }
 
@@ -9129,7 +9186,7 @@
     public String[] setPackagesSuspended(ComponentName who, String callerPackage,
             String[] packageNames, boolean suspended) {
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a package access delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PACKAGE_ACCESS);
@@ -9137,7 +9194,7 @@
             long id = mInjector.binderClearCallingIdentity();
             try {
                 return mIPackageManager.setPackagesSuspendedAsUser(
-                        packageNames, suspended, null, null, "android", callingUserId);
+                        packageNames, suspended, null, null, null, "android", callingUserId);
             } catch (RemoteException re) {
                 // Shouldn't happen.
                 Slog.e(LOG_TAG, "Failed talking to the package manager", re);
@@ -9151,7 +9208,7 @@
     @Override
     public boolean isPackageSuspended(ComponentName who, String callerPackage, String packageName) {
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a package access delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PACKAGE_ACCESS);
@@ -9177,7 +9234,7 @@
         }
 
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin activeAdmin =
                     getActiveAdminForCallerLocked(who,
                             DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
@@ -9216,7 +9273,7 @@
     }
 
     private void pushUserRestrictions(int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final boolean isDeviceOwner = mOwners.isDeviceOwnerUserId(userId);
             final Bundle userRestrictions;
             // Whether device owner enforces camera restriction.
@@ -9263,7 +9320,7 @@
             return null;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return activeAdmin.userRestrictions;
@@ -9274,7 +9331,7 @@
     public boolean setApplicationHidden(ComponentName who, String callerPackage, String packageName,
             boolean hidden) {
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a package access delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PACKAGE_ACCESS);
@@ -9297,7 +9354,7 @@
     public boolean isApplicationHidden(ComponentName who, String callerPackage,
             String packageName) {
         int callingUserId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a package access delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PACKAGE_ACCESS);
@@ -9318,7 +9375,7 @@
 
     @Override
     public void enableSystemApp(ComponentName who, String callerPackage, String packageName) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or an enable system app delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_ENABLE_SYSTEM_APP);
@@ -9359,7 +9416,7 @@
 
     @Override
     public int enableSystemAppWithIntent(ComponentName who, String callerPackage, Intent intent) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or an enable system app delegate.
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_ENABLE_SYSTEM_APP);
@@ -9421,7 +9478,7 @@
     @Override
     public boolean installExistingPackage(ComponentName who, String callerPackage,
             String packageName) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a PO or an install existing package delegate
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_INSTALL_EXISTING_PACKAGE);
@@ -9458,7 +9515,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin ap = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (disabled) {
@@ -9481,7 +9538,7 @@
         if (!mHasFeature) {
             return null;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(userId);
             final int N = policy.mAdminList.size();
             ArraySet<String> resultSet = new ArraySet<>();
@@ -9497,7 +9554,7 @@
     public void setUninstallBlocked(ComponentName who, String callerPackage, String packageName,
             boolean uninstallBlocked) {
         final int userId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a block uninstall delegate
             enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_BLOCK_UNINSTALL);
@@ -9521,7 +9578,7 @@
         // when the package is a system app, or when it is an active device admin.
         final int userId = UserHandle.getCallingUserId();
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (who != null) {
                 getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             }
@@ -9545,7 +9602,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (admin.disableCallerId != disabled) {
@@ -9561,7 +9618,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.disableCallerId;
@@ -9571,7 +9628,7 @@
     @Override
     public boolean getCrossProfileCallerIdDisabledForUser(int userId) {
         enforceCrossUsersPermission(userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
             return (admin != null) ? admin.disableCallerId : false;
         }
@@ -9583,7 +9640,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (admin.disableContactsSearch != disabled) {
@@ -9599,7 +9656,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.disableContactsSearch;
@@ -9609,7 +9666,7 @@
     @Override
     public boolean getCrossProfileContactsSearchDisabledForUser(int userId) {
         enforceCrossUsersPermission(userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
             return (admin != null) ? admin.disableContactsSearch : false;
         }
@@ -9624,7 +9681,7 @@
 
         final long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 final int managedUserId = getManagedUserId(callingUserId);
                 if (managedUserId < 0) {
                     return;
@@ -9682,7 +9739,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (admin.disableBluetoothContactSharing != disabled) {
@@ -9698,7 +9755,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.disableBluetoothContactSharing;
@@ -9710,7 +9767,7 @@
         // TODO: Should there be a check to make sure this relationship is
         // within a profile group?
         // enforceSystemProcess("getCrossProfileCallerIdDisabled can only be called by system");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
             return (admin != null) ? admin.disableBluetoothContactSharing : false;
         }
@@ -9722,7 +9779,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkNotNull(packages, "packages is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanCallLockTaskLocked(who);
             final int userHandle = mInjector.userHandleGetCallingUserId();
             setLockTaskPackagesLocked(userHandle, new ArrayList<>(Arrays.asList(packages)));
@@ -9743,7 +9800,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
 
         final int userHandle = mInjector.binderGetCallingUserHandle().getIdentifier();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanCallLockTaskLocked(who);
             final List<String> packages = getUserData(userHandle).mLockTaskPackages;
             return packages.toArray(new String[packages.size()]);
@@ -9753,7 +9810,7 @@
     @Override
     public boolean isLockTaskPermitted(String pkg) {
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return getUserData(userHandle).mLockTaskPackages.contains(pkg);
         }
     }
@@ -9772,7 +9829,7 @@
             "Cannot use LOCK_TASK_FEATURE_NOTIFICATIONS without LOCK_TASK_FEATURE_HOME");
 
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanCallLockTaskLocked(who);
             setLockTaskFeaturesLocked(userHandle, flags);
         }
@@ -9789,7 +9846,7 @@
     public int getLockTaskFeatures(ComponentName who) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceCanCallLockTaskLocked(who);
             return getUserData(userHandle).mLockTaskFeatures;
         }
@@ -9828,7 +9885,7 @@
         if (!isCallerWithSystemUid()) {
             throw new SecurityException("notifyLockTaskModeChanged can only be called by system");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final DevicePolicyData policy = getUserData(userHandle);
 
             if (policy.mStatusBarDisabled) {
@@ -9858,7 +9915,7 @@
     public void setGlobalSetting(ComponentName who, String setting, String value) {
         Preconditions.checkNotNull(who, "ComponentName is null");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
             // Some settings are no supported any more. However we do not want to throw a
@@ -9897,7 +9954,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         Preconditions.checkStringNotEmpty(setting, "String setting is null or empty");
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             if (!SYSTEM_SETTINGS_WHITELIST.contains(setting)) {
@@ -9942,7 +9999,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         int callingUserId = mInjector.userHandleGetCallingUserId();
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             if (isDeviceOwner(who, callingUserId)) {
@@ -10002,7 +10059,7 @@
     @Override
     public void setMasterVolumeMuted(ComponentName who, boolean on) {
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             setUserRestriction(who, UserManager.DISALLOW_UNMUTE_DEVICE, on);
         }
@@ -10011,7 +10068,7 @@
     @Override
     public boolean isMasterVolumeMuted(ComponentName who) {
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             AudioManager audioManager =
@@ -10022,7 +10079,7 @@
 
     @Override
     public void setUserIcon(ComponentName who, Bitmap icon) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             Preconditions.checkNotNull(who, "ComponentName is null");
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
@@ -10040,7 +10097,7 @@
     public boolean setKeyguardDisabled(ComponentName who, boolean disabled) {
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (!isUserAffiliatedWithDeviceLocked(userId)) {
                 throw new SecurityException("Admin " + who +
@@ -10070,7 +10127,7 @@
     @Override
     public boolean setStatusBarDisabled(ComponentName who, boolean disabled) {
         int userId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (!isUserAffiliatedWithDeviceLocked(userId)) {
                 throw new SecurityException("Admin " + who +
@@ -10139,7 +10196,7 @@
                 DevicePolicyData policy = getUserData(userHandle);
                 if (!policy.mUserSetupComplete) {
                     policy.mUserSetupComplete = true;
-                    synchronized (this) {
+                    synchronized (getLockObject()) {
                         saveSettingsLocked(userHandle);
                     }
                 }
@@ -10149,7 +10206,7 @@
                 DevicePolicyData policy = getUserData(userHandle);
                 if (!policy.mPaired) {
                     policy.mPaired = true;
-                    synchronized (this) {
+                    synchronized (getLockObject()) {
                         saveSettingsLocked(userHandle);
                     }
                 }
@@ -10166,7 +10223,7 @@
         private final Uri mDefaultImeChanged = Settings.Secure.getUriFor(
                 Settings.Secure.DEFAULT_INPUT_METHOD);
 
-        @GuardedBy("DevicePolicyManagerService.this")
+        @GuardedBy("getLockObject()")
         private Set<Integer> mUserIdsWithPendingChangesByOwner = new ArraySet<>();
 
         public SetupContentObserver(Handler handler) {
@@ -10182,7 +10239,7 @@
             mInjector.registerContentObserver(mDefaultImeChanged, false, this, UserHandle.USER_ALL);
         }
 
-        @GuardedBy("DevicePolicyManagerService.this")
+        @GuardedBy("getLockObject()")
         private void addPendingChangeByOwnerLocked(int userId) {
             mUserIdsWithPendingChangesByOwner.add(userId);
         }
@@ -10192,13 +10249,13 @@
             if (mUserSetupComplete.equals(uri) || (mIsWatch && mPaired.equals(uri))) {
                 updateUserSetupCompleteAndPaired();
             } else if (mDeviceProvisioned.equals(uri)) {
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     // Set PROPERTY_DEVICE_OWNER_PRESENT, for the SUW case where setting the property
                     // is delayed until device is marked as provisioned.
                     setDeviceOwnerSystemPropertyLocked();
                 }
             } else if (mDefaultImeChanged.equals(uri)) {
-                synchronized (DevicePolicyManagerService.this) {
+                synchronized (getLockObject()) {
                     if (mUserIdsWithPendingChangesByOwner.contains(userId)) {
                         // This change notification was triggered by the owner changing the current
                         // IME. Ignore it.
@@ -10220,7 +10277,7 @@
 
         @Override
         public List<String> getCrossProfileWidgetProviders(int profileId) {
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 if (mOwners == null) {
                     return Collections.emptyList();
                 }
@@ -10244,7 +10301,7 @@
         @Override
         public void addOnCrossProfileWidgetProvidersChangeListener(
                 OnCrossProfileWidgetProvidersChangeListener listener) {
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 if (mWidgetProviderListeners == null) {
                     mWidgetProviderListeners = new ArrayList<>();
                 }
@@ -10256,14 +10313,14 @@
 
         @Override
         public boolean isActiveAdminWithPolicy(int uid, int reqPolicy) {
-            synchronized(DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 return getActiveAdminWithPolicyForUidLocked(null, reqPolicy, uid) != null;
             }
         }
 
         private void notifyCrossProfileProvidersChanged(int userId, List<String> packages) {
             final List<OnCrossProfileWidgetProvidersChangeListener> listeners;
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 listeners = new ArrayList<>(mWidgetProviderListeners);
             }
             final int listenerCount = listeners.size();
@@ -10352,7 +10409,7 @@
 
         @Override
         public void reportSeparateProfileChallengeChanged(@UserIdInt int userId) {
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 updateMaximumTimeToLockLocked(userId);
             }
         }
@@ -10364,7 +10421,7 @@
 
         @Override
         public CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId) {
-            synchronized (DevicePolicyManagerService.this) {
+            synchronized (getLockObject()) {
                 DevicePolicyData policy = getUserData(userId);
                 if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING,
                         UserHandle.of(userId))) {
@@ -10426,7 +10483,7 @@
         if (DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction) ||
                 DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction) ||
                 DevicePolicyManager.POLICY_MANDATORY_BACKUPS.equals(restriction)) {
-            synchronized(this) {
+            synchronized (getLockObject()) {
                 final DevicePolicyData policy = getUserData(userId);
                 final int N = policy.mAdminList.size();
                 for (int i = 0; i < N; i++) {
@@ -10485,7 +10542,7 @@
             policy.validateAgainstPreviousFreezePeriod(record.first, record.second,
                     LocalDate.now());
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             if (policy == null) {
                 mOwners.clearSystemUpdatePolicy();
@@ -10502,7 +10559,7 @@
 
     @Override
     public SystemUpdatePolicy getSystemUpdatePolicy() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             SystemUpdatePolicy policy =  mOwners.getSystemUpdatePolicy();
             if (policy != null && !policy.isValid()) {
                 Slog.w(LOG_TAG, "Stored system update policy is invalid, return null instead.");
@@ -10535,7 +10592,7 @@
      */
     private void updateSystemUpdateFreezePeriodsRecord(boolean saveIfChanged) {
         Slog.d(LOG_TAG, "updateSystemUpdateFreezePeriodsRecord");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final SystemUpdatePolicy policy = mOwners.getSystemUpdatePolicy();
             if (policy == null) {
                 return;
@@ -10579,7 +10636,7 @@
     @Override
     public void clearSystemUpdatePolicyFreezePeriodRecord() {
         enforceShell("clearSystemUpdatePolicyFreezePeriodRecord");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Print out current record to help diagnosed CTS failures
             Slog.i(LOG_TAG, "Clear freeze period record: "
                     + mOwners.getSystemUpdateFreezePeriodRecordAsString());
@@ -10597,7 +10654,7 @@
      */
     @VisibleForTesting
     boolean isCallerDeviceOwner(int callerUid) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!mOwners.hasDeviceOwner()) {
                 return false;
             }
@@ -10643,7 +10700,7 @@
 
         final long ident = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 // Broadcast to device owner first if there is one.
                 if (mOwners.hasDeviceOwner()) {
                     final UserHandle deviceOwnerUser =
@@ -10663,7 +10720,7 @@
             }
             // Send broadcasts to corresponding profile owners if any.
             for (final int userId : runningUserIds) {
-                synchronized (this) {
+                synchronized (getLockObject()) {
                     final ComponentName profileOwnerPackage =
                             mOwners.getProfileOwnerComponent(userId);
                     if (profileOwnerPackage != null) {
@@ -10689,7 +10746,7 @@
     public void setPermissionPolicy(ComponentName admin, String callerPackage, int policy)
             throws RemoteException {
         int userId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a permission grant state delegate.
             enforceCanManageScope(admin, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PERMISSION_GRANT);
@@ -10704,7 +10761,7 @@
     @Override
     public int getPermissionPolicy(ComponentName admin) throws RemoteException {
         int userId = UserHandle.getCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData userPolicy = getUserData(userId);
             return userPolicy.mPermissionPolicy;
         }
@@ -10714,7 +10771,7 @@
     public boolean setPermissionGrantState(ComponentName admin, String callerPackage,
             String packageName, String permission, int grantState) throws RemoteException {
         UserHandle user = mInjector.binderGetCallingUserHandle();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // Ensure the caller is a DO/PO or a permission grant state delegate.
             enforceCanManageScope(admin, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
                     DELEGATION_PERMISSION_GRANT);
@@ -10772,7 +10829,7 @@
             enforceCanManageScope(admin, callerPackage,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, DELEGATION_PERMISSION_GRANT);
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             long ident = mInjector.binderClearCallingIdentity();
             try {
                 int granted = mIPackageManager.checkPermission(permission,
@@ -10910,7 +10967,7 @@
     }
 
     private int checkDeviceOwnerProvisioningPreCondition(int deviceOwnerUserId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             // hasIncompatibleAccountsOrNonAdb doesn't matter since the caller is not adb.
             return checkDeviceOwnerProvisioningPreConditionLocked(/* owner unknown */ null,
                     deviceOwnerUserId, /* isAdb= */ false,
@@ -10977,7 +11034,7 @@
      * Return device owner or profile owner set on a given user.
      */
     private @Nullable ComponentName getOwnerComponent(int userId) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (mOwners.getDeviceOwnerUserId() == userId) {
                 return mOwners.getDeviceOwnerComponent();
             }
@@ -11028,7 +11085,7 @@
     @Override
     public String getWifiMacAddress(ComponentName admin) {
         // Make sure caller has DO.
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -11068,7 +11125,7 @@
 
     @Override
     public boolean isSystemOnlyUser(ComponentName admin) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
         final int callingUserId = mInjector.userHandleGetCallingUserId();
@@ -11079,7 +11136,7 @@
     public void reboot(ComponentName admin) {
         Preconditions.checkNotNull(admin);
         // Make sure caller has DO.
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
         long ident = mInjector.binderClearCallingIdentity();
@@ -11101,7 +11158,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForUidLocked(who,
                     mInjector.binderGetCallingUid());
             if (!TextUtils.equals(admin.shortSupportMessage, message)) {
@@ -11117,7 +11174,7 @@
             return null;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForUidLocked(who,
                     mInjector.binderGetCallingUid());
             return admin.shortSupportMessage;
@@ -11131,7 +11188,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForUidLocked(who,
                     mInjector.binderGetCallingUid());
             if (!TextUtils.equals(admin.longSupportMessage, message)) {
@@ -11147,7 +11204,7 @@
             return null;
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForUidLocked(who,
                     mInjector.binderGetCallingUid());
             return admin.longSupportMessage;
@@ -11163,7 +11220,7 @@
         if (!isCallerWithSystemUid()) {
             throw new SecurityException("Only the system can query support message for user");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
             if (admin != null) {
                 return admin.shortSupportMessage;
@@ -11181,7 +11238,7 @@
         if (!isCallerWithSystemUid()) {
             throw new SecurityException("Only the system can query support message for user");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
             if (admin != null) {
                 return admin.longSupportMessage;
@@ -11198,7 +11255,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
         enforceManagedProfile(userHandle, "set organization color");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             admin.organizationColor = color;
@@ -11214,7 +11271,7 @@
         enforceFullCrossUsersPermission(userId);
         enforceManageUsers();
         enforceManagedProfile(userId, "set organization color");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
             admin.organizationColor = color;
             saveSettingsLocked(userId);
@@ -11228,7 +11285,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         enforceManagedProfile(mInjector.userHandleGetCallingUserId(), "get organization color");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.organizationColor;
@@ -11242,7 +11299,7 @@
         }
         enforceFullCrossUsersPermission(userHandle);
         enforceManagedProfile(userHandle, "get organization color");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userHandle);
             return (profileOwner != null)
                     ? profileOwner.organizationColor
@@ -11258,7 +11315,7 @@
         Preconditions.checkNotNull(who, "ComponentName is null");
         final int userHandle = mInjector.userHandleGetCallingUserId();
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             if (!TextUtils.equals(admin.organizationName, text)) {
@@ -11276,7 +11333,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null");
         enforceManagedProfile(mInjector.userHandleGetCallingUserId(), "get organization name");
-        synchronized(this) {
+        synchronized (getLockObject()) {
             ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.organizationName;
@@ -11289,7 +11346,7 @@
             return null;
         }
         enforceDeviceOwnerOrManageUsers();
-        synchronized(this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked();
             return deviceOwnerAdmin == null ? null : deviceOwnerAdmin.organizationName;
         }
@@ -11302,7 +11359,7 @@
         }
         enforceFullCrossUsersPermission(userHandle);
         enforceManagedProfile(userHandle, "get organization name");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userHandle);
             return (profileOwner != null)
                     ? profileOwner.organizationName
@@ -11318,7 +11375,7 @@
         if (!mHasFeature) {
             return packageNames;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             final int callingUserId = mInjector.userHandleGetCallingUserId();
@@ -11367,7 +11424,7 @@
         if (!mHasFeature) {
             return new ArrayList<>();
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin admin = getActiveAdminForCallerLocked(who,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return admin.meteredDisabledPackages == null
@@ -11387,7 +11444,7 @@
             throw new SecurityException(
                     "Only the system can query restricted pkgs for a specific user");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId);
             if (admin != null && admin.meteredDisabledPackages != null) {
                 return admin.meteredDisabledPackages.contains(packageName);
@@ -11429,7 +11486,7 @@
 
         final Set<String> affiliationIds = new ArraySet<>(ids);
         final int callingUserId = mInjector.userHandleGetCallingUserId();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             getUserData(callingUserId).mAffiliationIds = affiliationIds;
             saveSettingsLocked(callingUserId);
@@ -11456,7 +11513,7 @@
         }
 
         Preconditions.checkNotNull(admin);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             return new ArrayList<String>(
                     getUserData(mInjector.userHandleGetCallingUserId()).mAffiliationIds);
@@ -11469,7 +11526,7 @@
             return false;
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return isUserAffiliatedWithDeviceLocked(mInjector.userHandleGetCallingUserId());
         }
     }
@@ -11530,7 +11587,7 @@
         }
         Preconditions.checkNotNull(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             if (enabled == mInjector.securityLogGetLoggingEnabledProperty()) {
                 return;
@@ -11551,7 +11608,7 @@
             return false;
         }
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!isCallerWithSystemUid()) {
                 Preconditions.checkNotNull(admin);
                 getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
@@ -11560,12 +11617,14 @@
         }
     }
 
-    private synchronized void recordSecurityLogRetrievalTime() {
-        final long currentTime = System.currentTimeMillis();
-        DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
-        if (currentTime > policyData.mLastSecurityLogRetrievalTime) {
-            policyData.mLastSecurityLogRetrievalTime = currentTime;
-            saveSettingsLocked(UserHandle.USER_SYSTEM);
+    private void recordSecurityLogRetrievalTime() {
+        synchronized (getLockObject()) {
+            final long currentTime = System.currentTimeMillis();
+            DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
+            if (currentTime > policyData.mLastSecurityLogRetrievalTime) {
+                policyData.mLastSecurityLogRetrievalTime = currentTime;
+                saveSettingsLocked(UserHandle.USER_SYSTEM);
+            }
         }
     }
 
@@ -11646,7 +11705,7 @@
         enforceCanManageDeviceAdmin();
         final int userId = mInjector.userHandleGetCallingUserId();
         Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return mPackagesToRemove.contains(packageUserPair);
         }
     }
@@ -11672,7 +11731,7 @@
         }
 
         final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             mPackagesToRemove.add(packageUserPair);
         }
 
@@ -11707,7 +11766,7 @@
     @Override
     public boolean isDeviceProvisioned() {
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return getUserDataUnchecked(UserHandle.USER_SYSTEM).mUserSetupComplete;
         }
     }
@@ -11734,7 +11793,7 @@
 
     private void startUninstallIntent(final String packageName, final int userId) {
         final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (!mPackagesToRemove.contains(packageUserPair)) {
                 // Do nothing if uninstall was not requested or was already started.
                 return;
@@ -11769,7 +11828,7 @@
      * @param userHandle The user for which this admin has to be removed.
      */
     private void removeAdminArtifacts(final ComponentName adminReceiver, final int userHandle) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
             if (admin == null) {
                 return;
@@ -11799,7 +11858,7 @@
     @Override
     public void setDeviceProvisioningConfigApplied() {
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
             policy.mDeviceProvisioningConfigApplied = true;
             saveSettingsLocked(UserHandle.USER_SYSTEM);
@@ -11809,7 +11868,7 @@
     @Override
     public boolean isDeviceProvisioningConfigApplied() {
         enforceManageUsers();
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
             return policy.mDeviceProvisioningConfigApplied;
         }
@@ -11835,7 +11894,7 @@
                 Settings.Secure.USER_SETUP_COMPLETE, 0, userId) != 0;
         DevicePolicyData policy = getUserData(userId);
         policy.mUserSetupComplete = isUserCompleted;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             saveSettingsLocked(userId);
         }
     }
@@ -11850,7 +11909,7 @@
             return;
         }
         Preconditions.checkNotNull(admin);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(
                     admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             if (!enabled) {
@@ -11879,7 +11938,7 @@
         if (!mHasFeature) {
             return true;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             try {
                 getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
                 IBackupManager ibm = mInjector.getIBackupManager();
@@ -11898,7 +11957,7 @@
             return false;
         }
         Preconditions.checkNotNull(admin);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -11944,18 +12003,20 @@
         return success.get();
     }
 
-    synchronized private void saveMandatoryBackupTransport(
+    private void saveMandatoryBackupTransport(
             ComponentName admin, int callingUid, ComponentName backupTransportComponent) {
-        ActiveAdmin activeAdmin =
-                getActiveAdminWithPolicyForUidLocked(
-                        admin,
-                        DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
-                        callingUid);
-        if (!Objects.equals(backupTransportComponent,
-                activeAdmin.mandatoryBackupTransport)) {
-            activeAdmin.mandatoryBackupTransport =
-                    backupTransportComponent;
-            saveSettingsLocked(UserHandle.USER_SYSTEM);
+        synchronized (getLockObject()) {
+            ActiveAdmin activeAdmin =
+                    getActiveAdminWithPolicyForUidLocked(
+                            admin,
+                            DeviceAdminInfo.USES_POLICY_DEVICE_OWNER,
+                            callingUid);
+            if (!Objects.equals(backupTransportComponent,
+                    activeAdmin.mandatoryBackupTransport)) {
+                activeAdmin.mandatoryBackupTransport =
+                        backupTransportComponent;
+                saveSettingsLocked(UserHandle.USER_SYSTEM);
+            }
         }
     }
 
@@ -11964,7 +12025,7 @@
         if (!mHasFeature) {
             return null;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin activeAdmin = getDeviceOwnerAdminLocked();
             return activeAdmin == null ? null : activeAdmin.mandatoryBackupTransport;
         }
@@ -11995,7 +12056,7 @@
         }
 
         final String targetPackage;
-        synchronized (this) {
+        synchronized (getLockObject()) {
             targetPackage = getOwnerPackageNameForUserLocked(targetUserId);
         }
 
@@ -12032,7 +12093,7 @@
         }
         Preconditions.checkNotNull(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
             final int callingUserId = mInjector.userHandleGetCallingUserId();
@@ -12106,7 +12167,7 @@
             if (accounts.length == 0) {
                 return false;
             }
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 if (owner == null || !isAdminTestOnlyLocked(owner, userId)) {
                     Log.w(LOG_TAG,
                             "Non test-only owner can't be installed with existing accounts.");
@@ -12158,50 +12219,54 @@
     }
 
     @Override
-    public synchronized void setNetworkLoggingEnabled(ComponentName admin, boolean enabled) {
+    public void setNetworkLoggingEnabled(ComponentName admin, boolean enabled) {
         if (!mHasFeature) {
             return;
         }
-        Preconditions.checkNotNull(admin);
-        getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+        synchronized (getLockObject()) {
+            Preconditions.checkNotNull(admin);
+            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
-        if (enabled == isNetworkLoggingEnabledInternalLocked()) {
-            // already in the requested state
-            return;
-        }
-        ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
-        deviceOwner.isNetworkLoggingEnabled = enabled;
-        if (!enabled) {
-            deviceOwner.numNetworkLoggingNotifications = 0;
-            deviceOwner.lastNetworkLoggingNotificationTimeMs = 0;
-        }
-        saveSettingsLocked(mInjector.userHandleGetCallingUserId());
+            if (enabled == isNetworkLoggingEnabledInternalLocked()) {
+                // already in the requested state
+                return;
+            }
+            ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
+            deviceOwner.isNetworkLoggingEnabled = enabled;
+            if (!enabled) {
+                deviceOwner.numNetworkLoggingNotifications = 0;
+                deviceOwner.lastNetworkLoggingNotificationTimeMs = 0;
+            }
+            saveSettingsLocked(mInjector.userHandleGetCallingUserId());
 
-        setNetworkLoggingActiveInternal(enabled);
+            setNetworkLoggingActiveInternal(enabled);
+        }
     }
 
-    private synchronized void setNetworkLoggingActiveInternal(boolean active) {
-        final long callingIdentity = mInjector.binderClearCallingIdentity();
-        try {
-            if (active) {
-                mNetworkLogger = new NetworkLogger(this, mInjector.getPackageManagerInternal());
-                if (!mNetworkLogger.startNetworkLogging()) {
+    private void setNetworkLoggingActiveInternal(boolean active) {
+        synchronized (getLockObject()) {
+            final long callingIdentity = mInjector.binderClearCallingIdentity();
+            try {
+                if (active) {
+                    mNetworkLogger = new NetworkLogger(this, mInjector.getPackageManagerInternal());
+                    if (!mNetworkLogger.startNetworkLogging()) {
+                        mNetworkLogger = null;
+                        Slog.wtf(LOG_TAG, "Network logging could not be started due to the logging"
+                                + " service not being available yet.");
+                    }
+                    maybePauseDeviceWideLoggingLocked();
+                    sendNetworkLoggingNotificationLocked();
+                } else {
+                    if (mNetworkLogger != null && !mNetworkLogger.stopNetworkLogging()) {
+                        Slog.wtf(LOG_TAG, "Network logging could not be stopped due to the logging"
+                                + " service not being available yet.");
+                    }
                     mNetworkLogger = null;
-                    Slog.wtf(LOG_TAG, "Network logging could not be started due to the logging"
-                            + " service not being available yet.");
+                    mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING);
                 }
-                maybePauseDeviceWideLoggingLocked();
-                sendNetworkLoggingNotificationLocked();
-            } else {
-                if (mNetworkLogger != null && !mNetworkLogger.stopNetworkLogging()) {
-                    Slog.wtf(LOG_TAG, "Network logging could not be stopped due to the logging"
-                            + " service not being available yet.");
-                }
-                mNetworkLogger = null;
-                mInjector.getNotificationManager().cancel(SystemMessage.NOTE_NETWORK_LOGGING);
+            } finally {
+                mInjector.binderRestoreCallingIdentity(callingIdentity);
             }
-        } finally {
-            mInjector.binderRestoreCallingIdentity(callingIdentity);
         }
     }
 
@@ -12248,7 +12313,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             enforceDeviceOwnerOrManageUsers();
             return isNetworkLoggingEnabledInternalLocked();
         }
@@ -12274,7 +12339,7 @@
         Preconditions.checkNotNull(admin);
         ensureDeviceOwnerAndAllUsersAffiliated(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             if (mNetworkLogger == null
                     || !isNetworkLoggingEnabledInternalLocked()) {
                 return null;
@@ -12399,7 +12464,7 @@
         if (token == null || token.length < 32) {
             throw new IllegalArgumentException("token must be at least 32-byte long");
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int userHandle = mInjector.userHandleGetCallingUserId();
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
@@ -12424,7 +12489,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int userHandle = mInjector.userHandleGetCallingUserId();
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
@@ -12447,7 +12512,7 @@
 
     @Override
     public boolean isResetPasswordTokenActive(ComponentName admin) {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int userHandle = mInjector.userHandleGetCallingUserId();
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
@@ -12469,7 +12534,7 @@
     public boolean resetPasswordWithToken(ComponentName admin, String passwordOrNull, byte[] token,
             int flags) {
         Preconditions.checkNotNull(token);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int userHandle = mInjector.userHandleGetCallingUserId();
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
 
@@ -12495,7 +12560,7 @@
     public StringParceledListSlice getOwnerInstalledCaCerts(@NonNull UserHandle user) {
         final int userId = user.getIdentifier();
         enforceProfileOwnerOrFullCrossUsersPermission(userId);
-        synchronized (this) {
+        synchronized (getLockObject()) {
             return new StringParceledListSlice(
                     new ArrayList<>(getUserData(userId).mOwnerInstalledCaCerts));
         }
@@ -12507,7 +12572,7 @@
         Preconditions.checkNotNull(admin, "ComponentName is null");
         Preconditions.checkNotNull(packageName, "packageName is null");
         Preconditions.checkNotNull(callback, "callback is null");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
         }
         final int userId = UserHandle.getCallingUserId();
@@ -12535,13 +12600,13 @@
     }
 
     @Override
-    public synchronized void setLogoutEnabled(ComponentName admin, boolean enabled) {
+    public void setLogoutEnabled(ComponentName admin, boolean enabled) {
         if (!mHasFeature) {
             return;
         }
         Preconditions.checkNotNull(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
@@ -12559,7 +12624,7 @@
         if (!mHasFeature) {
             return false;
         }
-        synchronized (this) {
+        synchronized (getLockObject()) {
             ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
             return (deviceOwner != null) && deviceOwner.isLogoutEnabled;
         }
@@ -12607,7 +12672,7 @@
 
         final long id = mInjector.binderClearCallingIdentity();
         try {
-            synchronized (this) {
+            synchronized (getLockObject()) {
                 /*
                 * We must ensure the whole process is atomic to prevent the device from ending up
                 * in an invalid state (e.g. no active admin). This could happen if the device
@@ -12713,7 +12778,7 @@
         final String startUserSessionMessageString =
                 startUserSessionMessage != null ? startUserSessionMessage.toString() : null;
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
@@ -12738,7 +12803,7 @@
         final String endUserSessionMessageString =
                 endUserSessionMessage != null ? endUserSessionMessage.toString() : null;
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
 
@@ -12760,7 +12825,7 @@
         }
         Preconditions.checkNotNull(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             return deviceOwner.startUserSessionMessage;
@@ -12774,7 +12839,7 @@
         }
         Preconditions.checkNotNull(admin);
 
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final ActiveAdmin deviceOwner =
                     getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
             return deviceOwner.endUserSessionMessage;
@@ -12788,7 +12853,7 @@
     @Override
     @Nullable
     public PersistableBundle getTransferOwnershipBundle() {
-        synchronized (this) {
+        synchronized (getLockObject()) {
             final int callingUserId = mInjector.userHandleGetCallingUserId();
             getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
             final File bundleFile = new File(
@@ -12817,7 +12882,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null in addOverrideApn");
         Preconditions.checkNotNull(apnSetting, "ApnSetting is null in addOverrideApn");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -12848,7 +12913,7 @@
         }
         Preconditions.checkNotNull(who, "ComponentName is null in updateOverrideApn");
         Preconditions.checkNotNull(apnSetting, "ApnSetting is null in updateOverrideApn");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -12871,7 +12936,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null in removeOverrideApn");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -12899,7 +12964,7 @@
             return Collections.emptyList();
         }
         Preconditions.checkNotNull(who, "ComponentName is null in getOverrideApns");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -12937,7 +13002,7 @@
             return;
         }
         Preconditions.checkNotNull(who, "ComponentName is null in setOverrideApnEnabled");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
@@ -12962,7 +13027,7 @@
             return false;
         }
         Preconditions.checkNotNull(who, "ComponentName is null in isOverrideApnEnabled");
-        synchronized (this) {
+        synchronized (getLockObject()) {
             getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
         }
 
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 6f50ee2..5519d22 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -725,7 +725,6 @@
         NetworkStatsService networkStats = null;
         NetworkPolicyManagerService networkPolicy = null;
         ConnectivityService connectivity = null;
-        NetworkScoreService networkScore = null;
         NsdService serviceDiscovery= null;
         WindowManagerService wm = null;
         SerialService serial = null;
@@ -1090,12 +1089,7 @@
             }
 
             traceBeginAndSlog("StartNetworkScoreService");
-            try {
-                networkScore = new NetworkScoreService(context);
-                ServiceManager.addService(Context.NETWORK_SCORE_SERVICE, networkScore);
-            } catch (Throwable e) {
-                reportWtf("starting Network Score Service", e);
-            }
+            mSystemServiceManager.startService(NetworkScoreService.Lifecycle.class);
             traceEnd();
 
             traceBeginAndSlog("StartNetworkStatsService");
@@ -1728,7 +1722,6 @@
         final NetworkStatsService networkStatsF = networkStats;
         final NetworkPolicyManagerService networkPolicyF = networkPolicy;
         final ConnectivityService connectivityF = connectivity;
-        final NetworkScoreService networkScoreF = networkScore;
         final LocationManagerService locationF = location;
         final CountryDetectorService countryDetectorF = countryDetector;
         final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;
@@ -1789,13 +1782,6 @@
                 reportWtf("starting System UI", e);
             }
             traceEnd();
-            traceBeginAndSlog("MakeNetworkScoreReady");
-            try {
-                if (networkScoreF != null) networkScoreF.systemReady();
-            } catch (Throwable e) {
-                reportWtf("making Network Score Service ready", e);
-            }
-            traceEnd();
             traceBeginAndSlog("MakeNetworkManagementServiceReady");
             try {
                 if (networkManagementF != null) networkManagementF.systemReady();
@@ -1917,13 +1903,6 @@
             }
             traceEnd();
 
-            traceBeginAndSlog("MakeNetworkScoreServiceReady");
-            try {
-                if (networkScoreF != null) networkScoreF.systemRunning();
-            } catch (Throwable e) {
-                reportWtf("Notifying NetworkScoreService running", e);
-            }
-            traceEnd();
             traceBeginAndSlog("IncidentDaemonReady");
             try {
                 // TODO: Switch from checkService to getService once it's always
diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java
index d190432..d5ff2dd 100644
--- a/services/net/java/android/net/apf/ApfFilter.java
+++ b/services/net/java/android/net/apf/ApfFilter.java
@@ -16,21 +16,21 @@
 
 package android.net.apf;
 
+import static android.net.util.NetworkConstants.*;
 import static android.system.OsConstants.*;
-
 import static com.android.internal.util.BitUtils.bytesToBEInt;
 import static com.android.internal.util.BitUtils.getUint16;
 import static com.android.internal.util.BitUtils.getUint32;
 import static com.android.internal.util.BitUtils.getUint8;
-import static com.android.internal.util.BitUtils.uint16;
 import static com.android.internal.util.BitUtils.uint32;
-import static com.android.internal.util.BitUtils.uint8;
 
-import android.os.SystemClock;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.NetworkUtils;
-import android.net.apf.ApfGenerator;
 import android.net.apf.ApfGenerator.IllegalInstructionException;
 import android.net.apf.ApfGenerator.Register;
 import android.net.ip.IpClient;
@@ -39,31 +39,29 @@
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.RaEvent;
 import android.net.util.InterfaceParams;
+import android.os.PowerManager;
+import android.os.SystemClock;
 import android.system.ErrnoException;
 import android.system.Os;
 import android.system.PacketSocketAddress;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.util.Pair;
-
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.HexDump;
 import com.android.internal.util.IndentingPrintWriter;
-
 import java.io.FileDescriptor;
 import java.io.IOException;
-import java.lang.Thread;
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.SocketException;
 import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
 import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
-
 import libcore.io.IoBridge;
 
 /**
@@ -215,10 +213,6 @@
             { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
 
     private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN;
-    private static final int ICMP6_ROUTER_SOLICITATION = 133;
-    private static final int ICMP6_ROUTER_ADVERTISEMENT = 134;
-    private static final int ICMP6_NEIGHBOR_SOLICITATION = 135;
-    private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136;
 
     // NOTE: this must be added to the IPv4 header length in IPV4_HEADER_SIZE_MEMORY_SLOT
     private static final int UDP_DESTINATION_PORT_OFFSET = ETH_HEADER_LEN + 2;
@@ -258,9 +252,26 @@
     private long mUniqueCounter;
     @GuardedBy("this")
     private boolean mMulticastFilter;
+    @GuardedBy("this")
+    private boolean mInDozeMode;
     private final boolean mDrop802_3Frames;
     private final int[] mEthTypeBlackList;
 
+    // Detects doze mode state transitions.
+    private final BroadcastReceiver mDeviceIdleReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)) {
+                PowerManager powerManager =
+                        (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+                final boolean deviceIdle = powerManager.isDeviceIdleMode();
+                setDozeMode(deviceIdle);
+            }
+        }
+    };
+    private final Context mContext;
+
     // Our IPv4 address, if we have just one, otherwise null.
     @GuardedBy("this")
     private byte[] mIPv4Address;
@@ -269,13 +280,14 @@
     private int mIPv4PrefixLength;
 
     @VisibleForTesting
-    ApfFilter(ApfConfiguration config, InterfaceParams ifParams,
+    ApfFilter(Context context, ApfConfiguration config, InterfaceParams ifParams,
             IpClient.Callback ipClientCallback, IpConnectivityLog log) {
         mApfCapabilities = config.apfCapabilities;
         mIpClientCallback = ipClientCallback;
         mInterfaceParams = ifParams;
         mMulticastFilter = config.multicastFilter;
         mDrop802_3Frames = config.ieee802_3Filter;
+        mContext = context;
 
         // Now fill the black list from the passed array
         mEthTypeBlackList = filterEthTypeBlackList(config.ethTypeBlackList);
@@ -284,6 +296,10 @@
 
         // TODO: ApfFilter should not generate programs until IpClient sends provisioning success.
         maybeStartFilter();
+
+        // Listen for doze-mode transition changes to enable/disable the IPv6 multicast filter.
+        mContext.registerReceiver(mDeviceIdleReceiver,
+                new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED));
     }
 
     private void log(String s) {
@@ -522,7 +538,7 @@
             // to our packet socket. b/29586253
             if (getUint16(mPacket, ETH_ETHERTYPE_OFFSET) != ETH_P_IPV6 ||
                     getUint8(mPacket, IPV6_NEXT_HEADER_OFFSET) != IPPROTO_ICMPV6 ||
-                    getUint8(mPacket, ICMP6_TYPE_OFFSET) != ICMP6_ROUTER_ADVERTISEMENT) {
+                    getUint8(mPacket, ICMP6_TYPE_OFFSET) != ICMPV6_ROUTER_ADVERTISEMENT) {
                 throw new InvalidRaException("Not an ICMP6 router advertisement");
             }
 
@@ -889,10 +905,11 @@
     private void generateIPv6FilterLocked(ApfGenerator gen) throws IllegalInstructionException {
         // Here's a basic summary of what the IPv6 filter program does:
         //
-        // if it's not ICMPv6:
-        //   if it's multicast and we're dropping multicast:
-        //     drop
-        //   pass
+        // if we're dropping multicast
+        //   if it's not IPCMv6 or it's ICMPv6 but we're in doze mode:
+        //     if it's multicast:
+        //       drop
+        //     pass
         // if it's ICMPv6 RS to any:
         //   drop
         // if it's ICMPv6 NA to ff02::1:
@@ -902,28 +919,44 @@
 
         // Drop multicast if the multicast filter is enabled.
         if (mMulticastFilter) {
-            // Don't touch ICMPv6 multicast here, we deal with it in more detail later.
-            String skipIpv6MulticastFilterLabel = "skipIPv6MulticastFilter";
-            gen.addJumpIfR0Equals(IPPROTO_ICMPV6, skipIpv6MulticastFilterLabel);
+            final String skipIPv6MulticastFilterLabel = "skipIPv6MulticastFilter";
+            final String dropAllIPv6MulticastsLabel = "dropAllIPv6Multicast";
 
-            // Drop all other packets sent to ff00::/8.
+            // While in doze mode, drop ICMPv6 multicast pings, let the others pass.
+            // While awake, let all ICMPv6 multicasts through.
+            if (mInDozeMode) {
+                // Not ICMPv6? -> Proceed to multicast filtering
+                gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, dropAllIPv6MulticastsLabel);
+
+                // ICMPv6 but not ECHO? -> Skip the multicast filter.
+                // (ICMPv6 ECHO requests will go through the multicast filter below).
+                gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET);
+                gen.addJumpIfR0NotEquals(ICMPV6_ECHO_REQUEST_TYPE, skipIPv6MulticastFilterLabel);
+            } else {
+                gen.addJumpIfR0Equals(IPPROTO_ICMPV6, skipIPv6MulticastFilterLabel);
+            }
+
+            // Drop all other packets sent to ff00::/8 (multicast prefix).
+            gen.defineLabel(dropAllIPv6MulticastsLabel);
             gen.addLoad8(Register.R0, IPV6_DEST_ADDR_OFFSET);
             gen.addJumpIfR0Equals(0xff, gen.DROP_LABEL);
-            // Not multicast and not ICMPv6. Pass.
+            // Not multicast. Pass.
             gen.addJump(gen.PASS_LABEL);
-            gen.defineLabel(skipIpv6MulticastFilterLabel);
+            gen.defineLabel(skipIPv6MulticastFilterLabel);
         } else {
             // If not ICMPv6, pass.
             gen.addJumpIfR0NotEquals(IPPROTO_ICMPV6, gen.PASS_LABEL);
         }
 
+        // If we got this far, the packet is ICMPv6.  Drop some specific types.
+
         // Add unsolicited multicast neighbor announcements filter
         String skipUnsolicitedMulticastNALabel = "skipUnsolicitedMulticastNA";
         gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET);
         // Drop all router solicitations (b/32833400)
-        gen.addJumpIfR0Equals(ICMP6_ROUTER_SOLICITATION, gen.DROP_LABEL);
+        gen.addJumpIfR0Equals(ICMPV6_ROUTER_SOLICITATION, gen.DROP_LABEL);
         // If not neighbor announcements, skip filter.
-        gen.addJumpIfR0NotEquals(ICMP6_NEIGHBOR_ANNOUNCEMENT, skipUnsolicitedMulticastNALabel);
+        gen.addJumpIfR0NotEquals(ICMPV6_NEIGHBOR_ADVERTISEMENT, skipUnsolicitedMulticastNALabel);
         // If to ff02::1, drop.
         // TODO: Drop only if they don't contain the address of on-link neighbours.
         gen.addLoadImmediate(Register.R0, IPV6_DEST_ADDR_OFFSET);
@@ -1168,9 +1201,9 @@
      * Create an {@link ApfFilter} if {@code apfCapabilities} indicates support for packet
      * filtering using APF programs.
      */
-    public static ApfFilter maybeCreate(ApfConfiguration config,
+    public static ApfFilter maybeCreate(Context context, ApfConfiguration config,
             InterfaceParams ifParams, IpClient.Callback ipClientCallback) {
-        if (config == null || ifParams == null) return null;
+        if (context == null || config == null || ifParams == null) return null;
         ApfCapabilities apfCapabilities =  config.apfCapabilities;
         if (apfCapabilities == null) return null;
         if (apfCapabilities.apfVersionSupported == 0) return null;
@@ -1187,7 +1220,8 @@
             Log.e(TAG, "Unsupported APF version: " + apfCapabilities.apfVersionSupported);
             return null;
         }
-        return new ApfFilter(config, ifParams, ipClientCallback, new IpConnectivityLog());
+
+        return new ApfFilter(context, config, ifParams, ipClientCallback, new IpConnectivityLog());
     }
 
     public synchronized void shutdown() {
@@ -1197,12 +1231,11 @@
             mReceiveThread = null;
         }
         mRas.clear();
+        mContext.unregisterReceiver(mDeviceIdleReceiver);
     }
 
     public synchronized void setMulticastFilter(boolean isEnabled) {
-        if (mMulticastFilter == isEnabled) {
-            return;
-        }
+        if (mMulticastFilter == isEnabled) return;
         mMulticastFilter = isEnabled;
         if (!isEnabled) {
             mNumProgramUpdatesAllowingMulticast++;
@@ -1210,6 +1243,13 @@
         installNewProgramLocked();
     }
 
+    @VisibleForTesting
+    public synchronized void setDozeMode(boolean isEnabled) {
+        if (mInDozeMode == isEnabled) return;
+        mInDozeMode = isEnabled;
+        installNewProgramLocked();
+    }
+
     /** Find the single IPv4 LinkAddress if there is one, otherwise return null. */
     private static LinkAddress findIPv4LinkAddress(LinkProperties lp) {
         LinkAddress ipv4Address = null;
diff --git a/services/net/java/android/net/dns/ResolvUtil.java b/services/net/java/android/net/dns/ResolvUtil.java
new file mode 100644
index 0000000..97d20f4
--- /dev/null
+++ b/services/net/java/android/net/dns/ResolvUtil.java
@@ -0,0 +1,65 @@
+/*
+ * 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.dns;
+
+import android.net.Network;
+import android.net.NetworkUtils;
+import android.system.GaiException;
+import android.system.OsConstants;
+import android.system.StructAddrinfo;
+
+import libcore.io.Libcore;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+
+/**
+ * DNS resolution utility class.
+ *
+ * @hide
+ */
+public class ResolvUtil {
+    // Non-portable DNS resolution flag.
+    private static final long NETID_USE_LOCAL_NAMESERVERS = 0x80000000L;
+
+    private ResolvUtil() {}
+
+    public static InetAddress[] blockingResolveAllLocally(Network network, String name)
+            throws UnknownHostException {
+        final StructAddrinfo hints = new StructAddrinfo();
+        // Unnecessary, but expressly no AI_ADDRCONFIG.
+        hints.ai_flags = 0;
+        // Fetch all IP addresses at once to minimize re-resolution.
+        hints.ai_family = OsConstants.AF_UNSPEC;
+        hints.ai_socktype = OsConstants.SOCK_DGRAM;
+
+        final Network networkForResolv = getNetworkWithUseLocalNameserversFlag(network);
+
+        try {
+            return Libcore.os.android_getaddrinfo(name, hints, (int) networkForResolv.netId);
+        } catch (GaiException gai) {
+            gai.rethrowAsUnknownHostException(name + ": TLS-bypass resolution failed");
+            return null;  // keep compiler quiet
+        }
+    }
+
+    public static Network getNetworkWithUseLocalNameserversFlag(Network network) {
+        final long netidForResolv = NETID_USE_LOCAL_NAMESERVERS | (long) network.netId;
+        return new Network((int) netidForResolv);
+    }
+}
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index 9863370..87249df 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -40,6 +40,7 @@
 import android.net.util.NetdService;
 import android.net.util.NetworkConstants;
 import android.net.util.SharedLog;
+import android.os.ConditionVariable;
 import android.os.INetworkManagementService;
 import android.os.Message;
 import android.os.RemoteException;
@@ -150,6 +151,28 @@
         public void setNeighborDiscoveryOffload(boolean enable) {}
     }
 
+    public static class WaitForProvisioningCallback extends Callback {
+        private final ConditionVariable mCV = new ConditionVariable();
+        private LinkProperties mCallbackLinkProperties;
+
+        public LinkProperties waitForProvisioning() {
+            mCV.block();
+            return mCallbackLinkProperties;
+        }
+
+        @Override
+        public void onProvisioningSuccess(LinkProperties newLp) {
+            mCallbackLinkProperties = newLp;
+            mCV.open();
+        }
+
+        @Override
+        public void onProvisioningFailure(LinkProperties newLp) {
+            mCallbackLinkProperties = null;
+            mCV.open();
+        }
+    }
+
     // Use a wrapper class to log in order to ensure complete and detailed
     // logging. This method is lighter weight than annotations/reflection
     // and has the following benefits:
@@ -281,6 +304,11 @@
                 return this;
             }
 
+            public Builder withoutMultinetworkPolicyTracker() {
+                mConfig.mUsingMultinetworkPolicyTracker = false;
+                return this;
+            }
+
             public Builder withoutIpReachabilityMonitor() {
                 mConfig.mUsingIpReachabilityMonitor = false;
                 return this;
@@ -343,6 +371,7 @@
 
         /* package */ boolean mEnableIPv4 = true;
         /* package */ boolean mEnableIPv6 = true;
+        /* package */ boolean mUsingMultinetworkPolicyTracker = true;
         /* package */ boolean mUsingIpReachabilityMonitor = true;
         /* package */ int mRequestedPreDhcpActionMs;
         /* package */ InitialConfiguration mInitialConfig;
@@ -374,6 +403,7 @@
             return new StringJoiner(", ", getClass().getSimpleName() + "{", "}")
                     .add("mEnableIPv4: " + mEnableIPv4)
                     .add("mEnableIPv6: " + mEnableIPv6)
+                    .add("mUsingMultinetworkPolicyTracker: " + mUsingMultinetworkPolicyTracker)
                     .add("mUsingIpReachabilityMonitor: " + mUsingIpReachabilityMonitor)
                     .add("mRequestedPreDhcpActionMs: " + mRequestedPreDhcpActionMs)
                     .add("mInitialConfig: " + mInitialConfig)
@@ -559,7 +589,6 @@
     private final NetlinkTracker mNetlinkTracker;
     private final WakeupMessage mProvisioningTimeoutAlarm;
     private final WakeupMessage mDhcpActionTimeoutAlarm;
-    private final MultinetworkPolicyTracker mMultinetworkPolicyTracker;
     private final SharedLog mLog;
     private final LocalLog mConnectivityPacketLog;
     private final MessageHandlingLogger mMsgStateLogger;
@@ -573,6 +602,7 @@
      */
     private LinkProperties mLinkProperties;
     private ProvisioningConfiguration mConfiguration;
+    private MultinetworkPolicyTracker mMultinetworkPolicyTracker;
     private IpReachabilityMonitor mIpReachabilityMonitor;
     private DhcpClient mDhcpClient;
     private DhcpResults mDhcpResults;
@@ -685,9 +715,6 @@
         mLinkProperties = new LinkProperties();
         mLinkProperties.setInterfaceName(mInterfaceName);
 
-        mMultinetworkPolicyTracker = new MultinetworkPolicyTracker(mContext, getHandler(),
-                () -> { mLog.log("OBSERVED AvoidBadWifi changed"); });
-
         mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(),
                 mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT);
         mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(),
@@ -719,8 +746,6 @@
         } catch (RemoteException e) {
             logError("Couldn't register NetlinkTracker: %s", e);
         }
-
-        mMultinetworkPolicyTracker.start();
     }
 
     private void stopStateMachineUpdaters() {
@@ -729,8 +754,6 @@
         } catch (RemoteException e) {
             logError("Couldn't unregister NetlinkTracker: %s", e);
         }
-
-        mMultinetworkPolicyTracker.shutdown();
     }
 
     @Override
@@ -1028,7 +1051,8 @@
         // Note that we can still be disconnected by IpReachabilityMonitor
         // if the IPv6 default gateway (but not the IPv6 DNS servers; see
         // accompanying code in IpReachabilityMonitor) is unreachable.
-        final boolean ignoreIPv6ProvisioningLoss = !mMultinetworkPolicyTracker.getAvoidBadWifi();
+        final boolean ignoreIPv6ProvisioningLoss = (mMultinetworkPolicyTracker != null)
+                && !mMultinetworkPolicyTracker.getAvoidBadWifi();
 
         // Additionally:
         //
@@ -1490,7 +1514,7 @@
                     mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames);
             apfConfig.ethTypeBlackList =
                     mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList);
-            mApfFilter = ApfFilter.maybeCreate(apfConfig, mInterfaceParams, mCallback);
+            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.
             if (mApfFilter == null) {
@@ -1520,6 +1544,13 @@
                 return;
             }
 
+            if (mConfiguration.mUsingMultinetworkPolicyTracker) {
+                mMultinetworkPolicyTracker = new MultinetworkPolicyTracker(
+                        mContext, getHandler(),
+                        () -> { mLog.log("OBSERVED AvoidBadWifi changed"); });
+                mMultinetworkPolicyTracker.start();
+            }
+
             if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) {
                 doImmediateProvisioningFailure(
                         IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR);
@@ -1537,6 +1568,11 @@
                 mIpReachabilityMonitor = null;
             }
 
+            if (mMultinetworkPolicyTracker != null) {
+                mMultinetworkPolicyTracker.shutdown();
+                mMultinetworkPolicyTracker = null;
+            }
+
             if (mDhcpClient != null) {
                 mDhcpClient.sendMessage(DhcpClient.CMD_STOP_DHCP);
                 mDhcpClient.doQuit();
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 508a43d..2eb36a2 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -114,35 +114,6 @@
     public static class Callback extends IpClient.Callback {
     }
 
-    public static class WaitForProvisioningCallback extends Callback {
-        private LinkProperties mCallbackLinkProperties;
-
-        public LinkProperties waitForProvisioning() {
-            synchronized (this) {
-                try {
-                    wait();
-                } catch (InterruptedException e) {}
-                return mCallbackLinkProperties;
-            }
-        }
-
-        @Override
-        public void onProvisioningSuccess(LinkProperties newLp) {
-            synchronized (this) {
-                mCallbackLinkProperties = newLp;
-                notify();
-            }
-        }
-
-        @Override
-        public void onProvisioningFailure(LinkProperties newLp) {
-            synchronized (this) {
-                mCallbackLinkProperties = null;
-                notify();
-            }
-        }
-    }
-
     public IpManager(Context context, String ifName, Callback callback) {
         super(context, ifName, callback);
     }
diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java
index 984c9f8..53fd01f 100644
--- a/services/net/java/android/net/util/NetworkConstants.java
+++ b/services/net/java/android/net/util/NetworkConstants.java
@@ -136,6 +136,8 @@
      *     - https://tools.ietf.org/html/rfc4861
      */
     public static final int ICMPV6_HEADER_MIN_LEN = 4;
+    public static final int ICMPV6_ECHO_REQUEST_TYPE = 128;
+    public static final int ICMPV6_ECHO_REPLY_TYPE = 129;
     public static final int ICMPV6_ROUTER_SOLICITATION    = 133;
     public static final int ICMPV6_ROUTER_ADVERTISEMENT   = 134;
     public static final int ICMPV6_NEIGHBOR_SOLICITATION  = 135;
@@ -147,7 +149,6 @@
     public static final int ICMPV6_ND_OPTION_TLLA = 2;
     public static final int ICMPV6_ND_OPTION_MTU  = 5;
 
-    public static final int ICMPV6_ECHO_REQUEST_TYPE = 128;
 
     /**
      * UDP constants.
diff --git a/services/robotests/src/com/android/server/location/GnssSatelliteBlacklistHelperTest.java b/services/robotests/src/com/android/server/location/GnssSatelliteBlacklistHelperTest.java
new file mode 100644
index 0000000..d6f5446
--- /dev/null
+++ b/services/robotests/src/com/android/server/location/GnssSatelliteBlacklistHelperTest.java
@@ -0,0 +1,130 @@
+package com.android.server.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.os.Looper;
+import android.platform.test.annotations.Presubmit;
+import android.provider.Settings;
+
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderPackages;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Unit tests for {@link GnssSatelliteBlacklistHelper}.
+ */
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(
+        manifest = Config.NONE,
+        shadows = {
+        },
+        sdk = 27
+)
+@SystemLoaderPackages({"com.android.server.location"})
+@Presubmit
+public class GnssSatelliteBlacklistHelperTest {
+
+    private Context mContext;
+    private ContentResolver mContentResolver;
+    @Mock
+    private GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback mCallback;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mContentResolver = mContext.getContentResolver();
+        new GnssSatelliteBlacklistHelper(mContext, Looper.myLooper(), mCallback);
+    }
+
+    @Test
+    public void blacklistOf2Satellites_callbackIsCalled() {
+        String blacklist = "3,0,5,24";
+        updateBlacklistAndVerifyCallbackIsCalled(blacklist);
+    }
+
+    @Test
+    public void blacklistWithSpaces_callbackIsCalled() {
+        String blacklist = "3, 11";
+        updateBlacklistAndVerifyCallbackIsCalled(blacklist);
+    }
+
+    @Test
+    public void emptyBlacklist_callbackIsCalled() {
+        String blacklist = "";
+        updateBlacklistAndVerifyCallbackIsCalled(blacklist);
+    }
+
+    @Test
+    public void blacklistWithOddNumberOfValues_callbackIsNotCalled() {
+        String blacklist = "3,0,5";
+        updateBlacklistAndNotifyContentObserver(blacklist);
+        verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class));
+    }
+
+    @Test
+    public void blacklistWithNegativeValue_callbackIsNotCalled() {
+        String blacklist = "3,-11";
+        updateBlacklistAndNotifyContentObserver(blacklist);
+        verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class));
+    }
+
+    @Test
+    public void blacklistWithNonDigitCharacter_callbackIsNotCalled() {
+        String blacklist = "3,1a,5,11";
+        updateBlacklistAndNotifyContentObserver(blacklist);
+        verify(mCallback, never()).onUpdateSatelliteBlacklist(any(int[].class), any(int[].class));
+    }
+
+    private void updateBlacklistAndNotifyContentObserver(String blacklist) {
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.GNSS_SATELLITE_BLACKLIST, blacklist);
+        notifyContentObserverFor(Settings.Global.GNSS_SATELLITE_BLACKLIST);
+    }
+
+    private void updateBlacklistAndVerifyCallbackIsCalled(String blacklist) {
+        updateBlacklistAndNotifyContentObserver(blacklist);
+
+        ArgumentCaptor<int[]> constellationsCaptor = ArgumentCaptor.forClass(int[].class);
+        ArgumentCaptor<int[]> svIdsCaptor = ArgumentCaptor.forClass(int[].class);
+        verify(mCallback).onUpdateSatelliteBlacklist(constellationsCaptor.capture(),
+                svIdsCaptor.capture());
+
+        int[] constellations = constellationsCaptor.getValue();
+        int[] svIds = svIdsCaptor.getValue();
+        List<Integer> values = GnssSatelliteBlacklistHelper.parseSatelliteBlacklist(blacklist);
+        assertThat(values.size()).isEqualTo(constellations.length * 2);
+        assertThat(svIds.length).isEqualTo(constellations.length);
+        for (int i = 0; i < constellations.length; i++) {
+            assertThat(constellations[i]).isEqualTo(values.get(i * 2));
+            assertThat(svIds[i]).isEqualTo(values.get(i * 2 + 1));
+        }
+    }
+
+    private static void notifyContentObserverFor(String globalSetting) {
+        Collection<ContentObserver> contentObservers =
+                Shadows.shadowOf(RuntimeEnvironment.application.getContentResolver())
+                        .getContentObservers(Settings.Global.getUriFor(globalSetting));
+        assertThat(contentObservers).isNotEmpty();
+        contentObservers.iterator().next().onChange(false /* selfChange */);
+    }
+}
diff --git a/services/robotests/src/com/android/server/location/NtpTimeHelperTest.java b/services/robotests/src/com/android/server/location/NtpTimeHelperTest.java
new file mode 100644
index 0000000..a68b579
--- /dev/null
+++ b/services/robotests/src/com/android/server/location/NtpTimeHelperTest.java
@@ -0,0 +1,100 @@
+package com.android.server.location;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+
+import android.os.Looper;
+import android.platform.test.annotations.Presubmit;
+import android.util.NtpTrustedTime;
+
+import com.android.server.location.NtpTimeHelper.InjectNtpTimeCallback;
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderPackages;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
+import org.robolectric.shadows.ShadowSystemClock;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Unit tests for {@link NtpTimeHelper}.
+ */
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(
+        manifest = Config.NONE,
+        sdk = 27
+)
+@SystemLoaderPackages({"com.android.server.location"})
+@Presubmit
+public class NtpTimeHelperTest {
+
+    private static final long MOCK_NTP_TIME = 1519930775453L;
+    @Mock
+    private NtpTrustedTime mMockNtpTrustedTime;
+    private NtpTimeHelper mNtpTimeHelper;
+    private CountDownLatch mCountDownLatch;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mCountDownLatch = new CountDownLatch(1);
+        InjectNtpTimeCallback callback =
+                (time, timeReference, uncertainty) -> {
+                    assertThat(time).isEqualTo(MOCK_NTP_TIME);
+                    mCountDownLatch.countDown();
+                };
+        mNtpTimeHelper = new NtpTimeHelper(RuntimeEnvironment.application,
+                Looper.myLooper(),
+                callback, mMockNtpTrustedTime);
+    }
+
+    @Test
+    public void handleInjectNtpTime_cachedAgeLow_injectTime() throws InterruptedException {
+        doReturn(NtpTimeHelper.NTP_INTERVAL - 1).when(mMockNtpTrustedTime).getCacheAge();
+        doReturn(MOCK_NTP_TIME).when(mMockNtpTrustedTime).getCachedNtpTime();
+
+        mNtpTimeHelper.retrieveAndInjectNtpTime();
+
+        waitForTasksToBePostedOnHandlerAndRunThem();
+        assertThat(mCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue();
+    }
+
+    @Test
+    public void handleInjectNtpTime_injectTimeFailed_injectTimeDelayed()
+            throws InterruptedException {
+        doReturn(NtpTimeHelper.NTP_INTERVAL + 1).when(mMockNtpTrustedTime).getCacheAge();
+        doReturn(false).when(mMockNtpTrustedTime).forceRefresh();
+
+        mNtpTimeHelper.retrieveAndInjectNtpTime();
+        waitForTasksToBePostedOnHandlerAndRunThem();
+        assertThat(mCountDownLatch.await(2, TimeUnit.SECONDS)).isFalse();
+
+        doReturn(true).when(mMockNtpTrustedTime).forceRefresh();
+        doReturn(1L).when(mMockNtpTrustedTime).getCacheAge();
+        doReturn(MOCK_NTP_TIME).when(mMockNtpTrustedTime).getCachedNtpTime();
+        ShadowSystemClock.sleep(NtpTimeHelper.RETRY_INTERVAL);
+
+        waitForTasksToBePostedOnHandlerAndRunThem();
+        assertThat(mCountDownLatch.await(2, TimeUnit.SECONDS)).isTrue();
+    }
+
+    /**
+     * Since a thread is created in {@link NtpTimeHelper#retrieveAndInjectNtpTime} and the task to
+     * be verified is posted in the thread, we have to wait for the task to be posted and then it
+     * can be run.
+     */
+    private void waitForTasksToBePostedOnHandlerAndRunThem() throws InterruptedException {
+        mCountDownLatch.await(1, TimeUnit.SECONDS);
+        ShadowLooper.runUiThreadTasks();
+    }
+}
+
diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk
index cdb339a..a85f21c 100644
--- a/services/tests/servicestests/Android.mk
+++ b/services/tests/servicestests/Android.mk
@@ -29,6 +29,7 @@
     truth-prebuilt \
     testables \
     testng \
+    ub-uiautomator\
     platformprotosnano
 
 LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
@@ -69,8 +70,6 @@
 LOCAL_JACK_FLAGS := --multi-dex native
 LOCAL_DX_FLAGS := --multi-dex
 
-LOCAL_STATIC_JAVA_LIBRARIES += ub-uiautomator
-
 LOCAL_PROGUARD_ENABLED := disabled
 
 include $(BUILD_PACKAGE)
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index ce98d65..22bec44 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -63,6 +63,7 @@
     <uses-permission android:name="android.permission.WATCH_APPOPS" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
     <uses-permission android:name="android.permission.SUSPEND_APPS"/>
+    <uses-permission android:name="android.permission.CONTROL_KEYGUARD"/>
 
     <!-- Uses API introduced in O (26) -->
     <uses-sdk android:minSdkVersion="1"
@@ -145,6 +146,15 @@
         <activity android:name="com.android.server.pm.ShortcutTestActivity"
                  android:enabled="true" android:exported="true" />
 
+        <activity android:name="com.android.server.pm.SuspendedDetailsActivity"
+                  android:enabled="true"
+                  android:permission="android.permission.SEND_SHOW_SUSPENDED_APP_DETAILS">
+            <intent-filter>
+                <action android:name="android.intent.action.SHOW_SUSPENDED_APP_DETAILS" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="com.android.server.accounts.AccountAuthenticatorDummyActivity" />
 
         <activity-alias android:name="a.ShortcutEnabled"
diff --git a/services/tests/servicestests/AndroidTest.xml b/services/tests/servicestests/AndroidTest.xml
index 0ec16b5..8f989df 100644
--- a/services/tests/servicestests/AndroidTest.xml
+++ b/services/tests/servicestests/AndroidTest.xml
@@ -28,5 +28,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.servicestests" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java
index 46b364c..43701e9 100644
--- a/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/ColorDisplayServiceTest.java
@@ -25,6 +25,7 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.provider.Settings.Secure;
+import android.provider.Settings.System;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.mock.MockContentResolver;
@@ -895,6 +896,52 @@
         assertActivated(true /* activated */);
     }
 
+    @Test
+    public void accessibility_colorInversion_transformActivated() {
+        setAccessibilityColorInversion(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_colorCorrection_transformActivated() {
+        setAccessibilityColorCorrection(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_all_transformActivated() {
+        setAccessibilityColorCorrection(true);
+        setAccessibilityColorInversion(true);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(true /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_SATURATED);
+    }
+
+    @Test
+    public void accessibility_none_transformActivated() {
+        setAccessibilityColorCorrection(false);
+        setAccessibilityColorInversion(false);
+        setColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+
+        startService();
+        assertAccessibilityTransformActivated(false /* activated */ );
+        assertUserColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+        assertActiveColorMode(ColorDisplayController.COLOR_MODE_NATURAL);
+    }
+
     /**
      * Configures Night display to use a custom schedule.
      *
@@ -935,6 +982,35 @@
     }
 
     /**
+     * Configures the Accessibility color correction setting state.
+     *
+     * @param state {@code true} if color inversion should be activated
+     */
+    private void setAccessibilityColorCorrection(boolean state) {
+        Secure.putIntForUser(mContext.getContentResolver(),
+                Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, state ? 1 : 0, mUserId);
+    }
+
+    /**
+     * Configures the Accessibility color inversion setting state.
+     *
+     * @param state {@code true} if color inversion should be activated
+     */
+    private void setAccessibilityColorInversion(boolean state) {
+        Secure.putIntForUser(mContext.getContentResolver(),
+                Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, state ? 1 : 0, mUserId);
+    }
+
+    /**
+     * Configures color mode via ColorDisplayController.
+     *
+     * @param mode the color mode to set
+     */
+    private void setColorMode(int mode) {
+        mColorDisplayController.setColorMode(mode);
+    }
+
+    /**
      * Convenience method to start {@link #mColorDisplayService}.
      */
     private void startService() {
@@ -962,6 +1038,41 @@
     }
 
     /**
+     * Convenience method for asserting that Accessibility color transform is detected.
+     *
+     * @param state {@code true} if any Accessibility transform should be activated
+     */
+    private void assertAccessibilityTransformActivated(boolean state) {
+        assertWithMessage("Unexpected Accessibility color transform state")
+                .that(mColorDisplayController.getAccessibilityTransformActivated())
+                .isEqualTo(state);
+    }
+
+    /**
+     * Convenience method for asserting that the active color mode matches expectation.
+     *
+     * @param mode the expected active color mode.
+     */
+    private void assertActiveColorMode(int mode) {
+        assertWithMessage("Unexpected color mode setting")
+                .that(mColorDisplayController.getColorMode())
+                .isEqualTo(mode);
+    }
+
+    /**
+     * Convenience method for asserting that the user chosen color mode matches expectation.
+     *
+     * @param mode the expected color mode setting.
+     */
+    private void assertUserColorMode(int mode) {
+        final int actualMode = System.getIntForUser(mContext.getContentResolver(),
+                System.DISPLAY_COLOR_MODE, -1, mUserId);
+        assertWithMessage("Unexpected color mode setting")
+                .that(actualMode)
+                .isEqualTo(mode);
+    }
+
+    /**
      * Convenience for making a {@link LocalTime} instance with an offset relative to now.
      *
      * @param offsetMinutes the offset relative to now (in minutes)
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index d31d550..cecc94b 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -18,6 +18,7 @@
 
 import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
 import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING;
 import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
 import static android.net.NetworkPolicy.LIMIT_DISABLED;
 import static android.net.NetworkPolicy.SNOOZE_NEVER;
@@ -30,6 +31,7 @@
 import static android.net.NetworkStats.SET_ALL;
 import static android.net.NetworkStats.TAG_ALL;
 import static android.net.NetworkTemplate.buildTemplateMobileAll;
+import static android.net.NetworkTemplate.buildTemplateWifi;
 import static android.net.TrafficStats.MB_IN_BYTES;
 import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
 import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
@@ -37,9 +39,13 @@
 import static android.telephony.CarrierConfigManager.KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG;
 import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_THRESHOLD_BYTES_LONG;
 import static android.telephony.CarrierConfigManager.KEY_MONTHLY_DATA_CYCLE_DAY_INT;
+import static android.telephony.SubscriptionPlan.BYTES_UNLIMITED;
 import static android.telephony.SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED;
 import static android.text.format.Time.TIMEZONE_UTC;
 
+import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_JOBS;
+import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
+import static com.android.server.net.NetworkPolicyManagerService.OPPORTUNISTIC_QUOTA_UNKNOWN;
 import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT;
 import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED;
 import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID;
@@ -62,6 +68,7 @@
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
@@ -118,7 +125,7 @@
 import android.text.format.Time;
 import android.util.DataUnit;
 import android.util.Log;
-import android.util.Pair;
+import android.util.Range;
 import android.util.RecurrenceRule;
 
 import com.android.internal.telephony.PhoneConstants;
@@ -198,7 +205,8 @@
     private static final int TEST_SUB_ID = 42;
     private static final int TEST_NET_ID = 24;
 
-    private static NetworkTemplate sTemplateWifi = NetworkTemplate.buildTemplateWifi(TEST_SSID);
+    private static NetworkTemplate sTemplateWifi = buildTemplateWifi(TEST_SSID);
+    private static NetworkTemplate sTemplateMobileAll = buildTemplateMobileAll(TEST_IMSI);
 
     /**
      * Path on assets where files used by {@link NetPolicyXml} are located.
@@ -218,6 +226,7 @@
     private @Mock IActivityManager mActivityManager;
     private @Mock INetworkManagementService mNetworkManager;
     private @Mock IConnectivityManager mConnManager;
+    private @Mock ConnectivityManager mConnectivityManager;
     private @Mock NotificationManager mNotifManager;
     private @Mock PackageManager mPackageManager;
     private @Mock IPackageManager mIpm;
@@ -225,6 +234,9 @@
     private @Mock CarrierConfigManager mCarrierConfigManager;
     private @Mock TelephonyManager mTelephonyManager;
 
+    private ArgumentCaptor<ConnectivityManager.NetworkCallback> mNetworkCallbackCaptor =
+            ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
+
     private ActivityManagerInternal mActivityManagerInternal;
     private NetworkStatsManagerInternal mStatsService;
 
@@ -328,6 +340,8 @@
                         return mTelephonyManager;
                     case Context.NOTIFICATION_SERVICE:
                         return mNotifManager;
+                    case Context.CONNECTIVITY_SERVICE:
+                        return mConnectivityManager;
                     default:
                         return super.getSystemService(name);
                 }
@@ -391,6 +405,8 @@
                 .thenReturn(buildApplicationInfo(PKG_NAME_C));
         when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
         when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
+        doNothing().when(mConnectivityManager)
+                .registerNetworkCallback(any(), mNetworkCallbackCaptor.capture());
 
         // Prepare NPMS.
         mService.systemReady(mService.networkScoreAndNetworkManagementServiceReady());
@@ -818,11 +834,11 @@
     private static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
         RecurrenceRule.sClock = Clock.fixed(Instant.ofEpochMilli(currentTime),
                 ZoneId.systemDefault());
-        final Iterator<Pair<ZonedDateTime, ZonedDateTime>> it = policy.cycleIterator();
+        final Iterator<Range<ZonedDateTime>> it = policy.cycleIterator();
         while (it.hasNext()) {
-            final Pair<ZonedDateTime, ZonedDateTime> cycle = it.next();
-            if (cycle.first.toInstant().toEpochMilli() < currentTime) {
-                return cycle.first.toInstant().toEpochMilli();
+            final Range<ZonedDateTime> cycle = it.next();
+            if (cycle.getLower().toInstant().toEpochMilli() < currentTime) {
+                return cycle.getLower().toInstant().toEpochMilli();
             }
         }
         throw new IllegalStateException(
@@ -832,7 +848,7 @@
     private static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
         RecurrenceRule.sClock = Clock.fixed(Instant.ofEpochMilli(currentTime),
                 ZoneId.systemDefault());
-        return policy.cycleIterator().next().second.toInstant().toEpochMilli();
+        return policy.cycleIterator().next().getUpper().toInstant().toEpochMilli();
     }
 
     @Test
@@ -1012,10 +1028,8 @@
         mService.updateNetworks();
 
         // Define simple data plan
-        final SubscriptionPlan plan = SubscriptionPlan.Builder
-                .createRecurringMonthly(ZonedDateTime.parse("2015-11-01T00:00:00.00Z"))
-                .setDataLimit(DataUnit.MEGABYTES.toBytes(1800), LIMIT_BEHAVIOR_DISABLED)
-                .build();
+        final SubscriptionPlan plan = buildMonthlyDataPlan(
+                ZonedDateTime.parse("2015-11-01T00:00:00.00Z"), DataUnit.MEGABYTES.toBytes(1800));
         mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[] { plan },
                 mServiceContext.getOpPackageName());
 
@@ -1119,10 +1133,8 @@
         mService.updateNetworks();
 
         // Define simple data plan which gives us effectively 60MB/day
-        final SubscriptionPlan plan = SubscriptionPlan.Builder
-                .createRecurringMonthly(ZonedDateTime.parse("2015-11-01T00:00:00.00Z"))
-                .setDataLimit(DataUnit.MEGABYTES.toBytes(1800), LIMIT_BEHAVIOR_DISABLED)
-                .build();
+        final SubscriptionPlan plan = buildMonthlyDataPlan(
+                ZonedDateTime.parse("2015-11-01T00:00:00.00Z"), DataUnit.MEGABYTES.toBytes(1800));
         mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[] { plan },
                 mServiceContext.getOpPackageName());
 
@@ -1484,6 +1496,145 @@
                 true);
     }
 
+    @Test
+    public void testOpportunisticQuota() throws Exception {
+        final Network net = new Network(TEST_NET_ID);
+        final NetworkPolicyManagerInternal internal = LocalServices
+                .getService(NetworkPolicyManagerInternal.class);
+
+        // Create a place to store fake usage
+        final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1));
+        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
+        when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong()))
+                .thenAnswer(invocation -> {
+                    final NetworkStatsHistory.Entry entry = history.getValues(
+                            invocation.getArgument(1), invocation.getArgument(2), null);
+                    return entry.rxBytes + entry.txBytes;
+                });
+        when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong()))
+                .thenReturn(stats);
+
+        // Get active mobile network in place
+        expectMobileDefaults();
+        mService.updateNetworks();
+
+        // We're 20% through the month (6 days)
+        final long start = parseTime("2015-11-01T00:00Z");
+        final long end = parseTime("2015-11-07T00:00Z");
+        setCurrentTimeMillis(end);
+
+        // Get some data usage in place
+        history.clear();
+        history.recordData(start, end,
+                new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0));
+
+        // No data plan
+        {
+            reset(mTelephonyManager, mNetworkManager, mNotifManager);
+            expectMobileDefaults();
+
+            mService.updateNetworks();
+
+            // No quotas
+            assertEquals(OPPORTUNISTIC_QUOTA_UNKNOWN,
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_JOBS));
+            assertEquals(OPPORTUNISTIC_QUOTA_UNKNOWN,
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_MULTIPATH));
+        }
+
+        // Limited data plan
+        {
+            final SubscriptionPlan plan = buildMonthlyDataPlan(
+                    ZonedDateTime.parse("2015-11-01T00:00:00.00Z"),
+                    DataUnit.MEGABYTES.toBytes(1800));
+            mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[]{plan},
+                    mServiceContext.getOpPackageName());
+
+            reset(mTelephonyManager, mNetworkManager, mNotifManager);
+            expectMobileDefaults();
+
+            mService.updateNetworks();
+
+            // We have 1440MB and 24 days left, which is 60MB/day; assuming 10%
+            // for quota split equally between two types gives 3MB.
+            assertEquals(DataUnit.MEGABYTES.toBytes(3),
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_JOBS));
+            assertEquals(DataUnit.MEGABYTES.toBytes(3),
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_MULTIPATH));
+        }
+
+        // Limited data plan, over quota
+        {
+            final SubscriptionPlan plan = buildMonthlyDataPlan(
+                    ZonedDateTime.parse("2015-11-01T00:00:00.00Z"),
+                    DataUnit.MEGABYTES.toBytes(100));
+            mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[]{plan},
+                    mServiceContext.getOpPackageName());
+
+            reset(mTelephonyManager, mNetworkManager, mNotifManager);
+            expectMobileDefaults();
+
+            mService.updateNetworks();
+
+            assertEquals(0L, internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_JOBS));
+            assertEquals(0L, internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_MULTIPATH));
+        }
+
+        // Roaming
+        {
+            final SubscriptionPlan plan = buildMonthlyDataPlan(
+                    ZonedDateTime.parse("2015-11-01T00:00:00.00Z"), BYTES_UNLIMITED);
+            mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[]{plan},
+                    mServiceContext.getOpPackageName());
+
+            reset(mTelephonyManager, mNetworkManager, mNotifManager);
+            expectMobileDefaults();
+            expectNetworkState(true /* roaming */);
+
+            mService.updateNetworks();
+
+            assertEquals(0L, internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_JOBS));
+            assertEquals(0L, internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_MULTIPATH));
+        }
+
+        // Unlimited data plan
+        {
+            final SubscriptionPlan plan = buildMonthlyDataPlan(
+                    ZonedDateTime.parse("2015-11-01T00:00:00.00Z"), BYTES_UNLIMITED);
+            mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[]{plan},
+                    mServiceContext.getOpPackageName());
+
+            reset(mTelephonyManager, mNetworkManager, mNotifManager);
+            expectMobileDefaults();
+
+            mService.updateNetworks();
+
+            // 20MB/day, split equally between two types gives 10MB.
+            assertEquals(DataUnit.MEBIBYTES.toBytes(10),
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_JOBS));
+            assertEquals(DataUnit.MEBIBYTES.toBytes(10),
+                    internal.getSubscriptionOpportunisticQuota(net, QUOTA_TYPE_MULTIPATH));
+
+            // Capabilities change to roaming
+            final ConnectivityManager.NetworkCallback callback = mNetworkCallbackCaptor.getValue();
+            assertNotNull(callback);
+            expectNetworkState(true /* roaming */);
+            callback.onCapabilitiesChanged(
+                    new Network(TEST_NET_ID),
+                    buildNetworkCapabilities(TEST_SUB_ID, true /* roaming */));
+
+            assertEquals(0, internal.getSubscriptionOpportunisticQuota(
+                    new Network(TEST_NET_ID), NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH));
+        }
+    }
+
+    private SubscriptionPlan buildMonthlyDataPlan(ZonedDateTime start, long limitBytes) {
+        return SubscriptionPlan.Builder
+                .createRecurringMonthly(start)
+                .setDataLimit(limitBytes, LIMIT_BEHAVIOR_DISABLED)
+                .build();
+    }
+
     private ApplicationInfo buildApplicationInfo(String label) {
         final ApplicationInfo ai = new ApplicationInfo();
         ai.nonLocalizedLabel = label;
@@ -1503,9 +1654,12 @@
         return lp;
     }
 
-    private NetworkCapabilities buildNetworkCapabilities(int subId) {
+    private NetworkCapabilities buildNetworkCapabilities(int subId, boolean roaming) {
         final NetworkCapabilities nc = new NetworkCapabilities();
         nc.addTransportType(TRANSPORT_CELLULAR);
+        if (!roaming) {
+            nc.addCapability(NET_CAPABILITY_NOT_ROAMING);
+        }
         nc.setNetworkSpecifier(new StringNetworkSpecifier(String.valueOf(subId)));
         return nc;
     }
@@ -1559,16 +1713,20 @@
                 hasIt ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED);
     }
 
+    private void expectNetworkState(boolean roaming) throws Exception {
+        when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] {
+                new NetworkState(buildNetworkInfo(),
+                        buildLinkProperties(TEST_IFACE),
+                        buildNetworkCapabilities(TEST_SUB_ID, roaming),
+                        new Network(TEST_NET_ID), TEST_IMSI, null)
+        });
+    }
+
     private void expectMobileDefaults() throws Exception {
         when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(
                 new int[] { TEST_SUB_ID });
         when(mTelephonyManager.getSubscriberId(TEST_SUB_ID)).thenReturn(TEST_IMSI);
-        when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] {
-                new NetworkState(buildNetworkInfo(),
-                        buildLinkProperties(TEST_IFACE),
-                        buildNetworkCapabilities(TEST_SUB_ID),
-                        new Network(TEST_NET_ID), TEST_IMSI, null)
-        });
+        expectNetworkState(false /* roaming */);
     }
 
     private void verifyAdvisePersistThreshold() throws Exception {
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
index cda968a7..9663a1b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -265,4 +265,26 @@
         // Supervisor should skip over the non-existent display.
         assertEquals(null, mSupervisor.topRunningActivityLocked());
     }
+
+    /**
+     * Verifies that removal of activity with task and stack is done correctly.
+     */
+    @Test
+    public void testRemovingStackOnAppCrash() throws Exception {
+        final ActivityDisplay defaultDisplay = mService.mStackSupervisor.getDefaultDisplay();
+        final int originalStackCount = defaultDisplay.getChildCount();
+        final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, false /* onTop */);
+        final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true)
+                .setStack(stack).build();
+
+        assertEquals(originalStackCount + 1, defaultDisplay.getChildCount());
+
+        // Let's pretend that the app has crashed.
+        firstActivity.app.thread = null;
+        mService.mStackSupervisor.finishTopCrashedActivitiesLocked(firstActivity.app, "test");
+
+        // Verify that the stack was removed.
+        assertEquals(originalStackCount, defaultDisplay.getChildCount());
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index b9ddf5c..c78fcd3 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -24,8 +24,6 @@
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
 
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
-import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
 import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
 import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
 import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
@@ -43,9 +41,7 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.app.servertransaction.DestroyActivityItem;
 import android.content.pm.ActivityInfo;
-import android.os.Debug;
 import android.os.UserHandle;
 import android.platform.test.annotations.Presubmit;
 import android.support.test.filters.SmallTest;
@@ -67,6 +63,7 @@
 public class ActivityStackTests extends ActivityTestsBase {
     private ActivityManagerService mService;
     private ActivityStackSupervisor mSupervisor;
+    private ActivityDisplay mDefaultDisplay;
     private ActivityStack mStack;
     private TaskRecord mTask;
 
@@ -77,8 +74,9 @@
 
         mService = createActivityManagerService();
         mSupervisor = mService.mStackSupervisor;
-        mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        mDefaultDisplay = mService.mStackSupervisor.getDefaultDisplay();
+        mStack = mDefaultDisplay.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
         mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
     }
 
@@ -112,9 +110,8 @@
     public void testPrimarySplitScreenToFullscreenWhenMovedToBack() throws Exception {
         // Create primary splitscreen stack. This will create secondary stacks and places the
         // existing fullscreen stack on the bottom.
-        final ActivityStack primarySplitScreen = mService.mStackSupervisor.getDefaultDisplay()
-                .createStack(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
-                        true /* onTop */);
+        final ActivityStack primarySplitScreen = mDefaultDisplay.createStack(
+                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         // Assert windowing mode.
         assertEquals(primarySplitScreen.getWindowingMode(), WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
@@ -124,8 +121,7 @@
                 null /* task */);
 
         // Assert that stack is at the bottom.
-        assertEquals(mService.mStackSupervisor.getDefaultDisplay().getIndexOf(primarySplitScreen),
-                0);
+        assertEquals(mDefaultDisplay.getIndexOf(primarySplitScreen), 0);
 
         // Ensure no longer in splitscreen.
         assertEquals(primarySplitScreen.getWindowingMode(), WINDOWING_MODE_FULLSCREEN);
@@ -165,16 +161,15 @@
 
     @Test
     public void testShouldBeVisible_Fullscreen() throws Exception {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(display,
+        final ActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         assertTrue(homeStack.shouldBeVisible(null /* starting */));
         assertTrue(pinnedStack.shouldBeVisible(null /* starting */));
 
-        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
         // Home stack shouldn't be visible behind an opaque fullscreen stack, but pinned stack
         // should be visible since it is always on-top.
@@ -191,14 +186,13 @@
 
     @Test
     public void testShouldBeVisible_SplitScreen() throws Exception {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
         // Home stack should always be fullscreen for this test.
         homeStack.setSupportsSplitScreen(false);
-        final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         // Home stack shouldn't be visible if both halves of split-screen are opaque.
@@ -214,7 +208,7 @@
         assertTrue(splitScreenPrimary.shouldBeVisible(null /* starting */));
         assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
 
-        final TestActivityStack splitScreenSecondary2 = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack splitScreenSecondary2 = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
         // First split-screen secondary shouldn't be visible behind another opaque split-split
         // secondary.
@@ -228,7 +222,7 @@
         assertTrue(splitScreenSecondary.shouldBeVisible(null /* starting */));
         assertTrue(splitScreenSecondary2.shouldBeVisible(null /* starting */));
 
-        final TestActivityStack assistantStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
 
         // Split-screen stacks shouldn't be visible behind an opaque fullscreen stack.
@@ -258,11 +252,11 @@
 
     @Test
     public void testShouldBeVisible_Finishing() throws Exception {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final TestActivityStack translucentStack = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final TestActivityStack translucentStack = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
         translucentStack.setIsTranslucent(true);
 
         assertTrue(homeStack.shouldBeVisible(null /* starting */));
@@ -286,76 +280,74 @@
 
     @Test
     public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         homeStack.setIsTranslucent(false);
         fullscreenStack.setIsTranslucent(false);
 
         // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
-        int homeStackIndex = display.getIndexOf(homeStack);
-        assertTrue(display.getStackAboveHome() == fullscreenStack);
-        display.moveHomeStackBehindBottomMostVisibleStack();
-        assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+        int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack);
+        mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
+        assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
     }
 
     @Test
     public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         homeStack.setIsTranslucent(false);
         fullscreenStack.setIsTranslucent(true);
 
         // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
-        int homeStackIndex = display.getIndexOf(homeStack);
-        assertTrue(display.getStackAboveHome() == fullscreenStack);
-        display.moveHomeStackBehindBottomMostVisibleStack();
-        assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+        int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack);
+        mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
+        assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
     }
 
     @Test
     public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
 
         homeStack.setIsTranslucent(false);
         fullscreenStack.setIsTranslucent(false);
 
         // Ensure we don't move the home stack if it is already on top
-        int homeStackIndex = display.getIndexOf(homeStack);
-        assertTrue(display.getStackAboveHome() == null);
-        display.moveHomeStackBehindBottomMostVisibleStack();
-        assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+        int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == null);
+        mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
+        assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
     }
 
     @Test
     public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack pinnedStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack pinnedStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
 
         homeStack.setIsTranslucent(false);
@@ -364,22 +356,23 @@
 
         // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
         // pinned stack
-        assertTrue(display.getStackAboveHome() == fullscreenStack1);
-        display.moveHomeStackBehindBottomMostVisibleStack();
-        assertTrue(display.getStackAboveHome() == fullscreenStack2);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+        mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
     }
 
     @Test
     public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
-        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
 
         homeStack.setIsTranslucent(false);
         fullscreenStack1.setIsTranslucent(false);
@@ -387,21 +380,22 @@
 
         // Ensure that we move the home stack behind the bottom most non-translucent fullscreen
         // stack
-        assertTrue(display.getStackAboveHome() == fullscreenStack1);
-        display.moveHomeStackBehindBottomMostVisibleStack();
-        assertTrue(display.getStackAboveHome() == fullscreenStack1);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+        mDefaultDisplay.moveStackBehindBottomMostVisibleStack(homeStack);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
     }
 
     @Test
     public void testMoveHomeStackBehindStack_BehindHomeStack() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
 
         homeStack.setIsTranslucent(false);
@@ -409,45 +403,49 @@
         fullscreenStack2.setIsTranslucent(false);
 
         // Ensure we don't move the home stack behind itself
-        int homeStackIndex = display.getIndexOf(homeStack);
-        display.moveHomeStackBehindStack(homeStack);
-        assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+        int homeStackIndex = mDefaultDisplay.getIndexOf(homeStack);
+        mDefaultDisplay.moveStackBehindStack(homeStack, homeStack);
+        assertTrue(mDefaultDisplay.getIndexOf(homeStack) == homeStackIndex);
     }
 
     @Test
     public void testMoveHomeStackBehindStack() {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        display.removeChild(mStack);
+        mDefaultDisplay.removeChild(mStack);
 
-        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack3 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack fullscreenStack4 = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack homeStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
 
-        display.moveHomeStackBehindStack(fullscreenStack1);
-        assertTrue(display.getStackAboveHome() == fullscreenStack1);
-        display.moveHomeStackBehindStack(fullscreenStack2);
-        assertTrue(display.getStackAboveHome() == fullscreenStack2);
-        display.moveHomeStackBehindStack(fullscreenStack4);
-        assertTrue(display.getStackAboveHome() == fullscreenStack4);
-        display.moveHomeStackBehindStack(fullscreenStack2);
-        assertTrue(display.getStackAboveHome() == fullscreenStack2);
+        mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack1);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack1);
+        mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
+        mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack4);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack4);
+        mDefaultDisplay.moveStackBehindStack(homeStack, fullscreenStack2);
+        assertTrue(mDefaultDisplay.getStackAbove(homeStack) == fullscreenStack2);
     }
 
     @Test
     public void testSplitScreenMoveToFront() throws Exception {
-        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
-        final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(display,
-                WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
-        final TestActivityStack assistantStack = createStackForShouldBeVisibleTest(display,
+        final TestActivityStack splitScreenPrimary = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack splitScreenSecondary = createStackForShouldBeVisibleTest(
+                mDefaultDisplay, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
+                true /* onTop */);
+        final TestActivityStack assistantStack = createStackForShouldBeVisibleTest(mDefaultDisplay,
                 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, true /* onTop */);
 
         splitScreenPrimary.setIsTranslucent(false);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
index 194f4ae..a14b950 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartInterceptorTest.java
@@ -17,6 +17,9 @@
 package com.android.server.am;
 
 import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
+
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -30,15 +33,19 @@
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManagerInternal;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.test.filters.SmallTest;
+import android.testing.DexmakerShareClassLoaderRule;
 
 import com.android.internal.app.UnlaunchableAppActivity;
 import com.android.server.LocalServices;
+import com.android.server.pm.PackageManagerService;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -64,6 +71,10 @@
             0 /* flags */);
     private static final String TEST_PACKAGE_NAME = "com.test.package";
 
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
     @Mock
     private Context mContext;
     @Mock
@@ -73,20 +84,21 @@
     @Mock
     private DevicePolicyManagerInternal mDevicePolicyManager;
     @Mock
+    private PackageManagerInternal mPackageManagerInternal;
+    @Mock
     private UserManager mUserManager;
     @Mock
     private UserController mUserController;
     @Mock
     private KeyguardManager mKeyguardManager;
+    @Mock
+    private PackageManagerService mPackageManager;
 
     private ActivityStartInterceptor mInterceptor;
     private ActivityInfo mAInfo = new ActivityInfo();
 
     @Before
     public void setUp() {
-        // This property is used to allow mocking of package private classes with mockito
-        System.setProperty("dexmaker.share_classloader", "true");
-
         MockitoAnnotations.initMocks(this);
         mInterceptor = new ActivityStartInterceptor(mService, mSupervisor, mContext,
                 mUserController);
@@ -100,6 +112,7 @@
         when(mDevicePolicyManager
                         .createShowAdminSupportIntent(TEST_USER_ID, true))
                 .thenReturn(ADMIN_SUPPORT_INTENT);
+        when(mService.getPackageManagerInternalLocked()).thenReturn(mPackageManagerInternal);
 
         // Mock UserManager
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
@@ -111,16 +124,24 @@
                 nullable(CharSequence.class), nullable(CharSequence.class), eq(TEST_USER_ID))).
                 thenReturn(CONFIRM_CREDENTIALS_INTENT);
 
+        // Mock PackageManager
+        when(mService.getPackageManager()).thenReturn(mPackageManager);
+        when(mPackageManager.getHarmfulAppWarning(TEST_PACKAGE_NAME, TEST_USER_ID))
+                .thenReturn(null);
+
         // Initialise activity info
-        mAInfo.packageName = TEST_PACKAGE_NAME;
         mAInfo.applicationInfo = new ApplicationInfo();
+        mAInfo.packageName = mAInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
     }
 
     @Test
-    public void testSuspendedPackage() {
+    public void testSuspendedByAdminPackage() {
         // GIVEN the package we're about to launch is currently suspended
         mAInfo.applicationInfo.flags = FLAG_SUSPENDED;
 
+        when(mPackageManagerInternal.getSuspendingPackage(TEST_PACKAGE_NAME, TEST_USER_ID))
+                .thenReturn(PLATFORM_PACKAGE_NAME);
+
         // THEN calling intercept returns true
         assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, 0, 0, null));
 
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
index d012bba..18e842f 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java
@@ -23,6 +23,7 @@
 import static android.app.ActivityManager.START_INTENT_NOT_RESOLVED;
 import static android.app.ActivityManager.START_NOT_VOICE_COMPATIBLE;
 import static android.app.ActivityManager.START_PERMISSION_DENIED;
+import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
 import static android.app.ActivityManager.START_SUCCESS;
 import static android.app.ActivityManager.START_SWITCHES_CANCELED;
 import static android.app.ActivityManager.START_TASK_TO_FRONT;
@@ -34,6 +35,7 @@
 
 import android.app.ActivityOptions;
 import android.app.IApplicationThread;
+import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ActivityInfo.WindowLayout;
@@ -74,6 +76,8 @@
 import com.android.server.am.LaunchParamsController.LaunchParamsModifier;
 import com.android.server.am.TaskRecord.TaskRecordFactory;
 
+import java.util.ArrayList;
+
 /**
  * Tests for the {@link ActivityStarter} class.
  *
@@ -301,13 +305,14 @@
                 anyBoolean(), any(), any(), any());
 
         // instrument the stack and task used.
-        final ActivityStack stack = spy(mService.mStackSupervisor.getDefaultDisplay().createStack(
-                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */));
-        final TaskRecord task =
-                spy(new TaskBuilder(mService.mStackSupervisor).setStack(stack).build());
+        final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final TaskRecord task = new TaskBuilder(mService.mStackSupervisor)
+                .setCreateStack(false)
+                .build();
 
         // supervisor needs a focused stack.
-        mService.mStackSupervisor.mFocusedStack = task.getStack();
+        mService.mStackSupervisor.mFocusedStack = stack;
 
         // use factory that only returns spy task.
         final TaskRecordFactory factory = mock(TaskRecordFactory.class);
@@ -322,14 +327,6 @@
         doReturn(stack).when(mService.mStackSupervisor)
                 .getLaunchStack(any(), any(), any(), anyBoolean(), anyInt());
 
-        // ignore the start request.
-        doNothing().when(stack)
-                .startActivityLocked(any(), any(), anyBoolean(), anyBoolean(), any());
-
-        // ignore requests to create window container.
-        doNothing().when(task).createWindowContainer(anyBoolean(), anyBoolean());
-
-
         final Intent intent = new Intent();
         intent.addFlags(launchFlags);
         intent.setComponent(ActivityBuilder.getDefaultComponent());
@@ -448,4 +445,30 @@
         // Ensure result is moving task to front.
         assertEquals(result, START_TASK_TO_FRONT);
     }
+
+    /**
+     * Tests activity is cleaned up properly in a task mode violation.
+     */
+    @Test
+    public void testTaskModeViolation() {
+        final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+        assertNoTasks(display);
+
+        final ActivityStarter starter = prepareStarter(0);
+
+        final LockTaskController lockTaskController = mService.getLockTaskController();
+        doReturn(true).when(lockTaskController).isLockTaskModeViolation(any());
+
+        final int result = starter.setReason("testTaskModeViolation").execute();
+
+        assertEquals(START_RETURN_LOCK_TASK_MODE_VIOLATION, result);
+        assertNoTasks(display);
+    }
+
+    private void assertNoTasks(ActivityDisplay display) {
+        for (int i = display.getChildCount() - 1; i >= 0; --i) {
+            final ActivityStack stack = display.getChildAt(i);
+            assertTrue(stack.getAllTasks().isEmpty());
+        }
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index a533447..f5e61a1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -30,7 +30,10 @@
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.spy;
 
+import android.app.ActivityOptions;
 import com.android.server.wm.DisplayWindowController;
+
+import org.junit.Rule;
 import org.mockito.invocation.InvocationOnMock;
 
 import android.app.IApplicationThread;
@@ -47,6 +50,11 @@
 import android.os.Looper;
 import android.service.voice.IVoiceInteractionSession;
 import android.support.test.InstrumentationRegistry;
+import android.testing.DexmakerShareClassLoaderRule;
+
+
+import com.android.internal.app.IVoiceInteractor;
+
 import com.android.server.AttributeCache;
 import com.android.server.wm.AppWindowContainerController;
 import com.android.server.wm.PinnedStackWindowController;
@@ -58,12 +66,17 @@
 import org.junit.Before;
 import org.mockito.MockitoAnnotations;
 
+
 /**
  * A base class to handle common operations in activity related unit tests.
  */
 public class ActivityTestsBase {
     private static boolean sOneTimeSetupDone = false;
 
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
     private final Context mContext = InstrumentationRegistry.getContext();
     private HandlerThread mHandlerThread;
 
@@ -77,9 +90,6 @@
     public void setUp() throws Exception {
         if (!sOneTimeSetupDone) {
             sOneTimeSetupDone = true;
-
-            // Allows to mock package local classes and methods
-            System.setProperty("dexmaker.share_classloader", "true");
             MockitoAnnotations.initMocks(this);
         }
         mHandlerThread = new HandlerThread("ActivityTestsBaseThread");
@@ -210,6 +220,7 @@
         private int mTaskId = 0;
         private int mUserId = 0;
         private IVoiceInteractionSession mVoiceSession;
+        private boolean mCreateStack = true;
 
         private ActivityStack mStack;
 
@@ -227,6 +238,15 @@
             return this;
         }
 
+        /**
+         * Set to {@code true} by default, set to {@code false} to prevent the task from
+         * automatically creating a parent stack.
+         */
+        TaskBuilder setCreateStack(boolean createStack) {
+            mCreateStack = createStack;
+            return this;
+        }
+
         TaskBuilder setVoiceSession(IVoiceInteractionSession session) {
             mVoiceSession = session;
             return this;
@@ -253,7 +273,7 @@
         }
 
         TaskRecord build() {
-            if (mStack == null) {
+            if (mStack == null && mCreateStack) {
                 mStack = mSupervisor.getDefaultDisplay().createStack(
                         WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
             }
@@ -271,17 +291,38 @@
             intent.setComponent(mComponent);
             intent.setFlags(mFlags);
 
-            final TaskRecord task = new TaskRecord(mSupervisor.mService, mTaskId, aInfo,
+            final TestTaskRecord task = new TestTaskRecord(mSupervisor.mService, mTaskId, aInfo,
                     intent /*intent*/, mVoiceSession, null /*_voiceInteractor*/);
             task.userId = mUserId;
-            mSupervisor.setFocusStackUnchecked("test", mStack);
-            mStack.addTask(task, true, "creating test task");
-            task.setStack(mStack);
-            task.setWindowContainerController(mock(TaskWindowContainerController.class));
+
+            if (mStack != null) {
+                mSupervisor.setFocusStackUnchecked("test", mStack);
+                mStack.addTask(task, true, "creating test task");
+                task.setStack(mStack);
+                task.setWindowContainerController();
+            }
+
             task.touchActiveTime();
 
             return task;
         }
+
+        private static class TestTaskRecord extends TaskRecord {
+            TestTaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info,
+                       Intent _intent, IVoiceInteractionSession _voiceSession,
+                       IVoiceInteractor _voiceInteractor) {
+                super(service, _taskId, info, _intent, _voiceSession, _voiceInteractor);
+            }
+
+            @Override
+            void createWindowContainer(boolean onTop, boolean showForAllUsers) {
+                setWindowContainerController();
+            }
+
+            private void setWindowContainerController() {
+                setWindowContainerController(mock(TaskWindowContainerController.class));
+            }
+        }
     }
 
     /**
@@ -290,6 +331,7 @@
      */
     protected static class TestActivityManagerService extends ActivityManagerService {
         private ClientLifecycleManager mLifecycleManager;
+        private LockTaskController mLockTaskController;
 
         TestActivityManagerService(Context context) {
             super(context);
@@ -309,6 +351,14 @@
             return mLifecycleManager;
         }
 
+        public LockTaskController getLockTaskController() {
+            if (mLockTaskController == null) {
+                mLockTaskController = spy(super.getLockTaskController());
+            }
+
+            return mLockTaskController;
+        }
+
         void setLifecycleManager(ClientLifecycleManager manager) {
             mLifecycleManager = manager;
         }
@@ -439,7 +489,7 @@
     }
 
     /**
-     * Overrided of {@link ActivityStack} that tracks test metrics, such as the number of times a
+     * Overridden {@link ActivityStack} that tracks test metrics, such as the number of times a
      * method is called. Note that its functionality depends on the implementations of the
      * construction arguments.
      */
@@ -525,5 +575,11 @@
                     return super.supportsSplitScreenWindowingMode();
             }
         }
+
+        @Override
+        void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
+                                 boolean newTask, boolean keepCurTransition,
+                                 ActivityOptions options) {
+        }
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
index 1cbb399..f46d712 100644
--- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java
@@ -55,6 +55,7 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.telecom.TelecomManager;
+import android.testing.DexmakerShareClassLoaderRule;
 import android.util.Pair;
 
 import com.android.internal.statusbar.IStatusBarService;
@@ -65,6 +66,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -85,6 +87,10 @@
     private static final int TEST_USER_ID = 123;
     private static final int TEST_UID = 10467;
 
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
     @Mock private ActivityStackSupervisor mSupervisor;
     @Mock private IDevicePolicyManager mDevicePolicyManager;
     @Mock private IStatusBarService mStatusBarService;
@@ -100,9 +106,6 @@
 
     @Before
     public void setUp() throws Exception {
-        // This property is used to allow mocking of package private classes with mockito
-        System.setProperty("dexmaker.share_classloader", "true");
-
         MockitoAnnotations.initMocks(this);
 
         mContext = InstrumentationRegistry.getTargetContext();
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
index 7765387..592f7b1 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
@@ -39,6 +39,7 @@
 
 import static java.lang.Integer.MAX_VALUE;
 
+import android.annotation.TestApi;
 import android.app.ActivityManager;
 import android.app.ActivityManager.RecentTaskInfo;
 import android.app.ActivityManager.RunningTaskInfo;
@@ -327,6 +328,33 @@
     }
 
     @Test
+    public void testAddTaskCompatibleActivityTypeDifferentUser_expectNoRemove() throws Exception {
+        Configuration config1 = new Configuration();
+        config1.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
+        TaskRecord task1 = createTaskBuilder(".Task1")
+                .setFlags(FLAG_ACTIVITY_NEW_TASK)
+                .setStack(mStack)
+                .setUserId(TEST_USER_0_ID)
+                .build();
+        task1.onConfigurationChanged(config1);
+        assertTrue(task1.getActivityType() == ACTIVITY_TYPE_UNDEFINED);
+        mRecentTasks.add(task1);
+        mCallbacksRecorder.clear();
+
+        TaskRecord task2 = createTaskBuilder(".Task1")
+                .setFlags(FLAG_ACTIVITY_NEW_TASK)
+                .setStack(mStack)
+                .setUserId(TEST_USER_1_ID)
+                .build();
+        assertTrue(task2.getActivityType() == ACTIVITY_TYPE_STANDARD);
+        mRecentTasks.add(task2);
+        assertTrue(mCallbacksRecorder.added.size() == 1);
+        assertTrue(mCallbacksRecorder.added.contains(task2));
+        assertTrue(mCallbacksRecorder.trimmed.isEmpty());
+        assertTrue(mCallbacksRecorder.removed.isEmpty());
+    }
+
+    @Test
     public void testUsersTasks() throws Exception {
         mRecentTasks.setOnlyTestVisibleRange();
 
@@ -567,6 +595,23 @@
     }
 
     @Test
+    public void testRemovePackageByName() throws Exception {
+        // Add a number of tasks with the same package name
+        mRecentTasks.add(createTaskBuilder("com.android.pkg1", ".Task1").build());
+        mRecentTasks.add(createTaskBuilder("com.android.pkg2", ".Task2").build());
+        mRecentTasks.add(createTaskBuilder("com.android.pkg3", ".Task3").build());
+        mRecentTasks.add(createTaskBuilder("com.android.pkg1", ".Task4").build());
+        mRecentTasks.removeTasksByPackageName("com.android.pkg1", TEST_USER_0_ID);
+
+        final ArrayList<TaskRecord> tasks = mRecentTasks.getRawTasks();
+        for (int i = 0; i < tasks.size(); i++) {
+            if (tasks.get(i).intent.getComponent().getPackageName().equals("com.android.pkg1")) {
+                fail("Expected com.android.pkg1 tasks to be removed");
+            }
+        }
+    }
+
+    @Test
     public void testNotRecentsComponent_denyApiAccess() throws Exception {
         doReturn(PackageManager.PERMISSION_DENIED).when(mService).checkPermission(anyString(),
                 anyInt(), anyInt());
@@ -649,7 +694,9 @@
         assertSecurityException(expectCallable, () -> mService.cancelTaskWindowTransition(0));
         assertSecurityException(expectCallable, () -> mService.startRecentsActivity(null, null,
                 null));
-        assertSecurityException(expectCallable, () -> mService.cancelRecentsAnimation());
+        assertSecurityException(expectCallable, () -> mService.cancelRecentsAnimation(true));
+        assertSecurityException(expectCallable, () -> mService.stopAppSwitches());
+        assertSecurityException(expectCallable, () -> mService.resumeAppSwitches());
     }
 
     private void testGetTasksApis(boolean expectCallable) {
@@ -665,8 +712,12 @@
     }
 
     private TaskBuilder createTaskBuilder(String className) {
+        return createTaskBuilder(mContext.getPackageName(), className);
+    }
+
+    private TaskBuilder createTaskBuilder(String packageName, String className) {
         return new TaskBuilder(mService.mStackSupervisor)
-                .setComponent(new ComponentName(mContext.getPackageName(), className))
+                .setComponent(new ComponentName(packageName, className))
                 .setStack(mStack)
                 .setTaskId(LAST_TASK_ID++)
                 .setUserId(TEST_USER_0_ID);
diff --git a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
index 3c10b03..cc4f519 100644
--- a/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/UserControllerTest.java
@@ -49,6 +49,7 @@
 import java.util.Set;
 
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
 import static com.android.server.am.UserController.CONTINUE_USER_SWITCH_MSG;
 import static com.android.server.am.UserController.REPORT_LOCKED_BOOT_COMPLETE_MSG;
 import static com.android.server.am.UserController.REPORT_USER_SWITCH_COMPLETE_MSG;
@@ -102,13 +103,15 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mInjector = Mockito.spy(new TestInjector(getContext()));
-        doNothing().when(mInjector).clearAllLockedTasks(anyString());
-        doNothing().when(mInjector).startHomeActivity(anyInt(), anyString());
-        doReturn(false).when(mInjector).stackSupervisorSwitchUser(anyInt(), any());
-        doNothing().when(mInjector).stackSupervisorResumeFocusedStackTopActivity();
-        mUserController = new UserController(mInjector);
-        setUpUser(TEST_USER_ID, 0);
+        runWithDexmakerShareClassLoader(() -> {
+            mInjector = Mockito.spy(new TestInjector(getContext()));
+            doNothing().when(mInjector).clearAllLockedTasks(anyString());
+            doNothing().when(mInjector).startHomeActivity(anyInt(), anyString());
+            doReturn(false).when(mInjector).stackSupervisorSwitchUser(anyInt(), any());
+            doNothing().when(mInjector).stackSupervisorResumeFocusedStackTopActivity();
+            mUserController = new UserController(mInjector);
+            setUpUser(TEST_USER_ID, 0);
+        });
     }
 
     @Override
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
index f740654..e4e9701 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/SystemUpdatePolicyTest.java
@@ -24,7 +24,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.app.admin.FreezeInterval;
+import android.app.admin.FreezePeriod;
 import android.app.admin.SystemUpdatePolicy;
 import android.os.Parcel;
 import android.support.test.runner.AndroidJUnit4;
@@ -42,15 +42,15 @@
 import java.io.ByteArrayOutputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
-import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.time.MonthDay;
 import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+
 /**
  * Unit tests for {@link android.app.admin.SystemUpdatePolicy}.
  * Throughout this test, we use "MM-DD" format to denote dates without year.
@@ -224,36 +224,36 @@
 
     @Test
     public void testDistanceWithoutLeapYear() {
-        assertEquals(364, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(364, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 12, 31), LocalDate.of(2016, 1, 1)));
-        assertEquals(365, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2017, 1, 1), LocalDate.of(2016, 1, 1)));
-        assertEquals(365, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2017, 2, 28), LocalDate.of(2016, 2, 29)));
-        assertEquals(-365, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(-365, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 1, 1), LocalDate.of(2017, 1, 1)));
-        assertEquals(1, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(1, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 29)));
-        assertEquals(1, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(1, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 3, 1), LocalDate.of(2016, 2, 28)));
-        assertEquals(0, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(0, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 2, 29), LocalDate.of(2016, 2, 28)));
-        assertEquals(0, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(0, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 2, 28), LocalDate.of(2016, 2, 28)));
 
-        assertEquals(59, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(59, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2016, 3, 1), LocalDate.of(2016, 1, 1)));
-        assertEquals(59, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(59, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2017, 3, 1), LocalDate.of(2017, 1, 1)));
 
-        assertEquals(365 * 40, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365 * 40, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2040, 1, 1), LocalDate.of(2000, 1, 1)));
 
-        assertEquals(365 * 2, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2019, 3, 1), LocalDate.of(2017, 3, 1)));
-        assertEquals(365 * 2, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2018, 3, 1), LocalDate.of(2016, 3, 1)));
-        assertEquals(365 * 2, FreezeInterval.distanceWithoutLeapYear(
+        assertEquals(365 * 2, FreezePeriod.distanceWithoutLeapYear(
                 LocalDate.of(2017, 3, 1), LocalDate.of(2015, 3, 1)));
 
     }
@@ -386,10 +386,10 @@
 
         // Two freeze periods
         p = SystemUpdatePolicy.createAutomaticInstallPolicy();
-        setFreezePeriods(p, "05-01", "06-01", "11-01", "01-29");
-        // automatic policy for July, August, September and October
+        setFreezePeriods(p, "05-01", "06-01", "10-15", "01-10");
+        // automatic policy for July, August, September and October until 15th
         assertInstallationOption(
-                SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC, TimeUnit.DAYS.toMillis(92),
+                SystemUpdatePolicy.TYPE_INSTALL_AUTOMATIC, TimeUnit.DAYS.toMillis(31 + 30 + 14),
                 millis_2018_08_01, p);
     }
 
@@ -435,18 +435,18 @@
             String... dates) throws Exception {
         SystemUpdatePolicy p = SystemUpdatePolicy.createPostponeInstallPolicy();
         setFreezePeriods(p, dates);
-        p.validateAgainstPreviousFreezePeriod(parseDate(prevStart), parseDate(prevEnd),
-                parseDate(now));
+        p.validateAgainstPreviousFreezePeriod(parseLocalDate(prevStart),
+                parseLocalDate(prevEnd), parseLocalDate(now));
     }
 
     // "MM-DD" format for date
     private void setFreezePeriods(SystemUpdatePolicy policy, String... dates) throws Exception {
-        List<Pair<Integer, Integer>> periods = new ArrayList<>();
-        LocalDate lastDate = null;
+        List<FreezePeriod> periods = new ArrayList<>();
+        MonthDay lastDate = null;
         for (String date : dates) {
-            LocalDate currentDate = parseDate(date);
+            MonthDay currentDate = parseMonthDay(date);
             if (lastDate != null) {
-                periods.add(new Pair<>(lastDate.getDayOfYear(), currentDate.getDayOfYear()));
+                periods.add(new FreezePeriod(lastDate, currentDate));
                 lastDate = null;
             } else {
                 lastDate = currentDate;
@@ -457,7 +457,7 @@
     }
 
     private void testSerialization(SystemUpdatePolicy policy,
-            List<Pair<Integer, Integer>> expectedPeriods) throws Exception {
+            List<FreezePeriod> expectedPeriods) throws Exception {
         // Test parcel / unparcel
         Parcel parcel = Parcel.obtain();
         policy.writeToParcel(parcel, 0);
@@ -485,36 +485,27 @@
     }
 
     private void checkFreezePeriods(SystemUpdatePolicy policy,
-            List<Pair<Integer, Integer>> expectedPeriods) {
+            List<FreezePeriod> expectedPeriods) {
         int i = 0;
-        for (Pair<Integer, Integer> period : policy.getFreezePeriods()) {
-            assertEquals(expectedPeriods.get(i).first, period.first);
-            assertEquals(expectedPeriods.get(i).second, period.second);
+        for (FreezePeriod period : policy.getFreezePeriods()) {
+            assertEquals(expectedPeriods.get(i).getStart(), period.getStart());
+            assertEquals(expectedPeriods.get(i).getEnd(), period.getEnd());
             i++;
         }
     }
 
-    private LocalDate parseDate(String date) {
-        // Use leap year when parsing date string to handle "02-29", but force round down
-        // to Feb 28th by overriding the year to non-leap year.
-        final int year;
-        boolean monthDateOnly = false;
-        if (date.length() == 5) {
-            year = 2000;
-            monthDateOnly = true;
-        } else {
-            year = Integer.parseInt(date.substring(0, 4));
-            date = date.substring(5);
-        }
-        LocalDate result = LocalDate.of(year, Integer.parseInt(date.substring(0, 2)),
+    // MonthDay is of format MM-dd
+    private MonthDay parseMonthDay(String date) {
+        return MonthDay.of(Integer.parseInt(date.substring(0, 2)),
                 Integer.parseInt(date.substring(3, 5)));
-        if (monthDateOnly) {
-            return result.withYear(2001);
-        } else {
-            return result;
-        }
     }
 
+    // LocalDat is of format YYYY-MM-dd
+    private LocalDate parseLocalDate(String date) {
+        return parseMonthDay(date.substring(5)).atYear(Integer.parseInt(date.substring(0, 4)));
+    }
+
+
     private long toMillis(int year, int month, int day) {
         return LocalDateTime.of(year, month, day, 0, 0, 0).atZone(ZoneId.systemDefault())
                 .toInstant().toEpochMilli();
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 92cc537..45bee6e 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -30,9 +30,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.ParceledListSlice;
 import android.database.ContentObserver;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
+import android.hardware.display.AmbientBrightnessDayStats;
 import android.hardware.display.BrightnessChangeEvent;
 import android.os.BatteryManager;
 import android.os.Handler;
@@ -571,6 +573,19 @@
         assertEquals(event.batteryLevel, event2.batteryLevel, FLOAT_DELTA);
     }
 
+    @Test
+    public void testNonNullAmbientStats() {
+        // getAmbientBrightnessStats should return an empty list rather than null when
+        // tracker isn't started or hasn't collected any data.
+        ParceledListSlice<AmbientBrightnessDayStats> slice = mTracker.getAmbientBrightnessStats(0);
+        assertNotNull(slice);
+        assertTrue(slice.getList().isEmpty());
+        startTracker(mTracker);
+        slice = mTracker.getAmbientBrightnessStats(0);
+        assertNotNull(slice);
+        assertTrue(slice.getList().isEmpty());
+    }
+
     private InputStream getInputStream(String data) {
         return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
     }
diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
index 2f2afd7..ceee60c 100644
--- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java
@@ -17,12 +17,15 @@
 package com.android.server.display;
 
 import android.content.Context;
+import android.hardware.display.BrightnessConfiguration;
+import android.hardware.display.Curve;
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayViewport;
 import android.hardware.display.IVirtualDisplayCallback;
 import android.hardware.input.InputManagerInternal;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.UserHandle;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.view.SurfaceControl;
@@ -226,6 +229,62 @@
                 + " virtual display adapter");
     }
 
+    /**
+     * Tests that an exception is raised for too dark a brightness configuration.
+     */
+    public void testTooDarkBrightnessConfigurationThrowException() {
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mShortMockedInjector);
+        Curve minimumBrightnessCurve = displayManager.getMinimumBrightnessCurveInternal();
+        float[] lux = minimumBrightnessCurve.getX();
+        float[] minimumNits = minimumBrightnessCurve.getY();
+        float[] nits = new float[minimumNits.length];
+        // For every control point, assert that making it slightly lower than the minimum throws an
+        // exception.
+        for (int i = 0; i < nits.length; i++) {
+            for (int j = 0; j < nits.length; j++) {
+                nits[j] = minimumNits[j];
+                if (j == i) {
+                    nits[j] -= 0.1f;
+                }
+                if (nits[j] < 0) {
+                    nits[j] = 0;
+                }
+            }
+            BrightnessConfiguration config =
+                    new BrightnessConfiguration.Builder(lux, nits).build();
+            Exception thrown = null;
+            try {
+                displayManager.validateBrightnessConfiguration(config);
+            } catch (IllegalArgumentException e) {
+                thrown = e;
+            }
+            assertNotNull("Building too dark a brightness configuration must throw an exception");
+        }
+    }
+
+    /**
+     * Tests that no exception is raised for not too dark a brightness configuration.
+     */
+    public void testBrightEnoughBrightnessConfigurationDoesNotThrowException() {
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mShortMockedInjector);
+        Curve minimumBrightnessCurve = displayManager.getMinimumBrightnessCurveInternal();
+        float[] lux = minimumBrightnessCurve.getX();
+        float[] nits = minimumBrightnessCurve.getY();
+        BrightnessConfiguration config = new BrightnessConfiguration.Builder(lux, nits).build();
+        displayManager.validateBrightnessConfiguration(config);
+    }
+
+    /**
+     * Tests that null brightness configurations are alright.
+     */
+    public void testNullBrightnessConfiguration() {
+        DisplayManagerService displayManager =
+                new DisplayManagerService(mContext, mShortMockedInjector);
+        displayManager.validateBrightnessConfiguration(null);
+    }
+
     private void registerDefaultDisplays(DisplayManagerService displayManager) {
         Handler handler = displayManager.getDisplayHandler();
         // Would prefer to call displayManager.onStart() directly here but it performs binderService
diff --git a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index 8874894..5b59e60 100644
--- a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -23,19 +23,28 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.when;
 
 import android.app.job.JobInfo;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.pm.PackageManagerInternal;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
 import android.net.Network;
 import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
+import android.net.NetworkPolicyManager;
 import android.os.Build;
-import android.os.Handler;
 import android.os.SystemClock;
-import android.support.test.runner.AndroidJUnit4;
 import android.util.DataUnit;
 
 import com.android.server.LocalServices;
@@ -45,14 +54,26 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.time.Clock;
 import java.time.ZoneOffset;
 
-@RunWith(AndroidJUnit4.class)
+@RunWith(MockitoJUnitRunner.class)
 public class ConnectivityControllerTest {
+
+    @Mock private Context mContext;
+    @Mock private ConnectivityManager mConnManager;
+    @Mock private NetworkPolicyManager mNetPolicyManager;
+    @Mock private JobSchedulerService mService;
+
     private Constants mConstants;
 
+    private static final int UID_RED = 10001;
+    private static final int UID_BLUE = 10002;
+
     @Before
     public void setUp() throws Exception {
         // Assume all packages are current SDK
@@ -72,6 +93,19 @@
 
         // Assume default constants for now
         mConstants = new Constants();
+
+        // Get our mocks ready
+        when(mContext.getSystemServiceName(ConnectivityManager.class))
+                .thenReturn(Context.CONNECTIVITY_SERVICE);
+        when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
+                .thenReturn(mConnManager);
+        when(mContext.getSystemServiceName(NetworkPolicyManager.class))
+                .thenReturn(Context.NETWORK_POLICY_SERVICE);
+        when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
+                .thenReturn(mNetPolicyManager);
+        when(mService.getTestableContext()).thenReturn(mContext);
+        when(mService.getLock()).thenReturn(mService);
+        when(mService.getConstants()).thenReturn(mConstants);
     }
 
     @Test
@@ -155,6 +189,99 @@
         }
     }
 
+    @Test
+    public void testUpdates() throws Exception {
+        final ArgumentCaptor<NetworkCallback> callback = ArgumentCaptor
+                .forClass(NetworkCallback.class);
+        doNothing().when(mConnManager).registerNetworkCallback(any(), callback.capture());
+
+        final ConnectivityController controller = new ConnectivityController(mService);
+
+        final Network meteredNet = new Network(101);
+        final NetworkCapabilities meteredCaps = createCapabilities();
+        final Network unmeteredNet = new Network(202);
+        final NetworkCapabilities unmeteredCaps = createCapabilities()
+                .addCapability(NET_CAPABILITY_NOT_METERED);
+
+        final JobStatus red = createJobStatus(createJob()
+                .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1), 0)
+                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED), UID_RED);
+        final JobStatus blue = createJobStatus(createJob()
+                .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1), 0)
+                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY), UID_BLUE);
+
+        // Pretend we're offline when job is added
+        {
+            reset(mConnManager);
+            answerNetwork(UID_RED, null, null);
+            answerNetwork(UID_BLUE, null, null);
+
+            controller.maybeStartTrackingJobLocked(red, null);
+            controller.maybeStartTrackingJobLocked(blue, null);
+
+            assertFalse(red.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+            assertFalse(blue.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+        }
+
+        // Metered network
+        {
+            reset(mConnManager);
+            answerNetwork(UID_RED, meteredNet, meteredCaps);
+            answerNetwork(UID_BLUE, meteredNet, meteredCaps);
+
+            callback.getValue().onCapabilitiesChanged(meteredNet, meteredCaps);
+
+            assertFalse(red.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+            assertTrue(blue.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+        }
+
+        // Unmetered network background
+        {
+            reset(mConnManager);
+            answerNetwork(UID_RED, meteredNet, meteredCaps);
+            answerNetwork(UID_BLUE, meteredNet, meteredCaps);
+
+            callback.getValue().onCapabilitiesChanged(unmeteredNet, unmeteredCaps);
+
+            assertFalse(red.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+            assertTrue(blue.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+        }
+
+        // Lost metered network
+        {
+            reset(mConnManager);
+            answerNetwork(UID_RED, unmeteredNet, unmeteredCaps);
+            answerNetwork(UID_BLUE, unmeteredNet, unmeteredCaps);
+
+            callback.getValue().onLost(meteredNet);
+
+            assertTrue(red.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+            assertTrue(blue.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+        }
+
+        // Specific UID was blocked
+        {
+            reset(mConnManager);
+            answerNetwork(UID_RED, null, null);
+            answerNetwork(UID_BLUE, unmeteredNet, unmeteredCaps);
+
+            callback.getValue().onCapabilitiesChanged(unmeteredNet, unmeteredCaps);
+
+            assertFalse(red.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+            assertTrue(blue.isConstraintSatisfied(JobStatus.CONSTRAINT_CONNECTIVITY));
+        }
+    }
+
+    private void answerNetwork(int uid, Network net, NetworkCapabilities caps) {
+        when(mConnManager.getActiveNetworkForUid(eq(uid))).thenReturn(net);
+        when(mConnManager.getNetworkCapabilities(eq(net))).thenReturn(caps);
+        if (net != null) {
+            final NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0, null, null);
+            ni.setDetailedState(DetailedState.CONNECTED, null, null);
+            when(mConnManager.getNetworkInfoForUid(eq(net), eq(uid), anyBoolean())).thenReturn(ni);
+        }
+    }
+
     private static NetworkCapabilities createCapabilities() {
         return new NetworkCapabilities().addCapability(NET_CAPABILITY_INTERNET)
                 .addCapability(NET_CAPABILITY_VALIDATED);
@@ -165,12 +292,22 @@
     }
 
     private static JobStatus createJobStatus(JobInfo.Builder job) {
-        return createJobStatus(job, 0, Long.MAX_VALUE);
+        return createJobStatus(job, android.os.Process.NOBODY_UID, 0, Long.MAX_VALUE);
     }
 
-    private static JobStatus createJobStatus(JobInfo.Builder job, long earliestRunTimeElapsedMillis,
-            long latestRunTimeElapsedMillis) {
-        return new JobStatus(job.build(), 0, null, -1, 0, 0, null, earliestRunTimeElapsedMillis,
-                latestRunTimeElapsedMillis, 0, 0, null, 0);
+    private static JobStatus createJobStatus(JobInfo.Builder job, int uid) {
+        return createJobStatus(job, uid, 0, Long.MAX_VALUE);
+    }
+
+    private static JobStatus createJobStatus(JobInfo.Builder job,
+            long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis) {
+        return createJobStatus(job, android.os.Process.NOBODY_UID,
+                earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis);
+    }
+
+    private static JobStatus createJobStatus(JobInfo.Builder job, int uid,
+            long earliestRunTimeElapsedMillis, long latestRunTimeElapsedMillis) {
+        return new JobStatus(job.build(), uid, null, -1, 0, 0, null,
+                earliestRunTimeElapsedMillis, latestRunTimeElapsedMillis, 0, 0, null, 0);
     }
 }
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
index 7ce5904..0e5b7b3 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java
@@ -17,11 +17,9 @@
 package com.android.server.locksettings.recoverablekeystore;
 
 import static android.security.keystore.recovery.KeyChainProtectionParams.TYPE_LOCKSCREEN;
-
 import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PASSWORD;
 import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PATTERN;
 import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PIN;
-
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD;
 import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTERN;
 
@@ -50,6 +48,7 @@
 import android.security.keystore.recovery.KeyChainSnapshot;
 import android.security.keystore.recovery.KeyDerivationParams;
 import android.security.keystore.recovery.RecoveryController;
+import android.security.keystore.recovery.TrustedRootCertificates;
 import android.security.keystore.recovery.WrappedApplicationKey;
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
@@ -101,6 +100,7 @@
     @Mock private PlatformKeyManager mPlatformKeyManager;
     @Mock private RecoverySnapshotListenersStorage mSnapshotListenersStorage;
     @Spy private TestOnlyInsecureCertificateHelper mTestOnlyInsecureCertificateHelper;
+    @Spy private MockScrypt mMockScrypt;
 
     private RecoverySnapshotStorage mRecoverySnapshotStorage;
     private RecoverableKeyStoreDb mRecoverableKeyStoreDb;
@@ -138,7 +138,8 @@
                 TEST_CREDENTIAL,
                 /*credentialUpdated=*/ false,
                 mPlatformKeyManager,
-                mTestOnlyInsecureCertificateHelper);
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
 
         mWrappingKey = generateAndroidKeyStoreKey();
         mEncryptKey = new PlatformEncryptionKey(TEST_GENERATION_ID, mWrappingKey);
@@ -172,41 +173,41 @@
     }
 
     @Test
-    public void hashCredentials_returnsSameHashForSameCredentialsAndSalt() {
+    public void hashCredentialsBySaltedSha256_returnsSameHashForSameCredentialsAndSalt() {
         String credentials = "password1234";
         byte[] salt = randomBytes(16);
 
         assertArrayEquals(
-                KeySyncTask.hashCredentials(salt, credentials),
-                KeySyncTask.hashCredentials(salt, credentials));
+                KeySyncTask.hashCredentialsBySaltedSha256(salt, credentials),
+                KeySyncTask.hashCredentialsBySaltedSha256(salt, credentials));
     }
 
     @Test
-    public void hashCredentials_returnsDifferentHashForDifferentCredentials() {
+    public void hashCredentialsBySaltedSha256_returnsDifferentHashForDifferentCredentials() {
         byte[] salt = randomBytes(16);
 
         assertFalse(
                 Arrays.equals(
-                    KeySyncTask.hashCredentials(salt, "password1234"),
-                    KeySyncTask.hashCredentials(salt, "password12345")));
+                    KeySyncTask.hashCredentialsBySaltedSha256(salt, "password1234"),
+                    KeySyncTask.hashCredentialsBySaltedSha256(salt, "password12345")));
     }
 
     @Test
-    public void hashCredentials_returnsDifferentHashForDifferentSalt() {
+    public void hashCredentialsBySaltedSha256_returnsDifferentHashForDifferentSalt() {
         String credentials = "wowmuch";
 
         assertFalse(
                 Arrays.equals(
-                        KeySyncTask.hashCredentials(randomBytes(64), credentials),
-                        KeySyncTask.hashCredentials(randomBytes(64), credentials)));
+                        KeySyncTask.hashCredentialsBySaltedSha256(randomBytes(64), credentials),
+                        KeySyncTask.hashCredentialsBySaltedSha256(randomBytes(64), credentials)));
     }
 
     @Test
-    public void hashCredentials_returnsDifferentHashEvenIfConcatIsSame() {
+    public void hashCredentialsBySaltedSha256_returnsDifferentHashEvenIfConcatIsSame() {
         assertFalse(
                 Arrays.equals(
-                        KeySyncTask.hashCredentials(utf8Bytes("123"), "4567"),
-                        KeySyncTask.hashCredentials(utf8Bytes("1234"), "567")));
+                        KeySyncTask.hashCredentialsBySaltedSha256(utf8Bytes("123"), "4567"),
+                        KeySyncTask.hashCredentialsBySaltedSha256(utf8Bytes("1234"), "567")));
     }
 
     @Test
@@ -277,6 +278,155 @@
     }
 
     @Test
+    public void run_useScryptToHashLongPasswordInTestMode() throws Exception {
+        String longPassword = TrustedRootCertificates.INSECURE_PASSWORD_PREFIX + "0123456789";
+        String appKeyAlias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "alias";
+        mKeySyncTask = new KeySyncTask(
+                mRecoverableKeyStoreDb,
+                mRecoverySnapshotStorage,
+                mSnapshotListenersStorage,
+                TEST_USER_ID,
+                CREDENTIAL_TYPE_PASSWORD,
+                /*credential=*/ longPassword,
+                /*credentialUpdated=*/ false,
+                mPlatformKeyManager,
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
+        mRecoverableKeyStoreDb.setServerParams(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+        mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+        mRecoverableKeyStoreDb.setActiveRootOfTrust(TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+                TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS);
+        mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+                TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS,
+                TestData.getInsecureCertPathForEndpoint1());
+        addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, appKeyAlias);
+
+        mKeySyncTask.run();
+
+        KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
+                isEqualTo(UI_FORMAT_PASSWORD);
+        verify(mMockScrypt).scrypt(eq(longPassword.getBytes()), any(),
+                eq(KeySyncTask.SCRYPT_PARAM_N), eq(KeySyncTask.SCRYPT_PARAM_R),
+                eq(KeySyncTask.SCRYPT_PARAM_P), eq(KeySyncTask.SCRYPT_PARAM_OUTLEN_BYTES));
+        KeyDerivationParams keyDerivationParams =
+                keyChainSnapshot.getKeyChainProtectionParams().get(0).getKeyDerivationParams();
+        assertThat(keyDerivationParams.getAlgorithm()).isEqualTo(
+                KeyDerivationParams.ALGORITHM_SCRYPT);
+        assertThat(keyDerivationParams.getMemoryDifficulty()).isEqualTo(KeySyncTask.SCRYPT_PARAM_N);
+    }
+
+    @Test
+    public void run_useSha256ToHashShortPasswordInTestMode() throws Exception {
+        String shortPassword = TrustedRootCertificates.INSECURE_PASSWORD_PREFIX + "012345678";
+        String appKeyAlias = TrustedRootCertificates.INSECURE_KEY_ALIAS_PREFIX + "alias";
+        mKeySyncTask = new KeySyncTask(
+                mRecoverableKeyStoreDb,
+                mRecoverySnapshotStorage,
+                mSnapshotListenersStorage,
+                TEST_USER_ID,
+                CREDENTIAL_TYPE_PASSWORD,
+                /*credential=*/ shortPassword,
+                /*credentialUpdated=*/ false,
+                mPlatformKeyManager,
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
+        mRecoverableKeyStoreDb.setServerParams(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+        mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+        mRecoverableKeyStoreDb.setActiveRootOfTrust(TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+                TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS);
+        mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID,
+                TrustedRootCertificates.TEST_ONLY_INSECURE_CERTIFICATE_ALIAS,
+                TestData.getInsecureCertPathForEndpoint1());
+        addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, appKeyAlias);
+
+        mKeySyncTask.run();
+
+        KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
+                isEqualTo(UI_FORMAT_PASSWORD);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
+        KeyDerivationParams keyDerivationParams =
+                keyChainSnapshot.getKeyChainProtectionParams().get(0).getKeyDerivationParams();
+        assertThat(keyDerivationParams.getAlgorithm()).isEqualTo(
+                KeyDerivationParams.ALGORITHM_SHA256);
+    }
+
+    @Test
+    public void run_useSha256ToHashShortPasswordInProdMode() throws Exception {
+        String shortPassword = "01234567890123456789abc";  // 23 chars
+        mKeySyncTask = new KeySyncTask(
+                mRecoverableKeyStoreDb,
+                mRecoverySnapshotStorage,
+                mSnapshotListenersStorage,
+                TEST_USER_ID,
+                CREDENTIAL_TYPE_PASSWORD,
+                /*credential=*/ shortPassword,
+                /*credentialUpdated=*/ false,
+                mPlatformKeyManager,
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
+        mRecoverableKeyStoreDb.setServerParams(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+        mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+        addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+        mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+
+        mKeySyncTask.run();
+
+        KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
+                isEqualTo(UI_FORMAT_PASSWORD);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
+        KeyDerivationParams keyDerivationParams =
+                keyChainSnapshot.getKeyChainProtectionParams().get(0).getKeyDerivationParams();
+        assertThat(keyDerivationParams.getAlgorithm()).isEqualTo(
+                KeyDerivationParams.ALGORITHM_SHA256);
+    }
+
+    @Test
+    public void run_useSha256ToHashLongPasswordInProdMode() throws Exception {
+        String longPassword = "01234567890123456789abcd";  // 24 chars
+        mKeySyncTask = new KeySyncTask(
+                mRecoverableKeyStoreDb,
+                mRecoverySnapshotStorage,
+                mSnapshotListenersStorage,
+                TEST_USER_ID,
+                CREDENTIAL_TYPE_PASSWORD,
+                /*credential=*/ longPassword,
+                /*credentialUpdated=*/ false,
+                mPlatformKeyManager,
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
+        mRecoverableKeyStoreDb.setServerParams(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_VAULT_HANDLE);
+        mRecoverableKeyStoreDb.setPlatformKeyGenerationId(TEST_USER_ID, TEST_GENERATION_ID);
+        addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
+        mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
+                TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
+
+        mKeySyncTask.run();
+
+        KeyChainSnapshot keyChainSnapshot = mRecoverySnapshotStorage.get(TEST_RECOVERY_AGENT_UID);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
+        assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
+                isEqualTo(UI_FORMAT_PASSWORD);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
+        KeyDerivationParams keyDerivationParams =
+                keyChainSnapshot.getKeyChainProtectionParams().get(0).getKeyDerivationParams();
+        assertThat(keyDerivationParams.getAlgorithm()).isEqualTo(
+                KeyDerivationParams.ALGORITHM_SHA256);
+    }
+
+    @Test
     public void run_stillCreatesSnapshotIfNoRecoveryAgentPendingIntentRegistered()
             throws Exception {
         mRecoverableKeyStoreDb.setServerParams(
@@ -319,6 +469,7 @@
         assertNotNull(keyChainSnapshot); // created snapshot
         List<WrappedApplicationKey> applicationKeys = keyChainSnapshot.getWrappedApplicationKeys();
         assertThat(applicationKeys).hasSize(0); // non whitelisted key is not included
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -341,6 +492,7 @@
                 .getDefaultCertificateAliasIfEmpty(eq(TEST_ROOT_CERT_ALIAS));
         verify(mTestOnlyInsecureCertificateHelper)
                 .doesCredentialSupportInsecureMode(anyInt(), any());
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -404,7 +556,7 @@
         assertThat(keyDerivationParams.getAlgorithm()).isEqualTo(
                 KeyDerivationParams.ALGORITHM_SHA256);
         verify(mSnapshotListenersStorage).recoverySnapshotAvailable(TEST_RECOVERY_AGENT_UID);
-        byte[] lockScreenHash = KeySyncTask.hashCredentials(
+        byte[] lockScreenHash = KeySyncTask.hashCredentialsBySaltedSha256(
                 keyDerivationParams.getSalt(),
                 TEST_CREDENTIAL);
         Long counterId = mRecoverableKeyStoreDb.getCounterId(TEST_USER_ID, TEST_RECOVERY_AGENT_UID);
@@ -501,7 +653,8 @@
                 "password",
                 /*credentialUpdated=*/ false,
                 mPlatformKeyManager,
-                mTestOnlyInsecureCertificateHelper);
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
 
         mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
                 TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
@@ -515,9 +668,10 @@
         assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
         assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
                 isEqualTo(UI_FORMAT_PASSWORD);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
-   @Test
+    @Test
     public void run_setsCorrectTypeForPin() throws Exception {
         mKeySyncTask = new KeySyncTask(
                 mRecoverableKeyStoreDb,
@@ -528,7 +682,8 @@
                 /*credential=*/ "1234",
                 /*credentialUpdated=*/ false,
                 mPlatformKeyManager,
-                mTestOnlyInsecureCertificateHelper);
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
 
         mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
                 TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
@@ -543,6 +698,7 @@
         // Password with only digits is changed to pin.
         assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
                 isEqualTo(UI_FORMAT_PIN);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -556,7 +712,8 @@
                 "12345",
                 /*credentialUpdated=*/ false,
                 mPlatformKeyManager,
-                mTestOnlyInsecureCertificateHelper);
+                mTestOnlyInsecureCertificateHelper,
+                mMockScrypt);
 
         mRecoverableKeyStoreDb.setRecoveryServiceCertPath(
                 TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_ROOT_CERT_ALIAS, TestData.CERT_PATH_1);
@@ -570,6 +727,7 @@
         assertThat(keyChainSnapshot.getKeyChainProtectionParams()).hasSize(1);
         assertThat(keyChainSnapshot.getKeyChainProtectionParams().get(0).getLockScreenUiFormat()).
                 isEqualTo(UI_FORMAT_PATTERN);
+        verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -638,7 +796,8 @@
           "12345",
           /*credentialUpdated=*/ false,
           mPlatformKeyManager,
-          mTestOnlyInsecureCertificateHelper);
+          mTestOnlyInsecureCertificateHelper,
+          mMockScrypt);
 
       addApplicationKey(TEST_USER_ID, TEST_RECOVERY_AGENT_UID, TEST_APP_KEY_ALIAS);
 
@@ -654,6 +813,7 @@
           .getStatusForAllKeys(TEST_RECOVERY_AGENT_UID)
           .get(TEST_APP_KEY_ALIAS);
       assertEquals(RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE, status);
+      verify(mMockScrypt, never()).scrypt(any(), any(), anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     private SecretKey addApplicationKey(int userId, int recoveryAgentUid, String alias)
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/MockScrypt.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/MockScrypt.java
new file mode 100644
index 0000000..e736e25
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/MockScrypt.java
@@ -0,0 +1,53 @@
+/*
+ * 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.locksettings.recoverablekeystore;
+
+import static org.junit.Assert.assertEquals;
+
+import android.security.Scrypt;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class MockScrypt extends Scrypt {
+
+    @Override
+    public byte[] scrypt(byte[] password, byte[] salt, int n, int r, int p, int outLen) {
+        assertEquals(32, outLen);
+
+        ByteBuffer byteBuffer = ByteBuffer.allocate(
+                password.length + salt.length + Integer.BYTES * 6);
+        byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
+        byteBuffer.putInt(password.length);
+        byteBuffer.put(password);
+        byteBuffer.putInt(salt.length);
+        byteBuffer.put(salt);
+        byteBuffer.putInt(n);
+        byteBuffer.putInt(r);
+        byteBuffer.putInt(p);
+        byteBuffer.putInt(outLen);
+
+        try {
+            return MessageDigest.getInstance("SHA-256").digest(byteBuffer.array());
+        } catch (NoSuchAlgorithmException e) {
+            // Should never happen
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index f0d799f..db910f2 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -19,6 +19,7 @@
 import static android.security.keystore.recovery.KeyChainProtectionParams.TYPE_LOCKSCREEN;
 import static android.security.keystore.recovery.KeyChainProtectionParams.UI_FORMAT_PASSWORD;
 import static android.security.keystore.recovery.RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT;
+import static android.security.keystore.recovery.RecoveryController.ERROR_DOWNGRADE_CERTIFICATE;
 import static android.security.keystore.recovery.RecoveryController.ERROR_INVALID_CERTIFICATE;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -222,7 +223,6 @@
 
         assertThat(mRecoverableKeyStoreDb.getKey(uid, TEST_ALIAS)).isNotNull();
         assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isTrue();
-        // TODO(76083050) Test the grant mechanism for the keys.
     }
 
     @Test
@@ -409,19 +409,20 @@
     }
 
     @Test
-    public void initRecoveryService_ignoresSmallerSerial() throws Exception {
+    public void initRecoveryService_throwsExceptionOnSmallerSerial() throws Exception {
         int uid = Binder.getCallingUid();
         int userId = UserHandle.getCallingUserId();
         long certSerial = 1000L;
 
         mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
                 TestData.getCertXmlWithSerial(certSerial));
-        mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
-                TestData.getCertXmlWithSerial(certSerial - 1));
-
-        assertThat(mRecoverableKeyStoreDb.getRecoveryServiceCertSerial(userId, uid,
-                DEFAULT_ROOT_CERT_ALIAS)).isEqualTo(certSerial);
-        assertThat(mRecoverableKeyStoreDb.getShouldCreateSnapshot(userId, uid)).isFalse();
+        try {
+            mRecoverableKeyStoreManager.initRecoveryService(ROOT_CERTIFICATE_ALIAS,
+                    TestData.getCertXmlWithSerial(certSerial - 1));
+            fail();
+        } catch (ServiceSpecificException e) {
+            assertThat(e.errorCode).isEqualTo(ERROR_DOWNGRADE_CERTIFICATE);
+        }
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
index 654acc2..678f018 100644
--- a/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
+++ b/services/tests/servicestests/src/com/android/server/net/watchlist/WatchlistConfigTests.java
@@ -19,6 +19,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNull;
 
 import android.content.Context;
 import android.support.test.InstrumentationRegistry;
@@ -114,13 +115,19 @@
     }
 
     @Test
-    public void testWatchlistConfig_getWatchlistConfigHash() throws Exception {
+    public void testWatchlistConfig_getWatchlistConfigHash_hasConfig() throws Exception {
         copyWatchlistConfigXml(mContext, TEST_XML_1, mTestXmlFile);
         WatchlistConfig config = new WatchlistConfig(mTestXmlFile);
         assertEquals(TEST_XML_1_HASH, HexDump.toHexString(config.getWatchlistConfigHash()));
     }
 
     @Test
+    public void testWatchlistConfig_getWatchlistConfigHash_withoutConfig() throws Exception {
+        WatchlistConfig config = new WatchlistConfig(mTestXmlFile);
+        assertNull(config.getWatchlistConfigHash());
+    }
+
+    @Test
     public void testWatchlistConfig_testDumpDoesNotCrash() throws Exception {
         WatchlistConfig config = new WatchlistConfig(new File("/not_exist_path.xml"));
         ByteArrayOutputStream bs = new ByteArrayOutputStream(2048);
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 1974750..ee83b62 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -92,6 +92,8 @@
 
 import org.junit.Assert;
 import org.mockito.ArgumentCaptor;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
@@ -111,6 +113,7 @@
 import java.util.function.BiFunction;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
+import java.util.function.Function;
 
 public abstract class BaseShortcutManagerTest extends InstrumentationTestCase {
     protected static final String TAG = "ShortcutManagerTest";
@@ -834,6 +837,8 @@
                             + targetUserId);
                 });
 
+        when(mMockUserManager.getUserInfo(anyInt())).thenAnswer(new AnswerWithSystemCheck<>(
+                inv -> mUserInfos.get((Integer) inv.getArguments()[0])));
         when(mMockActivityManagerInternal.getUidProcessState(anyInt())).thenReturn(
                 ActivityManager.PROCESS_STATE_CACHED_EMPTY);
 
@@ -863,6 +868,24 @@
         }
     }
 
+    /**
+     * Returns a boolean but also checks if the current UID is SYSTEM_UID.
+     */
+    protected class AnswerWithSystemCheck<T> implements Answer<T> {
+        private final Function<InvocationOnMock, T> mChecker;
+
+        public AnswerWithSystemCheck(Function<InvocationOnMock, T> checker) {
+            mChecker = checker;
+        }
+
+        @Override
+        public T answer(InvocationOnMock invocation) throws Throwable {
+            assertEquals("Must be called on SYSTEM UID.",
+                    Process.SYSTEM_UID, mInjectedCallingUid);
+            return mChecker.apply(invocation);
+        }
+    }
+
     private static boolean b(Boolean value) {
         return (value != null && value);
     }
@@ -1014,7 +1037,7 @@
         pi.applicationInfo.flags = ApplicationInfo.FLAG_INSTALLED
                 | ApplicationInfo.FLAG_ALLOW_BACKUP;
         pi.versionCode = version;
-        pi.applicationInfo.versionCode = version;
+        pi.applicationInfo.setVersionCode(version);
         pi.signatures = null;
         pi.signingCertificateHistory = new Signature[][] {genSignatures(signatures)};
 
@@ -1032,7 +1055,7 @@
     protected void updatePackageVersion(String packageName, int increment) {
         updatePackageInfo(packageName, pi -> {
             pi.versionCode += increment;
-            pi.applicationInfo.versionCode += increment;
+            pi.applicationInfo.setVersionCode(pi.applicationInfo.longVersionCode + increment);
         });
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index ebb4248..97ff94f 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -199,13 +199,13 @@
                 PACKAGE_NAME_1, 1L, 0.01, true, "appString1");
         final PersistableBundle launcherExtras1 = getPersistableBundle(
                 PACKAGE_NAME_1, 10L, 0.1, false, "launcherString1");
-        ps1.setSuspended(true, "suspendingPackage1", appExtras1, launcherExtras1, 0);
+        ps1.setSuspended(true, "suspendingPackage1", "dialogMsg1", appExtras1, launcherExtras1, 0);
         settingsUnderTest.mPackages.put(PACKAGE_NAME_1, ps1);
 
-        ps2.setSuspended(true, "suspendingPackage2", null, null, 0);
+        ps2.setSuspended(true, "suspendingPackage2", "dialogMsg2", null, null, 0);
         settingsUnderTest.mPackages.put(PACKAGE_NAME_2, ps2);
 
-        ps3.setSuspended(false, "irrelevant", null, null, 0);
+        ps3.setSuspended(false, "irrelevant", "irrevelant2", null, null, 0);
         settingsUnderTest.mPackages.put(PACKAGE_NAME_3, ps3);
 
         settingsUnderTest.writePackageRestrictionsLPr(0);
@@ -220,6 +220,7 @@
                 readUserState(0);
         assertThat(readPus1.suspended, is(true));
         assertThat(readPus1.suspendingPackage, equalTo("suspendingPackage1"));
+        assertThat(readPus1.dialogMessage, equalTo("dialogMsg1"));
         assertThat(BaseBundle.kindofEquals(readPus1.suspendedAppExtras, appExtras1), is(true));
         assertThat(BaseBundle.kindofEquals(readPus1.suspendedLauncherExtras, launcherExtras1),
                 is(true));
@@ -228,12 +229,17 @@
                 readUserState(0);
         assertThat(readPus2.suspended, is(true));
         assertThat(readPus2.suspendingPackage, equalTo("suspendingPackage2"));
+        assertThat(readPus2.dialogMessage, equalTo("dialogMsg2"));
         assertThat(readPus2.suspendedAppExtras, is(nullValue()));
         assertThat(readPus2.suspendedLauncherExtras, is(nullValue()));
 
         final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3).
                 readUserState(0);
         assertThat(readPus3.suspended, is(false));
+        assertThat(readPus3.suspendingPackage, is(nullValue()));
+        assertThat(readPus3.dialogMessage, is(nullValue()));
+        assertThat(readPus3.suspendedAppExtras, is(nullValue()));
+        assertThat(readPus3.suspendedLauncherExtras, is(nullValue()));
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
index 4e1418c..2a4ea8c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java
@@ -184,30 +184,40 @@
         launcherExtras2.putString("name", "launcherExtras2");
         final String suspendingPackage1 = "package1";
         final String suspendingPackage2 = "package2";
+        final String dialogMessage1 = "dialogMessage1";
+        final String dialogMessage2 = "dialogMessage2";
 
         final PackageUserState testUserState1 = new PackageUserState();
         testUserState1.suspended = true;
         testUserState1.suspendedAppExtras = appExtras1;
         testUserState1.suspendedLauncherExtras = launcherExtras1;
         testUserState1.suspendingPackage = suspendingPackage1;
+        testUserState1.dialogMessage = dialogMessage1;
 
-        final PackageUserState testUserState2 = new PackageUserState(testUserState1);
+        PackageUserState testUserState2 = new PackageUserState(testUserState1);
         assertThat(testUserState1.equals(testUserState2), is(true));
         testUserState2.suspendingPackage = suspendingPackage2;
         assertThat(testUserState1.equals(testUserState2), is(false));
 
-        testUserState2.suspendingPackage = testUserState1.suspendingPackage;
+        testUserState2 = new PackageUserState(testUserState1);
         testUserState2.suspendedAppExtras = appExtras2;
         assertThat(testUserState1.equals(testUserState2), is(false));
 
-        testUserState2.suspendedAppExtras = testUserState1.suspendedAppExtras;
+        testUserState2 = new PackageUserState(testUserState1);
         testUserState2.suspendedLauncherExtras = launcherExtras2;
         assertThat(testUserState1.equals(testUserState2), is(false));
 
-        // Everything is different but irrelevant if suspended is false
+        testUserState2 = new PackageUserState(testUserState1);
+        testUserState2.dialogMessage = dialogMessage2;
+        assertThat(testUserState1.equals(testUserState2), is(false));
+
+        testUserState2 = new PackageUserState(testUserState1);
         testUserState2.suspended = testUserState1.suspended = false;
-        testUserState2.suspendedAppExtras = appExtras2;
+        // Everything is different but irrelevant if suspended is false
         testUserState2.suspendingPackage = suspendingPackage2;
+        testUserState2.dialogMessage = dialogMessage2;
+        testUserState2.suspendedAppExtras = appExtras2;
+        testUserState2.suspendedLauncherExtras = launcherExtras2;
         assertThat(testUserState1.equals(testUserState2), is(true));
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
index 43a439b..084f7e5 100644
--- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import android.app.AppGlobals;
 import android.content.BroadcastReceiver;
@@ -41,8 +42,15 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.LargeTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
 import android.util.Log;
+import android.view.IWindowManager;
+import android.view.WindowManagerGlobal;
 
+import com.android.servicestests.apps.suspendtestapp.SuspendTestActivity;
 import com.android.servicestests.apps.suspendtestapp.SuspendTestReceiver;
 
 import org.junit.After;
@@ -68,14 +76,25 @@
             INSTRUMENTATION_PACKAGE + ".action.REPORT_MY_PACKAGE_SUSPENDED";
     public static final String ACTION_REPORT_MY_PACKAGE_UNSUSPENDED =
             INSTRUMENTATION_PACKAGE + ".action.REPORT_MY_PACKAGE_UNSUSPENDED";
+    public static final String ACTION_REPORT_TEST_ACTIVITY_STARTED =
+            INSTRUMENTATION_PACKAGE + ".action.REPORT_TEST_ACTIVITY_STARTED";
+    public static final String ACTION_REPORT_TEST_ACTIVITY_STOPPED =
+            INSTRUMENTATION_PACKAGE + ".action.REPORT_TEST_ACTIVITY_STOPPED";
+    public static final String ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED =
+            INSTRUMENTATION_PACKAGE + ".action.REPORT_MORE_DETAILS_ACTIVITY_STARTED";
+    public static final String ACTION_FINISH_TEST_ACTIVITY =
+            INSTRUMENTATION_PACKAGE + ".action.FINISH_TEST_ACTIVITY";
+    public static final String EXTRA_RECEIVED_PACKAGE_NAME =
+            SuspendPackagesTest.INSTRUMENTATION_PACKAGE + ".extra.RECEIVED_PACKAGE_NAME";
+
 
     private Context mContext;
     private PackageManager mPackageManager;
     private LauncherApps mLauncherApps;
     private Handler mReceiverHandler;
-    private ComponentName mTestReceiverComponent;
     private AppCommunicationReceiver mAppCommsReceiver;
     private StubbedCallback mTestCallback;
+    private UiDevice mUiDevice;
 
     private static final class AppCommunicationReceiver extends BroadcastReceiver {
         private Context context;
@@ -86,11 +105,12 @@
             this.context = context;
         }
 
-        void register(Handler handler) {
+        void register(Handler handler, String... actions) {
             registered = true;
             final IntentFilter intentFilter = new IntentFilter();
-            intentFilter.addAction(ACTION_REPORT_MY_PACKAGE_SUSPENDED);
-            intentFilter.addAction(ACTION_REPORT_MY_PACKAGE_UNSUSPENDED);
+            for (String action : actions) {
+                intentFilter.addAction(action);
+            }
             context.registerReceiver(this, intentFilter, null, handler);
         }
 
@@ -110,19 +130,28 @@
             }
         }
 
-        Intent receiveIntentFromApp() {
+        Intent pollForIntent(long secondsToWait) {
             if (!registered) {
                 throw new IllegalStateException("Receiver not registered");
             }
             final Intent intent;
             try {
-                intent = intentQueue.poll(5, TimeUnit.SECONDS);
+                intent = intentQueue.poll(secondsToWait, TimeUnit.SECONDS);
             } catch (InterruptedException ie) {
                 throw new RuntimeException("Interrupted while waiting for app broadcast", ie);
             }
-            assertNotNull("No intent received from app within 5 seconds", intent);
             return intent;
         }
+
+        void drainPendingBroadcasts() {
+            while (pollForIntent(5) != null);
+        }
+
+        Intent receiveIntentFromApp() {
+            final Intent intentReceived = pollForIntent(5);
+            assertNotNull("No intent received from app within 5 seconds", intentReceived);
+            return intentReceived;
+        }
     }
 
     @Before
@@ -131,8 +160,7 @@
         mPackageManager = mContext.getPackageManager();
         mLauncherApps = (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE);
         mReceiverHandler = new Handler(Looper.getMainLooper());
-        mTestReceiverComponent = new ComponentName(TEST_APP_PACKAGE_NAME,
-                SuspendTestReceiver.class.getCanonicalName());
+        mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         IPackageManager ipm = AppGlobals.getPackageManager();
         try {
             // Otherwise implicit broadcasts will not be delivered.
@@ -151,9 +179,10 @@
     private Bundle requestAppAction(String action) throws InterruptedException {
         final AtomicReference<Bundle> result = new AtomicReference<>();
         final CountDownLatch receiverLatch = new CountDownLatch(1);
-
+        final ComponentName testReceiverComponent = new ComponentName(TEST_APP_PACKAGE_NAME,
+                SuspendTestReceiver.class.getCanonicalName());
         final Intent broadcastIntent = new Intent(action)
-                .setComponent(mTestReceiverComponent)
+                .setComponent(testReceiverComponent)
                 .setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
         mContext.sendOrderedBroadcast(broadcastIntent, null, new BroadcastReceiver() {
             @Override
@@ -175,9 +204,10 @@
         return extras;
     }
 
-    private void suspendTestPackage(PersistableBundle appExtras, PersistableBundle launcherExtras) {
+    private void suspendTestPackage(PersistableBundle appExtras, PersistableBundle launcherExtras,
+            String dialogMessage) {
         final String[] unchangedPackages = mPackageManager.setPackagesSuspended(
-                PACKAGES_TO_SUSPEND, true, appExtras, launcherExtras, null);
+                PACKAGES_TO_SUSPEND, true, appExtras, launcherExtras, dialogMessage);
         assertTrue("setPackagesSuspended returned non-empty list", unchangedPackages.length == 0);
     }
 
@@ -187,6 +217,13 @@
         assertTrue("setPackagesSuspended returned non-empty list", unchangedPackages.length == 0);
     }
 
+    private void startTestAppActivity() {
+        final Intent testActivity = new Intent()
+                .setComponent(new ComponentName(TEST_APP_PACKAGE_NAME,
+                        SuspendTestActivity.class.getCanonicalName()))
+                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        mContext.startActivity(testActivity);
+    }
 
     private static boolean areSameExtras(BaseBundle expected, BaseBundle received) {
         if (expected != null) {
@@ -199,13 +236,14 @@
     }
 
     private static void assertSameExtras(String message, BaseBundle expected, BaseBundle received) {
-        assertTrue(message + ": [expected: " + expected + "; received: " + received + "]",
-                areSameExtras(expected, received));
+        if (!areSameExtras(expected, received)) {
+            fail(message + ": [expected: " + expected + "; received: " + received + "]");
+        }
     }
 
     @Test
     public void testIsPackageSuspended() {
-        suspendTestPackage(null, null);
+        suspendTestPackage(null, null, null);
         assertTrue("isPackageSuspended is false",
                 mPackageManager.isPackageSuspended(TEST_APP_PACKAGE_NAME));
     }
@@ -217,7 +255,7 @@
         assertNull(resultFromApp.getBundle(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
 
         final PersistableBundle appExtras = getExtras("testSuspendedStateFromApp", 20, "20", 0.2);
-        suspendTestPackage(appExtras, null);
+        suspendTestPackage(appExtras, null, null);
 
         resultFromApp = requestAppAction(SuspendTestReceiver.ACTION_GET_SUSPENDED_STATE);
         assertTrue("resultFromApp:suspended is false",
@@ -230,37 +268,39 @@
 
     @Test
     public void testMyPackageSuspendedUnsuspended() {
-        mAppCommsReceiver.register(mReceiverHandler);
+        mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_MY_PACKAGE_SUSPENDED,
+                ACTION_REPORT_MY_PACKAGE_UNSUSPENDED);
+        mAppCommsReceiver.drainPendingBroadcasts();
         final PersistableBundle appExtras = getExtras("testMyPackageSuspendBroadcasts", 1, "1", .1);
-        suspendTestPackage(appExtras, null);
+        suspendTestPackage(appExtras, null, null);
         Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
-        assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
-                ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+        assertEquals("MY_PACKAGE_SUSPENDED delivery not reported",
+                ACTION_REPORT_MY_PACKAGE_SUSPENDED, intentFromApp.getAction());
         assertSameExtras("Received app extras different to the ones supplied", appExtras,
                 intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
         unsuspendTestPackage();
         intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
-        assertTrue("MY_PACKAGE_UNSUSPENDED delivery not reported",
-                ACTION_REPORT_MY_PACKAGE_UNSUSPENDED.equals(intentFromApp.getAction()));
+        assertEquals("MY_PACKAGE_UNSUSPENDED delivery not reported",
+                ACTION_REPORT_MY_PACKAGE_UNSUSPENDED, intentFromApp.getAction());
     }
 
     @Test
     public void testUpdatingAppExtras() {
-        mAppCommsReceiver.register(mReceiverHandler);
+        mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_MY_PACKAGE_SUSPENDED);
         final PersistableBundle extras1 = getExtras("testMyPackageSuspendedOnChangingExtras", 1,
                 "1", 0.1);
-        suspendTestPackage(extras1, null);
+        suspendTestPackage(extras1, null, null);
         Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
-        assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
-                ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+        assertEquals("MY_PACKAGE_SUSPENDED delivery not reported",
+                ACTION_REPORT_MY_PACKAGE_SUSPENDED, intentFromApp.getAction());
         assertSameExtras("Received app extras different to the ones supplied", extras1,
                 intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
         final PersistableBundle extras2 = getExtras("testMyPackageSuspendedOnChangingExtras", 2,
                 "2", 0.2);
-        mPackageManager.setSuspendedPackageAppExtras(TEST_APP_PACKAGE_NAME, extras2);
+        suspendTestPackage(extras2, null, null);
         intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
-        assertTrue("MY_PACKAGE_SUSPENDED delivery not reported",
-                ACTION_REPORT_MY_PACKAGE_SUSPENDED.equals(intentFromApp.getAction()));
+        assertEquals("MY_PACKAGE_SUSPENDED delivery not reported",
+                ACTION_REPORT_MY_PACKAGE_SUSPENDED, intentFromApp.getAction());
         assertSameExtras("Received app extras different to the updated extras", extras2,
                 intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS));
     }
@@ -274,12 +314,26 @@
     }
 
     @Test
+    public void testActivityStoppedOnSuspend() {
+        mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_TEST_ACTIVITY_STARTED,
+                ACTION_REPORT_TEST_ACTIVITY_STOPPED);
+        startTestAppActivity();
+        Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+        assertEquals("Test activity start not reported",
+                ACTION_REPORT_TEST_ACTIVITY_STARTED, intentFromApp.getAction());
+        suspendTestPackage(null, null, null);
+        intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+        assertEquals("Test activity stop not reported on suspending the test app",
+                ACTION_REPORT_TEST_ACTIVITY_STOPPED, intentFromApp.getAction());
+    }
+
+    @Test
     public void testGetLauncherExtrasNonNull() {
         final Bundle extrasWhenUnsuspended = mLauncherApps.getSuspendedPackageLauncherExtras(
                 TEST_APP_PACKAGE_NAME, mContext.getUser());
         assertNull("Non null extras when package unsuspended:", extrasWhenUnsuspended);
         final PersistableBundle launcherExtras = getExtras("testGetLauncherExtras", 1, "1", 0.1);
-        suspendTestPackage(null, launcherExtras);
+        suspendTestPackage(null, launcherExtras, null);
         final Bundle receivedExtras = mLauncherApps.getSuspendedPackageLauncherExtras(
                 TEST_APP_PACKAGE_NAME, mContext.getUser());
         assertSameExtras("Received launcher extras different to the ones supplied", launcherExtras,
@@ -288,7 +342,7 @@
 
     @Test
     public void testGetLauncherExtrasNull() {
-        suspendTestPackage(null, null);
+        suspendTestPackage(null, null, null);
         final Bundle extrasWhenNoneGiven = mLauncherApps.getSuspendedPackageLauncherExtras(
                 TEST_APP_PACKAGE_NAME, mContext.getUser());
         assertNull("Non null extras when null extras provided:", extrasWhenNoneGiven);
@@ -339,7 +393,7 @@
             }
         };
         mLauncherApps.registerCallback(mTestCallback, mReceiverHandler);
-        suspendTestPackage(null, suppliedExtras);
+        suspendTestPackage(null, suppliedExtras, null);
         assertFalse("Both callbacks were invoked", twoCallbackLatch.await(5, TimeUnit.SECONDS));
         twoCallbackLatch.countDown();
         assertTrue("No callback was invoked", twoCallbackLatch.await(2, TimeUnit.SECONDS));
@@ -373,19 +427,53 @@
             }
         };
         mLauncherApps.registerCallback(mTestCallback, mReceiverHandler);
-        suspendTestPackage(null, suppliedExtras);
+        suspendTestPackage(null, suppliedExtras, null);
         assertTrue("Callback not invoked", oneCallbackLatch.await(5, TimeUnit.SECONDS));
         final String result = overridingOneCallbackResult.get();
         assertTrue("Callback did not complete as expected: " + result, result.isEmpty());
     }
 
+    private void turnScreenOn() throws Exception {
+        if (!mUiDevice.isScreenOn()) {
+            mUiDevice.wakeUp();
+        }
+        final IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
+        wm.dismissKeyguard(null, null);
+    }
+
+    @Test
+    public void testInterceptorActivity() throws Exception {
+        turnScreenOn();
+        mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED,
+                ACTION_REPORT_TEST_ACTIVITY_STARTED);
+        final String testMessage = "This is a test message";
+        suspendTestPackage(null, null, testMessage);
+        startTestAppActivity();
+        assertNull("No broadcast was expected from app", mAppCommsReceiver.pollForIntent(2));
+        assertNotNull("Given dialog message not shown",
+                mUiDevice.wait(Until.findObject(By.text(testMessage)), 5000));
+        final String buttonText = "More details";
+        final UiObject2 moreDetailsButton = mUiDevice.findObject(
+                By.clickable(true).text(buttonText));
+        assertNotNull("\"More Details\" button not shown", moreDetailsButton);
+        moreDetailsButton.click();
+        final Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
+        assertEquals("\"More Details\" activity start not reported",
+                ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED, intentFromApp.getAction());
+        final String receivedPackageName = intentFromApp.getStringExtra(
+                EXTRA_RECEIVED_PACKAGE_NAME);
+        assertEquals("Wrong package name received by \"More Details\" activity",
+                TEST_APP_PACKAGE_NAME, receivedPackageName);
+    }
+
     @After
-    public void tearDown() throws Exception {
+    public void tearDown() {
         mAppCommsReceiver.unregister();
         if (mTestCallback != null) {
             mLauncherApps.unregisterCallback(mTestCallback);
         }
-        Thread.sleep(250); // To prevent any race with the next registerReceiver
+        mContext.sendBroadcast(new Intent(ACTION_FINISH_TEST_ACTIVITY)
+                .setPackage(TEST_APP_PACKAGE_NAME));
     }
 
     private static abstract class StubbedCallback extends LauncherApps.Callback {
diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendedDetailsActivity.java b/services/tests/servicestests/src/com/android/server/pm/SuspendedDetailsActivity.java
new file mode 100644
index 0000000..18f0123
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendedDetailsActivity.java
@@ -0,0 +1,42 @@
+/*
+ * 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.pm;
+
+import static com.android.server.pm.SuspendPackagesTest.ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED;
+import static com.android.server.pm.SuspendPackagesTest.EXTRA_RECEIVED_PACKAGE_NAME;
+import static com.android.server.pm.SuspendPackagesTest.INSTRUMENTATION_PACKAGE;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class SuspendedDetailsActivity extends Activity {
+    private static final String TAG = SuspendedDetailsActivity.class.getSimpleName();
+
+    @Override
+    protected void onStart() {
+        Log.d(TAG, "onStart");
+        final String suspendedPackage =  getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+        super.onStart();
+        final Intent reportStart = new Intent(ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED)
+                .putExtra(EXTRA_RECEIVED_PACKAGE_NAME, suspendedPackage)
+                .setPackage(INSTRUMENTATION_PACKAGE);
+        sendBroadcast(reportStart);
+        finish();
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
index 56ba047..7487d44 100644
--- a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
+++ b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java
@@ -258,4 +258,9 @@
     public void writeIdentifierToProto(ProtoOutputStream proto, long fieldId){
         throw new UnsupportedOperationException("not implemented");
     }
+
+    @Override
+    public boolean isInputMethodTarget() {
+        return false;
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
index b6be3a4..97a716f 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
@@ -22,6 +22,7 @@
 import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
+import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
 import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
@@ -29,6 +30,7 @@
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
@@ -260,6 +262,23 @@
     }
 
     @Test
+    public void layoutWindowLw_withDisplayCutout_floatingInScreen() {
+        addDisplayCutout();
+
+        mAppWindow.attrs.flags = FLAG_LAYOUT_IN_SCREEN;
+        mAppWindow.attrs.type = TYPE_APPLICATION_OVERLAY;
+        mAppWindow.attrs.width = DISPLAY_WIDTH;
+        mAppWindow.attrs.height = DISPLAY_HEIGHT;
+        mPolicy.addWindow(mAppWindow);
+
+        mPolicy.beginLayoutLw(mFrames, 0 /* UI mode */);
+        mPolicy.layoutWindowLw(mAppWindow, null, mFrames);
+
+        assertInsetByTopBottom(mAppWindow.parentFrame, 0, NAV_BAR_HEIGHT);
+        assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
+    }
+
+    @Test
     public void layoutWindowLw_withDisplayCutout_fullscreenInCutout_landscape() {
         addDisplayCutout();
         setRotation(ROTATION_90);
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
index 195dd39..2c47a94 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
@@ -229,7 +229,8 @@
         void addWindow(WindowState state) {
             if (state instanceof FakeWindowState) {
                 ((FakeWindowState) state).surfaceLayer =
-                        getWindowLayerFromTypeLw(state.getAttrs().type);
+                        getWindowLayerFromTypeLw(state.getAttrs().type,
+                                true /* canAddInternalSystemWindow */);
             }
             adjustWindowParamsLw(state, state.getAttrs(), true /* hasStatusBarPermission */);
             assertEquals(WindowManagerGlobal.ADD_OKAY, prepareAddWindowLw(state, state.getAttrs()));
diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
index 9ad41cd..dca09af 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
@@ -21,7 +21,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.Signature;
@@ -206,7 +205,7 @@
         PackageInfo p = createPackageInfo(packageName, enabled, valid, installed, signatures,
                 updateTime, hidden);
         p.setLongVersionCode(versionCode);
-        p.applicationInfo.versionCode = versionCode;
+        p.applicationInfo.setVersionCode(versionCode);
         if (isSystemApp) p.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
         return p;
     }
diff --git a/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
index 8b78f10..164c80b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AnimatingAppWindowTokenRegistryTest.java
@@ -88,4 +88,25 @@
         verify(mMockEndDeferFinishCallback1).run();
         verifyZeroInteractions(mMockEndDeferFinishCallback2);
     }
+
+    @Test
+    public void testContainerRemoved() throws Exception {
+        final AppWindowToken window1 = createAppWindowToken(mDisplayContent,
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        final AppWindowToken window2 = createAppWindow(window1.getTask(), ACTIVITY_TYPE_STANDARD,
+                "window2").mAppToken;
+        final AnimatingAppWindowTokenRegistry registry =
+                window1.getStack().getAnimatingAppWindowTokenRegistry();
+
+        window1.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
+        window2.startAnimation(window1.getPendingTransaction(), mAdapter, false /* hidden */);
+        assertTrue(window1.isSelfAnimating());
+        assertTrue(window2.isSelfAnimating());
+
+        // Make sure that first animation finish is deferred, and removing the second window stops
+        // finishes all pending deferred finishings.
+        registry.notifyAboutToFinish(window1, mMockEndDeferFinishCallback1);
+        window2.setParent(null);
+        verify(mMockEndDeferFinishCallback1).run();
+    }
 }
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
index e7e55cd..8e5aec3 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppTransitionTests.java
@@ -28,6 +28,7 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -41,12 +42,14 @@
 @RunWith(AndroidJUnit4.class)
 public class AppTransitionTests {
 
+    @Rule
+    public final WindowManagerServiceRule mRule = new WindowManagerServiceRule();
     private WindowManagerService mWm;
 
     @Before
     public void setUp() throws Exception {
         final Context context = InstrumentationRegistry.getTargetContext();
-        mWm = TestWindowManagerPolicy.getWindowManagerService(context);
+        mWm = mRule.getWindowManagerService();
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index 2bfe274..6019958 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -159,6 +159,11 @@
         }
 
         @Override
+        public boolean shouldDeferStartOnMoveToFullscreen() {
+            return true;
+        }
+
+        @Override
         public boolean setPinnedStackSize(Rect stackBounds, Rect taskBounds) {
             // TODO: Once we break the runs apart, we should fail() here if this is called outside
             //       of onAnimationStart() and onAnimationEnd()
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index 7f1bcac..845095a 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -46,6 +46,7 @@
 import android.graphics.Rect;
 import android.os.SystemClock;
 import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.FlakyTest;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.util.DisplayMetrics;
@@ -56,7 +57,9 @@
 
 import com.android.server.wm.utils.WmDisplayCutout;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -72,6 +75,7 @@
 public class DisplayContentTests extends WindowTestsBase {
 
     @Test
+    @FlakyTest(bugId = 77772044)
     public void testForAllWindows() throws Exception {
         final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION,
                 mDisplayContent, "exiting app");
@@ -495,24 +499,24 @@
         assertEquals(displayContent.mBaseDisplayDensity, expectedBaseDensity);
     }
 
-    private void assertForAllWindowsOrder(List<WindowState> expectedWindows) {
-        final LinkedList<WindowState> actualWindows = new LinkedList();
+    private void assertForAllWindowsOrder(List<WindowState> expectedWindowsBottomToTop) {
+        final LinkedList<WindowState> actualWindows = new LinkedList<>();
 
         // Test forward traversal.
         mDisplayContent.forAllWindows(actualWindows::addLast, false /* traverseTopToBottom */);
-        assertEquals(expectedWindows.size(), actualWindows.size());
-        for (WindowState w : expectedWindows) {
-            assertEquals(w, actualWindows.pollFirst());
-        }
-        assertTrue(actualWindows.isEmpty());
+        assertThat("bottomToTop", actualWindows, is(expectedWindowsBottomToTop));
+
+        actualWindows.clear();
 
         // Test backward traversal.
         mDisplayContent.forAllWindows(actualWindows::addLast, true /* traverseTopToBottom */);
-        assertEquals(expectedWindows.size(), actualWindows.size());
-        for (WindowState w : expectedWindows) {
-            assertEquals(w, actualWindows.pollLast());
-        }
-        assertTrue(actualWindows.isEmpty());
+        assertThat("topToBottom", actualWindows, is(reverseList(expectedWindowsBottomToTop)));
+    }
+
+    private static List<WindowState> reverseList(List<WindowState> list) {
+        final ArrayList<WindowState> result = new ArrayList<>(list);
+        Collections.reverse(result);
+        return result;
     }
 
     private MotionEvent createTapEvent(float x, float y, boolean isDownEvent) {
diff --git a/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java
new file mode 100644
index 0000000..fbf6691
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/RecentsAnimationControllerTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.wm;
+
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.os.Binder;
+import android.os.IInterface;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.IRecentsAnimationRunner;
+import android.view.SurfaceControl;
+import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * atest FrameworksServicesTests:com.android.server.wm.RecentsAnimationControllerTest
+ */
+@SmallTest
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+public class RecentsAnimationControllerTest extends WindowTestsBase {
+
+    @Mock SurfaceControl mMockLeash;
+    @Mock SurfaceControl.Transaction mMockTransaction;
+    @Mock OnAnimationFinishedCallback mFinishedCallback;
+    @Mock IRecentsAnimationRunner mMockRunner;
+    @Mock RecentsAnimationController.RecentsAnimationCallbacks mAnimationCallbacks;
+    private RecentsAnimationController mController;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        MockitoAnnotations.initMocks(this);
+        when(mMockRunner.asBinder()).thenReturn(new Binder());
+        mController = new RecentsAnimationController(sWm, mMockRunner, mAnimationCallbacks,
+                DEFAULT_DISPLAY);
+    }
+
+    @Test
+    public void testRemovedBeforeStarted_expectCanceled() throws Exception {
+        final AppWindowToken appWindow = createAppWindowToken(mDisplayContent,
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD);
+        AnimationAdapter adapter = mController.addAnimation(appWindow.getTask(),
+                false /* isRecentTaskInvisible */);
+        adapter.startAnimation(mMockLeash, mMockTransaction, mFinishedCallback);
+
+        // Remove the app window so that the animation target can not be created
+        appWindow.removeImmediately();
+        mController.startAnimation();
+
+        // Verify that the finish callback to reparent the leash is called
+        verify(mFinishedCallback).onAnimationFinished(eq(adapter));
+        // Verify the animation canceled callback to the app was made
+        verify(mMockRunner).onAnimationCanceled();
+        verifyNoMoreInteractionsExceptAsBinder(mMockRunner);
+    }
+
+    private static void verifyNoMoreInteractionsExceptAsBinder(IInterface binder) {
+        verify(binder, atLeast(0)).asBinder();
+        verifyNoMoreInteractions(binder);
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 1af344b..1c2d538 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -16,108 +16,47 @@
 
 package com.android.server.wm;
 
-import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
 import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
 
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.spy;
-
-import android.os.PowerSaveState;
-import android.util.proto.ProtoOutputStream;
-import org.mockito.invocation.InvocationOnMock;
 
 import android.annotation.Nullable;
-import android.app.ActivityManagerInternal;
 import android.content.Context;
 import android.content.res.CompatibilityInfo;
 import android.content.res.Configuration;
 import android.graphics.Rect;
-import android.hardware.display.DisplayManagerInternal;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
+import android.util.proto.ProtoOutputStream;
 import android.view.Display;
 import android.view.DisplayCutout;
+import android.view.IWindow;
 import android.view.IWindowManager;
-import android.view.InputChannel;
 import android.view.KeyEvent;
 import android.view.WindowManager;
 import android.view.animation.Animation;
-import android.os.PowerManagerInternal;
 
 import com.android.internal.policy.IKeyguardDismissCallback;
 import com.android.internal.policy.IShortcutService;
-import com.android.server.input.InputManagerService;
-import com.android.server.LocalServices;
 import com.android.server.policy.WindowManagerPolicy;
 
 import java.io.PrintWriter;
+import java.util.function.Supplier;
 
 class TestWindowManagerPolicy implements WindowManagerPolicy {
     private static final String TAG = "TestWindowManagerPolicy";
 
-    private static WindowManagerService sWm = null;
+    private final Supplier<WindowManagerService> mWmSupplier;
 
     int rotationToReport = 0;
 
     private Runnable mRunnableWhenAddingSplashScreen;
 
-    static synchronized WindowManagerService getWindowManagerService(Context context) {
-        if (sWm == null) {
-            // We only want to do this once for the test process as we don't want WM to try to
-            // register a bunch of local services again.
-            if (LocalServices.getService(DisplayManagerInternal.class) == null) {
-                LocalServices.addService(DisplayManagerInternal.class,
-                        mock(DisplayManagerInternal.class));
-            }
-            if (LocalServices.getService(PowerManagerInternal.class) == null) {
-                LocalServices.addService(PowerManagerInternal.class,
-                        mock(PowerManagerInternal.class));
-                final PowerManagerInternal pm =
-                        LocalServices.getService(PowerManagerInternal.class);
-                PowerSaveState state = new PowerSaveState.Builder().build();
-                doReturn(state).when(pm).getLowPowerState(anyInt());
-            }
-            if (LocalServices.getService(ActivityManagerInternal.class) == null) {
-                LocalServices.addService(ActivityManagerInternal.class,
-                        mock(ActivityManagerInternal.class));
-                final ActivityManagerInternal am =
-                        LocalServices.getService(ActivityManagerInternal.class);
-                doAnswer((InvocationOnMock invocationOnMock) -> {
-                    final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
-                    if (runnable != null) {
-                        runnable.run();
-                    }
-                    return null;
-                }).when(am).notifyKeyguardFlagsChanged(any());
-            }
+    public TestWindowManagerPolicy(Supplier<WindowManagerService> wmSupplier) {
 
-            InputManagerService ims = mock(InputManagerService.class);
-            // InputChannel is final and can't be mocked.
-            InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM);
-            if (input != null && input.length > 1) {
-                doReturn(input[1]).when(ims).monitorInput(anyString());
-            }
-
-            sWm = WindowManagerService.main(context, ims, true, false,
-                    false, new TestWindowManagerPolicy());
-
-            sWm.onInitReady();
-
-            // Display creation is driven by the ActivityManagerService via ActivityStackSupervisor.
-            // We emulate those steps here.
-            sWm.mRoot.createDisplayContent(sWm.mDisplayManager.getDisplay(DEFAULT_DISPLAY),
-                    mock(DisplayWindowController.class));
-        }
-        return sWm;
+        mWmSupplier = wmSupplier;
     }
 
     @Override
@@ -216,10 +155,12 @@
             int logo, int windowFlags, Configuration overrideConfig, int displayId) {
         final com.android.server.wm.WindowState window;
         final AppWindowToken atoken;
-        synchronized (sWm.mWindowMap) {
-            atoken = sWm.mRoot.getAppWindowToken(appToken);
+        final WindowManagerService wm = mWmSupplier.get();
+        synchronized (wm.mWindowMap) {
+            atoken = wm.mRoot.getAppWindowToken(appToken);
             window = WindowTestsBase.createWindow(null, TYPE_APPLICATION_STARTING, atoken,
-                    "Starting window");
+                    "Starting window", 0 /* ownerId */, false /* internalWindows */, wm,
+                    mock(Session.class), mock(IWindow.class));
             atoken.startingWindow = window;
         }
         if (mRunnableWhenAddingSplashScreen != null) {
@@ -227,7 +168,7 @@
             mRunnableWhenAddingSplashScreen = null;
         }
         return () -> {
-            synchronized (sWm.mWindowMap) {
+            synchronized (wm.mWindowMap) {
                 atoken.removeChild(window);
                 atoken.startingWindow = null;
             }
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
index 794d033..ca520ed 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowAnimationSpecTest.java
@@ -56,7 +56,8 @@
         Rect windowCrop = new Rect(0, 0, 20, 20);
         Animation a = createClipRectAnimation(windowCrop, windowCrop);
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
-                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_NONE);
+                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_NONE,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
                 argThat(rect -> rect.equals(windowCrop)));
@@ -65,7 +66,8 @@
     @Test
     public void testApply_clipAfter() {
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null,
-                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM);
+                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_AFTER_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
         verify(mTransaction).setFinalCrop(eq(mSurfaceControl),
@@ -77,7 +79,8 @@
         // Stack bounds is (0, 0, 10, 10) position is (20, 40)
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation,
                 new Point(20, 40), mStackBounds, false /* canSkipFirstFrame */,
-                STACK_CLIP_AFTER_ANIM);
+                STACK_CLIP_AFTER_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
         verify(mTransaction).setFinalCrop(eq(mSurfaceControl),
@@ -89,7 +92,8 @@
     public void testApply_clipBeforeNoAnimationBounds() {
         // Stack bounds is (0, 0, 10, 10) animation clip is (0, 0, 0, 0)
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(mAnimation, null,
-                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM);
+                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
                 argThat(rect -> rect.equals(mStackBounds)));
@@ -102,7 +106,8 @@
         Animation a = createClipRectAnimation(windowCrop, windowCrop);
         a.initialize(0, 0, 0, 0);
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
-                null, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM);
+                null, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl), argThat(Rect::isEmpty));
     }
@@ -113,7 +118,8 @@
         Rect windowCrop = new Rect(0, 0, 5, 5);
         Animation a = createClipRectAnimation(windowCrop, windowCrop);
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
-                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM);
+                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
                 argThat(rect -> rect.equals(windowCrop)));
@@ -125,7 +131,8 @@
         Rect windowCrop = new Rect(0, 0, 20, 20);
         Animation a = createClipRectAnimation(windowCrop, windowCrop);
         WindowAnimationSpec windowAnimationSpec = new WindowAnimationSpec(a, null,
-                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM);
+                mStackBounds, false /* canSkipFirstFrame */, STACK_CLIP_BEFORE_ANIM,
+                true /* isAppAnimation */);
         windowAnimationSpec.apply(mTransaction, mSurfaceControl, 0);
         verify(mTransaction).setWindowCrop(eq(mSurfaceControl),
                 argThat(rect -> rect.equals(mStackBounds)));
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.java
new file mode 100644
index 0000000..32bfda32
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRule.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.wm;
+
+import static android.testing.DexmakerShareClassLoaderRule.runWithDexmakerShareClassLoader;
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
+
+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.doReturn;
+import static org.mockito.Mockito.mock;
+
+import android.app.ActivityManagerInternal;
+import android.content.Context;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.PowerManagerInternal;
+import android.os.PowerSaveState;
+import android.support.test.InstrumentationRegistry;
+import android.view.InputChannel;
+
+import com.android.server.LocalServices;
+import com.android.server.input.InputManagerService;
+import com.android.server.policy.WindowManagerPolicy;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+import org.mockito.invocation.InvocationOnMock;
+
+/**
+ * A test rule that sets up a fresh WindowManagerService instance before each test and makes sure
+ * to properly tear it down after.
+ *
+ * <p>
+ * Usage:
+ * <pre>
+ * {@literal @}Rule
+ *  public final WindowManagerServiceRule mWmRule = new WindowManagerServiceRule();
+ * </pre>
+ */
+public class WindowManagerServiceRule implements TestRule {
+
+    private WindowManagerService mService;
+
+    @Override
+    public Statement apply(Statement base, Description description) {
+        return new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                runWithDexmakerShareClassLoader(this::setUp);
+                try {
+                    base.evaluate();
+                } finally {
+                    tearDown();
+                }
+            }
+
+            private void setUp() {
+                final Context context = InstrumentationRegistry.getTargetContext();
+
+                removeServices();
+
+                LocalServices.addService(DisplayManagerInternal.class,
+                        mock(DisplayManagerInternal.class));
+
+                LocalServices.addService(PowerManagerInternal.class,
+                        mock(PowerManagerInternal.class));
+                final PowerManagerInternal pm =
+                        LocalServices.getService(PowerManagerInternal.class);
+                PowerSaveState state = new PowerSaveState.Builder().build();
+                doReturn(state).when(pm).getLowPowerState(anyInt());
+
+                LocalServices.addService(ActivityManagerInternal.class,
+                        mock(ActivityManagerInternal.class));
+                final ActivityManagerInternal am =
+                        LocalServices.getService(ActivityManagerInternal.class);
+                doAnswer((InvocationOnMock invocationOnMock) -> {
+                    final Runnable runnable = invocationOnMock.<Runnable>getArgument(0);
+                    if (runnable != null) {
+                        runnable.run();
+                    }
+                    return null;
+                }).when(am).notifyKeyguardFlagsChanged(any());
+
+                InputManagerService ims = mock(InputManagerService.class);
+                // InputChannel is final and can't be mocked.
+                InputChannel[] input = InputChannel.openInputChannelPair(TAG_WM);
+                if (input != null && input.length > 1) {
+                    doReturn(input[1]).when(ims).monitorInput(anyString());
+                }
+
+                mService = WindowManagerService.main(context, ims, true, false,
+                        false, new TestWindowManagerPolicy(
+                                WindowManagerServiceRule.this::getWindowManagerService));
+
+                mService.onInitReady();
+
+                // Display creation is driven by the ActivityManagerService via ActivityStackSupervisor.
+                // We emulate those steps here.
+                mService.mRoot.createDisplayContent(
+                        mService.mDisplayManager.getDisplay(DEFAULT_DISPLAY),
+                        mock(DisplayWindowController.class));
+            }
+
+            private void removeServices() {
+                LocalServices.removeServiceForTest(DisplayManagerInternal.class);
+                LocalServices.removeServiceForTest(PowerManagerInternal.class);
+                LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+                LocalServices.removeServiceForTest(WindowManagerInternal.class);
+                LocalServices.removeServiceForTest(WindowManagerPolicy.class);
+            }
+
+            private void tearDown() {
+                waitUntilWindowManagerHandlersIdle();
+                removeServices();
+                mService = null;
+            }
+        };
+    }
+
+    public WindowManagerService getWindowManagerService() {
+        return mService;
+    }
+
+    public void waitUntilWindowManagerHandlersIdle() {
+        final WindowManagerService wm = getWindowManagerService();
+        if (wm != null) {
+            wm.mH.runWithScissors(() -> { }, 0);
+            wm.mAnimationHandler.runWithScissors(() -> { }, 0);
+            SurfaceAnimationThread.getHandler().runWithScissors(() -> { }, 0);
+        }
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
new file mode 100644
index 0000000..6cf6d7b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowManagerServiceRuleTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@Presubmit
+@SmallTest
+public class WindowManagerServiceRuleTest {
+
+    @Rule
+    public final WindowManagerServiceRule mRule = new WindowManagerServiceRule();
+
+    @Test
+    public void testWindowManagerSetUp() {
+        assertThat(mRule.getWindowManagerService(), notNullValue());
+    }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 1248eae..85e846d 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -37,6 +37,7 @@
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
 import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
 
@@ -51,6 +52,7 @@
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 /**
@@ -129,6 +131,16 @@
     }
 
     @Test
+    public void testOverlayWindowHiddenWhenSuspended() {
+        final WindowState overlayWindow = spy(createWindow(null, TYPE_APPLICATION_OVERLAY,
+                "overlayWindow"));
+        overlayWindow.setHiddenWhileSuspended(true);
+        verify(overlayWindow).hideLw(true, true);
+        overlayWindow.setHiddenWhileSuspended(false);
+        verify(overlayWindow).showLw(true, true);
+    }
+
+    @Test
     public void testGetTopParentWindow() throws Exception {
         final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
         final WindowState child1 = createWindow(root, FIRST_SUB_WINDOW, "child1");
@@ -326,6 +338,17 @@
         assertThat(app.mLayoutSeq, not(is(mDisplayContent.mLayoutSeq)));
     }
 
+    @Test
+    public void testDisplayIdUpdatedOnReparent() throws Exception {
+        final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+        // fake a different display
+        app.mInputWindowHandle.displayId = mDisplayContent.getDisplayId() + 1;
+        app.onDisplayChanged(mDisplayContent);
+
+        assertThat(app.mInputWindowHandle.displayId, is(mDisplayContent.getDisplayId()));
+        assertThat(app.getDisplayId(), is(mDisplayContent.getDisplayId()));
+    }
+
     private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) {
         reset(mPowerManagerWrapper);
         final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
index f4cdc90..d74defc 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestUtils.java
@@ -48,13 +48,6 @@
     public static int sNextTaskId = 0;
 
     /**
-     * Retrieves an instance of {@link WindowManagerService}, creating it if necessary.
-     */
-    public static WindowManagerService getWindowManagerService(Context context) {
-        return TestWindowManagerPolicy.getWindowManagerService(context);
-    }
-
-    /**
      * Retrieves an instance of a mock {@link WindowManagerService}.
      */
     public static WindowManagerService getMockWindowManagerService() {
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index d2eee68..473a287 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -24,14 +24,14 @@
 import android.content.res.Configuration;
 import android.graphics.Rect;
 import android.hardware.display.DisplayManagerGlobal;
+import android.testing.DexmakerShareClassLoaderRule;
 import android.util.Log;
 import android.view.Display;
 import android.view.DisplayInfo;
 import org.junit.Assert;
 import org.junit.After;
 import org.junit.Before;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.junit.Rule;
 
 import android.content.Context;
 import android.support.test.InstrumentationRegistry;
@@ -66,16 +66,15 @@
  */
 class WindowTestsBase {
     private static final String TAG = WindowTestsBase.class.getSimpleName();
-    static WindowManagerService sWm = null;
-    private static final IWindow sIWindow = new TestIWindow();
-    private static Session sMockSession;
+    WindowManagerService sWm = null;  // TODO(roosa): rename to mWm in follow-up CL
+    private final IWindow mIWindow = new TestIWindow();
+    private Session mMockSession;
     // The default display is removed in {@link #setUp} and then we iterate over all displays to
     // make sure we don't collide with any existing display. If we run into no other display, the
     // added display should be treated as default. This cannot be the default display
     private static int sNextDisplayId = DEFAULT_DISPLAY + 1;
     static int sNextStackId = 1000;
 
-    private static boolean sOneTimeSetupDone = false;
     DisplayContent mDisplayContent;
     DisplayInfo mDisplayInfo = new DisplayInfo();
     WindowState mWallpaperWindow;
@@ -90,27 +89,27 @@
     HashSet<WindowState> mCommonWindows;
     WallpaperController mWallpaperController;
 
-    @Mock
-    static WindowState.PowerManagerWrapper mPowerManagerWrapper;
+    @Rule
+    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
+            new DexmakerShareClassLoaderRule();
+
+    @Rule
+    public final WindowManagerServiceRule mWmRule = new WindowManagerServiceRule();
+
+    static WindowState.PowerManagerWrapper mPowerManagerWrapper;  // TODO(roosa): make non-static.
 
     @Before
     public void setUp() throws Exception {
         // If @Before throws an exception, the error isn't logged. This will make sure any failures
         // in the set up are clear. This can be removed when b/37850063 is fixed.
         try {
-            if (!sOneTimeSetupDone) {
-                sOneTimeSetupDone = true;
-
-                // Allows to mock package local classes and methods
-                System.setProperty("dexmaker.share_classloader", "true");
-                MockitoAnnotations.initMocks(this);
-                sMockSession = mock(Session.class);
-            }
+            mMockSession = mock(Session.class);
+            mPowerManagerWrapper = mock(WindowState.PowerManagerWrapper.class);
 
             final Context context = InstrumentationRegistry.getTargetContext();
             AttributeCache.init(context);
 
-            sWm = TestWindowManagerPolicy.getWindowManagerService(context);
+            sWm = mWmRule.getWindowManagerService();
             beforeCreateDisplay();
 
             mWallpaperController = new WallpaperController(sWm);
@@ -217,9 +216,7 @@
      * Waits until the main handler for WM has processed all messages.
      */
     void waitUntilHandlersIdle() {
-        sWm.mH.runWithScissors(() -> { }, 0);
-        sWm.mAnimationHandler.runWithScissors(() -> { }, 0);
-        SurfaceAnimationThread.getHandler().runWithScissors(() -> { }, 0);
+        mWmRule.waitUntilWindowManagerHandlersIdle();
     }
 
     private WindowToken createWindowToken(
@@ -285,20 +282,27 @@
         }
     }
 
-    static WindowState createWindow(WindowState parent, int type, WindowToken token, String name) {
+    WindowState createWindow(WindowState parent, int type, WindowToken token, String name) {
         synchronized (sWm.mWindowMap) {
             return createWindow(parent, type, token, name, 0 /* ownerId */,
                     false /* ownerCanAddInternalSystemWindow */);
         }
     }
 
-    static WindowState createWindow(WindowState parent, int type, WindowToken token, String name,
+    WindowState createWindow(WindowState parent, int type, WindowToken token, String name,
             int ownerId, boolean ownerCanAddInternalSystemWindow) {
-        synchronized (sWm.mWindowMap) {
+        return createWindow(parent, type, token, name, ownerId, ownerCanAddInternalSystemWindow,
+                sWm, mMockSession, mIWindow);
+    }
+
+    static WindowState createWindow(WindowState parent, int type, WindowToken token,
+            String name, int ownerId, boolean ownerCanAddInternalSystemWindow,
+            WindowManagerService service, Session session, IWindow iWindow) {
+        synchronized (service.mWindowMap) {
             final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
             attrs.setTitle(name);
 
-            final WindowState w = new WindowState(sWm, sMockSession, sIWindow, token, parent,
+            final WindowState w = new WindowState(service, session, iWindow, token, parent,
                     OP_NONE,
                     0, attrs, VISIBLE, ownerId, ownerCanAddInternalSystemWindow,
                     mPowerManagerWrapper);
@@ -357,7 +361,7 @@
     WindowTestUtils.TestWindowState createWindowState(WindowManager.LayoutParams attrs,
             WindowToken token) {
         synchronized (sWm.mWindowMap) {
-            return new WindowTestUtils.TestWindowState(sWm, sMockSession, sIWindow, attrs, token);
+            return new WindowTestUtils.TestWindowState(sWm, mMockSession, mIWindow, attrs, token);
         }
     }
 
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
index afdde72..ae0b0f9 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/Android.mk
@@ -20,7 +20,7 @@
 
 LOCAL_COMPATIBILITY_SUITE := device-tests
 
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator
 
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 LOCAL_SRC_FILES += ../../src/com/android/server/pm/SuspendPackagesTest.java
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java
index fa5fc58..ab7ddbb 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/src/com/android/servicestests/apps/suspendtestapp/SuspendTestActivity.java
@@ -16,9 +16,45 @@
 
 package com.android.servicestests.apps.suspendtestapp;
 
+import static com.android.server.pm.SuspendPackagesTest.ACTION_FINISH_TEST_ACTIVITY;
+import static com.android.server.pm.SuspendPackagesTest.ACTION_REPORT_TEST_ACTIVITY_STARTED;
+import static com.android.server.pm.SuspendPackagesTest.ACTION_REPORT_TEST_ACTIVITY_STOPPED;
+import static com.android.server.pm.SuspendPackagesTest.INSTRUMENTATION_PACKAGE;
+
 import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.util.Log;
 
 public class SuspendTestActivity extends Activity {
     private static final String TAG = SuspendTestActivity.class.getSimpleName();
 
-}
\ No newline at end of file
+    private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Log.d(TAG, "Finishing test activity from receiver");
+            SuspendTestActivity.this.finish();
+        }
+    };
+
+    @Override
+    public void onStart() {
+        Log.d(TAG, "onStart");
+        final Intent reportStart = new Intent(ACTION_REPORT_TEST_ACTIVITY_STARTED)
+                .setPackage(INSTRUMENTATION_PACKAGE);
+        sendBroadcast(reportStart);
+        registerReceiver(mFinishReceiver, new IntentFilter(ACTION_FINISH_TEST_ACTIVITY));
+        super.onStart();
+    }
+    @Override
+    public void onStop() {
+        Log.d(TAG, "onStop");
+        final Intent reportStop = new Intent(ACTION_REPORT_TEST_ACTIVITY_STOPPED)
+                .setPackage(INSTRUMENTATION_PACKAGE);
+        sendBroadcast(reportStop);
+        unregisterReceiver(mFinishReceiver);
+        super.onStop();
+    }
+}
diff --git a/services/tests/uiservicestests/AndroidTest.xml b/services/tests/uiservicestests/AndroidTest.xml
index d3b9d4a..11e8f09 100644
--- a/services/tests/uiservicestests/AndroidTest.xml
+++ b/services/tests/uiservicestests/AndroidTest.xml
@@ -24,5 +24,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.tests.uiservices" />
         <option name="runner" value="android.testing.TestableInstrumentation" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
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 689c2ce..a8b9dff 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java
@@ -33,7 +33,6 @@
 import android.content.pm.ServiceInfo;
 import android.content.pm.UserInfo;
 import android.os.UserManager;
-import android.util.Slog;
 import android.util.Xml;
 
 import com.android.internal.util.FastXmlSerializer;
@@ -108,14 +107,8 @@
     }
 
     @Test
-    public void testXmlUpgrade() throws Exception {
-        String xml = "<enabled_assistants/>";
-
-        XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(new BufferedInputStream(
-                new ByteArrayInputStream(xml.toString().getBytes())), null);
-        parser.nextTag();
-        mAssistants.readXml(parser);
+    public void testXmlUpgrade() {
+        mAssistants.ensureAssistant();
 
         //once per user
         verify(mNm, times(mUm.getUsers().size())).readDefaultAssistant(anyInt());
@@ -133,42 +126,8 @@
         parser.nextTag();
         mAssistants.readXml(parser);
 
-        // once per user
-        verify(mNm, times(mUm.getUsers().size())).readDefaultAssistant(anyInt());
+        verify(mNm, never()).readDefaultAssistant(anyInt());
         verify(mAssistants, times(1)).addApprovedList(
                 new ComponentName("b", "b").flattenToString(),10, true);
     }
-
-    @Test
-    public void testXmlUpgradeOnce() throws Exception {
-        String xml = "<enabled_assistants/>";
-
-        XmlPullParser parser = Xml.newPullParser();
-        parser.setInput(new BufferedInputStream(
-                new ByteArrayInputStream(xml.toString().getBytes())), null);
-        parser.nextTag();
-        mAssistants.readXml(parser);
-
-        XmlSerializer serializer = new FastXmlSerializer();
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
-        serializer.startDocument(null, true);
-        mAssistants.writeXml(serializer, true);
-        serializer.endDocument();
-        serializer.flush();
-
-        //once per user
-        verify(mNm, times(mUm.getUsers().size())).readDefaultAssistant(anyInt());
-
-        Mockito.reset(mNm);
-
-        parser = Xml.newPullParser();
-        parser.setInput(new BufferedInputStream(
-                new ByteArrayInputStream(baos.toByteArray())), null);
-        parser.nextTag();
-        mAssistants.readXml(parser);
-
-        //once per user
-        verify(mNm, never()).readDefaultAssistant(anyInt());
-    }
 }
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index b82becd..124cb42 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -2184,7 +2184,7 @@
 
     @Test
     public void testReadPolicyXml_readApprovedServicesFromXml() throws Exception {
-        final String preupgradeXml = "<notification-policy version=\"1\">"
+        final String upgradeXml = "<notification-policy version=\"1\">"
                 + "<zen></zen>"
                 + "<ranking></ranking>"
                 + "<enabled_listeners>"
@@ -2198,7 +2198,7 @@
                 + "</dnd_apps>"
                 + "</notification-policy>";
         mService.readPolicyXml(
-                new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())), false);
+                new BufferedInputStream(new ByteArrayInputStream(upgradeXml.getBytes())), false);
         verify(mListeners, times(1)).readXml(any());
         verify(mConditionProviders, times(1)).readXml(any());
         verify(mAssistants, times(1)).readXml(any());
@@ -2207,6 +2207,7 @@
         verify(mListeners, times(1)).migrateToXml();
         verify(mConditionProviders, times(1)).migrateToXml();
         verify(mAssistants, times(1)).migrateToXml();
+        verify(mAssistants, times(2)).ensureAssistant();
     }
 
     @Test
@@ -2225,6 +2226,7 @@
         verify(mListeners, times(2)).migrateToXml();
         verify(mConditionProviders, times(2)).migrateToXml();
         verify(mAssistants, times(2)).migrateToXml();
+        verify(mAssistants, times(2)).ensureAssistant();
     }
 
 
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
index 0f2e56b..9f7205b 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationTest.java
@@ -28,7 +28,7 @@
 
 import android.app.ActivityManager;
 import android.app.Notification;
-import android.app.Notification.Person;
+import android.app.Person;
 import android.app.PendingIntent;
 import android.app.RemoteInput;
 import android.content.Context;
@@ -193,13 +193,13 @@
         Notification.Builder nM1 = new Notification.Builder(mContext, "test")
                 .setStyle(new Notification.MessagingStyle("")
                         .addMessage(new Notification.MessagingStyle.Message(
-                                "a", 100, mock(Notification.Person.class))));
+                                "a", 100, mock(Person.class))));
         Notification.Builder nM2 = new Notification.Builder(mContext, "test")
                 .setStyle(new Notification.MessagingStyle("")
                         .addMessage(new Notification.MessagingStyle.Message(
-                                "a", 100, mock(Notification.Person.class)))
+                                "a", 100, mock(Person.class)))
                         .addMessage(new Notification.MessagingStyle.Message(
-                                "b", 100, mock(Notification.Person.class)))
+                                "b", 100, mock(Person.class)))
                 );
 
         assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
@@ -257,11 +257,11 @@
         Notification.Builder nM1 = new Notification.Builder(mContext, "test")
                 .setStyle(new Notification.MessagingStyle("")
                         .addMessage(new Notification.MessagingStyle.Message(
-                                "a", 100, mock(Notification.Person.class))));
+                                "a", 100, mock(Person.class))));
         Notification.Builder nM2 = new Notification.Builder(mContext, "test")
                 .setStyle(new Notification.MessagingStyle("")
                         .addMessage(new Notification.MessagingStyle.Message(
-                                "a", 1000, mock(Notification.Person.class)))
+                                "a", 1000, mock(Person.class)))
                 );
 
         assertFalse(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 0815876..54ed1e6 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -1093,7 +1093,7 @@
         NotificationChannel channel2 =
                 new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
         NotificationChannel channel3 =
-                new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
+                new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_HIGH);
         mHelper.createNotificationChannel(PKG, UID, channel, true, false);
         mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
         mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
@@ -1106,6 +1106,24 @@
     }
 
     @Test
+    public void testGetBlockedChannelCount() throws Exception {
+        NotificationChannel channel =
+                new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+        NotificationChannel channel2 =
+                new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_NONE);
+        NotificationChannel channel3 =
+                new NotificationChannel("id5", "a", NotificationManager.IMPORTANCE_NONE);
+        mHelper.createNotificationChannel(PKG, UID, channel, true, false);
+        mHelper.createNotificationChannel(PKG, UID, channel2, true, false);
+        mHelper.createNotificationChannel(PKG, UID, channel3, true, false);
+
+        mHelper.deleteNotificationChannel(PKG, UID, channel3.getId());
+
+        assertEquals(1, mHelper.getBlockedChannelCount(PKG, UID));
+        assertEquals(0, mHelper.getBlockedChannelCount("pkg2", UID2));
+    }
+
+    @Test
     public void testCreateDeletedChannel() throws Exception {
         long[] vibration = new long[]{100, 67, 145, 156};
         NotificationChannel channel =
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
index ce74457..1be1643 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleCalendarTest.java
@@ -30,6 +30,7 @@
 import com.android.server.UiServiceTestCase;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -205,6 +206,7 @@
         assertTrue(mScheduleCalendar.shouldExitForAlarm(1000));
     }
 
+    @Ignore
     @Test
     public void testShouldExitForAlarm_oldAlarm() {
         // Cal: today 2:15pm
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
index a60d715..025b11a 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java
@@ -16,6 +16,7 @@
 package com.android.server.notification;
 
 import android.app.Notification;
+import android.app.Person;
 import android.os.Bundle;
 import android.support.test.runner.AndroidJUnit4;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -158,10 +159,10 @@
     public void testPeopleArrayList() throws Exception {
         Bundle bundle = new Bundle();
         String[] expected = { "name:test" , "tel:1234" };
-        final ArrayList<Notification.Person> arrayList =
+        final ArrayList<Person> arrayList =
                 new ArrayList<>(expected.length);
-        arrayList.add(new Notification.Person().setName("test"));
-        arrayList.add(new Notification.Person().setUri(expected[1]));
+        arrayList.add(new Person.Builder().setName("test").build());
+        arrayList.add(new Person.Builder().setUri(expected[1]).build());
         bundle.putParcelableArrayList(Notification.EXTRA_PEOPLE_LIST, arrayList);
         String[] result = ValidateNotificationPeople.getExtraPeople(bundle);
         assertStringArrayEquals("testPeopleArrayList", expected, result);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
index 3acc277..d02a983 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -201,12 +201,12 @@
                 AudioAttributes.USAGE_MEDIA);
         verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(false,
                 AudioAttributes.USAGE_GAME);
+        verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(false,
+                AudioAttributes.USAGE_UNKNOWN);
 
         // Alarms only will silence system noises (but not vibrations)
         verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(true,
                 AudioAttributes.USAGE_ASSISTANCE_SONIFICATION, AppOpsManager.OP_PLAY_AUDIO);
-        verify(mZenModeHelperSpy, atLeastOnce()).applyRestrictions(true,
-                AudioAttributes.USAGE_UNKNOWN);
     }
 
     @Test
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java
new file mode 100644
index 0000000..1efa415
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceClientPermissionsTest.java
@@ -0,0 +1,256 @@
+/*
+ * 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.slice;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.util.Xml.Encoding;
+
+import com.android.server.UiServiceTestCase;
+import com.android.server.slice.SlicePermissionManager.PkgUser;
+import com.android.server.slice.SliceClientPermissions.SliceAuthority;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class SliceClientPermissionsTest extends UiServiceTestCase {
+
+    @Test
+    public void testRemoveBasic() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+        Uri base = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("com.android.pkg.slices").build();
+
+        PkgUser testPkg = new PkgUser("other", 2);
+
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .build(), testPkg);
+        client.revokeUri(base.buildUpon()
+                .appendPath("first")
+                .build(), testPkg);
+
+        assertFalse(client.hasPermission(base.buildUpon()
+                .appendPath("first")
+                .appendPath("third")
+                .build(), testPkg.getUserId()));
+
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(client.getAuthorities());
+        assertEquals(0, authorities.get(0).getPaths().size());
+    }
+
+    @Test
+    public void testRemoveSubtrees() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+        Uri base = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("com.android.pkg.slices").build();
+
+        PkgUser testPkg = new PkgUser("other", 2);
+
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .appendPath("second")
+                .build(), testPkg);
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .appendPath("third")
+                .build(), testPkg);
+        client.revokeUri(base.buildUpon()
+                .appendPath("first")
+                .build(), testPkg);
+
+        assertFalse(client.hasPermission(base.buildUpon()
+                .appendPath("first")
+                .appendPath("fourth")
+                .build(), testPkg.getUserId()));
+
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(client.getAuthorities());
+        assertEquals(0, authorities.get(0).getPaths().size());
+    }
+
+    @Test
+    public void testAddConsolidate_addFirst() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+        Uri base = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("com.android.pkg.slices").build();
+
+        PkgUser testPkg = new PkgUser("other", 2);
+
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .build(), testPkg);
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .appendPath("second")
+                .build(), testPkg);
+
+        assertTrue(client.hasPermission(base.buildUpon()
+                .appendPath("first")
+                .appendPath("third")
+                .build(), testPkg.getUserId()));
+
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(client.getAuthorities());
+        assertEquals(1, authorities.get(0).getPaths().size());
+    }
+
+    @Test
+    public void testAddConsolidate_addSecond() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+        Uri base = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("com.android.pkg.slices").build();
+
+        PkgUser testPkg = new PkgUser("other", 2);
+
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .appendPath("second")
+                .build(), testPkg);
+        client.grantUri(base.buildUpon()
+                .appendPath("first")
+                .build(), testPkg);
+
+        assertTrue(client.hasPermission(base.buildUpon()
+                .appendPath("first")
+                .appendPath("third")
+                .build(), testPkg.getUserId()));
+
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(client.getAuthorities());
+        assertEquals(1, authorities.get(0).getPaths().size());
+    }
+
+    @Test
+    public void testDirty_addAuthority() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+
+        client.getOrCreateAuthority(new PkgUser("some_auth", 2), new PkgUser("com.pkg", 2));
+
+        verify(tracker).onPersistableDirty(eq(client));
+    }
+
+    @Test
+    public void testDirty_addPkg() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+
+        SliceAuthority auth = client.getOrCreateAuthority(
+                new PkgUser("some_auth", 2),
+                new PkgUser("com.pkg", 2));
+        clearInvocations(tracker);
+
+        auth.addPath(Arrays.asList("/something/"));
+
+        verify(tracker).onPersistableDirty(eq(client));
+    }
+
+    @Test
+    public void testCreation() {
+        SliceClientPermissions client = createClient();
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(client.getAuthorities());
+        authorities.sort(Comparator.comparing(SliceAuthority::getAuthority));
+
+        assertEquals(2, authorities.size());
+        assertEquals("com.android.pkg", authorities.get(0).getAuthority());
+        assertEquals("com.android.pkg.slices", authorities.get(1).getAuthority());
+
+        assertEquals(1, authorities.get(0).getPaths().size());
+        assertEquals(2, authorities.get(1).getPaths().size());
+    }
+
+    @Test
+    public void testSerialization() throws XmlPullParserException, IOException {
+        SliceClientPermissions client = createClient();
+        client.setHasFullAccess(true);
+
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
+        serializer.setOutput(output, Encoding.UTF_8.name());
+
+        client.writeTo(serializer);
+        serializer.flush();
+
+        ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
+        XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
+        parser.setInput(input, Encoding.UTF_8.name());
+
+        SliceClientPermissions deser = SliceClientPermissions.createFrom(parser,
+                mock(DirtyTracker.class));
+
+        assertEquivalent(client, deser);
+    }
+
+    private void assertEquivalent(SliceClientPermissions o1, SliceClientPermissions o2) {
+        assertEquals(o1.getPkg(), o2.getPkg());
+        ArrayList<SliceAuthority> a1 = new ArrayList<>(o1.getAuthorities());
+        ArrayList<SliceAuthority> a2 = new ArrayList<>(o2.getAuthorities());
+        a1.sort(Comparator.comparing(SliceAuthority::getAuthority));
+        a2.sort(Comparator.comparing(SliceAuthority::getAuthority));
+        assertEquals(a1, a2);
+    }
+
+    private static SliceClientPermissions createClient() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 2);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceClientPermissions client = new SliceClientPermissions(pkg, tracker);
+
+        SliceAuthority auth = client.getOrCreateAuthority(
+                new PkgUser("com.android.pkg.slices", 3),
+                new PkgUser("com.android.pkg", 3));
+        auth.addPath(Arrays.asList("/something/"));
+        auth.addPath(Arrays.asList("/something/else"));
+
+        auth = client.getOrCreateAuthority(
+                new PkgUser("com.android.pkg", 3),
+                new PkgUser("com.pkg", 1));
+        auth.addPath(Arrays.asList("/somewhere"));
+        return client;
+    }
+
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
new file mode 100644
index 0000000..5443e73
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SlicePermissionManagerTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.slice;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.net.Uri.Builder;
+import android.os.FileUtils;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+import android.testing.TestableLooper.RunWithLooper;
+import android.util.Log;
+import android.util.Xml.Encoding;
+
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class SlicePermissionManagerTest extends UiServiceTestCase {
+
+    @Test
+    public void testBackup() throws XmlPullParserException, IOException {
+        File sliceDir = new File(mContext.getDataDir(), "system/slices");
+        Uri uri = new Builder().scheme(ContentResolver.SCHEME_CONTENT)
+                .authority("authority")
+                .path("something").build();
+        SlicePermissionManager permissions = new SlicePermissionManager(mContext,
+                TestableLooper.get(this).getLooper(), sliceDir);
+
+        permissions.grantFullAccess("com.android.mypkg", 10);
+        permissions.grantSliceAccess("com.android.otherpkg", 0, "com.android.lastpkg", 1, uri);
+
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
+        serializer.setOutput(output, Encoding.UTF_8.name());
+
+
+        TestableLooper.get(this).processAllMessages();
+        permissions.writeBackup(serializer);
+        serializer.flush();
+
+        ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
+        XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
+        parser.setInput(input, Encoding.UTF_8.name());
+
+        permissions = new SlicePermissionManager(mContext,
+                TestableLooper.get(this).getLooper());
+        permissions.readRestore(parser);
+
+        assertTrue(permissions.hasFullAccess("com.android.mypkg", 10));
+        assertTrue(permissions.hasPermission("com.android.otherpkg", 0,
+                ContentProvider.maybeAddUserId(uri, 1)));
+        permissions.removePkg("com.android.lastpkg", 1);
+        assertFalse(permissions.hasPermission("com.android.otherpkg", 0,
+                ContentProvider.maybeAddUserId(uri, 1)));
+
+        // Cleanup.
+        assertTrue(FileUtils.deleteContentsAndDir(sliceDir));
+    }
+
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java
new file mode 100644
index 0000000..5775991
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceProviderPermissionsTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.slice;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.util.Xml.Encoding;
+
+import com.android.server.UiServiceTestCase;
+import com.android.server.slice.SlicePermissionManager.PkgUser;
+import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+import org.xmlpull.v1.XmlSerializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class SliceProviderPermissionsTest extends UiServiceTestCase {
+
+    @Test
+    public void testDirty_addAuthority() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
+
+        provider.getOrCreateAuthority("some_auth");
+
+        verify(tracker).onPersistableDirty(eq(provider));
+    }
+
+    @Test
+    public void testDirty_addPkg() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 0);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
+
+        SliceAuthority auth = provider.getOrCreateAuthority("some_auth");
+        clearInvocations(tracker);
+
+        auth.addPkg(new PkgUser("pkg", 0));
+
+        verify(tracker).onPersistableDirty(eq(provider));
+    }
+
+    @Test
+    public void testCreation() {
+        SliceProviderPermissions provider = createProvider();
+        ArrayList<SliceAuthority> authorities = new ArrayList<>(provider.getAuthorities());
+        authorities.sort(Comparator.comparing(SliceAuthority::getAuthority));
+
+        assertEquals(2, authorities.size());
+        assertEquals("com.android.pkg", authorities.get(0).getAuthority());
+        assertEquals("com.android.pkg.slices", authorities.get(1).getAuthority());
+
+        assertEquals(1, authorities.get(0).getPkgs().size());
+        assertEquals(2, authorities.get(1).getPkgs().size());
+    }
+
+    @Test
+    public void testSerialization() throws XmlPullParserException, IOException {
+        SliceProviderPermissions provider = createProvider();
+
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
+        serializer.setOutput(output, Encoding.UTF_8.name());
+
+        provider.writeTo(serializer);
+        serializer.flush();
+
+        ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
+        XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
+        parser.setInput(input, Encoding.UTF_8.name());
+
+        SliceProviderPermissions deser = SliceProviderPermissions.createFrom(parser,
+                mock(DirtyTracker.class));
+
+        assertEquivalent(provider, deser);
+    }
+
+    private void assertEquivalent(SliceProviderPermissions o1, SliceProviderPermissions o2) {
+        assertEquals(o1.getPkg(), o2.getPkg());
+        assertEquals(o1.getAuthorities(), o2.getAuthorities());
+    }
+
+    private static SliceProviderPermissions createProvider() {
+        PkgUser pkg = new PkgUser("com.android.pkg", 2);
+        DirtyTracker tracker = mock(DirtyTracker.class);
+        SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
+
+        SliceAuthority auth = provider.getOrCreateAuthority("com.android.pkg.slices");
+        auth.addPkg(new PkgUser("com.example.pkg", 0));
+        auth.addPkg(new PkgUser("example.pkg.com", 10));
+
+        auth = provider.getOrCreateAuthority("com.android.pkg");
+        auth.addPkg(new PkgUser("com.example.pkg", 2));
+        return provider;
+    }
+
+}
\ No newline at end of file
diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java
index b070e03..c914689 100644
--- a/services/usage/java/com/android/server/usage/IntervalStats.java
+++ b/services/usage/java/com/android/server/usage/IntervalStats.java
@@ -30,12 +30,10 @@
     public long beginTime;
     public long endTime;
     public long lastTimeSaved;
-    public long lastInteractiveTime;
-    public long lastNonInteractiveTime;
-    public long interactiveDuration;
-    public int interactiveCount;
-    public long nonInteractiveDuration;
-    public int nonInteractiveCount;
+    public final EventTracker interactiveTracker = new EventTracker();
+    public final EventTracker nonInteractiveTracker = new EventTracker();
+    public final EventTracker keyguardShownTracker = new EventTracker();
+    public final EventTracker keyguardHiddenTracker = new EventTracker();
     public final ArrayMap<String, UsageStats> packageStats = new ArrayMap<>();
     public final ArrayMap<Configuration, ConfigurationStats> configurations = new ArrayMap<>();
     public Configuration activeConfiguration;
@@ -47,6 +45,44 @@
     // strings that had identical copies in the cache.
     private final ArraySet<String> mStringCache = new ArraySet<>();
 
+    public static final class EventTracker {
+        public long curStartTime;
+        public long lastEventTime;
+        public long duration;
+        public int count;
+
+        public void commitTime(long timeStamp) {
+            if (curStartTime != 0) {
+                duration += timeStamp - duration;
+                curStartTime = 0;
+            }
+        }
+
+        public void update(long timeStamp) {
+            if (curStartTime == 0) {
+                // If we aren't already running, time to bump the count.
+                count++;
+            }
+            commitTime(timeStamp);
+            curStartTime = timeStamp;
+            lastEventTime = timeStamp;
+        }
+
+        void addToEventStats(List<EventStats> out, int event, long beginTime, long endTime) {
+            if (count != 0 || duration != 0) {
+                EventStats ev = new EventStats();
+                ev.mEventType = event;
+                ev.mCount = count;
+                ev.mTotalTime = duration;
+                ev.mLastEventTime = lastEventTime;
+                ev.mBeginTimeStamp = beginTime;
+                ev.mEndTimeStamp = endTime;
+                out.add(ev);
+            }
+        }
+
+    }
+
     /**
      * Gets the UsageStats object for the given package, or creates one and adds it internally.
      */
@@ -180,58 +216,42 @@
         usageStats.mAppLaunchCount += 1;
     }
 
-    private void commitInteractiveTime(long timeStamp) {
-        if (lastInteractiveTime != 0) {
-            interactiveDuration += timeStamp - lastInteractiveTime;
-            lastInteractiveTime = 0;
-        }
-        if (lastNonInteractiveTime != 0) {
-            nonInteractiveDuration += timeStamp - lastNonInteractiveTime;
-            lastNonInteractiveTime = 0;
-        }
-    }
-
     void commitTime(long timeStamp) {
-        commitInteractiveTime(timeStamp);
+        interactiveTracker.commitTime(timeStamp);
+        nonInteractiveTracker.commitTime(timeStamp);
+        keyguardShownTracker.commitTime(timeStamp);
+        keyguardHiddenTracker.commitTime(timeStamp);
     }
 
     void updateScreenInteractive(long timeStamp) {
-        if (lastInteractiveTime != 0) {
-            // Already interactive, just keep running.
-            return;
-        }
-        commitInteractiveTime(timeStamp);
-        lastInteractiveTime = timeStamp;
-        interactiveCount++;
+        interactiveTracker.update(timeStamp);
+        nonInteractiveTracker.commitTime(timeStamp);
     }
 
     void updateScreenNonInteractive(long timeStamp) {
-        if (lastNonInteractiveTime != 0) {
-            // Already non-interactive, just keep running.
-            return;
-        }
-        commitInteractiveTime(timeStamp);
-        lastNonInteractiveTime = timeStamp;
-        nonInteractiveCount++;
+        nonInteractiveTracker.update(timeStamp);
+        interactiveTracker.commitTime(timeStamp);
     }
 
-    private void addOneEventStats(List<EventStats> out, int event, int count, long duration) {
-        if (count != 0 || duration != 0) {
-            EventStats ev = new EventStats();
-            ev.mEventType = event;
-            ev.mCount = count;
-            ev.mTotalTime = duration;
-            ev.mBeginTimeStamp = beginTime;
-            ev.mEndTimeStamp = endTime;
-            out.add(ev);
-        }
+    void updateKeyguardShown(long timeStamp) {
+        keyguardShownTracker.update(timeStamp);
+        keyguardHiddenTracker.commitTime(timeStamp);
+    }
+
+    void updateKeyguardHidden(long timeStamp) {
+        keyguardHiddenTracker.update(timeStamp);
+        keyguardShownTracker.commitTime(timeStamp);
     }
 
     void addEventStatsTo(List<EventStats> out) {
-        addOneEventStats(out, UsageEvents.Event.SCREEN_INTERACTIVE, interactiveCount,
-                interactiveDuration);
-        addOneEventStats(out, UsageEvents.Event.SCREEN_NON_INTERACTIVE, nonInteractiveCount,
-                nonInteractiveDuration);
+        interactiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_INTERACTIVE,
+                beginTime, endTime);
+        nonInteractiveTracker.addToEventStats(out, UsageEvents.Event.SCREEN_NON_INTERACTIVE,
+                beginTime, endTime);
+        keyguardShownTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_SHOWN,
+                beginTime, endTime);
+        keyguardHiddenTracker.addToEventStats(out, UsageEvents.Event.KEYGUARD_HIDDEN,
+                beginTime, endTime);
     }
 
     private String getCachedStringRef(String str) {
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index 2287b27..fe3a884 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -40,6 +40,8 @@
 
     private static final String INTERACTIVE_TAG = "interactive";
     private static final String NON_INTERACTIVE_TAG = "non-interactive";
+    private static final String KEYGUARD_SHOWN_TAG = "keyguard-shown";
+    private static final String KEYGUARD_HIDDEN_TAG = "keyguard-hidden";
 
     private static final String PACKAGES_TAG = "packages";
     private static final String PACKAGE_TAG = "package";
@@ -103,12 +105,12 @@
         }
     }
 
-    private static Pair<Integer, Long> loadCountAndTime(XmlPullParser parser)
+    private static void loadCountAndTime(XmlPullParser parser,
+            IntervalStats.EventTracker tracker)
             throws IOException, XmlPullParserException {
-        int count = XmlUtils.readIntAttribute(parser, COUNT_ATTR, 0);
-        long time = XmlUtils.readLongAttribute(parser, TIME_ATTR, 0);
+        tracker.count = XmlUtils.readIntAttribute(parser, COUNT_ATTR, 0);
+        tracker.duration = XmlUtils.readLongAttribute(parser, TIME_ATTR, 0);
         XmlUtils.skipCurrentTag(parser);
-        return new Pair<>(count, time);
     }
 
     private static void loadChooserCounts(
@@ -340,17 +342,21 @@
 
             final String tag = parser.getName();
             switch (tag) {
-                case INTERACTIVE_TAG: {
-                    Pair<Integer, Long> result = loadCountAndTime(parser);
-                    statsOut.interactiveCount = result.first;
-                    statsOut.interactiveDuration = result.second;
-                } break;
+                case INTERACTIVE_TAG:
+                    loadCountAndTime(parser, statsOut.interactiveTracker);
+                    break;
 
-                case NON_INTERACTIVE_TAG: {
-                    Pair<Integer, Long> result = loadCountAndTime(parser);
-                    statsOut.nonInteractiveCount = result.first;
-                    statsOut.nonInteractiveDuration = result.second;
-                } break;
+                case NON_INTERACTIVE_TAG:
+                    loadCountAndTime(parser, statsOut.nonInteractiveTracker);
+                    break;
+
+                case KEYGUARD_SHOWN_TAG:
+                    loadCountAndTime(parser, statsOut.keyguardShownTracker);
+                    break;
+
+                case KEYGUARD_HIDDEN_TAG:
+                    loadCountAndTime(parser, statsOut.keyguardHiddenTracker);
+                    break;
 
                 case PACKAGE_TAG:
                     loadUsageStats(parser, statsOut);
@@ -378,10 +384,14 @@
     public static void write(XmlSerializer xml, IntervalStats stats) throws IOException {
         XmlUtils.writeLongAttribute(xml, END_TIME_ATTR, stats.endTime - stats.beginTime);
 
-        writeCountAndTime(xml, INTERACTIVE_TAG, stats.interactiveCount, stats.interactiveDuration);
-
-        writeCountAndTime(xml, NON_INTERACTIVE_TAG, stats.nonInteractiveCount,
-                stats.nonInteractiveDuration);
+        writeCountAndTime(xml, INTERACTIVE_TAG, stats.interactiveTracker.count,
+                stats.interactiveTracker.duration);
+        writeCountAndTime(xml, NON_INTERACTIVE_TAG, stats.nonInteractiveTracker.count,
+                stats.nonInteractiveTracker.duration);
+        writeCountAndTime(xml, KEYGUARD_SHOWN_TAG, stats.keyguardShownTracker.count,
+                stats.keyguardShownTracker.duration);
+        writeCountAndTime(xml, KEYGUARD_HIDDEN_TAG, stats.keyguardHiddenTracker.count,
+                stats.keyguardHiddenTracker.duration);
 
         xml.startTag(null, PACKAGES_TAG);
         final int statsCount = stats.packageStats.size();
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 6ad374b..d9fc066 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -211,6 +211,12 @@
                 case UsageEvents.Event.SCREEN_NON_INTERACTIVE: {
                     stats.updateScreenNonInteractive(event.mTimeStamp);
                 } break;
+                case UsageEvents.Event.KEYGUARD_SHOWN: {
+                    stats.updateKeyguardShown(event.mTimeStamp);
+                } break;
+                case UsageEvents.Event.KEYGUARD_HIDDEN: {
+                    stats.updateKeyguardHidden(event.mTimeStamp);
+                } break;
                 default: {
                     stats.update(event.mPackage, event.mTimeStamp, event.mEventType);
                     if (incrementAppLaunch) {
@@ -665,14 +671,19 @@
         }
     }
 
-    void printEventAggregation(IndentingPrintWriter pw, String label, int count, long duration,
-            boolean prettyDates) {
-        if (count != 0 || duration != 0) {
+    void printEventAggregation(IndentingPrintWriter pw, String label,
+            IntervalStats.EventTracker tracker, boolean prettyDates) {
+        if (tracker.count != 0 || tracker.duration != 0) {
             pw.print(label);
             pw.print(": ");
-            pw.print(count);
+            pw.print(tracker.count);
             pw.print("x for ");
-            pw.print(formatElapsedTime(duration, prettyDates));
+            pw.print(formatElapsedTime(tracker.duration, prettyDates));
+            if (tracker.curStartTime != 0) {
+                pw.print(" (now running, started at ");
+                formatDateTime(tracker.curStartTime, prettyDates);
+                pw.print(")");
+            }
             pw.println();
         }
     }
@@ -752,10 +763,14 @@
             pw.decreaseIndent();
             pw.println("event aggregations");
             pw.increaseIndent();
-            printEventAggregation(pw, "screen-interactive", stats.interactiveCount,
-                    stats.interactiveDuration, prettyDates);
-            printEventAggregation(pw, "screen-non-interactive", stats.nonInteractiveCount,
-                    stats.nonInteractiveDuration, prettyDates);
+            printEventAggregation(pw, "screen-interactive", stats.interactiveTracker,
+                    prettyDates);
+            printEventAggregation(pw, "screen-non-interactive", stats.nonInteractiveTracker,
+                    prettyDates);
+            printEventAggregation(pw, "keyguard-shown", stats.keyguardShownTracker,
+                    prettyDates);
+            printEventAggregation(pw, "keyguard-hidden", stats.keyguardHiddenTracker,
+                    prettyDates);
             pw.decreaseIndent();
         }
 
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 36333e4..3bf951d 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -2600,7 +2600,6 @@
     }
 
     /**
-     *
      * Request audio routing to a specific bluetooth device. Calling this method may result in
      * the device routing audio to a different bluetooth device than the one specified if the
      * bluetooth stack is unable to route audio to the requested device.
@@ -2611,13 +2610,13 @@
      * Used by self-managed {@link ConnectionService}s which wish to use bluetooth audio for a
      * self-managed {@link Connection} (see {@link PhoneAccount#CAPABILITY_SELF_MANAGED}.)
      * <p>
-     * See also {@link InCallService#requestBluetoothAudio(String)}
-     * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
-     *                         {@link BluetoothDevice#getAddress()}.
+     * See also {@link InCallService#requestBluetoothAudio(BluetoothDevice)}
+     * @param bluetoothDevice The bluetooth device to connect to.
      */
-    public void requestBluetoothAudio(@NonNull String bluetoothAddress) {
+    public void requestBluetoothAudio(@NonNull BluetoothDevice bluetoothDevice) {
         for (Listener l : mListeners) {
-            l.onAudioRouteChanged(this, CallAudioState.ROUTE_BLUETOOTH, bluetoothAddress);
+            l.onAudioRouteChanged(this, CallAudioState.ROUTE_BLUETOOTH,
+                    bluetoothDevice.getAddress());
         }
     }
 
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index af65c65..bd25ab2 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -428,12 +428,11 @@
      * A list of available devices can be obtained via
      * {@link CallAudioState#getSupportedBluetoothDevices()}
      *
-     * @param bluetoothAddress The address of the bluetooth device to connect to, as returned by
-     *                         {@link BluetoothDevice#getAddress()}.
+     * @param bluetoothDevice The bluetooth device to connect to.
      */
-    public final void requestBluetoothAudio(@NonNull String bluetoothAddress) {
+    public final void requestBluetoothAudio(@NonNull BluetoothDevice bluetoothDevice) {
         if (mPhone != null) {
-            mPhone.requestBluetoothAudio(bluetoothAddress);
+            mPhone.requestBluetoothAudio(bluetoothDevice.getAddress());
         }
     }
 
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 95eb14a..b3a3bf2 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -129,6 +129,9 @@
      * <p>
      * By default, Self-Managed {@link PhoneAccount}s do not log their calls to the call log.
      * Setting this extra to {@code true} provides a means for them to log their calls.
+     * <p>
+     * Note: Only calls where the {@link Call.Details#getHandle()} {@link Uri#getScheme()} is
+     * {@link #SCHEME_SIP} or {@link #SCHEME_TEL} will be logged at the current time.
      */
     public static final String EXTRA_LOG_SELF_MANAGED_CALLS =
             "android.telecom.extra.LOG_SELF_MANAGED_CALLS";
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 4683161..aa76eab 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1954,7 +1954,7 @@
         sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false);
         sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false);
         sDefaults.putBoolean(KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL, false);
-        sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
+        sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
         sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true);
         sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false);
         sDefaults.putBoolean(KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL, false);
@@ -2187,7 +2187,7 @@
         sDefaults.putStringArray(KEY_FILTERED_CNAP_NAMES_STRING_ARRAY, null);
         sDefaults.putBoolean(KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false);
         sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false);
-        sDefaults.putBoolean(KEY_PERSIST_LPP_MODE_BOOL, false);
+        sDefaults.putBoolean(KEY_PERSIST_LPP_MODE_BOOL, true);
         sDefaults.putStringArray(KEY_CARRIER_WIFI_STRING_ARRAY, null);
         sDefaults.putInt(KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT, -1);
         sDefaults.putInt(KEY_EMERGENCY_NOTIFICATION_DELAY_INT, -1);
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index 35682a7..f7e6840 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -206,8 +206,10 @@
         }
     }
 
-    /** @hide */
-    protected NetworkService() {
+    /**
+     * Default constructor.
+     */
+    public NetworkService() {
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
 
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index e971d08..fa7988d 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -977,11 +977,13 @@
     }
 
     /** @hide */
+    @TestApi
     public void setCellBandwidths(int[] bandwidths) {
         mCellBandwidths = bandwidths;
     }
 
     /** @hide */
+    @TestApi
     public void setChannelNumber(int channelNumber) {
         mChannelNumber = channelNumber;
     }
@@ -1172,6 +1174,7 @@
     }
 
     /** @hide */
+    @TestApi
     public void setRilVoiceRadioTechnology(int rt) {
         if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) {
             rt = RIL_RADIO_TECHNOLOGY_LTE;
@@ -1181,6 +1184,7 @@
     }
 
     /** @hide */
+    @TestApi
     public void setRilDataRadioTechnology(int rt) {
         if (rt == RIL_RADIO_TECHNOLOGY_LTE_CA) {
             rt = RIL_RADIO_TECHNOLOGY_LTE;
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 7664b94..a9389be 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -477,6 +477,9 @@
      * <p>
      * Contains {@link #EXTRA_SUBSCRIPTION_INDEX} to indicate which subscription
      * the user is interested in.
+     * <p>
+     * Receivers should protect themselves by checking that the sender holds the
+     * {@code android.permission.MANAGE_SUBSCRIPTION_PLANS} permission.
      */
     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
     @SystemApi
@@ -505,7 +508,7 @@
     public static final String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX";
 
     private final Context mContext;
-    private INetworkPolicyManager mNetworkPolicy;
+    private volatile INetworkPolicyManager mNetworkPolicy;
 
     /**
      * A listener class for monitoring changes to {@link SubscriptionInfo} records.
@@ -1719,6 +1722,8 @@
      * </ul>
      *
      * @param subId the subscriber this relationship applies to
+     * @throws SecurityException if the caller doesn't meet the requirements
+     *             outlined above.
      */
     @SystemApi
     public @NonNull List<SubscriptionPlan> getSubscriptionPlans(int subId) {
@@ -1744,10 +1749,13 @@
      * {@link CarrierConfigManager#KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING}.
      * </ul>
      *
-     * @param subId the subscriber this relationship applies to
+     * @param subId the subscriber this relationship applies to. An empty list
+     *            may be sent to clear any existing plans.
      * @param plans the list of plans. The first plan is always the primary and
      *            most important plan. Any additional plans are secondary and
      *            may not be displayed or used by decision making logic.
+     * @throws SecurityException if the caller doesn't meet the requirements
+     *             outlined above.
      */
     @SystemApi
     public void setSubscriptionPlans(int subId, @NonNull List<SubscriptionPlan> plans) {
@@ -1788,13 +1796,15 @@
      *            be automatically cleared, or {@code 0} to leave in the
      *            requested state until explicitly cleared, or the next reboot,
      *            whichever happens first.
+     * @throws SecurityException if the caller doesn't meet the requirements
+     *             outlined above.
      */
     @SystemApi
     public void setSubscriptionOverrideUnmetered(int subId, boolean overrideUnmetered,
             @DurationMillisLong long timeoutMillis) {
         try {
             final int overrideValue = overrideUnmetered ? OVERRIDE_UNMETERED : 0;
-            mNetworkPolicy.setSubscriptionOverride(subId, OVERRIDE_UNMETERED, overrideValue,
+            getNetworkPolicy().setSubscriptionOverride(subId, OVERRIDE_UNMETERED, overrideValue,
                     timeoutMillis, mContext.getOpPackageName());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -1822,13 +1832,15 @@
      *            be automatically cleared, or {@code 0} to leave in the
      *            requested state until explicitly cleared, or the next reboot,
      *            whichever happens first.
+     * @throws SecurityException if the caller doesn't meet the requirements
+     *             outlined above.
      */
     @SystemApi
     public void setSubscriptionOverrideCongested(int subId, boolean overrideCongested,
             @DurationMillisLong long timeoutMillis) {
         try {
             final int overrideValue = overrideCongested ? OVERRIDE_CONGESTED : 0;
-            mNetworkPolicy.setSubscriptionOverride(subId, OVERRIDE_CONGESTED, overrideValue,
+            getNetworkPolicy().setSubscriptionOverride(subId, OVERRIDE_CONGESTED, overrideValue,
                     timeoutMillis, mContext.getOpPackageName());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
diff --git a/telephony/java/android/telephony/SubscriptionPlan.java b/telephony/java/android/telephony/SubscriptionPlan.java
index 9411652..ef2a364 100644
--- a/telephony/java/android/telephony/SubscriptionPlan.java
+++ b/telephony/java/android/telephony/SubscriptionPlan.java
@@ -24,7 +24,7 @@
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.util.Pair;
+import android.util.Range;
 import android.util.RecurrenceRule;
 
 import com.android.internal.util.Preconditions;
@@ -34,6 +34,7 @@
 import java.time.Period;
 import java.time.ZonedDateTime;
 import java.util.Iterator;
+import java.util.Objects;
 
 /**
  * Description of a billing relationship plan between a carrier and a specific
@@ -124,6 +125,27 @@
                 .append("}").toString();
     }
 
+    @Override
+    public int hashCode() {
+        return Objects.hash(cycleRule, title, summary, dataLimitBytes, dataLimitBehavior,
+                dataUsageBytes, dataUsageTime);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof SubscriptionPlan) {
+            final SubscriptionPlan other = (SubscriptionPlan) obj;
+            return Objects.equals(cycleRule, other.cycleRule)
+                    && Objects.equals(title, other.title)
+                    && Objects.equals(summary, other.summary)
+                    && dataLimitBytes == other.dataLimitBytes
+                    && dataLimitBehavior == other.dataLimitBehavior
+                    && dataUsageBytes == other.dataUsageBytes
+                    && dataUsageTime == other.dataUsageTime;
+        }
+        return false;
+    }
+
     public static final Parcelable.Creator<SubscriptionPlan> CREATOR = new Parcelable.Creator<SubscriptionPlan>() {
         @Override
         public SubscriptionPlan createFromParcel(Parcel source) {
@@ -187,7 +209,7 @@
      * any recurrence rules. The iterator starts from the currently active cycle
      * and walks backwards through time.
      */
-    public Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator() {
+    public Iterator<Range<ZonedDateTime>> cycleIterator() {
         return cycleRule.cycleIterator();
     }
 
@@ -205,6 +227,9 @@
         /**
          * Start defining a {@link SubscriptionPlan} that covers a very specific
          * window of time, and never automatically recurs.
+         *
+         * @param start The exact time at which the plan starts.
+         * @param end The exact time at which the plan ends.
          */
         public static Builder createNonrecurring(ZonedDateTime start, ZonedDateTime end) {
             if (!end.isAfter(start)) {
@@ -215,28 +240,40 @@
         }
 
         /**
-         * Start defining a {@link SubscriptionPlan} that will recur
-         * automatically every month. It will always recur on the same day of a
-         * particular month. When a particular month ends before the defined
-         * recurrence day, the plan will recur on the last instant of that
-         * month.
+         * Start defining a {@link SubscriptionPlan} that starts at a specific
+         * time, and automatically recurs after each specific period of time,
+         * repeating indefinitely.
+         * <p>
+         * When the given period is set to exactly one month, the plan will
+         * always recur on the day of the month defined by
+         * {@link ZonedDateTime#getDayOfMonth()}. When a particular month ends
+         * before this day, the plan will recur on the last possible instant of
+         * that month.
+         *
+         * @param start The exact time at which the plan starts.
+         * @param period The period after which the plan automatically recurs.
          */
+        public static Builder createRecurring(ZonedDateTime start, Period period) {
+            return new Builder(start, null, period);
+        }
+
+        /** {@hide} */
+        @SystemApi
+        @Deprecated
         public static Builder createRecurringMonthly(ZonedDateTime start) {
             return new Builder(start, null, Period.ofMonths(1));
         }
 
-        /**
-         * Start defining a {@link SubscriptionPlan} that will recur
-         * automatically every week.
-         */
+        /** {@hide} */
+        @SystemApi
+        @Deprecated
         public static Builder createRecurringWeekly(ZonedDateTime start) {
             return new Builder(start, null, Period.ofDays(7));
         }
 
-        /**
-         * Start defining a {@link SubscriptionPlan} that will recur
-         * automatically every day.
-         */
+        /** {@hide} */
+        @SystemApi
+        @Deprecated
         public static Builder createRecurringDaily(ZonedDateTime start) {
             return new Builder(start, null, Period.ofDays(1));
         }
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 15e0632..e15d35b 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -27,6 +27,7 @@
 import android.annotation.SuppressLint;
 import android.annotation.SystemApi;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.annotation.WorkerThread;
 import android.app.ActivityThread;
 import android.app.PendingIntent;
@@ -1067,6 +1068,13 @@
     public static final int UNKNOWN_CARRIER_ID = -1;
 
     /**
+     * An unknown carrier id list version.
+     * @hide
+     */
+    @TestApi
+    public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1;
+
+    /**
      * Broadcast Action: The subscription carrier identity has changed.
      * This intent could be sent on the following events:
      * <ul>
@@ -7808,4 +7816,49 @@
             }
         }
     }
+
+    /**
+     * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2,
+     * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config
+     * (also any country or carrier overlays) to be loaded when using a test SIM with a call box.
+     *
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+     *
+     * @hide
+     */
+    @TestApi
+    public void setCarrierTestOverride(String mccmnc, String imsi, String iccid, String gid1,
+            String gid2, String plmn, String spn) {
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                telephony.setCarrierTestOverride(
+                        getSubId(), mccmnc, imsi, iccid, gid1, gid2, plmn, spn);
+            }
+        } catch (RemoteException ex) {
+            // This could happen if binder process crashes.
+        }
+    }
+
+    /**
+     * A test API to return installed carrier id list version
+     *
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE}
+     *
+     * @hide
+     */
+    @TestApi
+    public int getCarrierIdListVersion() {
+        try {
+            ITelephony telephony = getITelephony();
+            if (telephony != null) {
+                return telephony.getCarrierIdListVersion(getSubId());
+            }
+        } catch (RemoteException ex) {
+            // This could happen if binder process crashes.
+        }
+        return UNKNOWN_CARRIER_ID_LIST_VERSION;
+    }
 }
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index e8c1cb1..4ca5ce3 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -429,8 +429,10 @@
         }
     }
 
-    /** @hide */
-    protected DataService() {
+    /**
+     * Default constructor.
+     */
+    public DataService() {
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
 
diff --git a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java
index 2f52c0a..dfb6e2c 100644
--- a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java
+++ b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java
@@ -77,6 +77,11 @@
             result = 31 * result + featureType;
             return result;
         }
+
+        @Override
+        public String toString() {
+            return "{s=" + slotId + ", f=" + featureType + "}";
+        }
     }
 
     /**
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index fbb69ad..7e8b2de 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -829,6 +829,16 @@
     boolean isResolvingImsBinding();
 
     /**
+    *  @return true if the ImsService to bind to for the slot id specified was set, false otherwise.
+    */
+    boolean setImsService(int slotId, boolean isCarrierImsService, String packageName);
+
+    /**
+    * @return the package name of the carrier/device ImsService associated with this slot.
+    */
+    String getImsService(int slotId, boolean isCarrierImsService);
+
+    /**
      * Set the network selection mode to automatic.
      *
      * @param subId the id of the subscription to update.
@@ -1486,4 +1496,17 @@
      * screen is off) we want to turn on those indications even when the screen is off.
      */
     void setRadioIndicationUpdateMode(int subId, int filters, int mode);
+
+    /**
+     * A test API to override carrier information including mccmnc, imsi, iccid, gid1, gid2,
+     * plmn and spn. This would be handy for, eg, forcing a particular carrier id, carrier's config
+     * (also any country or carrier overlays) to be loaded when using a test SIM with a call box.
+     */
+    void setCarrierTestOverride(int subId, String mccmnc, String imsi, String iccid, String gid1,
+            String gid2, String plmn, String spn);
+
+    /**
+     * A test API to return installed carrier id list version.
+     */
+    int getCarrierIdListVersion(int subId);
 }
diff --git a/tests/DexLoggerIntegrationTests/AndroidTest.xml b/tests/DexLoggerIntegrationTests/AndroidTest.xml
index 8ed19f8..fb1bef6 100644
--- a/tests/DexLoggerIntegrationTests/AndroidTest.xml
+++ b/tests/DexLoggerIntegrationTests/AndroidTest.xml
@@ -25,5 +25,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest">
         <option name="package" value="com.android.frameworks.dexloggertest"/>
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/tests/UsbTests/AndroidTest.xml b/tests/UsbTests/AndroidTest.xml
index 0b623fb..4affad3 100644
--- a/tests/UsbTests/AndroidTest.xml
+++ b/tests/UsbTests/AndroidTest.xml
@@ -25,5 +25,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest">
         <option name="package" value="com.android.server.usb"/>
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/>
+        <option name="hidden-api-checks" value="false"/>
     </test>
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/tests/net/AndroidTest.xml b/tests/net/AndroidTest.xml
index f8ecc6b..6e020a3 100644
--- a/tests/net/AndroidTest.xml
+++ b/tests/net/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="com.android.frameworks.tests.net" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/tests/net/java/android/net/IpSecManagerTest.java b/tests/net/java/android/net/IpSecManagerTest.java
index 970596d..8160924 100644
--- a/tests/net/java/android/net/IpSecManagerTest.java
+++ b/tests/net/java/android/net/IpSecManagerTest.java
@@ -30,6 +30,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.test.mock.MockContext;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 import android.system.Os;
@@ -37,6 +38,7 @@
 import com.android.server.IpSecService;
 
 import java.net.InetAddress;
+import java.net.Socket;
 import java.net.UnknownHostException;
 
 import org.junit.Before;
@@ -69,11 +71,17 @@
 
     private IpSecService mMockIpSecService;
     private IpSecManager mIpSecManager;
+    private MockContext mMockContext = new MockContext() {
+        @Override
+        public String getOpPackageName() {
+            return "fooPackage";
+        }
+    };
 
     @Before
     public void setUp() throws Exception {
         mMockIpSecService = mock(IpSecService.class);
-        mIpSecManager = new IpSecManager(mMockIpSecService);
+        mIpSecManager = new IpSecManager(mMockContext, mMockIpSecService);
     }
 
     /*
@@ -188,6 +196,33 @@
     }
 
     @Test
+    public void testApplyTransportModeTransformEnsuresSocketCreation() throws Exception {
+        Socket socket = new Socket();
+        IpSecConfig dummyConfig = new IpSecConfig();
+        IpSecTransform dummyTransform = new IpSecTransform(null, dummyConfig);
+
+        // Even if underlying SocketImpl is not initalized, this should force the init, and
+        // thereby succeed.
+        mIpSecManager.applyTransportModeTransform(
+                socket, IpSecManager.DIRECTION_IN, dummyTransform);
+
+        // Check to make sure the FileDescriptor is non-null
+        assertNotNull(socket.getFileDescriptor$());
+    }
+
+    @Test
+    public void testRemoveTransportModeTransformsForcesSocketCreation() throws Exception {
+        Socket socket = new Socket();
+
+        // Even if underlying SocketImpl is not initalized, this should force the init, and
+        // thereby succeed.
+        mIpSecManager.removeTransportModeTransforms(socket);
+
+        // Check to make sure the FileDescriptor is non-null
+        assertNotNull(socket.getFileDescriptor$());
+    }
+
+    @Test
     public void testOpenEncapsulationSocketOnRandomPort() throws Exception {
         IpSecUdpEncapResponse udpEncapResp =
                 new IpSecUdpEncapResponse(
@@ -227,7 +262,7 @@
                 new IpSecTunnelInterfaceResponse(IpSecManager.Status.OK, resourceId, intfName);
         when(mMockIpSecService.createTunnelInterface(
                 eq(VTI_LOCAL_ADDRESS.getHostAddress()), eq(GOOGLE_DNS_4.getHostAddress()),
-                anyObject(), anyObject()))
+                anyObject(), anyObject(), anyString()))
                         .thenReturn(dummyResponse);
 
         IpSecManager.IpSecTunnelInterface tunnelIntf = mIpSecManager.createIpSecTunnelInterface(
@@ -245,7 +280,7 @@
         assertEquals(VTI_INTF_NAME, tunnelIntf.getInterfaceName());
 
         tunnelIntf.close();
-        verify(mMockIpSecService).deleteTunnelInterface(eq(DUMMY_RESOURCE_ID));
+        verify(mMockIpSecService).deleteTunnelInterface(eq(DUMMY_RESOURCE_ID), anyString());
     }
 
     @Test
@@ -253,12 +288,16 @@
         IpSecManager.IpSecTunnelInterface tunnelIntf =
                 createAndValidateVti(DUMMY_RESOURCE_ID, VTI_INTF_NAME);
 
-        tunnelIntf.addAddress(VTI_INNER_ADDRESS);
+        tunnelIntf.addAddress(VTI_INNER_ADDRESS.getAddress(),
+                VTI_INNER_ADDRESS.getPrefixLength());
         verify(mMockIpSecService)
-                .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+                .addAddressToTunnelInterface(
+                        eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS), anyString());
 
-        tunnelIntf.removeAddress(VTI_INNER_ADDRESS);
+        tunnelIntf.removeAddress(VTI_INNER_ADDRESS.getAddress(),
+                VTI_INNER_ADDRESS.getPrefixLength());
         verify(mMockIpSecService)
-                .addAddressToTunnelInterface(eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS));
+                .addAddressToTunnelInterface(
+                        eq(DUMMY_RESOURCE_ID), eq(VTI_INNER_ADDRESS), anyString());
     }
-}
\ No newline at end of file
+}
diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java
index 941c94d..cdb4307 100644
--- a/tests/net/java/android/net/NetworkCapabilitiesTest.java
+++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java
@@ -264,14 +264,28 @@
     @Test
     public void testOemPaid() {
         NetworkCapabilities nc = new NetworkCapabilities();
-        nc.maybeMarkCapabilitiesRestricted();
+        // By default OEM_PAID is neither in the unwanted or required lists and the network is not
+        // restricted.
+        assertFalse(nc.hasUnwantedCapability(NET_CAPABILITY_OEM_PAID));
         assertFalse(nc.hasCapability(NET_CAPABILITY_OEM_PAID));
+        nc.maybeMarkCapabilitiesRestricted();
         assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
 
+        // Adding OEM_PAID to capability list should make network restricted.
         nc.addCapability(NET_CAPABILITY_OEM_PAID);
+        nc.addCapability(NET_CAPABILITY_INTERNET);  // Combine with unrestricted capability.
         nc.maybeMarkCapabilitiesRestricted();
         assertTrue(nc.hasCapability(NET_CAPABILITY_OEM_PAID));
         assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED));
+
+        // Now let's make request for OEM_PAID network.
+        NetworkCapabilities nr = new NetworkCapabilities();
+        nr.addCapability(NET_CAPABILITY_OEM_PAID);
+        nr.maybeMarkCapabilitiesRestricted();
+        assertTrue(nr.satisfiedByNetworkCapabilities(nc));
+
+        // Request fails for network with the default capabilities.
+        assertFalse(nr.satisfiedByNetworkCapabilities(new NetworkCapabilities()));
     }
 
     @Test
@@ -286,7 +300,8 @@
         request.addUnwantedCapability(NET_CAPABILITY_WIFI_P2P);
         request.addUnwantedCapability(NET_CAPABILITY_NOT_METERED);
         assertTrue(request.satisfiedByNetworkCapabilities(network));
-        assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, NET_CAPABILITY_NOT_METERED},
+        assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P,
+                        NET_CAPABILITY_NOT_METERED},
                 request.getUnwantedCapabilities());
 
         // This is a default capability, just want to make sure its there because we use it below.
diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java
index 0530a86..8f18d07 100644
--- a/tests/net/java/android/net/NetworkStatsTest.java
+++ b/tests/net/java/android/net/NetworkStatsTest.java
@@ -39,8 +39,10 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import android.os.Process;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.test.filters.SmallTest;
+import android.util.ArrayMap;
 
 import com.google.android.collect.Sets;
 
@@ -773,6 +775,88 @@
         assertEquals(entry2, stats.getValues(1, null));
     }
 
+    @Test
+    public void testApply464xlatAdjustments() {
+        final String v4Iface = "v4-wlan0";
+        final String baseIface = "wlan0";
+        final String otherIface = "other";
+        final int appUid = 10001;
+        final int rootUid = Process.ROOT_UID;
+        ArrayMap<String, String> stackedIface = new ArrayMap<>();
+        stackedIface.put(v4Iface, baseIface);
+
+        NetworkStats.Entry otherEntry = new NetworkStats.Entry(
+                otherIface, appUid, SET_DEFAULT, TAG_NONE,
+                2600  /* rxBytes */,
+                2 /* rxPackets */,
+                3800 /* txBytes */,
+                3 /* txPackets */,
+                0 /* operations */);
+
+        NetworkStats stats = new NetworkStats(TEST_START, 3)
+                .addValues(v4Iface, appUid, SET_DEFAULT, TAG_NONE,
+                        30501490  /* rxBytes */,
+                        22401 /* rxPackets */,
+                        876235 /* txBytes */,
+                        13805 /* txPackets */,
+                        0 /* operations */)
+                .addValues(baseIface, rootUid, SET_DEFAULT, TAG_NONE,
+                        31113087,
+                        22588,
+                        1169942,
+                        13902,
+                        0)
+                .addValues(otherEntry);
+
+        stats.apply464xlatAdjustments(stackedIface);
+
+        assertEquals(3, stats.size());
+        assertValues(stats, 0, v4Iface, appUid, SET_DEFAULT, TAG_NONE,
+                METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+                30949510,
+                22401,
+                1152335,
+                13805,
+                0);
+        assertValues(stats, 1, baseIface, 0, SET_DEFAULT, TAG_NONE,
+                METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO,
+                163577,
+                187,
+                17607,
+                97,
+                0);
+        assertEquals(otherEntry, stats.getValues(2, null));
+    }
+
+    @Test
+    public void testApply464xlatAdjustments_noStackedIface() {
+        NetworkStats.Entry firstEntry = new NetworkStats.Entry(
+                "if1", 10002, SET_DEFAULT, TAG_NONE,
+                2600  /* rxBytes */,
+                2 /* rxPackets */,
+                3800 /* txBytes */,
+                3 /* txPackets */,
+                0 /* operations */);
+        NetworkStats.Entry secondEntry = new NetworkStats.Entry(
+                "if2", 10002, SET_DEFAULT, TAG_NONE,
+                5000  /* rxBytes */,
+                3 /* rxPackets */,
+                6000 /* txBytes */,
+                4 /* txPackets */,
+                0 /* operations */);
+
+        NetworkStats stats = new NetworkStats(TEST_START, 2)
+                .addValues(firstEntry)
+                .addValues(secondEntry);
+
+        // Empty map: no adjustment
+        stats.apply464xlatAdjustments(new ArrayMap<>());
+
+        assertEquals(2, stats.size());
+        assertEquals(firstEntry, stats.getValues(0, null));
+        assertEquals(secondEntry, stats.getValues(1, null));
+    }
+
     private static void assertContains(NetworkStats stats,  String iface, int uid, int set,
             int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets,
             long txBytes, long txPackets, long operations) {
diff --git a/tests/net/java/android/net/apf/ApfTest.java b/tests/net/java/android/net/apf/ApfTest.java
index 9b75a50..9364ec8 100644
--- a/tests/net/java/android/net/apf/ApfTest.java
+++ b/tests/net/java/android/net/apf/ApfTest.java
@@ -16,6 +16,7 @@
 
 package android.net.apf;
 
+import static android.net.util.NetworkConstants.*;
 import static android.system.OsConstants.*;
 import static com.android.internal.util.BitUtils.bytesToBEInt;
 import static com.android.internal.util.BitUtils.put;
@@ -26,13 +27,14 @@
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.verify;
 
+import android.content.Context;
 import android.net.LinkAddress;
 import android.net.LinkProperties;
 import android.net.NetworkUtils;
 import android.net.apf.ApfFilter.ApfConfiguration;
 import android.net.apf.ApfGenerator.IllegalInstructionException;
 import android.net.apf.ApfGenerator.Register;
-import android.net.ip.IpManager;
+import android.net.ip.IpClient;
 import android.net.metrics.IpConnectivityLog;
 import android.net.metrics.RaEvent;
 import android.net.util.InterfaceParams;
@@ -82,6 +84,7 @@
     private static final int TIMEOUT_MS = 500;
 
     @Mock IpConnectivityLog mLog;
+    @Mock Context mContext;
 
     @Before
     public void setUp() throws Exception {
@@ -603,7 +606,7 @@
         }
     }
 
-    private class MockIpManagerCallback extends IpManager.Callback {
+    private class MockIpClientCallback extends IpClient.Callback {
         private final ConditionVariable mGotApfProgram = new ConditionVariable();
         private byte[] mLastApfProgram;
 
@@ -633,9 +636,9 @@
         private FileDescriptor mWriteSocket;
         private final long mFixedTimeMs = SystemClock.elapsedRealtime();
 
-        public TestApfFilter(ApfConfiguration config, IpManager.Callback ipManagerCallback,
-                IpConnectivityLog log) throws Exception {
-            super(config, InterfaceParams.getByName("lo"), ipManagerCallback, log);
+        public TestApfFilter(Context context, ApfConfiguration config,
+                IpClient.Callback ipClientCallback, IpConnectivityLog log) throws Exception {
+            super(context, config, InterfaceParams.getByName("lo"), ipClientCallback, log);
         }
 
         // Pretend an RA packet has been received and show it to ApfFilter.
@@ -757,19 +760,30 @@
     private static final byte[] ANOTHER_IPV4_ADDR        = {10, 0, 0, 2};
     private static final byte[] IPV4_ANY_HOST_ADDR       = {0, 0, 0, 0};
 
+    // Helper to initialize a default apfFilter.
+    private ApfFilter setupApfFilter(IpClient.Callback ipClientCallback, ApfConfiguration config)
+            throws Exception {
+        LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
+        LinkProperties lp = new LinkProperties();
+        lp.addLinkAddress(link);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
+        apfFilter.setLinkProperties(lp);
+        return apfFilter;
+    }
+
     @Test
     public void testApfFilterIPv4() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
         LinkProperties lp = new LinkProperties();
         lp.addLinkAddress(link);
 
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
         apfFilter.setLinkProperties(lp);
 
-        byte[] program = ipManagerCallback.getApfProgram();
+        byte[] program = ipClientCallback.getApfProgram();
 
         // Verify empty packet of 100 zero bytes is passed
         ByteBuffer packet = ByteBuffer.wrap(new byte[100]);
@@ -816,10 +830,10 @@
 
     @Test
     public void testApfFilterIPv6() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        byte[] program = ipManagerCallback.getApfProgram();
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
+        byte[] program = ipClientCallback.getApfProgram();
 
         // Verify empty IPv6 packet is passed
         ByteBuffer packet = ByteBuffer.wrap(new byte[100]);
@@ -854,17 +868,17 @@
         final byte[] multicastIpv4Addr = {(byte)224,0,0,1};
         final byte[] multicastIpv6Addr = {(byte)0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte)0xfb};
 
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         LinkAddress link = new LinkAddress(InetAddress.getByAddress(unicastIpv4Addr), 24);
         LinkProperties lp = new LinkProperties();
         lp.addLinkAddress(link);
 
         ApfConfiguration config = getDefaultConfig();
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
         apfFilter.setLinkProperties(lp);
 
-        byte[] program = ipManagerCallback.getApfProgram();
+        byte[] program = ipClientCallback.getApfProgram();
 
         // Construct IPv4 and IPv6 multicast packets.
         ByteBuffer mcastv4packet = ByteBuffer.wrap(new byte[100]);
@@ -901,9 +915,9 @@
         assertPass(program, bcastv4unicastl2packet.array());
 
         // Turn on multicast filter and verify it works
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.setMulticastFilter(true);
-        program = ipManagerCallback.getApfProgram();
+        program = ipClientCallback.getApfProgram();
         assertDrop(program, mcastv4packet.array());
         assertDrop(program, mcastv6packet.array());
         assertDrop(program, bcastv4packet1.array());
@@ -911,9 +925,9 @@
         assertDrop(program, bcastv4unicastl2packet.array());
 
         // Turn off multicast filter and verify it's off
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.setMulticastFilter(false);
-        program = ipManagerCallback.getApfProgram();
+        program = ipClientCallback.getApfProgram();
         assertPass(program, mcastv4packet.array());
         assertPass(program, mcastv6packet.array());
         assertPass(program, bcastv4packet1.array());
@@ -921,13 +935,13 @@
         assertPass(program, bcastv4unicastl2packet.array());
 
         // Verify it can be initialized to on
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.shutdown();
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+        apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
         apfFilter.setLinkProperties(lp);
-        program = ipManagerCallback.getApfProgram();
+        program = ipClientCallback.getApfProgram();
         assertDrop(program, mcastv4packet.array());
         assertDrop(program, mcastv6packet.array());
         assertDrop(program, bcastv4packet1.array());
@@ -941,17 +955,48 @@
     }
 
     @Test
+    public void testApfFilterMulticastPingWhileDozing() throws Exception {
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
+        ApfFilter apfFilter = setupApfFilter(ipClientCallback, getDefaultConfig());
+
+        // Construct a multicast ICMPv6 ECHO request.
+        final byte[] multicastIpv6Addr = {(byte)0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte)0xfb};
+        ByteBuffer packet = ByteBuffer.wrap(new byte[100]);
+        packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IPV6);
+        packet.put(IPV6_NEXT_HEADER_OFFSET, (byte)IPPROTO_ICMPV6);
+        packet.put(ICMP6_TYPE_OFFSET, (byte)ICMPV6_ECHO_REQUEST_TYPE);
+        put(packet, IPV6_DEST_ADDR_OFFSET, multicastIpv6Addr);
+
+        // Normally, we let multicast pings alone...
+        assertPass(ipClientCallback.getApfProgram(), packet.array());
+
+        // ...and even while dozing...
+        apfFilter.setDozeMode(true);
+        assertPass(ipClientCallback.getApfProgram(), packet.array());
+
+        // ...but when the multicast filter is also enabled, drop the multicast pings to save power.
+        apfFilter.setMulticastFilter(true);
+        assertDrop(ipClientCallback.getApfProgram(), packet.array());
+
+        // However, we should still let through all other ICMPv6 types.
+        ByteBuffer raPacket = ByteBuffer.wrap(packet.array().clone());
+        raPacket.put(ICMP6_TYPE_OFFSET, (byte)ICMPV6_ROUTER_ADVERTISEMENT);
+        assertPass(ipClientCallback.getApfProgram(), raPacket.array());
+
+        // Now wake up from doze mode to ensure that we no longer drop the packets.
+        // (The multicast filter is still enabled at this point).
+        apfFilter.setDozeMode(false);
+        assertPass(ipClientCallback.getApfProgram(), packet.array());
+
+        apfFilter.shutdown();
+    }
+
+    @Test
     public void testApfFilter802_3() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
-        LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
-        LinkProperties lp = new LinkProperties();
-        lp.addLinkAddress(link);
-
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        apfFilter.setLinkProperties(lp);
-
-        byte[] program = ipManagerCallback.getApfProgram();
+        ApfFilter apfFilter = setupApfFilter(ipClientCallback, config);
+        byte[] program = ipClientCallback.getApfProgram();
 
         // Verify empty packet of 100 zero bytes is passed
         // Note that eth-type = 0 makes it an IEEE802.3 frame
@@ -967,12 +1012,11 @@
         assertPass(program, packet.array());
 
         // Now turn on the filter
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.shutdown();
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        apfFilter.setLinkProperties(lp);
-        program = ipManagerCallback.getApfProgram();
+        apfFilter = setupApfFilter(ipClientCallback, config);
+        program = ipClientCallback.getApfProgram();
 
         // Verify that IEEE802.3 frame is dropped
         // In this case ethtype is used for payload length
@@ -992,19 +1036,14 @@
 
     @Test
     public void testApfFilterEthTypeBL() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
-        LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19);
-        LinkProperties lp = new LinkProperties();
-        lp.addLinkAddress(link);
         final int[] emptyBlackList = {};
         final int[] ipv4BlackList = {ETH_P_IP};
         final int[] ipv4Ipv6BlackList = {ETH_P_IP, ETH_P_IPV6};
 
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        apfFilter.setLinkProperties(lp);
-
-        byte[] program = ipManagerCallback.getApfProgram();
+        ApfFilter apfFilter = setupApfFilter(ipClientCallback, config);
+        byte[] program = ipClientCallback.getApfProgram();
 
         // Verify empty packet of 100 zero bytes is passed
         // Note that eth-type = 0 makes it an IEEE802.3 frame
@@ -1020,12 +1059,11 @@
         assertPass(program, packet.array());
 
         // Now add IPv4 to the black list
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.shutdown();
         config.ethTypeBlackList = ipv4BlackList;
-        apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        apfFilter.setLinkProperties(lp);
-        program = ipManagerCallback.getApfProgram();
+        apfFilter = setupApfFilter(ipClientCallback, config);
+        program = ipClientCallback.getApfProgram();
 
         // Verify that IPv4 frame will be dropped
         packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP);
@@ -1036,12 +1074,11 @@
         assertPass(program, packet.array());
 
         // Now let us have both IPv4 and IPv6 in the black list
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.shutdown();
         config.ethTypeBlackList = ipv4Ipv6BlackList;
-        apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        apfFilter.setLinkProperties(lp);
-        program = ipManagerCallback.getApfProgram();
+        apfFilter = setupApfFilter(ipClientCallback, config);
+        program = ipClientCallback.getApfProgram();
 
         // Verify that IPv4 frame will be dropped
         packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP);
@@ -1054,7 +1091,7 @@
         apfFilter.shutdown();
     }
 
-    private byte[] getProgram(MockIpManagerCallback cb, ApfFilter filter, LinkProperties lp) {
+    private byte[] getProgram(MockIpClientCallback cb, ApfFilter filter, LinkProperties lp) {
         cb.resetApfProgramWait();
         filter.setLinkProperties(lp);
         return cb.getApfProgram();
@@ -1077,23 +1114,23 @@
 
     @Test
     public void testApfFilterArp() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
 
         // Verify initially ARP request filter is off, and GARP filter is on.
-        verifyArpFilter(ipManagerCallback.getApfProgram(), PASS);
+        verifyArpFilter(ipClientCallback.getApfProgram(), PASS);
 
         // Inform ApfFilter of our address and verify ARP filtering is on
         LinkAddress linkAddress = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 24);
         LinkProperties lp = new LinkProperties();
         assertTrue(lp.addLinkAddress(linkAddress));
-        verifyArpFilter(getProgram(ipManagerCallback, apfFilter, lp), DROP);
+        verifyArpFilter(getProgram(ipClientCallback, apfFilter, lp), DROP);
 
         // Inform ApfFilter of loss of IP and verify ARP filtering is off
-        verifyArpFilter(getProgram(ipManagerCallback, apfFilter, new LinkProperties()), PASS);
+        verifyArpFilter(getProgram(ipClientCallback, apfFilter, new LinkProperties()), PASS);
 
         apfFilter.shutdown();
     }
@@ -1124,7 +1161,7 @@
         return packet.array();
     }
 
-    // Verify that the last program pushed to the IpManager.Callback properly filters the
+    // Verify that the last program pushed to the IpClient.Callback properly filters the
     // given packet for the given lifetime.
     private void verifyRaLifetime(byte[] program, ByteBuffer packet, int lifetime) {
         final int FRACTION_OF_LIFETIME = 6;
@@ -1154,12 +1191,12 @@
 
     // Test that when ApfFilter is shown the given packet, it generates a program to filter it
     // for the given lifetime.
-    private void verifyRaLifetime(TestApfFilter apfFilter, MockIpManagerCallback ipManagerCallback,
+    private void verifyRaLifetime(TestApfFilter apfFilter, MockIpClientCallback ipClientCallback,
             ByteBuffer packet, int lifetime) throws IOException, ErrnoException {
         // Verify new program generated if ApfFilter witnesses RA
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.pretendPacketReceived(packet.array());
-        byte[] program = ipManagerCallback.getApfProgram();
+        byte[] program = ipClientCallback.getApfProgram();
         verifyRaLifetime(program, packet, lifetime);
     }
 
@@ -1192,21 +1229,21 @@
                 && (ev1.dnsslLifetime == ev2.dnsslLifetime);
     }
 
-    private void assertInvalidRa(TestApfFilter apfFilter, MockIpManagerCallback ipManagerCallback,
+    private void assertInvalidRa(TestApfFilter apfFilter, MockIpClientCallback ipClientCallback,
             ByteBuffer packet) throws IOException, ErrnoException {
-        ipManagerCallback.resetApfProgramWait();
+        ipClientCallback.resetApfProgramWait();
         apfFilter.pretendPacketReceived(packet.array());
-        ipManagerCallback.assertNoProgramUpdate();
+        ipClientCallback.assertNoProgramUpdate();
     }
 
     @Test
     public void testApfFilterRa() throws Exception {
-        MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback();
+        MockIpClientCallback ipClientCallback = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        TestApfFilter apfFilter = new TestApfFilter(config, ipManagerCallback, mLog);
-        byte[] program = ipManagerCallback.getApfProgram();
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, ipClientCallback, mLog);
+        byte[] program = ipClientCallback.getApfProgram();
 
         final int ROUTER_LIFETIME = 1000;
         final int PREFIX_VALID_LIFETIME = 200;
@@ -1231,7 +1268,7 @@
         basePacket.put(IPV6_ALL_NODES_ADDRESS);
         assertPass(program, basePacket.array());
 
-        verifyRaLifetime(apfFilter, ipManagerCallback, basePacket, ROUTER_LIFETIME);
+        verifyRaLifetime(apfFilter, ipClientCallback, basePacket, ROUTER_LIFETIME);
         verifyRaEvent(new RaEvent(ROUTER_LIFETIME, -1, -1, -1, -1, -1));
 
         ByteBuffer newFlowLabelPacket = ByteBuffer.wrap(new byte[ICMP6_RA_OPTION_OFFSET]);
@@ -1249,7 +1286,7 @@
         zeroLengthOptionPacket.put(basePacket);
         zeroLengthOptionPacket.put((byte)ICMP6_PREFIX_OPTION_TYPE);
         zeroLengthOptionPacket.put((byte)0);
-        assertInvalidRa(apfFilter, ipManagerCallback, zeroLengthOptionPacket);
+        assertInvalidRa(apfFilter, ipClientCallback, zeroLengthOptionPacket);
 
         // Generate several RAs with different options and lifetimes, and verify when
         // ApfFilter is shown these packets, it generates programs to filter them for the
@@ -1267,7 +1304,7 @@
                 ICMP6_RA_OPTION_OFFSET + ICMP6_PREFIX_OPTION_VALID_LIFETIME_OFFSET,
                 PREFIX_VALID_LIFETIME);
         verifyRaLifetime(
-                apfFilter, ipManagerCallback, prefixOptionPacket, PREFIX_PREFERRED_LIFETIME);
+                apfFilter, ipClientCallback, prefixOptionPacket, PREFIX_PREFERRED_LIFETIME);
         verifyRaEvent(new RaEvent(
                 ROUTER_LIFETIME, PREFIX_VALID_LIFETIME, PREFIX_PREFERRED_LIFETIME, -1, -1, -1));
 
@@ -1279,7 +1316,7 @@
         rdnssOptionPacket.put((byte)(ICMP6_4_BYTE_OPTION_LEN / 8));
         rdnssOptionPacket.putInt(
                 ICMP6_RA_OPTION_OFFSET + ICMP6_4_BYTE_LIFETIME_OFFSET, RDNSS_LIFETIME);
-        verifyRaLifetime(apfFilter, ipManagerCallback, rdnssOptionPacket, RDNSS_LIFETIME);
+        verifyRaLifetime(apfFilter, ipClientCallback, rdnssOptionPacket, RDNSS_LIFETIME);
         verifyRaEvent(new RaEvent(ROUTER_LIFETIME, -1, -1, -1, RDNSS_LIFETIME, -1));
 
         ByteBuffer routeInfoOptionPacket = ByteBuffer.wrap(
@@ -1290,7 +1327,7 @@
         routeInfoOptionPacket.put((byte)(ICMP6_4_BYTE_OPTION_LEN / 8));
         routeInfoOptionPacket.putInt(
                 ICMP6_RA_OPTION_OFFSET + ICMP6_4_BYTE_LIFETIME_OFFSET, ROUTE_LIFETIME);
-        verifyRaLifetime(apfFilter, ipManagerCallback, routeInfoOptionPacket, ROUTE_LIFETIME);
+        verifyRaLifetime(apfFilter, ipClientCallback, routeInfoOptionPacket, ROUTE_LIFETIME);
         verifyRaEvent(new RaEvent(ROUTER_LIFETIME, -1, -1, ROUTE_LIFETIME, -1, -1));
 
         ByteBuffer dnsslOptionPacket = ByteBuffer.wrap(
@@ -1301,11 +1338,11 @@
         dnsslOptionPacket.put((byte)(ICMP6_4_BYTE_OPTION_LEN / 8));
         dnsslOptionPacket.putInt(
                 ICMP6_RA_OPTION_OFFSET + ICMP6_4_BYTE_LIFETIME_OFFSET, DNSSL_LIFETIME);
-        verifyRaLifetime(apfFilter, ipManagerCallback, dnsslOptionPacket, ROUTER_LIFETIME);
+        verifyRaLifetime(apfFilter, ipClientCallback, dnsslOptionPacket, ROUTER_LIFETIME);
         verifyRaEvent(new RaEvent(ROUTER_LIFETIME, -1, -1, -1, -1, DNSSL_LIFETIME));
 
         // Verify that current program filters all five RAs:
-        program = ipManagerCallback.getApfProgram();
+        program = ipClientCallback.getApfProgram();
         verifyRaLifetime(program, basePacket, ROUTER_LIFETIME);
         verifyRaLifetime(program, newFlowLabelPacket, ROUTER_LIFETIME);
         verifyRaLifetime(program, prefixOptionPacket, PREFIX_PREFERRED_LIFETIME);
@@ -1347,11 +1384,11 @@
     public void testRaParsing() throws Exception {
         final int maxRandomPacketSize = 512;
         final Random r = new Random();
-        MockIpManagerCallback cb = new MockIpManagerCallback();
+        MockIpClientCallback cb = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        TestApfFilter apfFilter = new TestApfFilter(config, cb, mLog);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, cb, mLog);
         for (int i = 0; i < 1000; i++) {
             byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
             r.nextBytes(packet);
@@ -1368,11 +1405,11 @@
     public void testRaProcessing() throws Exception {
         final int maxRandomPacketSize = 512;
         final Random r = new Random();
-        MockIpManagerCallback cb = new MockIpManagerCallback();
+        MockIpClientCallback cb = new MockIpClientCallback();
         ApfConfiguration config = getDefaultConfig();
         config.multicastFilter = DROP_MULTICAST;
         config.ieee802_3Filter = DROP_802_3_FRAMES;
-        TestApfFilter apfFilter = new TestApfFilter(config, cb, mLog);
+        TestApfFilter apfFilter = new TestApfFilter(mContext, config, cb, mLog);
         for (int i = 0; i < 1000; i++) {
             byte[] packet = new byte[r.nextInt(maxRandomPacketSize + 1)];
             r.nextBytes(packet);
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 163dd2a..482d6e1 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -17,6 +17,9 @@
 package com.android.server;
 
 import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
 import static android.net.ConnectivityManager.TYPE_ETHERNET;
 import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
@@ -70,6 +73,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
 
@@ -157,6 +161,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
@@ -181,6 +186,9 @@
     private static final int TIMEOUT_MS = 500;
     private static final int TEST_LINGER_DELAY_MS = 120;
 
+    private static final String MOBILE_IFNAME = "test_rmnet_data0";
+    private static final String WIFI_IFNAME = "test_wlan0";
+
     private MockContext mServiceContext;
     private WrappedConnectivityService mService;
     private WrappedConnectivityManager mCm;
@@ -751,7 +759,7 @@
 
     // NetworkMonitor implementation allowing overriding of Internet connectivity probe result.
     private class WrappedNetworkMonitor extends NetworkMonitor {
-        public Handler connectivityHandler;
+        public final Handler connectivityHandler;
         // HTTP response code fed back to NetworkMonitor for Internet connectivity probe.
         public int gen204ProbeResult = 500;
         public String gen204ProbeRedirectUrl = null;
@@ -872,6 +880,10 @@
             return mMetricsService;
         }
 
+        @Override
+        protected void registerNetdEventCallback() {
+        }
+
         public WrappedNetworkMonitor getLastCreatedWrappedNetworkMonitor() {
             return mLastCreatedNetworkMonitor;
         }
@@ -928,6 +940,7 @@
         // Ensure that the default setting for Captive Portals is used for most tests
         setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
         setMobileDataAlwaysOn(false);
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
     }
 
     @After
@@ -2582,6 +2595,14 @@
         waitForIdle();
     }
 
+    private void setPrivateDnsSettings(String mode, String specifier) {
+        final ContentResolver cr = mServiceContext.getContentResolver();
+        Settings.Global.putString(cr, Settings.Global.PRIVATE_DNS_MODE, mode);
+        Settings.Global.putString(cr, Settings.Global.PRIVATE_DNS_SPECIFIER, specifier);
+        mService.updatePrivateDnsSettings();
+        waitForIdle();
+    }
+
     private boolean isForegroundNetwork(MockNetworkAgent network) {
         NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork());
         assertNotNull(nc);
@@ -3583,7 +3604,7 @@
         mCm.registerNetworkCallback(networkRequest, networkCallback);
 
         LinkProperties lp = new LinkProperties();
-        lp.setInterfaceName("wlan0");
+        lp.setInterfaceName(WIFI_IFNAME);
         LinkAddress myIpv4Address = new LinkAddress("192.168.12.3/24");
         RouteInfo myIpv4DefaultRoute = new RouteInfo((IpPrefix) null,
                 NetworkUtils.numericToInetAddress("192.168.12.1"), lp.getInterfaceName());
@@ -3672,52 +3693,63 @@
 
     @Test
     public void testBasicDnsConfigurationPushed() throws Exception {
-        final String IFNAME = "test_rmnet_data0";
-        final String[] EMPTY_TLS_SERVERS = new String[0];
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
+        ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);
+
+        // Clear any interactions that occur as a result of CS starting up.
+        reset(mNetworkManagementService);
+
+        final String[] EMPTY_STRING_ARRAY = new String[0];
         mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
         waitForIdle();
         verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork(
-                anyInt(), any(), any(), any(), anyString(), eq(EMPTY_TLS_SERVERS));
+                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY));
+        verifyNoMoreInteractions(mNetworkManagementService);
 
         final LinkProperties cellLp = new LinkProperties();
-        cellLp.setInterfaceName(IFNAME);
+        cellLp.setInterfaceName(MOBILE_IFNAME);
         // Add IPv4 and IPv6 default routes, because DNS-over-TLS code does
         // "is-reachable" testing in order to not program netd with unreachable
         // nameservers that it might try repeated to validate.
         cellLp.addLinkAddress(new LinkAddress("192.0.2.4/24"));
-        cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"), IFNAME));
+        cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"),
+                MOBILE_IFNAME));
         cellLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64"));
-        cellLp.addRoute(
-                new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"), IFNAME));
+        cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"),
+                MOBILE_IFNAME));
         mCellNetworkAgent.sendLinkProperties(cellLp);
         mCellNetworkAgent.connect(false);
         waitForIdle();
-        verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
-                anyInt(), mStringArrayCaptor.capture(), any(), any(),
-                anyString(), eq(EMPTY_TLS_SERVERS));
         // CS tells netd about the empty DNS config for this network.
-        assertEmpty(mStringArrayCaptor.getValue());
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
+                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY));
         reset(mNetworkManagementService);
 
         cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
         mCellNetworkAgent.sendLinkProperties(cellLp);
         waitForIdle();
-        verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
                 anyInt(), mStringArrayCaptor.capture(), any(), any(),
-                anyString(), eq(EMPTY_TLS_SERVERS));
+                eq(""), tlsServers.capture());
         assertEquals(1, mStringArrayCaptor.getValue().length);
         assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1"));
+        // Opportunistic mode.
+        assertTrue(ArrayUtils.contains(tlsServers.getValue(), "2001:db8::1"));
         reset(mNetworkManagementService);
 
         cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
         mCellNetworkAgent.sendLinkProperties(cellLp);
         waitForIdle();
-        verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
                 anyInt(), mStringArrayCaptor.capture(), any(), any(),
-                anyString(), eq(EMPTY_TLS_SERVERS));
+                eq(""), tlsServers.capture());
         assertEquals(2, mStringArrayCaptor.getValue().length);
         assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
                 new String[]{"2001:db8::1", "192.0.2.1"}));
+        // Opportunistic mode.
+        assertEquals(2, tlsServers.getValue().length);
+        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
         reset(mNetworkManagementService);
 
         final String TLS_SPECIFIER = "tls.example.com";
@@ -3730,7 +3762,7 @@
                 mCellNetworkAgent.getNetwork().netId,
                 new DnsManager.PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS)));
         waitForIdle();
-        verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
                 anyInt(), mStringArrayCaptor.capture(), any(), any(),
                 eq(TLS_SPECIFIER), eq(TLS_SERVERS));
         assertEquals(2, mStringArrayCaptor.getValue().length);
@@ -3739,6 +3771,195 @@
         reset(mNetworkManagementService);
     }
 
+    @Test
+    public void testPrivateDnsSettingsChange() throws Exception {
+        final String[] EMPTY_STRING_ARRAY = new String[0];
+        ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);
+
+        // Clear any interactions that occur as a result of CS starting up.
+        reset(mNetworkManagementService);
+
+        // The default on Android is opportunistic mode ("Automatic").
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
+
+        final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback();
+        final NetworkRequest cellRequest = new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_CELLULAR).build();
+        mCm.requestNetwork(cellRequest, cellNetworkCallback);
+
+        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+        waitForIdle();
+        // CS tells netd about the empty DNS config for this network.
+        verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork(
+                anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY));
+        verifyNoMoreInteractions(mNetworkManagementService);
+
+        final LinkProperties cellLp = new LinkProperties();
+        cellLp.setInterfaceName(MOBILE_IFNAME);
+        // Add IPv4 and IPv6 default routes, because DNS-over-TLS code does
+        // "is-reachable" testing in order to not program netd with unreachable
+        // nameservers that it might try repeated to validate.
+        cellLp.addLinkAddress(new LinkAddress("192.0.2.4/24"));
+        cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("192.0.2.4"),
+                MOBILE_IFNAME));
+        cellLp.addLinkAddress(new LinkAddress("2001:db8:1::1/64"));
+        cellLp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"),
+                MOBILE_IFNAME));
+        cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
+        cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
+
+        mCellNetworkAgent.sendLinkProperties(cellLp);
+        mCellNetworkAgent.connect(false);
+        waitForIdle();
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
+                anyInt(), mStringArrayCaptor.capture(), any(), any(),
+                eq(""), tlsServers.capture());
+        assertEquals(2, mStringArrayCaptor.getValue().length);
+        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
+        // Opportunistic mode.
+        assertEquals(2, tlsServers.getValue().length);
+        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
+        reset(mNetworkManagementService);
+        cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
+        cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES,
+                mCellNetworkAgent);
+        CallbackInfo cbi = cellNetworkCallback.expectCallback(
+                CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
+        verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork(
+                anyInt(), mStringArrayCaptor.capture(), any(), any(),
+                eq(""), eq(EMPTY_STRING_ARRAY));
+        assertEquals(2, mStringArrayCaptor.getValue().length);
+        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
+        reset(mNetworkManagementService);
+        cellNetworkCallback.assertNoCallback();
+
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
+        verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork(
+                anyInt(), mStringArrayCaptor.capture(), any(), any(),
+                eq(""), tlsServers.capture());
+        assertEquals(2, mStringArrayCaptor.getValue().length);
+        assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
+        assertEquals(2, tlsServers.getValue().length);
+        assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
+                new String[]{"2001:db8::1", "192.0.2.1"}));
+        reset(mNetworkManagementService);
+        cellNetworkCallback.assertNoCallback();
+
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, "strict.example.com");
+        // Can't test dns configuration for strict mode without properly mocking
+        // out the DNS lookups, but can test that LinkProperties is updated.
+        cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+                mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertEquals("strict.example.com", ((LinkProperties)cbi.arg).getPrivateDnsServerName());
+    }
+
+    @Test
+    public void testLinkPropertiesWithPrivateDnsValidationEvents() throws Exception {
+        // The default on Android is opportunistic mode ("Automatic").
+        setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
+
+        final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback();
+        final NetworkRequest cellRequest = new NetworkRequest.Builder()
+                .addTransportType(TRANSPORT_CELLULAR).build();
+        mCm.requestNetwork(cellRequest, cellNetworkCallback);
+
+        mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+        waitForIdle();
+        LinkProperties lp = new LinkProperties();
+        mCellNetworkAgent.sendLinkProperties(lp);
+        mCellNetworkAgent.connect(false);
+        waitForIdle();
+        cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
+        cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES,
+                mCellNetworkAgent);
+        CallbackInfo cbi = cellNetworkCallback.expectCallback(
+                CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+        Set<InetAddress> dnsServers = new HashSet<>();
+        checkDnsServers(cbi.arg, dnsServers);
+
+        // Send a validation event for a server that is not part of the current
+        // resolver config. The validation event should be ignored.
+        mService.mNetdEventCallback.onPrivateDnsValidationEvent(
+                mCellNetworkAgent.getNetwork().netId, "", "145.100.185.18", true);
+        cellNetworkCallback.assertNoCallback();
+
+        // Add a dns server to the LinkProperties.
+        LinkProperties lp2 = new LinkProperties(lp);
+        lp2.addDnsServer(InetAddress.getByName("145.100.185.16"));
+        mCellNetworkAgent.sendLinkProperties(lp2);
+        cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+                mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+        dnsServers.add(InetAddress.getByName("145.100.185.16"));
+        checkDnsServers(cbi.arg, dnsServers);
+
+        // Send a validation event containing a hostname that is not part of
+        // the current resolver config. The validation event should be ignored.
+        mService.mNetdEventCallback.onPrivateDnsValidationEvent(
+                mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "hostname", true);
+        cellNetworkCallback.assertNoCallback();
+
+        // Send a validation event where validation failed.
+        mService.mNetdEventCallback.onPrivateDnsValidationEvent(
+                mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "", false);
+        cellNetworkCallback.assertNoCallback();
+
+        // Send a validation event where validation succeeded for a server in
+        // the current resolver config. A LinkProperties callback with updated
+        // private dns fields should be sent.
+        mService.mNetdEventCallback.onPrivateDnsValidationEvent(
+                mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "", true);
+        cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+                mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+        checkDnsServers(cbi.arg, dnsServers);
+
+        // The private dns fields in LinkProperties should be preserved when
+        // the network agent sends unrelated changes.
+        LinkProperties lp3 = new LinkProperties(lp2);
+        lp3.setMtu(1300);
+        mCellNetworkAgent.sendLinkProperties(lp3);
+        cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+                mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+        checkDnsServers(cbi.arg, dnsServers);
+        assertEquals(1300, ((LinkProperties)cbi.arg).getMtu());
+
+        // Removing the only validated server should affect the private dns
+        // fields in LinkProperties.
+        LinkProperties lp4 = new LinkProperties(lp3);
+        lp4.removeDnsServer(InetAddress.getByName("145.100.185.16"));
+        mCellNetworkAgent.sendLinkProperties(lp4);
+        cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES,
+                mCellNetworkAgent);
+        cellNetworkCallback.assertNoCallback();
+        assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive());
+        assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
+        dnsServers.remove(InetAddress.getByName("145.100.185.16"));
+        checkDnsServers(cbi.arg, dnsServers);
+        assertEquals(1300, ((LinkProperties)cbi.arg).getMtu());
+    }
+
     private void checkDirectlyConnectedRoutes(Object callbackObj,
             Collection<LinkAddress> linkAddresses, Collection<RouteInfo> otherRoutes) {
         assertTrue(callbackObj instanceof LinkProperties);
@@ -3756,6 +3977,13 @@
         assertTrue(observedRoutes.containsAll(expectedRoutes));
     }
 
+    private static void checkDnsServers(Object callbackObj, Set<InetAddress> dnsServers) {
+        assertTrue(callbackObj instanceof LinkProperties);
+        LinkProperties lp = (LinkProperties) callbackObj;
+        assertEquals(dnsServers.size(), lp.getDnsServers().size());
+        assertTrue(lp.getDnsServers().containsAll(dnsServers));
+    }
+
     private static <T> void assertEmpty(T[] ts) {
         int length = ts.length;
         assertEquals("expected empty array, but length was " + length, 0, length);
diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
index 410f754..e573d35 100644
--- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
+++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java
@@ -27,6 +27,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.AppOpsManager;
 import android.content.Context;
 import android.net.INetd;
 import android.net.IpSecAlgorithm;
@@ -40,6 +41,7 @@
 import android.net.NetworkUtils;
 import android.os.Binder;
 import android.os.ParcelFileDescriptor;
+import android.test.mock.MockContext;
 import android.support.test.filters.SmallTest;
 import android.system.Os;
 
@@ -92,7 +94,28 @@
         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F
     };
 
-    Context mMockContext;
+    AppOpsManager mMockAppOps = mock(AppOpsManager.class);
+
+    MockContext mMockContext = new MockContext() {
+        @Override
+        public Object getSystemService(String name) {
+            switch(name) {
+                case Context.APP_OPS_SERVICE:
+                    return mMockAppOps;
+                default:
+                    return null;
+            }
+        }
+
+        @Override
+        public void enforceCallingOrSelfPermission(String permission, String message) {
+            if (permission == android.Manifest.permission.MANAGE_IPSEC_TUNNELS) {
+                return;
+            }
+            throw new SecurityException("Unavailable permission requested");
+        }
+    };
+
     INetd mMockNetd;
     IpSecService.IpSecServiceConfiguration mMockIpSecSrvConfig;
     IpSecService mIpSecService;
@@ -114,13 +137,22 @@
 
     @Before
     public void setUp() throws Exception {
-        mMockContext = mock(Context.class);
         mMockNetd = mock(INetd.class);
         mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class);
         mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig);
 
         // Injecting mock netd
         when(mMockIpSecSrvConfig.getNetdInstance()).thenReturn(mMockNetd);
+        // A package granted the AppOp for MANAGE_IPSEC_TUNNELS will be MODE_ALLOWED.
+        when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("blessedPackage")))
+            .thenReturn(AppOpsManager.MODE_ALLOWED);
+        // A system package will not be granted the app op, so this should fall back to
+        // a permissions check, which should pass.
+        when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("systemPackage")))
+            .thenReturn(AppOpsManager.MODE_DEFAULT);
+        // A mismatch between the package name and the UID will return MODE_IGNORED.
+        when(mMockAppOps.noteOp(anyInt(), anyInt(), eq("badPackage")))
+            .thenReturn(AppOpsManager.MODE_IGNORED);
     }
 
     @Test
@@ -232,7 +264,7 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         assertEquals(IpSecManager.Status.OK, createTransformResp.status);
 
         verify(mMockNetd)
@@ -267,7 +299,7 @@
         ipSecConfig.setAuthenticatedEncryption(AEAD_ALGO);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         assertEquals(IpSecManager.Status.OK, createTransformResp.status);
 
         verify(mMockNetd)
@@ -301,12 +333,12 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         assertEquals(IpSecManager.Status.OK, createTransformResp.status);
 
         // Attempting to create transform a second time with the same SPIs should throw an error...
         try {
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
                 fail("IpSecService should have thrown an error for reuse of SPI");
         } catch (IllegalStateException expected) {
         }
@@ -314,7 +346,7 @@
         // ... even if the transform is deleted
         mIpSecService.deleteTransform(createTransformResp.resourceId);
         try {
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
                 fail("IpSecService should have thrown an error for reuse of SPI");
         } catch (IllegalStateException expected) {
         }
@@ -327,7 +359,7 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         IpSecService.UserRecord userRecord =
                 mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
         assertEquals(1, userRecord.mSpiQuotaTracker.mCurrent);
@@ -351,7 +383,7 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         mIpSecService.deleteTransform(createTransformResp.resourceId);
 
         verify(mMockNetd, times(1))
@@ -398,7 +430,7 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
 
         IpSecService.UserRecord userRecord =
                 mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
@@ -435,7 +467,7 @@
         addAuthAndCryptToIpSecConfig(ipSecConfig);
 
         IpSecTransformResponse createTransformResp =
-                mIpSecService.createTransform(ipSecConfig, new Binder());
+                mIpSecService.createTransform(ipSecConfig, new Binder(), "blessedPackage");
         ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(new Socket());
 
         int resourceId = createTransformResp.resourceId;
@@ -460,10 +492,10 @@
     }
 
     private IpSecTunnelInterfaceResponse createAndValidateTunnel(
-            String localAddr, String remoteAddr) {
+            String localAddr, String remoteAddr, String pkgName) {
         IpSecTunnelInterfaceResponse createTunnelResp =
                 mIpSecService.createTunnelInterface(
-                        mSourceAddr, mDestinationAddr, fakeNetwork, new Binder());
+                        mSourceAddr, mDestinationAddr, fakeNetwork, new Binder(), pkgName);
 
         assertNotNull(createTunnelResp);
         assertEquals(IpSecManager.Status.OK, createTunnelResp.status);
@@ -473,7 +505,7 @@
     @Test
     public void testCreateTunnelInterface() throws Exception {
         IpSecTunnelInterfaceResponse createTunnelResp =
-                createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+                createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
 
         // Check that we have stored the tracking object, and retrieve it
         IpSecService.UserRecord userRecord =
@@ -495,12 +527,12 @@
     @Test
     public void testDeleteTunnelInterface() throws Exception {
         IpSecTunnelInterfaceResponse createTunnelResp =
-                createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+                createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
 
         IpSecService.UserRecord userRecord =
                 mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
 
-        mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId);
+        mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId, "blessedPackage");
 
         // Verify quota and RefcountedResource objects cleaned up
         assertEquals(0, userRecord.mTunnelQuotaTracker.mCurrent);
@@ -516,7 +548,7 @@
     @Test
     public void testTunnelInterfaceBinderDeath() throws Exception {
         IpSecTunnelInterfaceResponse createTunnelResp =
-                createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+                createAndValidateTunnel(mSourceAddr, mDestinationAddr, "blessedPackage");
 
         IpSecService.UserRecord userRecord =
                 mIpSecService.mUserResourceTracker.getUserRecord(Os.getuid());
@@ -539,22 +571,34 @@
 
     @Test
     public void testAddRemoveAddressFromTunnelInterface() throws Exception {
-        IpSecTunnelInterfaceResponse createTunnelResp =
-                createAndValidateTunnel(mSourceAddr, mDestinationAddr);
+        for (String pkgName : new String[]{"blessedPackage", "systemPackage"}) {
+            IpSecTunnelInterfaceResponse createTunnelResp =
+                    createAndValidateTunnel(mSourceAddr, mDestinationAddr, pkgName);
+            mIpSecService.addAddressToTunnelInterface(
+                    createTunnelResp.resourceId, mLocalInnerAddress, pkgName);
+            verify(mMockNetd, times(1))
+                    .interfaceAddAddress(
+                            eq(createTunnelResp.interfaceName),
+                            eq(mLocalInnerAddress.getAddress().getHostAddress()),
+                            eq(mLocalInnerAddress.getPrefixLength()));
+            mIpSecService.removeAddressFromTunnelInterface(
+                    createTunnelResp.resourceId, mLocalInnerAddress, pkgName);
+            verify(mMockNetd, times(1))
+                    .interfaceDelAddress(
+                            eq(createTunnelResp.interfaceName),
+                            eq(mLocalInnerAddress.getAddress().getHostAddress()),
+                            eq(mLocalInnerAddress.getPrefixLength()));
+            mIpSecService.deleteTunnelInterface(createTunnelResp.resourceId, pkgName);
+        }
+    }
 
-        mIpSecService.addAddressToTunnelInterface(createTunnelResp.resourceId, mLocalInnerAddress);
-        verify(mMockNetd)
-                .interfaceAddAddress(
-                        eq(createTunnelResp.interfaceName),
-                        eq(mLocalInnerAddress.getAddress().getHostAddress()),
-                        eq(mLocalInnerAddress.getPrefixLength()));
-
-        mIpSecService.removeAddressFromTunnelInterface(
-                createTunnelResp.resourceId, mLocalInnerAddress);
-        verify(mMockNetd)
-                .interfaceDelAddress(
-                        eq(createTunnelResp.interfaceName),
-                        eq(mLocalInnerAddress.getAddress().getHostAddress()),
-                        eq(mLocalInnerAddress.getPrefixLength()));
+    @Test
+    public void testAddTunnelFailsForBadPackageName() throws Exception {
+        try {
+            IpSecTunnelInterfaceResponse createTunnelResp =
+                    createAndValidateTunnel(mSourceAddr, mDestinationAddr, "badPackage");
+            fail("Expected a SecurityException for badPackage.");
+        } catch (SecurityException expected) {
+        }
     }
 }
diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
new file mode 100644
index 0000000..bcd8bf3
--- /dev/null
+++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java
@@ -0,0 +1,201 @@
+/*
+ * 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.connectivity;
+
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF;
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
+import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.LinkProperties;
+import android.net.Network;
+import android.os.INetworkManagementService;
+import android.provider.Settings;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.mock.MockContentResolver;
+
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.connectivity.MockableSystemProperties;
+
+import java.net.InetAddress;
+
+import org.junit.runner.RunWith;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for {@link DnsManager}.
+ *
+ * Build, install and run with:
+ *  runtest frameworks-net -c com.android.server.connectivity.DnsManagerTest
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DnsManagerTest {
+    static final int TEST_NETID = 100;
+    static final int TEST_NETID_ALTERNATE = 101;
+    static final int TEST_NETID_UNTRACKED = 102;
+    final boolean IS_DEFAULT = true;
+    final boolean NOT_DEFAULT = false;
+
+    DnsManager mDnsManager;
+    MockContentResolver mContentResolver;
+
+    @Mock Context mCtx;
+    @Mock INetworkManagementService mNMService;
+    @Mock MockableSystemProperties mSystemProperties;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        mContentResolver = new MockContentResolver();
+        mContentResolver.addProvider(Settings.AUTHORITY,
+                new FakeSettingsProvider());
+        when(mCtx.getContentResolver()).thenReturn(mContentResolver);
+        mDnsManager = new DnsManager(mCtx, mNMService, mSystemProperties);
+
+        // Clear the private DNS settings
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.PRIVATE_DNS_MODE, "");
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.PRIVATE_DNS_SPECIFIER, "");
+    }
+
+    @Test
+    public void testTrackedValidationUpdates() throws Exception {
+        mDnsManager.updatePrivateDns(new Network(TEST_NETID),
+                mDnsManager.getPrivateDnsConfig());
+        mDnsManager.updatePrivateDns(new Network(TEST_NETID_ALTERNATE),
+                mDnsManager.getPrivateDnsConfig());
+        LinkProperties lp = new LinkProperties();
+        lp.addDnsServer(InetAddress.getByName("3.3.3.3"));
+        lp.addDnsServer(InetAddress.getByName("4.4.4.4"));
+
+        // Send a validation event that is tracked on the alternate netId
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID_ALTERNATE, lp, NOT_DEFAULT);
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_ALTERNATE,
+                InetAddress.parseNumericAddress("4.4.4.4"), "", true));
+        LinkProperties fixedLp = new LinkProperties(lp);
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
+        assertFalse(fixedLp.isPrivateDnsActive());
+        assertNull(fixedLp.getPrivateDnsServerName());
+        fixedLp = new LinkProperties(lp);
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID_ALTERNATE, fixedLp);
+        assertTrue(fixedLp.isPrivateDnsActive());
+        assertNull(fixedLp.getPrivateDnsServerName());
+
+        // Switch to strict mode
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.PRIVATE_DNS_MODE,
+                PRIVATE_DNS_MODE_PROVIDER_HOSTNAME);
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.PRIVATE_DNS_SPECIFIER, "strictmode.com");
+        mDnsManager.updatePrivateDns(new Network(TEST_NETID),
+                mDnsManager.getPrivateDnsConfig());
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
+        fixedLp = new LinkProperties(lp);
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, fixedLp);
+        assertTrue(fixedLp.isPrivateDnsActive());
+        assertEquals("strictmode.com", fixedLp.getPrivateDnsServerName());
+        fixedLp = new LinkProperties(lp);
+    }
+
+    @Test
+    public void testIgnoreUntrackedValidationUpdates() throws Exception {
+        // The PrivateDnsConfig map is empty, so no validation events will
+        // be tracked.
+        LinkProperties lp = new LinkProperties();
+        lp.addDnsServer(InetAddress.getByName("3.3.3.3"));
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("3.3.3.3"), "", true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Validation event has untracked netId
+        mDnsManager.updatePrivateDns(new Network(TEST_NETID),
+                mDnsManager.getPrivateDnsConfig());
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID_UNTRACKED,
+                InetAddress.parseNumericAddress("3.3.3.3"), "", true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Validation event has untracked ipAddress
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("4.4.4.4"), "", true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Validation event has untracked hostname
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("3.3.3.3"), "hostname",
+                true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Validation event failed
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("3.3.3.3"), "", false));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Network removed
+        mDnsManager.removeNetwork(new Network(TEST_NETID));
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("3.3.3.3"), "", true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+
+        // Turn private DNS mode off
+        Settings.Global.putString(mContentResolver,
+                Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF);
+        mDnsManager.updatePrivateDns(new Network(TEST_NETID),
+                mDnsManager.getPrivateDnsConfig());
+        mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT);
+        mDnsManager.updatePrivateDnsValidation(
+                new DnsManager.PrivateDnsValidationUpdate(TEST_NETID,
+                InetAddress.parseNumericAddress("3.3.3.3"), "", true));
+        mDnsManager.updatePrivateDnsStatus(TEST_NETID, lp);
+        assertFalse(lp.isPrivateDnsActive());
+        assertNull(lp.getPrivateDnsServerName());
+    }
+}
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
index 4a83d1b..f025f41 100644
--- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -26,6 +26,8 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
@@ -62,8 +64,8 @@
 
     private void expectPermission(String[] permissions, boolean preinstalled) throws Exception {
         final PackageInfo packageInfo = packageInfoWithPermissions(permissions, preinstalled);
-        when(mPackageManager.getPackageInfo(MOCK_PACKAGE_NAMES[0], GET_PERMISSIONS))
-                .thenReturn(packageInfo);
+        when(mPackageManager.getPackageInfoAsUser(
+                eq(MOCK_PACKAGE_NAMES[0]), eq(GET_PERMISSIONS), anyInt())).thenReturn(packageInfo);
     }
 
     private PackageInfo packageInfoWithPermissions(String[] permissions, boolean preinstalled) {
diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java
index 27f90f2..6142a7c 100644
--- a/tests/net/java/com/android/server/connectivity/TetheringTest.java
+++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java
@@ -19,8 +19,14 @@
 import static android.hardware.usb.UsbManager.USB_CONFIGURED;
 import static android.hardware.usb.UsbManager.USB_CONNECTED;
 import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY;
+import static android.net.ConnectivityManager.EXTRA_ACTIVE_TETHER;
+import static android.net.ConnectivityManager.EXTRA_AVAILABLE_TETHER;
+import static android.net.ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE;
 import static android.net.ConnectivityManager.TETHERING_WIFI;
 import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
 import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY;
 import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED;
 import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
@@ -54,7 +60,6 @@
 import android.content.pm.ApplicationInfo;
 import android.content.res.Resources;
 import android.hardware.usb.UsbManager;
-import android.net.ConnectivityManager;
 import android.net.INetd;
 import android.net.INetworkPolicyManager;
 import android.net.INetworkStatsService;
@@ -125,7 +130,6 @@
 
     @Mock private ApplicationInfo mApplicationInfo;
     @Mock private Context mContext;
-    @Mock private ConnectivityManager mConnectivityManager;
     @Mock private INetworkManagementService mNMService;
     @Mock private INetworkStatsService mStatsService;
     @Mock private INetworkPolicyManager mPolicyManager;
@@ -173,7 +177,6 @@
 
         @Override
         public Object getSystemService(String name) {
-            if (Context.CONNECTIVITY_SERVICE.equals(name)) return mConnectivityManager;
             if (Context.WIFI_SERVICE.equals(name)) return mWifiManager;
             if (Context.USB_SERVICE.equals(name)) return mUsbManager;
             return super.getSystemService(name);
@@ -181,8 +184,15 @@
     }
 
     public class MockTetheringDependencies extends TetheringDependencies {
-        private StateMachine upstreamNetworkMonitorMasterSM;
-        private ArrayList<TetherInterfaceStateMachine> ipv6CoordinatorNotifyList;
+        StateMachine upstreamNetworkMonitorMasterSM;
+        ArrayList<TetherInterfaceStateMachine> ipv6CoordinatorNotifyList;
+        int isTetheringSupportedCalls;
+
+        public void reset() {
+            upstreamNetworkMonitorMasterSM = null;
+            ipv6CoordinatorNotifyList = null;
+            isTetheringSupportedCalls = 0;
+        }
 
         @Override
         public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) {
@@ -222,11 +232,17 @@
             return new InterfaceParams(ifName, index + IFINDEX_OFFSET,
                     MacAddress.ALL_ZEROS_ADDRESS);
         }
+
+        @Override
+        public boolean isTetheringSupported() {
+            isTetheringSupportedCalls++;
+            return true;
+        }
     }
 
     private static NetworkState buildMobileUpstreamState(boolean withIPv4, boolean withIPv6,
             boolean with464xlat) {
-        final NetworkInfo info = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, 0, null, null);
+        final NetworkInfo info = new NetworkInfo(TYPE_MOBILE, 0, null, null);
         info.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
         final LinkProperties prop = new LinkProperties();
         prop.setInterfaceName(TEST_MOBILE_IFNAME);
@@ -308,7 +324,8 @@
             }
         };
         mServiceContext.registerReceiver(mBroadcastReceiver,
-                new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED));
+                new IntentFilter(ACTION_TETHER_STATE_CHANGED));
+        mTetheringDependencies.reset();
         mTethering = new Tethering(mServiceContext, mNMService, mStatsService, mPolicyManager,
                                    mLooper.getLooper(), mSystemProperties,
                                    mTetheringDependencies);
@@ -404,7 +421,7 @@
     private void verifyTetheringBroadcast(String ifname, String whichExtra) {
         // Verify that ifname is in the whichExtra array of the tether state changed broadcast.
         final Intent bcast = mIntents.get(0);
-        assertEquals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED, bcast.getAction());
+        assertEquals(ACTION_TETHER_STATE_CHANGED, bcast.getAction());
         final ArrayList<String> ifnames = bcast.getStringArrayListExtra(whichExtra);
         assertTrue(ifnames.contains(ifname));
         mIntents.remove(bcast);
@@ -412,8 +429,6 @@
 
     public void failingLocalOnlyHotspotLegacyApBroadcast(
             boolean emulateInterfaceStatusChanged) throws Exception {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
-
         // Emulate externally-visible WifiManager effects, causing the
         // per-interface state machine to start up, and telling us that
         // hotspot mode is to be started.
@@ -427,16 +442,14 @@
         // then it creates a TetherInterfaceStateMachine and sends out a
         // broadcast indicating that the interface is "available".
         if (emulateInterfaceStatusChanged) {
-            verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
-            verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+            assertEquals(1, mTetheringDependencies.isTetheringSupportedCalls);
+            verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
         }
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
         verifyNoMoreInteractions(mWifiManager);
     }
 
     private void prepareUsbTethering(NetworkState upstreamState) {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
         when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any()))
                 .thenReturn(upstreamState);
 
@@ -454,7 +467,6 @@
         prepareUsbTethering(upstreamState);
 
         // This should produce no activity of any kind.
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
 
         // Pretend we then receive USB configured broadcast.
@@ -481,8 +493,6 @@
 
     public void workingLocalOnlyHotspotEnrichedApBroadcast(
             boolean emulateInterfaceStatusChanged) throws Exception {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
-
         // Emulate externally-visible WifiManager effects, causing the
         // per-interface state machine to start up, and telling us that
         // hotspot mode is to be started.
@@ -493,18 +503,17 @@
         mLooper.dispatchAll();
 
         verifyInterfaceServingModeStarted();
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
         verify(mNMService, times(1)).setIpForwardingEnabled(true);
         verify(mNMService, times(1)).startTethering(any(String[].class));
         verifyNoMoreInteractions(mNMService);
         verify(mWifiManager).updateInterfaceIpState(
                 TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY);
         verifyNoMoreInteractions(mWifiManager);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_ACTIVE_LOCAL_ONLY);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY);
         verify(mUpstreamNetworkMonitor, times(1)).start();
         // TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
-        verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
-        verifyNoMoreInteractions(mConnectivityManager);
+        assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
 
         // Emulate externally-visible WifiManager effects, when hotspot mode
         // is being torn down.
@@ -523,8 +532,7 @@
         verifyNoMoreInteractions(mWifiManager);
         // Asking for the last error after the per-interface state machine
         // has been reaped yields an unknown interface error.
-        assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
-                mTethering.getLastTetherError(TEST_WLAN_IFNAME));
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
     }
 
     /**
@@ -648,7 +656,6 @@
     // TODO: Test with and without interfaceStatusChanged().
     @Test
     public void failingWifiTetheringLegacyApBroadcast() throws Exception {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
         when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
 
         // Emulate pressing the WiFi tethering button.
@@ -656,7 +663,6 @@
         mLooper.dispatchAll();
         verify(mWifiManager, times(1)).startSoftAp(null);
         verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
 
         // Emulate externally-visible WifiManager effects, causing the
@@ -666,9 +672,8 @@
         sendWifiApStateChanged(WIFI_AP_STATE_ENABLED);
         mLooper.dispatchAll();
 
-        verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
-        verifyNoMoreInteractions(mConnectivityManager);
+        assertEquals(1, mTetheringDependencies.isTetheringSupportedCalls);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
         verifyNoMoreInteractions(mNMService);
         verifyNoMoreInteractions(mWifiManager);
     }
@@ -676,7 +681,6 @@
     // TODO: Test with and without interfaceStatusChanged().
     @Test
     public void workingWifiTetheringEnrichedApBroadcast() throws Exception {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
         when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
 
         // Emulate pressing the WiFi tethering button.
@@ -684,7 +688,6 @@
         mLooper.dispatchAll();
         verify(mWifiManager, times(1)).startSoftAp(null);
         verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
 
         // Emulate externally-visible WifiManager effects, causing the
@@ -695,21 +698,20 @@
         mLooper.dispatchAll();
 
         verifyInterfaceServingModeStarted();
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
         verify(mNMService, times(1)).setIpForwardingEnabled(true);
         verify(mNMService, times(1)).startTethering(any(String[].class));
         verifyNoMoreInteractions(mNMService);
         verify(mWifiManager).updateInterfaceIpState(
                 TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
         verifyNoMoreInteractions(mWifiManager);
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_ACTIVE_TETHER);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER);
         verify(mUpstreamNetworkMonitor, times(1)).start();
         // In tethering mode, in the default configuration, an explicit request
         // for a mobile network is also made.
         verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest();
         // TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
-        verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
-        verifyNoMoreInteractions(mConnectivityManager);
+        assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
 
         /////
         // We do not currently emulate any upstream being found.
@@ -723,7 +725,6 @@
         mLooper.dispatchAll();
         verify(mWifiManager, times(1)).stopSoftAp();
         verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
 
         // Emulate externally-visible WifiManager effects, when tethering mode
@@ -743,14 +744,12 @@
         verifyNoMoreInteractions(mWifiManager);
         // Asking for the last error after the per-interface state machine
         // has been reaped yields an unknown interface error.
-        assertEquals(ConnectivityManager.TETHER_ERROR_UNKNOWN_IFACE,
-                mTethering.getLastTetherError(TEST_WLAN_IFNAME));
+        assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME));
     }
 
     // TODO: Test with and without interfaceStatusChanged().
     @Test
     public void failureEnablingIpForwarding() throws Exception {
-        when(mConnectivityManager.isTetheringSupported()).thenReturn(true);
         when(mWifiManager.startSoftAp(any(WifiConfiguration.class))).thenReturn(true);
         doThrow(new RemoteException()).when(mNMService).setIpForwardingEnabled(true);
 
@@ -759,7 +758,6 @@
         mLooper.dispatchAll();
         verify(mWifiManager, times(1)).startSoftAp(null);
         verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
 
         // Emulate externally-visible WifiManager effects, causing the
@@ -778,8 +776,9 @@
         verify(mNMService, times(1)).tetherInterface(TEST_WLAN_IFNAME);
         verify(mWifiManager).updateInterfaceIpState(
                 TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED);
-        verify(mConnectivityManager, atLeastOnce()).isTetheringSupported();
-        verifyTetheringBroadcast(TEST_WLAN_IFNAME, ConnectivityManager.EXTRA_AVAILABLE_TETHER);
+        // TODO: Figure out why this isn't exactly once, for sendTetherStateChangedBroadcast().
+        assertTrue(1 <= mTetheringDependencies.isTetheringSupportedCalls);
+        verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER);
         // This is called, but will throw.
         verify(mNMService, times(1)).setIpForwardingEnabled(true);
         // This never gets called because of the exception thrown above.
@@ -792,7 +791,6 @@
                 TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR);
 
         verifyNoMoreInteractions(mWifiManager);
-        verifyNoMoreInteractions(mConnectivityManager);
         verifyNoMoreInteractions(mNMService);
     }
 
diff --git a/tests/net/jni/apf_jni.cpp b/tests/net/jni/apf_jni.cpp
index d415d22..152e6c3 100644
--- a/tests/net/jni/apf_jni.cpp
+++ b/tests/net/jni/apf_jni.cpp
@@ -34,6 +34,8 @@
             env->GetArrayLength(program),
             (uint8_t*)env->GetByteArrayElements(packet, NULL),
             env->GetArrayLength(packet),
+            nullptr,
+            0,
             filter_age);
 }
 
@@ -143,7 +145,8 @@
         do {
             apf_packet = pcap_next(apf_pcap.get(), &apf_header);
         } while (apf_packet != NULL && !accept_packet(
-                apf_program, apf_program_len, apf_packet, apf_header.len, 0));
+                apf_program, apf_program_len, apf_packet, apf_header.len,
+                nullptr, 0, 0));
 
         // Make sure both filters matched the same packet.
         if (apf_packet == NULL && bpf_packet == NULL)
diff --git a/tests/testables/src/android/testing/DexmakerShareClassLoaderRule.java b/tests/testables/src/android/testing/DexmakerShareClassLoaderRule.java
new file mode 100644
index 0000000..1b8e58c
--- /dev/null
+++ b/tests/testables/src/android/testing/DexmakerShareClassLoaderRule.java
@@ -0,0 +1,129 @@
+/*
+ * 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.testing;
+
+import android.util.Log;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import java.util.ConcurrentModificationException;
+
+
+/**
+ * Runs the test such that mocks created in it don't use a dedicated classloader.
+ *
+ * This allows mocking package-private methods.
+ *
+ * WARNING: This is absolutely incompatible with running tests in parallel!
+ */
+public class DexmakerShareClassLoaderRule implements TestRule {
+
+    private static final String TAG = "ShareClassloaderRule";
+    @VisibleForTesting
+    static final String DEXMAKER_SHARE_CLASSLOADER_PROPERTY = "dexmaker.share_classloader";
+
+    private static Thread sOwningThread = null;
+
+    @Override
+    public Statement apply(Statement base, Description description) {
+        return apply(base::evaluate).toStatement();
+    }
+
+    /**
+     * Runs the runnable such that mocks created in it don't use a dedicated classloader.
+     *
+     * This allows mocking package-private methods.
+     *
+     * WARNING: This is absolutely incompatible with running tests in parallel!
+     */
+    public static void runWithDexmakerShareClassLoader(Runnable r) {
+        apply(r::run).run();
+    }
+
+    /**
+     * Returns a statement that first makes sure that only one thread at the time is modifying
+     * the property. Then actually sets the property, and runs the statement.
+     */
+    private static <T extends Throwable> ThrowingRunnable<T> apply(ThrowingRunnable<T> r) {
+        return wrapInMutex(wrapInSetAndClearProperty(r));
+    }
+
+    private static <T extends Throwable> ThrowingRunnable<T> wrapInSetAndClearProperty(
+            ThrowingRunnable<T> r) {
+        return () -> {
+            final String previousValue = System.getProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY);
+            try {
+                System.setProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY, "true");
+                r.run();
+            } finally {
+                if (previousValue != null) {
+                    System.setProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY, previousValue);
+                } else {
+                    System.clearProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY);
+                }
+            }
+        };
+    }
+
+    /**
+     * Runs the given statement, and while doing so prevents other threads from running statements.
+     */
+    private static <T extends Throwable> ThrowingRunnable<T> wrapInMutex(ThrowingRunnable<T> r) {
+        return () -> {
+            final boolean isOwner;
+            synchronized (DexmakerShareClassLoaderRule.class) {
+                isOwner = (sOwningThread == null);
+                if (isOwner) {
+                    sOwningThread = Thread.currentThread();
+                } else if (sOwningThread != Thread.currentThread()) {
+                    final RuntimeException e = new ConcurrentModificationException(
+                            "Tried to set dexmaker.share_classloader from " + Thread.currentThread()
+                                    + ", but was already set from " + sOwningThread);
+                    // Also log in case exception gets swallowed.
+                    Log.e(TAG, e.getMessage(), e);
+                    throw e;
+                }
+            }
+            try {
+                r.run();
+            } finally {
+                synchronized (DexmakerShareClassLoaderRule.class) {
+                    if (isOwner) {
+                        sOwningThread = null;
+                    }
+                }
+            }
+        };
+    }
+
+    private interface ThrowingRunnable<T extends Throwable> {
+        void run() throws T;
+
+        default Statement toStatement() {
+            return new Statement() {
+                @Override
+                public void evaluate() throws Throwable {
+                    ThrowingRunnable.this.run();
+                }
+            };
+        }
+    }
+}
diff --git a/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java b/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java
new file mode 100644
index 0000000..2528d09
--- /dev/null
+++ b/tests/testables/tests/src/android/testing/DexmakerShareClassLoaderRuleTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.testing;
+
+import static android.testing.DexmakerShareClassLoaderRule.DEXMAKER_SHARE_CLASSLOADER_PROPERTY;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+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.junit.runners.model.Statement;
+
+import java.util.ConcurrentModificationException;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DexmakerShareClassLoaderRuleTest {
+
+    // Intentionally not @Rule, so we have more control.
+    private final DexmakerShareClassLoaderRule mRule = new DexmakerShareClassLoaderRule();
+
+    @Before
+    public void setUp() throws Exception {
+        System.clearProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY);
+    }
+
+    @Test
+    public void rule_setsProperty() throws Throwable {
+        mRule.apply(ASSERT_STATEMENT, null).evaluate();
+    }
+
+    @Test
+    public void rule_resetsProperty() throws Throwable {
+        mRule.apply(ASSERT_STATEMENT, null).evaluate();
+        assertThat(readProperty(), is(false));
+    }
+
+    @Test
+    public void rule_resetsProperty_toExactValue() throws Throwable {
+        System.setProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY, "asdf");
+        mRule.apply(ASSERT_STATEMENT, null).evaluate();
+        assertThat(System.getProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY), is("asdf"));
+    }
+
+    @Test
+    public void rule_preventsOtherThreadFromInterfering() throws Throwable {
+        mRule.apply(new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                assertThat(readProperty(), is(true));
+
+                final Throwable[] thrown = new Throwable[1];
+                final Thread t = new Thread(() -> {
+                    try {
+                        new DexmakerShareClassLoaderRule().apply(ASSERT_STATEMENT, null).evaluate();
+                        fail("Expected a ConcurrentModificationException");
+                    } catch (ConcurrentModificationException e) {
+                        // Success.
+                    } catch (Throwable tr) {
+                        thrown[0] = tr;
+                    }
+                });
+                t.start();
+                t.join();
+
+                if (thrown[0] != null) {
+                    throw  thrown[0];
+                }
+            }
+        }, null).evaluate();
+        assertThat(readProperty(), is(false));
+    }
+
+    @Test
+    public void rule_isReentrant() throws Throwable {
+        mRule.apply(new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                assertThat(readProperty(), is(true));
+                new DexmakerShareClassLoaderRule().apply(ASSERT_STATEMENT, null).evaluate();
+                assertThat(readProperty(), is(true));
+            }
+        }, null).evaluate();
+        assertThat(readProperty(), is(false));
+    }
+
+    private static boolean readProperty() {
+        return Boolean.parseBoolean(System.getProperty(DEXMAKER_SHARE_CLASSLOADER_PROPERTY));
+    }
+
+    private static final Statement ASSERT_STATEMENT = new Statement() {
+        @Override
+        public void evaluate() throws Throwable {
+            assertThat(readProperty(), is(true));
+        }
+    };
+
+}
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index 4a4260d..1dd46ba 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -225,7 +225,7 @@
       }
     } else if (format_ == ApkFormat::kProto && path == kProtoResourceTablePath) {
       pb::ResourceTable pb_table;
-      SerializeTableToPb(*split_table, &pb_table);
+      SerializeTableToPb(*split_table, &pb_table, context->GetDiagnostics());
       if (!io::CopyProtoToArchive(context,
                                   &pb_table,
                                   path,
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index c98c0b9..fc1aeaa 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -164,6 +164,39 @@
   EXPECT_THAT(*str, StrValueEq("  This is what  I think  "));
 }
 
+TEST_F(ResourceParserTest, ParseStringTruncateASCII) {
+  // Tuncate leading and trailing whitespace
+  EXPECT_TRUE(TestParse(R"(<string name="foo">&#32;Hello&#32;</string>)"));
+
+  String* str = test::GetValue<String>(&table_, "string/foo");
+  ASSERT_THAT(str, NotNull());
+  EXPECT_THAT(*str->value, StrEq("Hello"));
+  EXPECT_THAT(str->untranslatable_sections, IsEmpty());
+
+  // AAPT does not truncate unicode whitespace
+  EXPECT_TRUE(TestParse(R"(<string name="foo2">\u0020\Hello\u0020</string>)"));
+
+  str = test::GetValue<String>(&table_, "string/foo2");
+  ASSERT_THAT(str, NotNull());
+  EXPECT_THAT(*str->value, StrEq(" Hello "));
+  EXPECT_THAT(str->untranslatable_sections, IsEmpty());
+
+  // Preserve non-ASCII whitespace including extended ASCII characters
+  EXPECT_TRUE(TestParse(R"(<string name="foo3">&#160;Hello&#160;</string>)"));
+
+  str = test::GetValue<String>(&table_, "string/foo3");
+  ASSERT_THAT(str, NotNull());
+  EXPECT_THAT(*str->value, StrEq("\xC2\xA0Hello\xC2\xA0"));
+  EXPECT_THAT(str->untranslatable_sections, IsEmpty());
+
+  EXPECT_TRUE(TestParse(R"(<string name="foo4">2005ćčŽ6月1æ—„</string>)"));
+
+  str = test::GetValue<String>(&table_, "string/foo4");
+  ASSERT_THAT(str, NotNull());
+  EXPECT_THAT(*str->value, StrEq("2005ćčŽ6月1æ—„"));
+  EXPECT_THAT(str->untranslatable_sections, IsEmpty());
+}
+
 TEST_F(ResourceParserTest, ParseStyledStringWithWhitespace) {
   std::string input = R"(<string name="foo">  <b> My <i> favorite</i> string </b>  </string>)";
   ASSERT_TRUE(TestParse(input));
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 8fc3d65..560077c 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -30,7 +30,6 @@
 #include "util/Files.h"
 #include "util/Util.h"
 
-using ::aapt::text::IsWhitespace;
 using ::aapt::text::Utf8Iterator;
 using ::android::StringPiece;
 using ::android::StringPiece16;
@@ -807,7 +806,7 @@
   Utf8Iterator iter(text);
   while (iter.HasNext()) {
     char32_t codepoint = iter.Next();
-    if (!quote_ && text::IsWhitespace(codepoint)) {
+    if (!quote_ && iswspace(codepoint)) {
       if (!last_codepoint_was_space_) {
         // Emit a space if it's the first.
         xml_string_.text += ' ';
diff --git a/tools/aapt2/StringPool.cpp b/tools/aapt2/StringPool.cpp
index 3a1a18c..b0ce9e1 100644
--- a/tools/aapt2/StringPool.cpp
+++ b/tools/aapt2/StringPool.cpp
@@ -332,6 +332,25 @@
   return data;
 }
 
+/**
+ * Returns the maximum possible string length that can be successfully encoded
+ * using 2 units of the specified T.
+ *    EncodeLengthMax<char> -> maximum unit length of 0x7FFF
+ *    EncodeLengthMax<char16_t> -> maximum unit length of 0x7FFFFFFF
+ **/
+template <typename T>
+static size_t EncodeLengthMax() {
+  static_assert(std::is_integral<T>::value, "wat.");
+
+  constexpr size_t kMask = 1 << ((sizeof(T) * 8 * 2) - 1);
+  constexpr size_t max = kMask - 1;
+  return max;
+}
+
+/**
+ * Returns the number of units (1 or 2) needed to encode the string length
+ * before writing the string.
+ */
 template <typename T>
 static size_t EncodedLengthUnits(size_t length) {
   static_assert(std::is_integral<T>::value, "wat.");
@@ -341,15 +360,30 @@
   return length > kMaxSize ? 2 : 1;
 }
 
-static void EncodeString(const std::string& str, const bool utf8, BigBuffer* out) {
+const std::string kStringTooLarge = "STRING_TOO_LARGE";
+
+static bool EncodeString(const std::string& str, const bool utf8, BigBuffer* out,
+                         IDiagnostics* diag) {
   if (utf8) {
     const std::string& encoded = str;
-    const ssize_t utf16_length =
-        utf8_to_utf16_length(reinterpret_cast<const uint8_t*>(str.data()), str.size());
+    const ssize_t utf16_length = utf8_to_utf16_length(
+        reinterpret_cast<const uint8_t*>(encoded.data()), encoded.size());
     CHECK(utf16_length >= 0);
 
-    const size_t total_size = EncodedLengthUnits<char>(utf16_length) +
-                              EncodedLengthUnits<char>(encoded.length()) + encoded.size() + 1;
+    // Make sure the lengths to be encoded do not exceed the maximum length that
+    // can be encoded using chars
+    if ((((size_t)encoded.size()) > EncodeLengthMax<char>())
+        || (((size_t)utf16_length) > EncodeLengthMax<char>())) {
+
+      diag->Error(DiagMessage() << "string too large to encode using UTF-8 "
+          << "written instead as '" << kStringTooLarge << "'");
+
+      EncodeString(kStringTooLarge, utf8, out, diag);
+      return false;
+    }
+
+    const size_t total_size = EncodedLengthUnits<char>(utf16_length)
+        + EncodedLengthUnits<char>(encoded.size()) + encoded.size() + 1;
 
     char* data = out->NextBlock<char>(total_size);
 
@@ -357,32 +391,47 @@
     data = EncodeLength(data, utf16_length);
 
     // Now encode the size of the real UTF8 string.
-    data = EncodeLength(data, encoded.length());
+    data = EncodeLength(data, encoded.size());
     strncpy(data, encoded.data(), encoded.size());
 
-    } else {
-      const std::u16string encoded = util::Utf8ToUtf16(str);
-      const ssize_t utf16_length = encoded.size();
+  } else {
+    const std::u16string encoded = util::Utf8ToUtf16(str);
+    const ssize_t utf16_length = encoded.size();
 
-      // Total number of 16-bit words to write.
-      const size_t total_size = EncodedLengthUnits<char16_t>(utf16_length) + encoded.size() + 1;
+    // Make sure the length to be encoded does not exceed the maximum possible
+    // length that can be encoded
+    if (((size_t)utf16_length) > EncodeLengthMax<char16_t>()) {
+      diag->Error(DiagMessage() << "string too large to encode using UTF-16 "
+          << "written instead as '" << kStringTooLarge << "'");
 
-      char16_t* data = out->NextBlock<char16_t>(total_size);
-
-      // Encode the actual UTF16 string length.
-      data = EncodeLength(data, utf16_length);
-      const size_t byte_length = encoded.size() * sizeof(char16_t);
-
-      // NOTE: For some reason, strncpy16(data, entry->value.data(),
-      // entry->value.size()) truncates the string.
-      memcpy(data, encoded.data(), byte_length);
-
-      // The null-terminating character is already here due to the block of data
-      // being set to 0s on allocation.
+      EncodeString(kStringTooLarge, utf8, out, diag);
+      return false;
     }
+
+    // Total number of 16-bit words to write.
+    const size_t total_size = EncodedLengthUnits<char16_t>(utf16_length)
+        + encoded.size() + 1;
+
+    char16_t* data = out->NextBlock<char16_t>(total_size);
+
+    // Encode the actual UTF16 string length.
+    data = EncodeLength(data, utf16_length);
+    const size_t byte_length = encoded.size() * sizeof(char16_t);
+
+    // NOTE: For some reason, strncpy16(data, entry->value.data(),
+    // entry->value.size()) truncates the string.
+    memcpy(data, encoded.data(), byte_length);
+
+    // The null-terminating character is already here due to the block of data
+    // being set to 0s on allocation.
+  }
+
+  return true;
 }
 
-bool StringPool::Flatten(BigBuffer* out, const StringPool& pool, bool utf8) {
+bool StringPool::Flatten(BigBuffer* out, const StringPool& pool, bool utf8,
+                         IDiagnostics* diag) {
+  bool no_error = true;
   const size_t start_index = out->size();
   android::ResStringPool_header* header = out->NextBlock<android::ResStringPool_header>();
   header->header.type = util::HostToDevice16(android::RES_STRING_POOL_TYPE);
@@ -403,12 +452,12 @@
   // Styles always come first.
   for (const std::unique_ptr<StyleEntry>& entry : pool.styles_) {
     *indices++ = out->size() - before_strings_index;
-    EncodeString(entry->value, utf8, out);
+    no_error = EncodeString(entry->value, utf8, out, diag) && no_error;
   }
 
   for (const std::unique_ptr<Entry>& entry : pool.strings_) {
     *indices++ = out->size() - before_strings_index;
-    EncodeString(entry->value, utf8, out);
+    no_error = EncodeString(entry->value, utf8, out, diag) && no_error;
   }
 
   out->Align4();
@@ -446,15 +495,15 @@
     out->Align4();
   }
   header->header.size = util::HostToDevice32(out->size() - start_index);
-  return true;
+  return no_error;
 }
 
-bool StringPool::FlattenUtf8(BigBuffer* out, const StringPool& pool) {
-  return Flatten(out, pool, true);
+bool StringPool::FlattenUtf8(BigBuffer* out, const StringPool& pool, IDiagnostics* diag) {
+  return Flatten(out, pool, true, diag);
 }
 
-bool StringPool::FlattenUtf16(BigBuffer* out, const StringPool& pool) {
-  return Flatten(out, pool, false);
+bool StringPool::FlattenUtf16(BigBuffer* out, const StringPool& pool, IDiagnostics* diag) {
+  return Flatten(out, pool, false, diag);
 }
 
 }  // namespace aapt
diff --git a/tools/aapt2/StringPool.h b/tools/aapt2/StringPool.h
index 3c1f3dc..f5b464d 100644
--- a/tools/aapt2/StringPool.h
+++ b/tools/aapt2/StringPool.h
@@ -27,6 +27,7 @@
 #include "androidfw/StringPiece.h"
 
 #include "ConfigDescription.h"
+#include "Diagnostics.h"
 #include "util/BigBuffer.h"
 
 namespace aapt {
@@ -152,8 +153,8 @@
     int ref_;
   };
 
-  static bool FlattenUtf8(BigBuffer* out, const StringPool& pool);
-  static bool FlattenUtf16(BigBuffer* out, const StringPool& pool);
+  static bool FlattenUtf8(BigBuffer* out, const StringPool& pool, IDiagnostics* diag);
+  static bool FlattenUtf16(BigBuffer* out, const StringPool& pool, IDiagnostics* diag);
 
   StringPool() = default;
   StringPool(StringPool&&) = default;
@@ -207,7 +208,7 @@
  private:
   DISALLOW_COPY_AND_ASSIGN(StringPool);
 
-  static bool Flatten(BigBuffer* out, const StringPool& pool, bool utf8);
+  static bool Flatten(BigBuffer* out, const StringPool& pool, bool utf8, IDiagnostics* diag);
 
   Ref MakeRefImpl(const android::StringPiece& str, const Context& context, bool unique);
   void ReAssignIndices();
diff --git a/tools/aapt2/StringPool_test.cpp b/tools/aapt2/StringPool_test.cpp
index b1e5ce2..58a03de 100644
--- a/tools/aapt2/StringPool_test.cpp
+++ b/tools/aapt2/StringPool_test.cpp
@@ -20,6 +20,7 @@
 
 #include "androidfw/StringPiece.h"
 
+#include "Diagnostics.h"
 #include "test/Test.h"
 #include "util/Util.h"
 
@@ -188,10 +189,11 @@
 
 TEST(StringPoolTest, FlattenEmptyStringPoolUtf8) {
   using namespace android;  // For NO_ERROR on Windows.
+  StdErrDiagnostics diag;
 
   StringPool pool;
   BigBuffer buffer(1024);
-  StringPool::FlattenUtf8(&buffer, pool);
+  StringPool::FlattenUtf8(&buffer, pool, &diag);
 
   std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
   ResStringPool test;
@@ -200,11 +202,12 @@
 
 TEST(StringPoolTest, FlattenOddCharactersUtf16) {
   using namespace android;  // For NO_ERROR on Windows.
+  StdErrDiagnostics diag;
 
   StringPool pool;
   pool.MakeRef("\u093f");
   BigBuffer buffer(1024);
-  StringPool::FlattenUtf16(&buffer, pool);
+  StringPool::FlattenUtf16(&buffer, pool, &diag);
 
   std::unique_ptr<uint8_t[]> data = util::Copy(buffer);
   ResStringPool test;
@@ -225,6 +228,7 @@
 
 TEST(StringPoolTest, Flatten) {
   using namespace android;  // For NO_ERROR on Windows.
+  StdErrDiagnostics diag;
 
   StringPool pool;
 
@@ -244,8 +248,8 @@
   EXPECT_THAT(ref_d.index(), Eq(4u));
 
   BigBuffer buffers[2] = {BigBuffer(1024), BigBuffer(1024)};
-  StringPool::FlattenUtf8(&buffers[0], pool);
-  StringPool::FlattenUtf16(&buffers[1], pool);
+  StringPool::FlattenUtf8(&buffers[0], pool, &diag);
+  StringPool::FlattenUtf16(&buffers[1], pool, &diag);
 
   // Test both UTF-8 and UTF-16 buffers.
   for (const BigBuffer& buffer : buffers) {
@@ -288,4 +292,53 @@
   }
 }
 
+
+TEST(StringPoolTest, MaxEncodingLength) {
+  StdErrDiagnostics diag;
+  using namespace android;  // For NO_ERROR on Windows.
+  ResStringPool test;
+
+  StringPool pool;
+  pool.MakeRef("aaaaaaaaaa");
+  BigBuffer buffers[2] = {BigBuffer(1024), BigBuffer(1024)};
+
+  // Make sure a UTF-8 string under the maximum length does not produce an error
+  EXPECT_THAT(StringPool::FlattenUtf8(&buffers[0], pool, &diag), Eq(true));
+  std::unique_ptr<uint8_t[]> data = util::Copy(buffers[0]);
+  test.setTo(data.get(), buffers[0].size());
+  EXPECT_THAT(util::GetString(test, 0), Eq("aaaaaaaaaa"));
+
+  // Make sure a UTF-16 string under the maximum length does not produce an error
+  EXPECT_THAT(StringPool::FlattenUtf16(&buffers[1], pool, &diag), Eq(true));
+  data = util::Copy(buffers[1]);
+  test.setTo(data.get(), buffers[1].size());
+  EXPECT_THAT(util::GetString16(test, 0), Eq(u"aaaaaaaaaa"));
+
+  StringPool pool2;
+  std::string longStr(50000, 'a');
+  pool2.MakeRef("this fits1");
+  pool2.MakeRef(longStr);
+  pool2.MakeRef("this fits2");
+  BigBuffer buffers2[2] = {BigBuffer(1024), BigBuffer(1024)};
+
+  // Make sure a string that exceeds the maximum length of UTF-8 produces an
+  // error and writes a shorter error string instead
+  EXPECT_THAT(StringPool::FlattenUtf8(&buffers2[0], pool2, &diag), Eq(false));
+  data = util::Copy(buffers2[0]);
+  test.setTo(data.get(), buffers2[0].size());
+  EXPECT_THAT(util::GetString(test, 0), "this fits1");
+  EXPECT_THAT(util::GetString(test, 1), "STRING_TOO_LARGE");
+  EXPECT_THAT(util::GetString(test, 2), "this fits2");
+
+  // Make sure a string that a string that exceeds the maximum length of UTF-8
+  // but not UTF-16 does not error for UTF-16
+  StringPool pool3;
+  std::u16string longStr16(50000, 'a');
+  pool3.MakeRef(longStr);
+  EXPECT_THAT(StringPool::FlattenUtf16(&buffers2[1], pool3, &diag), Eq(true));
+  data = util::Copy(buffers2[1]);
+  test.setTo(data.get(), buffers2[1].size());
+  EXPECT_THAT(util::GetString16(test, 0), Eq(longStr16));
+}
+
 }  // namespace aapt
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 101f74e..2d83a14 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -258,7 +258,7 @@
     ContainerWriter container_writer(&copying_adaptor, 1u);
 
     pb::ResourceTable pb_table;
-    SerializeTableToPb(table, &pb_table);
+    SerializeTableToPb(table, &pb_table, context->GetDiagnostics());
     if (!container_writer.AddResTableEntry(pb_table)) {
       context->GetDiagnostics()->Error(DiagMessage(output_path) << "failed to write");
       return false;
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp
index 7f956c5..eb307fb 100644
--- a/tools/aapt2/cmd/Convert.cpp
+++ b/tools/aapt2/cmd/Convert.cpp
@@ -226,7 +226,7 @@
 
   bool SerializeTable(ResourceTable* table, IArchiveWriter* writer) override {
     pb::ResourceTable pb_table;
-    SerializeTableToPb(*table, &pb_table);
+    SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics());
     return io::CopyProtoToArchive(context_, &pb_table, kProtoResourceTablePath,
                                   ArchiveEntry::kCompress, writer);
   }
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 0839f6f..a3b7664 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -1073,7 +1073,7 @@
 
       case OutputFormat::kProto: {
         pb::ResourceTable pb_table;
-        SerializeTableToPb(*table, &pb_table);
+        SerializeTableToPb(*table, &pb_table, context_->GetDiagnostics());
         return io::CopyProtoToArchive(context_, &pb_table, kProtoResourceTablePath,
                                       ArchiveEntry::kCompress, writer);
       } break;
@@ -2159,7 +2159,11 @@
                             "Syntax: path/to/output.apk:<config>[,<config>[...]].\n"
                             "On Windows, use a semicolon ';' separator instead.",
                             &split_args)
-          .OptionalSwitch("-v", "Enables verbose logging.", &verbose);
+          .OptionalSwitch("-v", "Enables verbose logging.", &verbose)
+          .OptionalSwitch("--debug-mode",
+                          "Inserts android:debuggable=\"true\" in to the application node of the\n"
+                          "manifest, making the application debuggable even on production devices.",
+                          &options.manifest_fixer_options.debug_mode);
 
   if (!flags.Parse("aapt2 link", args, &std::cerr)) {
     return 1;
diff --git a/tools/aapt2/format/binary/TableFlattener.cpp b/tools/aapt2/format/binary/TableFlattener.cpp
index 24a4112..6fd4c8d 100644
--- a/tools/aapt2/format/binary/TableFlattener.cpp
+++ b/tools/aapt2/format/binary/TableFlattener.cpp
@@ -255,10 +255,10 @@
     FlattenTypes(&type_buffer);
 
     pkg_header->typeStrings = util::HostToDevice32(pkg_writer.size());
-    StringPool::FlattenUtf16(pkg_writer.buffer(), type_pool_);
+    StringPool::FlattenUtf16(pkg_writer.buffer(), type_pool_, diag_);
 
     pkg_header->keyStrings = util::HostToDevice32(pkg_writer.size());
-    StringPool::FlattenUtf8(pkg_writer.buffer(), key_pool_);
+    StringPool::FlattenUtf8(pkg_writer.buffer(), key_pool_, diag_);
 
     // Append the types.
     buffer->AppendBuffer(std::move(type_buffer));
@@ -590,7 +590,8 @@
   table_header->packageCount = util::HostToDevice32(table->packages.size());
 
   // Flatten the values string pool.
-  StringPool::FlattenUtf8(table_writer.buffer(), table->string_pool);
+  StringPool::FlattenUtf8(table_writer.buffer(), table->string_pool,
+      context->GetDiagnostics());
 
   BigBuffer package_buffer(1024);
 
diff --git a/tools/aapt2/format/binary/XmlFlattener.cpp b/tools/aapt2/format/binary/XmlFlattener.cpp
index 781b9fe..d897941 100644
--- a/tools/aapt2/format/binary/XmlFlattener.cpp
+++ b/tools/aapt2/format/binary/XmlFlattener.cpp
@@ -333,9 +333,9 @@
 
   // Flatten the StringPool.
   if (options_.use_utf16) {
-    StringPool::FlattenUtf16(buffer_, visitor.pool);
+    StringPool::FlattenUtf16(buffer_, visitor.pool, context->GetDiagnostics());
   } else {
-    StringPool::FlattenUtf8(buffer_, visitor.pool);
+    StringPool::FlattenUtf8(buffer_, visitor.pool, context->GetDiagnostics());
   }
 
   {
diff --git a/tools/aapt2/format/proto/ProtoSerialize.cpp b/tools/aapt2/format/proto/ProtoSerialize.cpp
index 1d00852..2e56359 100644
--- a/tools/aapt2/format/proto/ProtoSerialize.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize.cpp
@@ -21,9 +21,9 @@
 
 namespace aapt {
 
-void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool) {
+void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool, IDiagnostics* diag) {
   BigBuffer buffer(1024);
-  StringPool::FlattenUtf8(&buffer, pool);
+  StringPool::FlattenUtf8(&buffer, pool, diag);
 
   std::string* data = out_pb_pool->mutable_data();
   data->reserve(buffer.size());
@@ -270,7 +270,8 @@
   out_pb_config->set_sdk_version(config.sdkVersion);
 }
 
-void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table) {
+void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table,
+                        IDiagnostics* diag) {
   StringPool source_pool;
   for (const std::unique_ptr<ResourceTablePackage>& package : table.packages) {
     pb::Package* pb_package = out_table->add_package();
@@ -323,7 +324,7 @@
       }
     }
   }
-  SerializeStringPoolToPb(source_pool, out_table->mutable_source_pool());
+  SerializeStringPoolToPb(source_pool, out_table->mutable_source_pool(), diag);
 }
 
 static pb::Reference_Type SerializeReferenceTypeToPb(Reference::Type type) {
diff --git a/tools/aapt2/format/proto/ProtoSerialize.h b/tools/aapt2/format/proto/ProtoSerialize.h
index 95dd413..951494c 100644
--- a/tools/aapt2/format/proto/ProtoSerialize.h
+++ b/tools/aapt2/format/proto/ProtoSerialize.h
@@ -46,13 +46,13 @@
 
 // Serializes a StringPool into its protobuf representation, which is really just the binary
 // ResStringPool representation stuffed into a bytes field.
-void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool);
+void SerializeStringPoolToPb(const StringPool& pool, pb::StringPool* out_pb_pool, IDiagnostics* diag);
 
 // Serializes a ConfigDescription into its protobuf representation.
 void SerializeConfig(const ConfigDescription& config, pb::Configuration* out_pb_config);
 
 // Serializes a ResourceTable into its protobuf representation.
-void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table);
+void SerializeTableToPb(const ResourceTable& table, pb::ResourceTable* out_table, IDiagnostics* diag);
 
 // Serializes a ResourceFile into its protobuf representation.
 void SerializeCompiledFileToPb(const ResourceFile& file, pb::internal::CompiledFile* out_file);
diff --git a/tools/aapt2/format/proto/ProtoSerialize_test.cpp b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
index 9081ab6..6366a3d 100644
--- a/tools/aapt2/format/proto/ProtoSerialize_test.cpp
+++ b/tools/aapt2/format/proto/ProtoSerialize_test.cpp
@@ -95,7 +95,7 @@
                                     Overlayable{}, test::GetDiagnostics()));
 
   pb::ResourceTable pb_table;
-  SerializeTableToPb(*table, &pb_table);
+  SerializeTableToPb(*table, &pb_table, context->GetDiagnostics());
 
   test::TestFile file_a("res/layout/main.xml");
   MockFileCollection files;
@@ -255,6 +255,7 @@
 }
 
 TEST(ProtoSerializeTest, SerializeAndDeserializePrimitives) {
+  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
   std::unique_ptr<ResourceTable> table =
       test::ResourceTableBuilder()
           .AddValue("android:bool/boolean_true",
@@ -274,7 +275,7 @@
           .Build();
 
   pb::ResourceTable pb_table;
-  SerializeTableToPb(*table, &pb_table);
+  SerializeTableToPb(*table, &pb_table, context->GetDiagnostics());
 
   test::TestFile file_a("res/layout/main.xml");
   MockFileCollection files;
diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp
index 713db5b..165702c 100644
--- a/tools/aapt2/link/ManifestFixer.cpp
+++ b/tools/aapt2/link/ManifestFixer.cpp
@@ -354,6 +354,14 @@
   uses_static_library_action.Action(RequiredAndroidAttribute("version"));
   uses_static_library_action.Action(RequiredAndroidAttribute("certDigest"));
 
+  if (options_.debug_mode) {
+    application_action.Action([&](xml::Element* el) -> bool {
+      xml::Attribute *attr = el->FindOrCreateAttribute(xml::kSchemaAndroid, "debuggable");
+      attr->value = "true";
+      return true;
+    });
+  }
+
   application_action["meta-data"] = meta_data_action;
 
   application_action["activity"] = component_action;
diff --git a/tools/aapt2/link/ManifestFixer.h b/tools/aapt2/link/ManifestFixer.h
index 0caa52e..7d6fad2 100644
--- a/tools/aapt2/link/ManifestFixer.h
+++ b/tools/aapt2/link/ManifestFixer.h
@@ -58,10 +58,13 @@
   // 'android:compileSdkVersionCodename' in the <manifest> tag.
   Maybe<std::string> compile_sdk_version_codename;
 
-  // Wether validation errors should be treated only as warnings. If this is 'true', then an
+  // Whether validation errors should be treated only as warnings. If this is 'true', then an
   // incorrect node will not result in an error, but only as a warning, and the parsing will
   // continue.
   bool warn_validation = false;
+
+  // Whether to inject the android:debuggable="true" flag into the manifest
+  bool debug_mode = false;
 };
 
 // Verifies that the manifest is correctly formed and inserts defaults where specified with
diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp
index ed98d71..8db9374 100644
--- a/tools/aapt2/link/ManifestFixer_test.cpp
+++ b/tools/aapt2/link/ManifestFixer_test.cpp
@@ -416,6 +416,68 @@
   EXPECT_THAT(Verify(input), IsNull());
 }
 
+TEST_F(ManifestFixerTest, ApplicationInjectDebuggable) {
+  ManifestFixerOptions options;
+  options.debug_mode = true;
+
+  std::string no_d = R"(
+      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android">
+        <application>
+        </application>
+      </manifest>)";
+
+  std::string false_d = R"(
+      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android">
+        <application android:debuggable="false">
+        </application>
+      </manifest>)";
+
+  std::string true_d = R"(
+      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android">
+        <application android:debuggable="true">
+        </application>
+      </manifest>)";
+
+  // Inject the debuggable attribute when the attribute is not present and the
+  // flag is present
+  std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(no_d, options);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
+
+  // Set the debuggable flag to true if the attribute is false and the flag is
+  // present
+  manifest = VerifyWithOptions(false_d, options);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
+
+  // Keep debuggable flag true if the attribute is true and the flag is present
+  manifest = VerifyWithOptions(true_d, options);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
+
+  // Do not inject the debuggable attribute when the attribute is not present
+  // and the flag is not present
+  manifest = Verify(no_d);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), IsNull());
+
+  // Do not set the debuggable flag to true if the attribute is false and the
+  // flag is not present
+  manifest = Verify(false_d);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), IsNull());
+
+  // Keep debuggable flag true if the attribute is true and the flag is not
+  // present
+  manifest = Verify(true_d);
+  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
+      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
+}
+
+
 TEST_F(ManifestFixerTest, IgnoreNamespacedElements) {
   std::string input = R"EOF(
       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp
index 7e922e6..a274a8c 100644
--- a/tools/incident_section_gen/main.cpp
+++ b/tools/incident_section_gen/main.cpp
@@ -393,6 +393,11 @@
 static bool generateSectionListCpp(Descriptor const* descriptor) {
     generateHead("section_list");
 
+    // generate namespaces
+    printf("namespace android {\n");
+    printf("namespace os {\n");
+    printf("namespace incidentd {\n");
+
     // generates SECTION_LIST
     printf("// Generate SECTION_LIST.\n\n");
 
@@ -502,6 +507,10 @@
         printf("const Privacy** PRIVACY_POLICY_LIST = createList();\n\n");
         printf("const int PRIVACY_POLICY_COUNT = %d;\n", policyCount);
     }
+
+    printf("}  // incidentd\n");
+    printf("}  // os\n");
+    printf("}  // android\n");
     return true;
 }
 
diff --git a/tools/stats_log_api_gen/Android.bp b/tools/stats_log_api_gen/Android.bp
index 948422c..17819db 100644
--- a/tools/stats_log_api_gen/Android.bp
+++ b/tools/stats_log_api_gen/Android.bp
@@ -101,7 +101,6 @@
     cflags: [
         "-Wall",
         "-Werror",
-        "-fexceptions",
     ],
     export_generated_headers: ["statslog.h"],
     shared_libs: [
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index 499f254..057772f 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -101,7 +101,8 @@
     fprintf(out, "// This file is autogenerated\n");
     fprintf(out, "\n");
 
-    fprintf(out, "#include <exception>\n");
+    fprintf(out, "#include <chrono>\n");
+    fprintf(out, "#include <thread>\n");
     fprintf(out, "#include <log/log_event_list.h>\n");
     fprintf(out, "#include <log/log.h>\n");
     fprintf(out, "#include <statslog.h>\n");
@@ -212,7 +213,7 @@
         int argIndex;
 
         fprintf(out, "int\n");
-        fprintf(out, "stats_write(int32_t code");
+        fprintf(out, "try_stats_write(int32_t code");
         argIndex = 1;
         for (vector<java_type_t>::const_iterator arg = signature->begin();
             arg != signature->end(); arg++) {
@@ -247,10 +248,6 @@
                     if (chainField.javaType == JAVA_TYPE_STRING) {
                         fprintf(out, "    if (%s_length != %s.size()) {\n",
                             attributionDecl.fields.front().name.c_str(), chainField.name.c_str());
-                        fprintf(out, "        throw std::invalid_argument(\"attribution fields with"
-                            " diff length: %s vs %s\");\n",
-                            attributionDecl.fields.front().name.c_str(),
-                            chainField.name.c_str());
                         fprintf(out, "        return -EINVAL;\n");
                         fprintf(out, "    }\n");
                     }
@@ -289,12 +286,74 @@
         fprintf(out, "\n");
     }
 
+   for (set<vector<java_type_t>>::const_iterator signature = atoms.signatures.begin();
+       signature != atoms.signatures.end(); signature++) {
+       int argIndex;
+
+       fprintf(out, "int \n");
+       fprintf(out, "stats_write(int32_t code");
+       argIndex = 1;
+       for (vector<java_type_t>::const_iterator arg = signature->begin();
+           arg != signature->end(); arg++) {
+           if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
+               for (auto chainField : attributionDecl.fields) {
+                   if (chainField.javaType == JAVA_TYPE_STRING) {
+                           fprintf(out, ", const std::vector<%s>& %s",
+                                cpp_type_name(chainField.javaType),
+                                chainField.name.c_str());
+                   } else {
+                           fprintf(out, ", const %s* %s, size_t %s_length",
+                                cpp_type_name(chainField.javaType),
+                                chainField.name.c_str(), chainField.name.c_str());
+                   }
+               }
+           } else {
+               fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex);
+           }
+           argIndex++;
+       }
+       fprintf(out, ")\n");
+
+       fprintf(out, "{\n");
+       fprintf(out, "  int ret = 0;\n");
+
+       fprintf(out, "  for(int retry = 0; retry < 3; ++retry) {\n");
+       fprintf(out, "      ret =  try_stats_write(code");
+
+       argIndex = 1;
+       for (vector<java_type_t>::const_iterator arg = signature->begin();
+           arg != signature->end(); arg++) {
+           if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
+               for (auto chainField : attributionDecl.fields) {
+                   if (chainField.javaType == JAVA_TYPE_STRING) {
+                           fprintf(out, ", %s",
+                                chainField.name.c_str());
+                   } else {
+                           fprintf(out, ",  %s,  %s_length",
+                                chainField.name.c_str(), chainField.name.c_str());
+                   }
+               }
+           } else {
+               fprintf(out, ", arg%d", argIndex);
+           }
+           argIndex++;
+       }
+       fprintf(out, ");\n");
+       fprintf(out, "      if (ret >= 0) { return retry; }\n");
+       fprintf(out,
+               "      std::this_thread::sleep_for(std::chrono::milliseconds(10 + 10 * retry));\n");
+       fprintf(out, "  }\n");
+       fprintf(out, "  return ret;\n");
+       fprintf(out, "}\n");
+       fprintf(out, "\n");
+   }
+
     for (set<vector<java_type_t>>::const_iterator signature = atoms.non_chained_signatures.begin();
         signature != atoms.non_chained_signatures.end(); signature++) {
         int argIndex;
 
         fprintf(out, "int\n");
-        fprintf(out, "stats_write_non_chained(int32_t code");
+        fprintf(out, "try_stats_write_non_chained(int32_t code");
         argIndex = 1;
         for (vector<java_type_t>::const_iterator arg = signature->begin();
             arg != signature->end(); arg++) {
@@ -331,6 +390,45 @@
         fprintf(out, "}\n");
         fprintf(out, "\n");
     }
+
+   for (set<vector<java_type_t>>::const_iterator signature = atoms.non_chained_signatures.begin();
+       signature != atoms.non_chained_signatures.end(); signature++) {
+       int argIndex;
+
+       fprintf(out, "int\n");
+       fprintf(out, "stats_write_non_chained(int32_t code");
+       argIndex = 1;
+       for (vector<java_type_t>::const_iterator arg = signature->begin();
+           arg != signature->end(); arg++) {
+           fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex);
+           argIndex++;
+       }
+       fprintf(out, ")\n");
+
+       fprintf(out, "{\n");
+
+       fprintf(out, "  int ret = 0;\n");
+       fprintf(out, "  for(int retry = 0; retry < 3; ++retry) {\n");
+       fprintf(out, "      ret =  try_stats_write_non_chained(code");
+
+       argIndex = 1;
+       for (vector<java_type_t>::const_iterator arg = signature->begin();
+           arg != signature->end(); arg++) {
+           fprintf(out, ", arg%d",   argIndex);
+           argIndex++;
+       }
+       fprintf(out, ");\n");
+       fprintf(out, "      if (ret >= 0) { return retry; }\n");
+       fprintf(out,
+               "      std::this_thread::sleep_for(std::chrono::milliseconds(10 + 10 * retry));\n");
+       fprintf(out, "  }\n");
+       fprintf(out, "  return ret;\n");
+       fprintf(out, "}\n");
+
+       fprintf(out, "\n");
+   }
+
+
     // Print footer
     fprintf(out, "\n");
     fprintf(out, "} // namespace util\n");
@@ -775,10 +873,6 @@
                         fprintf(out, "    if (%s_length != %s_length) {\n",
                             chainField.name.c_str(),
                             attributionDecl.fields.front().name.c_str());
-                        fprintf(out, "        jniThrowException(env, "
-                            "\"java/lang/IllegalArgumentException\", "
-                            "\"invalid attribution field(%s) length.\");\n",
-                            chainField.name.c_str());
                         fprintf(out, "        return -EINVAL;\n");
                         fprintf(out, "    }\n");
                     }
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index 2f7b50d..b333126 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -143,7 +143,7 @@
 
     WifiConfiguration getWifiApConfiguration();
 
-    void setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName);
+    boolean setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName);
 
     Messenger getWifiServiceMessenger(String packageName);
 
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index b77b1ad..f6c67c9 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -28,10 +28,12 @@
 import android.net.wifi.WifiInfo;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.SystemClock;
 import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.BackupUtils;
 import android.util.Log;
+import android.util.TimeUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
@@ -611,37 +613,6 @@
 
     /**
      * @hide
-     * Last time the system tried to connect and failed.
-     */
-    public long lastConnectionFailure;
-
-    /**
-     * @hide
-     * Last time the system tried to roam and failed because of authentication failure or DHCP
-     * RENEW failure.
-     */
-    public long lastRoamingFailure;
-
-    /** @hide */
-    public static int ROAMING_FAILURE_IP_CONFIG = 1;
-    /** @hide */
-    public static int ROAMING_FAILURE_AUTH_FAILURE = 2;
-
-    /**
-     * @hide
-     * Initial amount of time this Wifi configuration gets blacklisted for network switching
-     * because of roaming failure
-     */
-    public long roamingFailureBlackListTimeMilli = 1000;
-
-    /**
-     * @hide
-     * Last roaming failure reason code
-     */
-    public int lastRoamingFailureReason;
-
-    /**
-     * @hide
      * Last time the system was disconnected to this configuration.
      */
     public long lastDisconnected;
@@ -1620,8 +1591,9 @@
         }
         if (mNetworkSelectionStatus.getConnectChoice() != null) {
             sbuf.append(" connect choice: ").append(mNetworkSelectionStatus.getConnectChoice());
-            sbuf.append(" connect choice set time: ").append(mNetworkSelectionStatus
-                    .getConnectChoiceTimestamp());
+            sbuf.append(" connect choice set time: ")
+                    .append(TimeUtils.logTimeOfDay(
+                            mNetworkSelectionStatus.getConnectChoiceTimestamp()));
         }
         sbuf.append(" hasEverConnected: ")
                 .append(mNetworkSelectionStatus.getHasEverConnected()).append("\n");
@@ -1724,7 +1696,7 @@
             sbuf.append(" networkSelectionBSSID="
                     + mNetworkSelectionStatus.getNetworkSelectionBSSID());
         }
-        long now_ms = System.currentTimeMillis();
+        long now_ms = SystemClock.elapsedRealtime();
         if (mNetworkSelectionStatus.getDisableTime() != NetworkSelectionStatus
                 .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP) {
             sbuf.append('\n');
@@ -1746,35 +1718,9 @@
 
         if (this.lastConnected != 0) {
             sbuf.append('\n');
-            long diff = now_ms - this.lastConnected;
-            if (diff <= 0) {
-                sbuf.append("lastConnected since <incorrect>");
-            } else {
-                sbuf.append("lastConnected: ").append(Long.toString(diff / 1000)).append("sec ");
-            }
+            sbuf.append("lastConnected: ").append(TimeUtils.logTimeOfDay(this.lastConnected));
+            sbuf.append(" ");
         }
-        if (this.lastConnectionFailure != 0) {
-            sbuf.append('\n');
-            long diff = now_ms - this.lastConnectionFailure;
-            if (diff <= 0) {
-                sbuf.append("lastConnectionFailure since <incorrect> ");
-            } else {
-                sbuf.append("lastConnectionFailure: ").append(Long.toString(diff / 1000));
-                sbuf.append("sec ");
-            }
-        }
-        if (this.lastRoamingFailure != 0) {
-            sbuf.append('\n');
-            long diff = now_ms - this.lastRoamingFailure;
-            if (diff <= 0) {
-                sbuf.append("lastRoamingFailure since <incorrect> ");
-            } else {
-                sbuf.append("lastRoamingFailure: ").append(Long.toString(diff / 1000));
-                sbuf.append("sec ");
-            }
-        }
-        sbuf.append("roamingFailureBlackListTimeMilli: ").
-                append(Long.toString(this.roamingFailureBlackListTimeMilli));
         sbuf.append('\n');
         if (this.linkedConfigurations != null) {
             for (String key : this.linkedConfigurations.keySet()) {
@@ -2119,10 +2065,6 @@
 
             lastConnected = source.lastConnected;
             lastDisconnected = source.lastDisconnected;
-            lastConnectionFailure = source.lastConnectionFailure;
-            lastRoamingFailure = source.lastRoamingFailure;
-            lastRoamingFailureReason = source.lastRoamingFailureReason;
-            roamingFailureBlackListTimeMilli = source.roamingFailureBlackListTimeMilli;
             numScorerOverride = source.numScorerOverride;
             numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
             numAssociation = source.numAssociation;
@@ -2188,10 +2130,6 @@
         dest.writeInt(lastUpdateUid);
         dest.writeString(creatorName);
         dest.writeString(lastUpdateName);
-        dest.writeLong(lastConnectionFailure);
-        dest.writeLong(lastRoamingFailure);
-        dest.writeInt(lastRoamingFailureReason);
-        dest.writeLong(roamingFailureBlackListTimeMilli);
         dest.writeInt(numScorerOverride);
         dest.writeInt(numScorerOverrideAndSwitchedNetwork);
         dest.writeInt(numAssociation);
@@ -2257,10 +2195,6 @@
                 config.lastUpdateUid = in.readInt();
                 config.creatorName = in.readString();
                 config.lastUpdateName = in.readString();
-                config.lastConnectionFailure = in.readLong();
-                config.lastRoamingFailure = in.readLong();
-                config.lastRoamingFailureReason = in.readInt();
-                config.roamingFailureBlackListTimeMilli = in.readLong();
                 config.numScorerOverride = in.readInt();
                 config.numScorerOverrideAndSwitchedNetwork = in.readInt();
                 config.numAssociation = in.readInt();
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 433285b..9c6c8a9 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -2141,7 +2141,8 @@
     }
 
     /**
-     * Sets the Wi-Fi AP Configuration.
+     * Sets the Wi-Fi AP Configuration.  The AP configuration must either be open or
+     * WPA2 PSK networks.
      * @return {@code true} if the operation succeeded, {@code false} otherwise
      *
      * @hide
@@ -2150,8 +2151,7 @@
     @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE)
     public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) {
         try {
-            mService.setWifiApConfiguration(wifiConfig, mContext.getOpPackageName());
-            return true;
+            return mService.setWifiApConfiguration(wifiConfig, mContext.getOpPackageName());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/wifi/tests/AndroidTest.xml b/wifi/tests/AndroidTest.xml
index 764eb2b..45c7a17 100644
--- a/wifi/tests/AndroidTest.xml
+++ b/wifi/tests/AndroidTest.xml
@@ -23,5 +23,6 @@
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.net.wifi.test" />
         <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" />
+        <option name="hidden-api-checks" value="false"/>
     </test>
 </configuration>
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index f3a78bd..f3ffcad 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -1034,4 +1034,40 @@
         verifyNoMoreInteractions(mWifiService);
     }
 
+    /**
+     * Verify that a successful call properly returns true.
+     */
+    @Test
+    public void testSetWifiApConfigurationSuccessReturnsTrue() throws Exception {
+        WifiConfiguration apConfig = new WifiConfiguration();
+
+        when(mWifiService.setWifiApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
+                .thenReturn(true);
+        assertTrue(mWifiManager.setWifiApConfiguration(apConfig));
+    }
+
+    /**
+     * Verify that a failed call properly returns false.
+     */
+    @Test
+    public void testSetWifiApConfigurationFailureReturnsFalse() throws Exception {
+        WifiConfiguration apConfig = new WifiConfiguration();
+
+        when(mWifiService.setWifiApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
+                .thenReturn(false);
+        assertFalse(mWifiManager.setWifiApConfiguration(apConfig));
+    }
+
+    /**
+     * Verify Exceptions are rethrown when underlying calls to WifiService throw exceptions.
+     */
+    @Test
+    public void testSetWifiApConfigurationRethrowsException() throws Exception {
+        doThrow(new SecurityException()).when(mWifiService).setWifiApConfiguration(any(), any());
+
+        try {
+            mWifiManager.setWifiApConfiguration(new WifiConfiguration());
+            fail("setWifiApConfiguration should rethrow Exceptions from WifiService");
+        } catch (SecurityException e) { }
+    }
 }