Merge changes I6358cfe3,I00b20bd7 into pi-dev

* changes:
  Fix status icon tint in QQS.
  Fix QQS side padding for icons and tiles.
diff --git a/Android.bp b/Android.bp
index 9c76e14..22fe23d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -603,6 +603,7 @@
         "core/java/android/content/EventLogTags.logtags",
         "core/java/android/speech/tts/EventLogTags.logtags",
         "core/java/android/net/EventLogTags.logtags",
+        "core/java/android/os/EventLogTags.logtags",
         "core/java/android/webkit/EventLogTags.logtags",
         "core/java/com/android/internal/app/EventLogTags.logtags",
         "core/java/com/android/internal/logging/EventLogTags.logtags",
diff --git a/api/current.txt b/api/current.txt
index 94c7a8c..eac2168 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7212,7 +7212,6 @@
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
     field public static final java.lang.String EXTRA_RANGE_VALUE = "android.app.slice.extra.RANGE_VALUE";
-    field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
     field public static final java.lang.String EXTRA_TOGGLE_STATE = "android.app.slice.extra.TOGGLE_STATE";
     field public static final java.lang.String HINT_ACTIONS = "actions";
     field public static final java.lang.String HINT_ERROR = "error";
@@ -7239,14 +7238,12 @@
     field public static final java.lang.String SUBTYPE_MILLIS = "millis";
     field public static final java.lang.String SUBTYPE_PRIORITY = "priority";
     field public static final java.lang.String SUBTYPE_RANGE = "range";
-    field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
     field public static final java.lang.String SUBTYPE_SOURCE = "source";
     field public static final java.lang.String SUBTYPE_TOGGLE = "toggle";
     field public static final java.lang.String SUBTYPE_VALUE = "value";
   }
 
   public static class Slice.Builder {
-    ctor public deprecated Slice.Builder(android.net.Uri);
     ctor public Slice.Builder(android.net.Uri, android.app.slice.SliceSpec);
     ctor public Slice.Builder(android.app.slice.Slice.Builder);
     method public android.app.slice.Slice.Builder addAction(android.app.PendingIntent, android.app.slice.Slice, java.lang.String);
@@ -7258,10 +7255,8 @@
     method public android.app.slice.Slice.Builder addRemoteInput(android.app.RemoteInput, java.lang.String, java.util.List<java.lang.String>);
     method public android.app.slice.Slice.Builder addSubSlice(android.app.slice.Slice, java.lang.String);
     method public android.app.slice.Slice.Builder addText(java.lang.CharSequence, java.lang.String, java.util.List<java.lang.String>);
-    method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
     method public android.app.slice.Slice build();
     method public android.app.slice.Slice.Builder setCallerNeeded(boolean);
-    method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
   }
 
   public final class SliceItem implements android.os.Parcelable {
@@ -7272,11 +7267,11 @@
     method public java.util.List<java.lang.String> getHints();
     method public android.graphics.drawable.Icon getIcon();
     method public int getInt();
+    method public long getLong();
     method public android.app.RemoteInput getRemoteInput();
     method public android.app.slice.Slice getSlice();
     method public java.lang.String getSubType();
     method public java.lang.CharSequence getText();
-    method public long getTimestamp();
     method public boolean hasHint(java.lang.String);
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.app.slice.SliceItem> CREATOR;
@@ -7288,14 +7283,11 @@
     field public static final java.lang.String FORMAT_REMOTE_INPUT = "input";
     field public static final java.lang.String FORMAT_SLICE = "slice";
     field public static final java.lang.String FORMAT_TEXT = "text";
-    field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
   }
 
   public class SliceManager {
     method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
-    method public deprecated android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
     method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.Set<android.app.slice.SliceSpec>);
-    method public deprecated android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
     method public int checkSlicePermission(android.net.Uri, int, int);
     method public java.util.List<android.net.Uri> getPinnedSlices();
     method public java.util.Set<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
@@ -7303,7 +7295,6 @@
     method public void grantSlicePermission(java.lang.String, android.net.Uri);
     method public android.net.Uri mapIntentToUri(android.content.Intent);
     method public void pinSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
-    method public deprecated void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
     method public void revokeSlicePermission(java.lang.String, android.net.Uri);
     method public void unpinSlice(android.net.Uri);
     field public static final java.lang.String CATEGORY_SLICE = "android.app.slice.category.SLICE";
@@ -7324,7 +7315,6 @@
     method public final java.lang.String getType(android.net.Uri);
     method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues);
     method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.Set<android.app.slice.SliceSpec>);
-    method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
     method public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri);
     method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri);
     method public android.net.Uri onMapIntentToUri(android.content.Intent);
@@ -7397,7 +7387,7 @@
 
   public static class NetworkStats.Bucket {
     ctor public NetworkStats.Bucket();
-    method public int getDefaultNetwork();
+    method public int getDefaultNetworkStatus();
     method public long getEndTimeStamp();
     method public int getMetered();
     method public int getRoaming();
@@ -11020,7 +11010,7 @@
     field public java.lang.String sharedUserId;
     field public int sharedUserLabel;
     field public deprecated android.content.pm.Signature[] signatures;
-    field public android.content.pm.Signature[][] signingCertificateHistory;
+    field public android.content.pm.SigningInfo signingInfo;
     field public java.lang.String[] splitNames;
     field public int[] splitRevisionCodes;
     field public deprecated int versionCode;
@@ -11648,6 +11638,18 @@
     field public static final android.os.Parcelable.Creator<android.content.pm.Signature> CREATOR;
   }
 
+  public final class SigningInfo implements android.os.Parcelable {
+    ctor public SigningInfo();
+    ctor public SigningInfo(android.content.pm.SigningInfo);
+    method public int describeContents();
+    method public android.content.pm.Signature[] getApkContentsSigners();
+    method public android.content.pm.Signature[] getSigningCertificateHistory();
+    method public boolean hasMultipleSigners();
+    method public boolean hasPastSigningCertificates();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.content.pm.SigningInfo> CREATOR;
+  }
+
   public final class VersionedPackage implements android.os.Parcelable {
     ctor public VersionedPackage(java.lang.String, int);
     ctor public VersionedPackage(java.lang.String, long);
@@ -27201,6 +27203,7 @@
     field public static final int NET_CAPABILITY_IMS = 4; // 0x4
     field public static final int NET_CAPABILITY_INTERNET = 12; // 0xc
     field public static final int NET_CAPABILITY_MMS = 0; // 0x0
+    field public static final int NET_CAPABILITY_NOT_CONGESTED = 20; // 0x14
     field public static final int NET_CAPABILITY_NOT_METERED = 11; // 0xb
     field public static final int NET_CAPABILITY_NOT_RESTRICTED = 13; // 0xd
     field public static final int NET_CAPABILITY_NOT_ROAMING = 18; // 0x12
@@ -32052,6 +32055,7 @@
   }
 
   public class BatteryManager {
+    method public long computeChargeTimeRemaining();
     method public int getIntProperty(int);
     method public long getLongProperty(int);
     method public boolean isCharging();
@@ -41681,7 +41685,10 @@
     field public static final java.lang.String KEY_CONFIG_PLANS_PACKAGE_OVERRIDE_STRING = "config_plans_package_override_string";
     field public static final java.lang.String KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL = "config_telephony_use_own_number_for_voicemail_bool";
     field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
+    field public static final java.lang.String KEY_DATA_LIMIT_NOTIFICATION_BOOL = "data_limit_notification_bool";
     field public static final java.lang.String KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG = "data_limit_threshold_bytes_long";
+    field public static final java.lang.String KEY_DATA_RAPID_NOTIFICATION_BOOL = "data_rapid_notification_bool";
+    field public static final java.lang.String KEY_DATA_WARNING_NOTIFICATION_BOOL = "data_warning_notification_bool";
     field public static final java.lang.String KEY_DATA_WARNING_THRESHOLD_BYTES_LONG = "data_warning_threshold_bytes_long";
     field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
     field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string";
@@ -42038,7 +42045,6 @@
   }
 
   public class NetworkScan {
-    method public deprecated void stop() throws android.os.RemoteException;
     method public void stopScan();
     field public static final int ERROR_INTERRUPTED = 10002; // 0x2712
     field public static final int ERROR_INVALID_SCAN = 2; // 0x2
@@ -42502,7 +42508,6 @@
     method public boolean isWorldPhone();
     method public void listen(android.telephony.PhoneStateListener, int);
     method public android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, java.util.concurrent.Executor, android.telephony.TelephonyScanManager.NetworkScanCallback);
-    method public deprecated android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
     method public void sendDialerSpecialCode(java.lang.String);
     method public java.lang.String sendEnvelopeWithStatus(java.lang.String);
     method public void sendUssdRequest(java.lang.String, android.telephony.TelephonyManager.UssdResponseCallback, android.os.Handler);
@@ -47596,6 +47601,7 @@
     method public void invalidateDrawable(android.graphics.drawable.Drawable);
     method public void invalidateOutline();
     method public boolean isAccessibilityFocused();
+    method public boolean isAccessibilityHeading();
     method public boolean isActivated();
     method public boolean isAttachedToWindow();
     method public boolean isClickable();
@@ -47757,6 +47763,7 @@
     method public void sendAccessibilityEvent(int);
     method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
     method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
+    method public void setAccessibilityHeading(boolean);
     method public void setAccessibilityLiveRegion(int);
     method public void setAccessibilityPaneTitle(java.lang.CharSequence);
     method public void setAccessibilityTraversalAfter(int);
@@ -53832,7 +53839,6 @@
     method public android.graphics.Typeface getTypeface();
     method public android.text.style.URLSpan[] getUrls();
     method public boolean hasSelection();
-    method public boolean isAccessibilityHeading();
     method public boolean isAllCaps();
     method public boolean isCursorVisible();
     method public boolean isElegantTextHeight();
@@ -53855,7 +53861,6 @@
     method protected void onTextChanged(java.lang.CharSequence, int, int, int);
     method public boolean onTextContextMenuItem(int);
     method public void removeTextChangedListener(android.text.TextWatcher);
-    method public void setAccessibilityHeading(boolean);
     method public void setAllCaps(boolean);
     method public final void setAutoLinkMask(int);
     method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int);
diff --git a/api/removed.txt b/api/removed.txt
index 8d72483..833d8ec 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -72,6 +72,36 @@
 
 }
 
+package android.app.slice {
+
+  public final class Slice implements android.os.Parcelable {
+    field public static final deprecated java.lang.String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
+    field public static final deprecated java.lang.String SUBTYPE_SLIDER = "slider";
+  }
+
+  public static class Slice.Builder {
+    ctor public deprecated Slice.Builder(android.net.Uri);
+    method public deprecated android.app.slice.Slice.Builder addTimestamp(long, java.lang.String, java.util.List<java.lang.String>);
+    method public deprecated android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
+  }
+
+  public final class SliceItem implements android.os.Parcelable {
+    method public deprecated long getTimestamp();
+    field public static final deprecated java.lang.String FORMAT_TIMESTAMP = "long";
+  }
+
+  public class SliceManager {
+    method public deprecated android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+    method public deprecated android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
+    method public deprecated void pinSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+  }
+
+  public abstract class SliceProvider extends android.content.ContentProvider {
+    method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
+  }
+
+}
+
 package android.app.usage {
 
   public final class StorageStats implements android.os.Parcelable {
@@ -511,6 +541,18 @@
 
 }
 
+package android.telephony {
+
+  public class NetworkScan {
+    method public deprecated void stop() throws android.os.RemoteException;
+  }
+
+  public class TelephonyManager {
+    method public deprecated android.telephony.NetworkScan requestNetworkScan(android.telephony.NetworkScanRequest, android.telephony.TelephonyScanManager.NetworkScanCallback);
+  }
+
+}
+
 package android.text.format {
 
   public class DateFormat {
diff --git a/api/system-current.txt b/api/system-current.txt
index de51aa0..e54d2f6 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -383,12 +383,18 @@
   }
 
   public final class StatsManager {
+    method public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException;
     method public boolean addConfiguration(long, byte[]);
     method public byte[] getData(long);
     method public byte[] getMetadata();
+    method public byte[] getReports(long) throws android.app.StatsManager.StatsUnavailableException;
+    method public byte[] getStatsMetadata() throws android.app.StatsManager.StatsUnavailableException;
+    method public void removeConfig(long) throws android.app.StatsManager.StatsUnavailableException;
     method public boolean removeConfiguration(long);
+    method public void setBroadcastSubscriber(android.app.PendingIntent, long, long) throws android.app.StatsManager.StatsUnavailableException;
     method public boolean setBroadcastSubscriber(long, long, android.app.PendingIntent);
     method public boolean setDataFetchOperation(long, android.app.PendingIntent);
+    method public void setFetchReportsOperation(android.app.PendingIntent, long) throws android.app.StatsManager.StatsUnavailableException;
     field public static final java.lang.String ACTION_STATSD_STARTED = "android.app.action.STATSD_STARTED";
     field public static final java.lang.String EXTRA_STATS_BROADCAST_SUBSCRIBER_COOKIES = "android.app.extra.STATS_BROADCAST_SUBSCRIBER_COOKIES";
     field public static final java.lang.String EXTRA_STATS_CONFIG_KEY = "android.app.extra.STATS_CONFIG_KEY";
@@ -398,6 +404,11 @@
     field public static final java.lang.String EXTRA_STATS_SUBSCRIPTION_RULE_ID = "android.app.extra.STATS_SUBSCRIPTION_RULE_ID";
   }
 
+  public static class StatsManager.StatsUnavailableException extends android.util.AndroidException {
+    ctor public StatsManager.StatsUnavailableException(java.lang.String);
+    ctor public StatsManager.StatsUnavailableException(java.lang.String, java.lang.Throwable);
+  }
+
   public class VrManager {
     method public void setAndBindVrCompositor(android.content.ComponentName);
     method public void setPersistentVrModeEnabled(boolean);
@@ -3077,37 +3088,6 @@
     method public void onTetheringStarted();
   }
 
-  public final class IpSecManager {
-    method public void applyTunnelModeTransform(android.net.IpSecManager.IpSecTunnelInterface, int, android.net.IpSecTransform) throws java.io.IOException;
-    method public android.net.IpSecManager.IpSecTunnelInterface createIpSecTunnelInterface(java.net.InetAddress, java.net.InetAddress, android.net.Network) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException;
-  }
-
-  public static final class IpSecManager.IpSecTunnelInterface implements java.lang.AutoCloseable {
-    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(java.net.InetAddress, int) throws java.io.IOException;
-  }
-
-  public final class IpSecTransform implements java.lang.AutoCloseable {
-    method public void startNattKeepalive(android.net.IpSecTransform.NattKeepaliveCallback, int, android.os.Handler) throws java.io.IOException;
-    method public void stopNattKeepalive();
-  }
-
-  public static class IpSecTransform.Builder {
-    method public android.net.IpSecTransform buildTunnelModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex) throws java.io.IOException, android.net.IpSecManager.ResourceUnavailableException, android.net.IpSecManager.SpiUnavailableException;
-  }
-
-  public static class IpSecTransform.NattKeepaliveCallback {
-    ctor public IpSecTransform.NattKeepaliveCallback();
-    method public void onError(int);
-    method public void onStarted();
-    method public void onStopped();
-    field public static final int ERROR_HARDWARE_ERROR = 3; // 0x3
-    field public static final int ERROR_HARDWARE_UNSUPPORTED = 2; // 0x2
-    field public static final int ERROR_INVALID_NETWORK = 1; // 0x1
-  }
-
   public final class NetworkCapabilities implements android.os.Parcelable {
     field public static final int NET_CAPABILITY_OEM_PAID = 22; // 0x16
   }
@@ -4355,7 +4335,6 @@
     method public byte[] getServerParams();
     method public int getSnapshotVersion();
     method public java.security.cert.CertPath getTrustedHardwareCertPath();
-    method public deprecated byte[] getTrustedHardwarePublicKey();
     method public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR;
@@ -4380,25 +4359,19 @@
 
   public class RecoveryController {
     method public android.security.keystore.recovery.RecoverySession createRecoverySession();
-    method public byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
     method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
     method public java.security.Key getKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, java.security.UnrecoverableKeyException;
     method public android.security.keystore.recovery.KeyChainSnapshot getKeyChainSnapshot() throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public java.util.Map<java.lang.String, java.security.cert.X509Certificate> getRootCertificates();
     method public java.security.Key importKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
-    method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
     method public void initRecoveryService(java.lang.String, byte[], byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public static boolean isRecoverableKeyStoreEnabled(android.content.Context);
     method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
-    method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
     method public void setRecoveryStatus(java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public void setServerParams(byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
     method public void setSnapshotCreatedPendingIntent(android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
@@ -4410,9 +4383,6 @@
   public class RecoverySession implements java.lang.AutoCloseable {
     method public void close();
     method public java.util.Map<java.lang.String, java.security.Key> recoverKeyChainSnapshot(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
-    method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
-    method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
-    method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
     method public byte[] start(java.lang.String, java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
   }
 
@@ -4422,7 +4392,6 @@
 
   public final class WrappedApplicationKey implements android.os.Parcelable {
     method public int describeContents();
-    method public deprecated byte[] getAccount();
     method public java.lang.String getAlias();
     method public byte[] getEncryptedKeyMaterial();
     method public void writeToParcel(android.os.Parcel, int);
@@ -4432,7 +4401,6 @@
   public static class WrappedApplicationKey.Builder {
     ctor public WrappedApplicationKey.Builder();
     method public android.security.keystore.recovery.WrappedApplicationKey build();
-    method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
     method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String);
     method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]);
   }
@@ -5072,11 +5040,6 @@
 
 package android.telephony {
 
-  public static final class AccessNetworkConstants.TransportType {
-    field public static final int WLAN = 2; // 0x2
-    field public static final int WWAN = 1; // 0x1
-  }
-
   public class CarrierConfigManager {
     method public static android.os.PersistableBundle getDefaultConfig();
     method public void updateConfigForPhoneId(int, java.lang.String);
@@ -5091,66 +5054,6 @@
     field public static final java.lang.String MBMS_STREAMING_SERVICE_ACTION = "android.telephony.action.EmbmsStreaming";
   }
 
-  public class NetworkRegistrationState implements android.os.Parcelable {
-    ctor public NetworkRegistrationState(int, int, int, int, int, boolean, int[], android.telephony.CellIdentity);
-    ctor protected NetworkRegistrationState(android.os.Parcel);
-    method public int describeContents();
-    method public int getAccessNetworkTechnology();
-    method public int[] getAvailableServices();
-    method public android.telephony.CellIdentity getCellIdentity();
-    method public int getDomain();
-    method public int getReasonForDenial();
-    method public int getRegState();
-    method public int getTransportType();
-    method public boolean isEmergencyEnabled();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.telephony.NetworkRegistrationState> CREATOR;
-    field public static final int DOMAIN_CS = 1; // 0x1
-    field public static final int DOMAIN_PS = 2; // 0x2
-    field public static final int REG_STATE_DENIED = 3; // 0x3
-    field public static final int REG_STATE_HOME = 1; // 0x1
-    field public static final int REG_STATE_NOT_REG_NOT_SEARCHING = 0; // 0x0
-    field public static final int REG_STATE_NOT_REG_SEARCHING = 2; // 0x2
-    field public static final int REG_STATE_ROAMING = 5; // 0x5
-    field public static final int REG_STATE_UNKNOWN = 4; // 0x4
-    field public static final int SERVICE_TYPE_DATA = 2; // 0x2
-    field public static final int SERVICE_TYPE_EMERGENCY = 5; // 0x5
-    field public static final int SERVICE_TYPE_SMS = 3; // 0x3
-    field public static final int SERVICE_TYPE_VIDEO = 4; // 0x4
-    field public static final int SERVICE_TYPE_VOICE = 1; // 0x1
-  }
-
-  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";
-  }
-
-  public class NetworkService.NetworkServiceProvider {
-    ctor public NetworkService.NetworkServiceProvider(int);
-    method public void getNetworkRegistrationState(int, android.telephony.NetworkServiceCallback);
-    method public final int getSlotId();
-    method public final void notifyNetworkRegistrationStateChanged();
-    method protected void onDestroy();
-  }
-
-  public class NetworkServiceCallback {
-    method public void onGetNetworkRegistrationStateComplete(int, android.telephony.NetworkRegistrationState);
-    field public static final int RESULT_ERROR_BUSY = 3; // 0x3
-    field public static final int RESULT_ERROR_FAILED = 5; // 0x5
-    field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
-    field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
-    field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-  public class ServiceState implements android.os.Parcelable {
-    method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates();
-    method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(int);
-    method public android.telephony.NetworkRegistrationState getNetworkRegistrationStates(int, int);
-  }
-
   public final class SmsManager {
     method public void sendMultipartTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
     method public void sendTextMessageWithoutPersisting(java.lang.String, java.lang.String, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
@@ -5353,94 +5256,6 @@
 
 }
 
-package android.telephony.data {
-
-  public final class DataCallResponse implements android.os.Parcelable {
-    ctor public DataCallResponse(int, int, int, int, java.lang.String, java.lang.String, java.util.List<android.net.LinkAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.net.InetAddress>, java.util.List<java.lang.String>, int);
-    ctor public DataCallResponse(android.os.Parcel);
-    method public int describeContents();
-    method public int getActive();
-    method public java.util.List<android.net.LinkAddress> getAddresses();
-    method public int getCallId();
-    method public java.util.List<java.net.InetAddress> getDnses();
-    method public java.util.List<java.net.InetAddress> getGateways();
-    method public java.lang.String getIfname();
-    method public int getMtu();
-    method public java.util.List<java.lang.String> getPcscfs();
-    method public int getStatus();
-    method public int getSuggestedRetryTime();
-    method public java.lang.String getType();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.telephony.data.DataCallResponse> CREATOR;
-  }
-
-  public final class DataProfile implements android.os.Parcelable {
-    ctor public DataProfile(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, int, int, int, int, boolean, int, java.lang.String, int, int, java.lang.String, java.lang.String, boolean);
-    ctor public DataProfile(android.os.Parcel);
-    method public int describeContents();
-    method public java.lang.String getApn();
-    method public int getAuthType();
-    method public int getBearerBitmap();
-    method public int getMaxConns();
-    method public int getMaxConnsTime();
-    method public int getMtu();
-    method public java.lang.String getMvnoMatchData();
-    method public java.lang.String getMvnoType();
-    method public java.lang.String getPassword();
-    method public int getProfileId();
-    method public java.lang.String getProtocol();
-    method public java.lang.String getRoamingProtocol();
-    method public int getSupportedApnTypesBitmap();
-    method public int getType();
-    method public java.lang.String getUserName();
-    method public int getWaitTime();
-    method public boolean isEnabled();
-    method public boolean isModemCognitive();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.telephony.data.DataProfile> CREATOR;
-    field public static final int TYPE_3GPP = 1; // 0x1
-    field public static final int TYPE_3GPP2 = 2; // 0x2
-    field public static final int TYPE_COMMON = 0; // 0x0
-  }
-
-  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";
-    field public static final int REQUEST_REASON_HANDOVER = 3; // 0x3
-    field public static final int REQUEST_REASON_NORMAL = 1; // 0x1
-    field public static final int REQUEST_REASON_SHUTDOWN = 2; // 0x2
-  }
-
-  public class DataService.DataServiceProvider {
-    ctor public DataService.DataServiceProvider(int);
-    method public void deactivateDataCall(int, int, android.telephony.data.DataServiceCallback);
-    method public void getDataCallList(android.telephony.data.DataServiceCallback);
-    method public final int getSlotId();
-    method public final void notifyDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
-    method protected void onDestroy();
-    method public void setDataProfile(java.util.List<android.telephony.data.DataProfile>, boolean, android.telephony.data.DataServiceCallback);
-    method public void setInitialAttachApn(android.telephony.data.DataProfile, boolean, android.telephony.data.DataServiceCallback);
-    method public void setupDataCall(int, android.telephony.data.DataProfile, boolean, boolean, int, android.net.LinkProperties, android.telephony.data.DataServiceCallback);
-  }
-
-  public class DataServiceCallback {
-    method public void onDataCallListChanged(java.util.List<android.telephony.data.DataCallResponse>);
-    method public void onDeactivateDataCallComplete(int);
-    method public void onGetDataCallListComplete(int, java.util.List<android.telephony.data.DataCallResponse>);
-    method public void onSetDataProfileComplete(int);
-    method public void onSetInitialAttachApnComplete(int);
-    method public void onSetupDataCallComplete(int, android.telephony.data.DataCallResponse);
-    field public static final int RESULT_ERROR_BUSY = 3; // 0x3
-    field public static final int RESULT_ERROR_ILLEGAL_STATE = 4; // 0x4
-    field public static final int RESULT_ERROR_INVALID_ARG = 2; // 0x2
-    field public static final int RESULT_ERROR_UNSUPPORTED = 1; // 0x1
-    field public static final int RESULT_SUCCESS = 0; // 0x0
-  }
-
-}
-
 package android.telephony.euicc {
 
   public final class DownloadableSubscription implements android.os.Parcelable {
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 48f43e0..961026b 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -91,6 +91,38 @@
 
 }
 
+package android.security.keystore.recovery {
+
+  public final class KeyChainSnapshot implements android.os.Parcelable {
+    method public deprecated byte[] getTrustedHardwarePublicKey();
+  }
+
+  public class RecoveryController {
+    method public deprecated byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+    method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+    method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
+  }
+
+  public class RecoverySession implements java.lang.AutoCloseable {
+    method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
+    method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+    method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+  }
+
+  public final class WrappedApplicationKey implements android.os.Parcelable {
+    method public deprecated byte[] getAccount();
+  }
+
+  public static class WrappedApplicationKey.Builder {
+    method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
+  }
+
+}
+
 package android.service.notification {
 
   public abstract class NotificationListenerService extends android.app.Service {
diff --git a/api/test-current.txt b/api/test-current.txt
index a4f422b..ea8e5db 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -492,6 +492,27 @@
     method public int getProgramId();
   }
 
+  public final class BufferingParams implements android.os.Parcelable {
+    method public int describeContents();
+    method public int getInitialMarkMs();
+    method public int getResumePlaybackMarkMs();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.media.BufferingParams> CREATOR;
+  }
+
+  public static class BufferingParams.Builder {
+    ctor public BufferingParams.Builder();
+    ctor public BufferingParams.Builder(android.media.BufferingParams);
+    method public android.media.BufferingParams build();
+    method public android.media.BufferingParams.Builder setInitialMarkMs(int);
+    method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int);
+  }
+
+  public class MediaPlayer implements android.media.AudioRouting android.media.VolumeAutomation {
+    method public android.media.BufferingParams getBufferingParams();
+    method public void setBufferingParams(android.media.BufferingParams);
+  }
+
   public final class PlaybackParams implements android.os.Parcelable {
     method public int getAudioStretchMode();
     method public android.media.PlaybackParams setAudioStretchMode(int);
@@ -698,6 +719,15 @@
 
 }
 
+package android.security {
+
+  public class KeyStoreException extends java.lang.Exception {
+    ctor public KeyStoreException(int, java.lang.String);
+    method public int getErrorCode();
+  }
+
+}
+
 package android.security.keystore {
 
   public abstract class AttestationUtils {
@@ -707,6 +737,10 @@
     field public static final int ID_TYPE_SERIAL = 1; // 0x1
   }
 
+  public static final class KeyGenParameterSpec.Builder {
+    method public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean);
+  }
+
   public final class KeyProtection implements java.security.KeyStore.ProtectionParameter {
     method public long getBoundToSpecificSecureUserId();
   }
@@ -883,6 +917,10 @@
 
 package android.telephony.mbms {
 
+  public static class DownloadRequest.Builder {
+    method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
+  }
+
   public final class FileInfo implements android.os.Parcelable {
     ctor public FileInfo(android.net.Uri, java.lang.String);
   }
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index efcb1fe..f2443e8 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -79,7 +79,8 @@
       mPeriodicAlarmMonitor(periodicAlarmMonitor),
       mSendBroadcast(sendBroadcast),
       mTimeBaseNs(timeBaseNs),
-      mLastLogTimestamp(0) {
+      mLargestTimestampSeen(0),
+      mLastTimestampSeen(0) {
 }
 
 StatsLogProcessor::~StatsLogProcessor() {
@@ -156,18 +157,54 @@
 }
 
 void StatsLogProcessor::OnLogEvent(LogEvent* event) {
+    OnLogEvent(event, false);
+}
+
+void StatsLogProcessor::OnLogEvent(LogEvent* event, bool reconnected) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     const int64_t currentTimestampNs = event->GetElapsedTimestampNs();
 
-    if (currentTimestampNs < mLastLogTimestamp) {
-        StatsdStats::getInstance().noteLogEventSkipped(
-            event->GetTagId(), event->GetElapsedTimestampNs());
-        return;
+    if (reconnected && mLastTimestampSeen != 0) {
+        // LogReader tells us the connection has just been reset. Now we need
+        // to enter reconnection state to find the last CP.
+        mInReconnection = true;
+    }
+
+    if (mInReconnection) {
+        // We see the checkpoint
+        if (currentTimestampNs == mLastTimestampSeen) {
+            mInReconnection = false;
+            // Found the CP. ignore this event, and we will start to read from next event.
+            return;
+        }
+        if (currentTimestampNs > mLargestTimestampSeen) {
+            // We see a new log but CP has not been found yet. Give up now.
+            mLogLossCount++;
+            mInReconnection = false;
+            StatsdStats::getInstance().noteLogLost(currentTimestampNs);
+            // Persist the data before we reset. Do we want this?
+            WriteDataToDiskLocked();
+            // We see fresher event before we see the checkpoint. We might have lost data.
+            // The best we can do is to reset.
+            std::vector<ConfigKey> configKeys;
+            for (auto it = mMetricsManagers.begin(); it != mMetricsManagers.end(); it++) {
+                configKeys.push_back(it->first);
+            }
+            resetConfigsLocked(currentTimestampNs, configKeys);
+        } else {
+            // Still in search of the CP. Keep going.
+            return;
+        }
+    }
+
+    mLogCount++;
+    mLastTimestampSeen = currentTimestampNs;
+    if (mLargestTimestampSeen < currentTimestampNs) {
+        mLargestTimestampSeen = currentTimestampNs;
     }
 
     resetIfConfigTtlExpiredLocked(currentTimestampNs);
 
-    mLastLogTimestamp = currentTimestampNs;
     StatsdStats::getInstance().noteAtomLogged(
         event->GetTagId(), event->GetElapsedTimestampNs() / NS_PER_SEC);
 
@@ -339,15 +376,9 @@
                 (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) {
+void StatsLogProcessor::resetConfigsLocked(const int64_t timestampNs,
+                                           const std::vector<ConfigKey>& configs) {
+    for (const auto& key : configs) {
         StatsdConfig config;
         if (StorageManager::readConfigFromDisk(key, &config)) {
             OnConfigUpdatedLocked(timestampNs, key, config);
@@ -362,6 +393,18 @@
     }
 }
 
+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);
+        }
+    }
+    if (configKeysTtlExpired.size() > 0) {
+        resetConfigsLocked(timestampNs, configKeysTtlExpired);
+    }
+}
+
 void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) {
     std::lock_guard<std::mutex> lock(mMetricsMutex);
     auto it = mMetricsManagers.find(key);
diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h
index 0e1d4ba..6efdf8c 100644
--- a/cmds/statsd/src/StatsLogProcessor.h
+++ b/cmds/statsd/src/StatsLogProcessor.h
@@ -40,6 +40,9 @@
                       const std::function<void(const ConfigKey&)>& sendBroadcast);
     virtual ~StatsLogProcessor();
 
+    void OnLogEvent(LogEvent* event, bool reconnectionStarts);
+
+    // for testing only.
     void OnLogEvent(LogEvent* event);
 
     void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
@@ -122,16 +125,30 @@
     // Handler over the isolated uid change event.
     void onIsolatedUidChangedEventLocked(const LogEvent& event);
 
+    void resetConfigsLocked(const int64_t timestampNs, const std::vector<ConfigKey>& configs);
+
     // Function used to send a broadcast so that receiver for the config key can call getData
     // to retrieve the stored data.
     std::function<void(const ConfigKey& key)> mSendBroadcast;
 
     const int64_t mTimeBaseNs;
 
-    int64_t mLastLogTimestamp;
+    // Largest timestamp of the events that we have processed.
+    int64_t mLargestTimestampSeen = 0;
+
+    int64_t mLastTimestampSeen = 0;
+
+    bool mInReconnection = false;
+
+    // Processed log count
+    uint64_t mLogCount = 0;
+
+    // Log loss detected count
+    int mLogLossCount = 0;
 
     long mLastPullerCacheClearTimeSec = 0;
 
+    FRIEND_TEST(StatsLogProcessorTest, TestOutOfOrderLogs);
     FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize);
     FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast);
     FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge);
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 86a3a78..f7cc00c 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -780,8 +780,6 @@
 }
 
 void StatsService::sayHiToStatsCompanion() {
-    // TODO: This method needs to be private. It is temporarily public and unsecured for testing
-    // purposes.
     sp<IStatsCompanionService> statsCompanion = getStatsCompanionService();
     if (statsCompanion != nullptr) {
         VLOG("Telling statsCompanion that statsd is ready");
@@ -818,49 +816,44 @@
     mConfigManager->Startup();
 }
 
-void StatsService::OnLogEvent(LogEvent* event) {
-    mProcessor->OnLogEvent(event);
+void StatsService::OnLogEvent(LogEvent* event, bool reconnectionStarts) {
+    mProcessor->OnLogEvent(event, reconnectionStarts);
 }
 
 Status StatsService::getData(int64_t key, vector<uint8_t>* output) {
     IPCThreadState* ipc = IPCThreadState::self();
     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(),
-                                 false /* include_current_bucket*/, output);
-        return Status::ok();
-    } else {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    ConfigKey configKey(ipc->getCallingUid(), key);
+    mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(),
+                             false /* include_current_bucket*/, output);
+    return Status::ok();
 }
 
 Status StatsService::getMetadata(vector<uint8_t>* output) {
     IPCThreadState* ipc = IPCThreadState::self();
     VLOG("StatsService::getMetadata with Pid %i, Uid %i", ipc->getCallingPid(),
          ipc->getCallingUid());
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        StatsdStats::getInstance().dumpStats(output, false); // Don't reset the counters.
-        return Status::ok();
-    } else {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    StatsdStats::getInstance().dumpStats(output, false); // Don't reset the counters.
+    return Status::ok();
 }
 
-Status StatsService::addConfiguration(int64_t key,
-                                      const vector <uint8_t>& config,
-                                      bool* success) {
+Status StatsService::addConfiguration(int64_t key, const vector <uint8_t>& config) {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
+        return Status::fromExceptionCode(binder::Status::EX_SECURITY);
+    }
     IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        if (addConfigurationChecked(ipc->getCallingUid(), key, config)) {
-            *success = true;
-        } else {
-            *success = false;
-        }
+    if (addConfigurationChecked(ipc->getCallingUid(), key, config)) {
         return Status::ok();
     } else {
-        *success = false;
-        return Status::fromExceptionCode(binder::Status::EX_SECURITY);
+        ALOGE("Could not parse malformatted StatsdConfig");
+        return Status::fromExceptionCode(binder::Status::EX_ILLEGAL_ARGUMENT,
+                                         "config does not correspond to a StatsdConfig proto");
     }
 }
 
@@ -876,80 +869,62 @@
     return true;
 }
 
-Status StatsService::removeDataFetchOperation(int64_t key, bool* success) {
-    IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        ConfigKey configKey(ipc->getCallingUid(), key);
-        mConfigManager->RemoveConfigReceiver(configKey);
-        *success = true;
-        return Status::ok();
-    } else {
-        *success = false;
+Status StatsService::removeDataFetchOperation(int64_t key) {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    IPCThreadState* ipc = IPCThreadState::self();
+    ConfigKey configKey(ipc->getCallingUid(), key);
+    mConfigManager->RemoveConfigReceiver(configKey);
+    return Status::ok();
 }
 
-Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender,
-                                           bool* success) {
-    IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        ConfigKey configKey(ipc->getCallingUid(), key);
-        mConfigManager->SetConfigReceiver(configKey, intentSender);
-        *success = true;
-        return Status::ok();
-    } else {
-        *success = false;
+Status StatsService::setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender) {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    IPCThreadState* ipc = IPCThreadState::self();
+    ConfigKey configKey(ipc->getCallingUid(), key);
+    mConfigManager->SetConfigReceiver(configKey, intentSender);
+    return Status::ok();
 }
 
-Status StatsService::removeConfiguration(int64_t key, bool* success) {
-    IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        ConfigKey configKey(ipc->getCallingUid(), key);
-        mConfigManager->RemoveConfig(configKey);
-        SubscriberReporter::getInstance().removeConfig(configKey);
-        *success = true;
-        return Status::ok();
-    } else {
-        *success = false;
+Status StatsService::removeConfiguration(int64_t key) {
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    IPCThreadState* ipc = IPCThreadState::self();
+    ConfigKey configKey(ipc->getCallingUid(), key);
+    mConfigManager->RemoveConfig(configKey);
+    SubscriberReporter::getInstance().removeConfig(configKey);
+    return Status::ok();
 }
 
 Status StatsService::setBroadcastSubscriber(int64_t configId,
                                             int64_t subscriberId,
-                                            const sp<android::IBinder>& intentSender,
-                                            bool* success) {
+                                            const sp<android::IBinder>& intentSender) {
     VLOG("StatsService::setBroadcastSubscriber called.");
-    IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        ConfigKey configKey(ipc->getCallingUid(), configId);
-        SubscriberReporter::getInstance()
-                .setBroadcastSubscriber(configKey, subscriberId, intentSender);
-        *success = true;
-        return Status::ok();
-    } else {
-        *success = false;
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    IPCThreadState* ipc = IPCThreadState::self();
+    ConfigKey configKey(ipc->getCallingUid(), configId);
+    SubscriberReporter::getInstance()
+            .setBroadcastSubscriber(configKey, subscriberId, intentSender);
+    return Status::ok();
 }
 
 Status StatsService::unsetBroadcastSubscriber(int64_t configId,
-                                              int64_t subscriberId,
-                                              bool* success) {
+                                              int64_t subscriberId) {
     VLOG("StatsService::unsetBroadcastSubscriber called.");
-    IPCThreadState* ipc = IPCThreadState::self();
-    if (checkCallingPermission(String16(kPermissionDump))) {
-        ConfigKey configKey(ipc->getCallingUid(), configId);
-        SubscriberReporter::getInstance()
-                .unsetBroadcastSubscriber(configKey, subscriberId);
-        *success = true;
-        return Status::ok();
-    } else {
-        *success = false;
+    if (!checkCallingPermission(String16(kPermissionDump))) {
         return Status::fromExceptionCode(binder::Status::EX_SECURITY);
     }
+    IPCThreadState* ipc = IPCThreadState::self();
+    ConfigKey configKey(ipc->getCallingUid(), configId);
+    SubscriberReporter::getInstance()
+            .unsetBroadcastSubscriber(configKey, subscriberId);
+    return Status::ok();
 }
 
 
diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h
index 648e9c5..d502796 100644
--- a/cmds/statsd/src/StatsService.h
+++ b/cmds/statsd/src/StatsService.h
@@ -76,7 +76,7 @@
     /**
      * Called by LogReader when there's a log event to process.
      */
-    virtual void OnLogEvent(LogEvent* event);
+    virtual void OnLogEvent(LogEvent* event, bool reconnectionStarts);
 
     /**
      * Binder call for clients to request data for this configuration key.
@@ -94,24 +94,23 @@
      * Binder call to let clients send a configuration and indicate they're interested when they
      * should requestData for this configuration.
      */
-    virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config,
-                                    bool* success) override;
+    virtual Status addConfiguration(int64_t key, const vector<uint8_t>& config) override;
 
     /**
      * Binder call to let clients register the data fetch operation for a configuration.
      */
-    virtual Status setDataFetchOperation(int64_t key, const sp<android::IBinder>& intentSender,
-                                         bool* success) override;
+    virtual Status setDataFetchOperation(int64_t key,
+                                         const sp<android::IBinder>& intentSender) override;
 
     /**
      * Binder call to remove the data fetch operation for the specified config key.
      */
-    virtual Status removeDataFetchOperation(int64_t key, bool* success) override;
+    virtual Status removeDataFetchOperation(int64_t key) override;
 
     /**
      * Binder call to allow clients to remove the specified configuration.
      */
-    virtual Status removeConfiguration(int64_t key, bool* success) override;
+    virtual Status removeConfiguration(int64_t key) override;
 
     /**
      * Binder call to associate the given config's subscriberId with the given intentSender.
@@ -119,17 +118,13 @@
      */
     virtual Status setBroadcastSubscriber(int64_t configId,
                                           int64_t subscriberId,
-                                          const sp<android::IBinder>& intentSender,
-                                          bool* success) override;
+                                          const sp<android::IBinder>& intentSender) override;
 
     /**
      * Binder call to unassociate the given config's subscriberId with any intentSender.
      */
-    virtual Status unsetBroadcastSubscriber(int64_t configId, int64_t subscriberId,
-                                            bool* success) override;
+    virtual Status unsetBroadcastSubscriber(int64_t configId, int64_t subscriberId) override;
 
-    // TODO: public for testing since statsd doesn't run when system starts. Change to private
-    // later.
     /** Inform statsCompanion that statsd is ready. */
     virtual void sayHiToStatsCompanion();
 
diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp
index c342aa5..ee3ed23 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.cpp
+++ b/cmds/statsd/src/guardrail/StatsdStats.cpp
@@ -50,7 +50,7 @@
 // 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_PERIODIC_ALARM_STATS = 12;
-const int FIELD_ID_SKIPPED_LOG_EVENT_STATS = 13;
+const int FIELD_ID_LOG_LOSS_STATS = 14;
 
 const int FIELD_ID_ATOM_STATS_TAG = 1;
 const int FIELD_ID_ATOM_STATS_COUNT = 2;
@@ -61,9 +61,6 @@
 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;
@@ -182,6 +179,14 @@
     noteConfigResetInternalLocked(key);
 }
 
+void StatsdStats::noteLogLost(int64_t timestampNs) {
+    lock_guard<std::mutex> lock(mLock);
+    if (mLogLossTimestampNs.size() == kMaxLoggerErrors) {
+        mLogLossTimestampNs.pop_front();
+    }
+    mLogLossTimestampNs.push_back(timestampNs);
+}
+
 void StatsdStats::noteBroadcastSent(const ConfigKey& key) {
     noteBroadcastSent(key, getWallClockSec());
 }
@@ -350,15 +355,6 @@
     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
@@ -381,7 +377,7 @@
     mAnomalyAlarmRegisteredStats = 0;
     mPeriodicAlarmRegisteredStats = 0;
     mLoggerErrors.clear();
-    mSkippedLogEvents.clear();
+    mLogLossTimestampNs.clear();
     for (auto& config : mConfigStats) {
         config.second->broadcast_sent_time_sec.clear();
         config.second->data_drop_time_sec.clear();
@@ -515,8 +511,8 @@
         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);
+    for (const auto& loss : mLogLossTimestampNs) {
+        fprintf(out, "Log loss detected at %lld (elapsedRealtimeNs)\n", (long long)loss);
     }
 }
 
@@ -672,13 +668,9 @@
         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);
+    for (const auto& loss : mLogLossTimestampNs) {
+        proto.write(FIELD_TYPE_INT64 | FIELD_ID_LOG_LOSS_STATS | FIELD_COUNT_REPEATED,
+                    (long long)loss);
     }
 
     output->clear();
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 123a703..2cbcca3 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -102,9 +102,7 @@
     // The max number of old config stats we keep.
     const static int kMaxIceBoxSize = 20;
 
-    const static int kMaxLoggerErrors = 10;
-
-    const static int kMaxSkippedLogEvents = 200;
+    const static int kMaxLoggerErrors = 20;
 
     const static int kMaxTimestampCount = 20;
 
@@ -280,7 +278,7 @@
     /**
      * Records statsd skipped an event.
      */
-    void noteLogEventSkipped(int tag, int64_t timestamp);
+    void noteLogLost(int64_t timestamp);
 
     /**
      * Reset the historical stats. Including all stats in icebox, and the tracked stats about
@@ -337,8 +335,8 @@
     // 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;
+    // Timestamps when we detect log loss after logd reconnect.
+    std::list<int64_t> mLogLossTimestampNs;
 
     // Stores the number of times statsd modified the anomaly alarm registered with
     // StatsCompanionService.
diff --git a/cmds/statsd/src/logd/LogListener.h b/cmds/statsd/src/logd/LogListener.h
index 69ca571..f924040 100644
--- a/cmds/statsd/src/logd/LogListener.h
+++ b/cmds/statsd/src/logd/LogListener.h
@@ -33,7 +33,7 @@
     LogListener();
     virtual ~LogListener();
 
-    virtual void OnLogEvent(LogEvent* msg) = 0;
+    virtual void OnLogEvent(LogEvent* msg, bool reconnectionStarts) = 0;
 };
 
 }  // namespace statsd
diff --git a/cmds/statsd/src/logd/LogReader.cpp b/cmds/statsd/src/logd/LogReader.cpp
index 0fe896b..26ae6a3 100644
--- a/cmds/statsd/src/logd/LogReader.cpp
+++ b/cmds/statsd/src/logd/LogReader.cpp
@@ -113,7 +113,8 @@
             LogEvent event(msg);
 
             // Call the listener
-            mListener->OnLogEvent(&event);
+            mListener->OnLogEvent(&event,
+                                  lineCount == 1 /* indicate whether it's a new connection */);
         }
     }
 
diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp
index 4ce4768..8ce9ec7 100644
--- a/cmds/statsd/src/main.cpp
+++ b/cmds/statsd/src/main.cpp
@@ -116,11 +116,6 @@
         ALOGE("Failed to add service");
         return -1;
     }
-
-    // TODO: This line is temporary, since statsd doesn't start up automatically (and therefore
-    // the call in StatsService::SystemRunning() won't ever be called right now).
-    // TODO: Are you sure? Don't we need to reconnect to the system process if we get restarted?
-    //  --joeo
     service->sayHiToStatsCompanion();
 
     // Start the log reader thread
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index 4f7581d..eaa7bf1 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -305,4 +305,6 @@
         optional int64 elapsed_timestamp_nanos = 2;
     }
     repeated SkippedLogEventStats skipped_log_event_stats = 13;
+
+    repeated int64 log_loss_stats = 14;
 }
diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp
index fb8877a..91a40e3 100644
--- a/cmds/statsd/tests/StatsLogProcessor_test.cpp
+++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp
@@ -178,6 +178,128 @@
     EXPECT_EQ(2, report.annotation(0).field_int32());
 }
 
+TEST(StatsLogProcessorTest, TestOutOfOrderLogs) {
+    // 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++; });
+
+    LogEvent event1(0, 1 /*logd timestamp*/, 1001 /*elapsedRealtime*/);
+    event1.init();
+
+    LogEvent event2(0, 2, 1002);
+    event2.init();
+
+    LogEvent event3(0, 3, 1005);
+    event3.init();
+
+    LogEvent event4(0, 4, 1004);
+    event4.init();
+
+    // <----- Reconnection happens
+
+    LogEvent event5(0, 5, 999);
+    event5.init();
+
+    LogEvent event6(0, 6, 2000);
+    event6.init();
+
+    // <----- Reconnection happens
+
+    LogEvent event7(0, 7, 3000);
+    event7.init();
+
+    // first event ever
+    p.OnLogEvent(&event1, true);
+    EXPECT_EQ(1UL, p.mLogCount);
+    EXPECT_EQ(1001LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1001LL, p.mLastTimestampSeen);
+
+    p.OnLogEvent(&event2, false);
+    EXPECT_EQ(2UL, p.mLogCount);
+    EXPECT_EQ(1002LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1002LL, p.mLastTimestampSeen);
+
+    p.OnLogEvent(&event3, false);
+    EXPECT_EQ(3UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1005LL, p.mLastTimestampSeen);
+
+    p.OnLogEvent(&event4, false);
+    EXPECT_EQ(4UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1004LL, p.mLastTimestampSeen);
+    EXPECT_FALSE(p.mInReconnection);
+
+    // Reconnect happens, event1 out of buffer. Read event2
+    p.OnLogEvent(&event2, true);
+    EXPECT_EQ(4UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1004LL, p.mLastTimestampSeen);
+    EXPECT_TRUE(p.mInReconnection);
+
+    p.OnLogEvent(&event3, false);
+    EXPECT_EQ(4UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1004LL, p.mLastTimestampSeen);
+    EXPECT_TRUE(p.mInReconnection);
+
+    p.OnLogEvent(&event4, false);
+    EXPECT_EQ(4UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(1004LL, p.mLastTimestampSeen);
+    EXPECT_FALSE(p.mInReconnection);
+
+    // Fresh event comes.
+    p.OnLogEvent(&event5, false);
+    EXPECT_EQ(5UL, p.mLogCount);
+    EXPECT_EQ(1005LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(999LL, p.mLastTimestampSeen);
+
+    p.OnLogEvent(&event6, false);
+    EXPECT_EQ(6UL, p.mLogCount);
+    EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(2000LL, p.mLastTimestampSeen);
+
+    // Reconnect happens, read from event4
+    p.OnLogEvent(&event4, true);
+    EXPECT_EQ(6UL, p.mLogCount);
+    EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(2000LL, p.mLastTimestampSeen);
+    EXPECT_TRUE(p.mInReconnection);
+
+    p.OnLogEvent(&event5, false);
+    EXPECT_EQ(6UL, p.mLogCount);
+    EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(2000LL, p.mLastTimestampSeen);
+    EXPECT_TRUE(p.mInReconnection);
+
+    // Before we get out of reconnection state, it reconnects again.
+    p.OnLogEvent(&event5, true);
+    EXPECT_EQ(6UL, p.mLogCount);
+    EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(2000LL, p.mLastTimestampSeen);
+    EXPECT_TRUE(p.mInReconnection);
+
+    p.OnLogEvent(&event6, false);
+    EXPECT_EQ(6UL, p.mLogCount);
+    EXPECT_EQ(2000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(2000LL, p.mLastTimestampSeen);
+    EXPECT_FALSE(p.mInReconnection);
+    EXPECT_EQ(0, p.mLogLossCount);
+
+    // it reconnects again. All old events are gone. We lose CP.
+    p.OnLogEvent(&event7, true);
+    EXPECT_EQ(7UL, p.mLogCount);
+    EXPECT_EQ(3000LL, p.mLargestTimestampSeen);
+    EXPECT_EQ(3000LL, p.mLastTimestampSeen);
+    EXPECT_EQ(1, p.mLogLossCount);
+    EXPECT_FALSE(p.mInReconnection);
+}
+
 #else
 GTEST_LOG_(INFO) << "This test does nothing.\n";
 #endif
diff --git a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
index d4892ed..5499ee3 100644
--- a/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/PartialBucket_e2e_test.cpp
@@ -35,7 +35,7 @@
     config.SerializeToString(&str);
     std::vector<uint8_t> configAsVec(str.begin(), str.end());
     bool success;
-    service.addConfiguration(kConfigKey, configAsVec, &success);
+    service.addConfiguration(kConfigKey, configAsVec);
 }
 
 ConfigMetricsReport GetReports(StatsService& service) {
diff --git a/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java b/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
index 0e6c933..2b7da6a 100644
--- a/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
+++ b/cmds/statsd/tools/dogfood/src/com/android/statsd/dogfood/MainActivity.java
@@ -19,6 +19,7 @@
 import android.app.PendingIntent;
 import android.app.IntentService;
 import android.app.StatsManager;
+import android.app.StatsManager.StatsUnavailableException;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -171,12 +172,16 @@
                     return;
                 }
                 if (mStatsManager != null) {
-                    byte[] data = mStatsManager.getData(CONFIG_ID);
-                    if (data != null) {
-                        displayData(data);
-                    } else {
-                        mReportText.setText("Failed!");
+                    try {
+                        byte[] data = mStatsManager.getReports(CONFIG_ID);
+                        if (data != null) {
+                            displayData(data);
+                            return;
+                        }
+                    } catch (StatsUnavailableException e) {
+                        Log.e(TAG, "Failed to get data from statsd", e);
                     }
+                    mReportText.setText("Failed!");
                 }
             }
         });
@@ -194,10 +199,11 @@
                     byte[] config = new byte[inputStream.available()];
                     inputStream.read(config);
                     if (mStatsManager != null) {
-                        if (mStatsManager.addConfiguration(CONFIG_ID, config)) {
+                        try {
+                            mStatsManager.addConfig(CONFIG_ID, config);
                             Toast.makeText(
                                     MainActivity.this, "Config pushed", Toast.LENGTH_LONG).show();
-                        } else {
+                        } catch (StatsUnavailableException | IllegalArgumentException e) {
                             Toast.makeText(MainActivity.this, "Config push FAILED!",
                                     Toast.LENGTH_LONG).show();
                         }
@@ -218,11 +224,12 @@
                         return;
                     }
                     if (mStatsManager != null) {
-                        if (mStatsManager.setDataFetchOperation(CONFIG_ID, pi)) {
+                        try {
+                            mStatsManager.setFetchReportsOperation(pi, CONFIG_ID);
                             Toast.makeText(MainActivity.this,
                                     "Receiver specified to pending intent", Toast.LENGTH_LONG)
                                     .show();
-                        } else {
+                        } catch (StatsUnavailableException e) {
                             Toast.makeText(MainActivity.this, "Statsd did not set receiver",
                                     Toast.LENGTH_LONG)
                                     .show();
@@ -241,10 +248,11 @@
                         return;
                     }
                     if (mStatsManager != null) {
-                        if (mStatsManager.setDataFetchOperation(CONFIG_ID, null)) {
+                        try {
+                            mStatsManager.setFetchReportsOperation(null, CONFIG_ID);
                             Toast.makeText(MainActivity.this, "Receiver remove", Toast.LENGTH_LONG)
                                     .show();
-                        } else {
+                        } catch (StatsUnavailableException e) {
                             Toast.makeText(MainActivity.this, "Statsd did not remove receiver",
                                     Toast.LENGTH_LONG)
                                     .show();
diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
index bed4d98..769f78c 100644
--- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
+++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
@@ -355,7 +355,13 @@
             return null;
         }
         if (mStatsManager != null) {
-            byte[] data = mStatsManager.getMetadata();
+            byte[] data;
+            try {
+                data = mStatsManager.getStatsMetadata();
+            } catch (StatsManager.StatsUnavailableException e) {
+                Log.e(TAG, "Failed to get data from statsd", e);
+                return null;
+            }
             if (data != null) {
                 StatsdStatsReport report = null;
                 boolean good = false;
@@ -375,7 +381,13 @@
             return null;
         }
         if (mStatsManager != null) {
-            byte[] data = mStatsManager.getData(ConfigFactory.CONFIG_ID);
+            byte[] data;
+            try {
+                data = mStatsManager.getReports(ConfigFactory.CONFIG_ID);
+            } catch (StatsManager.StatsUnavailableException e) {
+                Log.e(TAG, "Failed to get data from statsd", e);
+                return null;
+            }
             if (data != null) {
                 ConfigMetricsReportList reports = null;
                 try {
@@ -563,10 +575,11 @@
         // TODO: Clear all configs instead of specific ones.
         if (mStatsManager != null) {
             if (mStarted) {
-                if (!mStatsManager.removeConfiguration(ConfigFactory.CONFIG_ID)) {
+                try {
+                    mStatsManager.removeConfig(ConfigFactory.CONFIG_ID);
                     Log.d(TAG, "Removed loadtest statsd configs.");
-                } else {
-                    Log.d(TAG, "Failed to remove loadtest configs.");
+                } catch (StatsManager.StatsUnavailableException e) {
+                    Log.e(TAG, "Failed to remove loadtest configs.", e);
                 }
             }
         }
@@ -574,12 +587,13 @@
 
     private boolean setConfig(ConfigFactory.ConfigMetadata configData) {
         if (mStatsManager != null) {
-            if (mStatsManager.addConfiguration(ConfigFactory.CONFIG_ID, configData.bytes)) {
+            try {
+                mStatsManager.addConfig(ConfigFactory.CONFIG_ID, configData.bytes);
                 mNumMetrics = configData.numMetrics;
                 Log.d(TAG, "Config pushed to statsd");
                 return true;
-            } else {
-                Log.d(TAG, "Failed to push config to statsd");
+            } catch (StatsManager.StatsUnavailableException | IllegalArgumentException e) {
+                Log.e(TAG, "Failed to push config to statsd", e);
             }
         }
         return false;
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 87fb998..7177336 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -32326,7 +32326,7 @@
 HSPLandroid/view/IWindowSession$Stub$Proxy;->getDisplayFrame(Landroid/view/IWindow;Landroid/graphics/Rect;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->getInTouchMode()Z
 HSPLandroid/view/IWindowSession$Stub$Proxy;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V
-HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
 HSPLandroid/view/IWindowSession$Stub$Proxy;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->setTransparentRegion(Landroid/view/IWindow;Landroid/graphics/Region;)V
 HSPLandroid/view/IWindowSession$Stub$Proxy;->setWallpaperPosition(Landroid/os/IBinder;FFFF)V
@@ -32349,7 +32349,7 @@
 HSPLandroid/view/IWindowSession;->pokeDrawLock(Landroid/os/IBinder;)V
 HSPLandroid/view/IWindowSession;->prepareDrag(Landroid/view/IWindow;IIILandroid/view/Surface;)Landroid/os/IBinder;
 HSPLandroid/view/IWindowSession;->prepareToReplaceWindows(Landroid/os/IBinder;Z)V
-HSPLandroid/view/IWindowSession;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+HSPLandroid/view/IWindowSession;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
 HSPLandroid/view/IWindowSession;->remove(Landroid/view/IWindow;)V
 HSPLandroid/view/IWindowSession;->reportDropResult(Landroid/view/IWindow;Z)V
 HSPLandroid/view/IWindowSession;->sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index 4f068fe3..81c9b6b 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -2232,7 +2232,7 @@
 Landroid/view/IWindowManager$Stub$Proxy;->getInitialDisplayDensity(I)I
 Landroid/view/IWindowManager$Stub$Proxy;->hasNavigationBar()Z
 Landroid/view/IWindowManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
-Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
+Landroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;ILandroid/view/WindowManager$LayoutParams;IIIIJLandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/util/MergedConfiguration;Landroid/view/Surface;)I
 Landroid/view/KeyCharacterMap$FallbackAction;->keyCode:I
 Landroid/view/KeyCharacterMap$FallbackAction;->metaState:I
 Landroid/view/KeyCharacterMap;-><init>(J)V
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 50a4398..82c3383 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -5873,7 +5873,7 @@
         } finally {
             // If the app targets < O-MR1, or doesn't change the thread policy
             // during startup, clobber the policy to maintain behavior of b/36951662
-            if (data.appInfo.targetSdkVersion <= Build.VERSION_CODES.O
+            if (data.appInfo.targetSdkVersion < Build.VERSION_CODES.O_MR1
                     || StrictMode.getThreadPolicy().equals(writesAllowedPolicy)) {
                 StrictMode.setThreadPolicy(savedPolicy);
             }
diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl
index 5067e19..5461c0c 100644
--- a/core/java/android/app/INotificationManager.aidl
+++ b/core/java/android/app/INotificationManager.aidl
@@ -54,6 +54,13 @@
     void setShowBadge(String pkg, int uid, boolean showBadge);
     boolean canShowBadge(String pkg, int uid);
     void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled);
+    /**
+     * Updates the notification's enabled state. Additionally locks importance for all of the
+     * notifications belonging to the app, such that future notifications aren't reconsidered for
+     * blocking helper.
+     */
+    void setNotificationsEnabledWithImportanceLockForPackage(String pkg, int uid, boolean enabled);
+
     boolean areNotificationsEnabledForPackage(String pkg, int uid);
     boolean areNotificationsEnabled(String pkg);
     int getPackageImportance(String pkg);
diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java
index 4a6fa8c..8783d94 100644
--- a/core/java/android/app/StatsManager.java
+++ b/core/java/android/app/StatsManager.java
@@ -23,6 +23,7 @@
 import android.os.IStatsManager;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.util.AndroidException;
 import android.util.Slog;
 
 /**
@@ -82,55 +83,74 @@
     }
 
     /**
-     * Clients can send a configuration and simultaneously registers the name of a broadcast
-     * receiver that listens for when it should request data.
+     * Adds the given configuration and associates it with the given configKey. If a config with the
+     * given configKey already exists for the caller's uid, it is replaced with the new one.
      *
      * @param configKey An arbitrary integer that allows clients to track the configuration.
-     * @param config    Wire-encoded StatsDConfig proto that specifies metrics (and all
+     * @param config    Wire-encoded StatsdConfig proto that specifies metrics (and all
      *                  dependencies eg, conditions and matchers).
-     * @return true if successful
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+     * @throws IllegalArgumentException if config is not a wire-encoded StatsdConfig proto
      */
     @RequiresPermission(Manifest.permission.DUMP)
-    public boolean addConfiguration(long configKey, byte[] config) {
+    public void addConfig(long configKey, byte[] config) throws StatsUnavailableException {
         synchronized (this) {
             try {
                 IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when adding configuration");
-                    return false;
-                }
-                return service.addConfiguration(configKey, config);
+                service.addConfiguration(configKey, config); // can throw IllegalArgumentException
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to connect to statsd when adding configuration");
-                return false;
+                throw new StatsUnavailableException("could not connect", e);
             }
         }
     }
 
     /**
+     * TODO: Temporary for backwards compatibility. Remove.
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public boolean addConfiguration(long configKey, byte[] config) {
+        try {
+            addConfig(configKey, config);
+            return true;
+        } catch (StatsUnavailableException | IllegalArgumentException e) {
+            return false;
+        }
+    }
+
+    /**
      * Remove a configuration from logging.
      *
      * @param configKey Configuration key to remove.
-     * @return true if successful
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
      */
     @RequiresPermission(Manifest.permission.DUMP)
-    public boolean removeConfiguration(long configKey) {
+    public void removeConfig(long configKey) throws StatsUnavailableException {
         synchronized (this) {
             try {
                 IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when removing configuration");
-                    return false;
-                }
-                return service.removeConfiguration(configKey);
+                service.removeConfiguration(configKey);
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to connect to statsd when removing configuration");
-                return false;
+                throw new StatsUnavailableException("could not connect", e);
             }
         }
     }
 
     /**
+     * TODO: Temporary for backwards compatibility. Remove.
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public boolean removeConfiguration(long configKey) {
+        try {
+            removeConfig(configKey);
+            return true;
+        } catch (StatsUnavailableException e) {
+            return false;
+        }
+    }
+
+    /**
      * Set the PendingIntent to be used when broadcasting subscriber information to the given
      * subscriberId within the given config.
      * <p>
@@ -150,123 +170,165 @@
      * {@link #EXTRA_STATS_DIMENSIONS_VALUE}.
      * <p>
      * This function can only be called by the owner (uid) of the config. It must be called each
-     * time statsd starts. The config must have been added first (via addConfiguration()).
+     * time statsd starts. The config must have been added first (via {@link #addConfig}).
      *
-     * @param configKey     The integer naming the config to which this subscriber is attached.
-     * @param subscriberId  ID of the subscriber, as used in the config.
      * @param pendingIntent the PendingIntent to use when broadcasting info to the subscriber
      *                      associated with the given subscriberId. May be null, in which case
      *                      it undoes any previous setting of this subscriberId.
-     * @return true if successful
+     * @param configKey     The integer naming the config to which this subscriber is attached.
+     * @param subscriberId  ID of the subscriber, as used in the config.
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public void setBroadcastSubscriber(
+            PendingIntent pendingIntent, long configKey, long subscriberId)
+            throws StatsUnavailableException {
+        synchronized (this) {
+            try {
+                IStatsManager service = getIStatsManagerLocked();
+                if (pendingIntent != null) {
+                    // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
+                    IBinder intentSender = pendingIntent.getTarget().asBinder();
+                    service.setBroadcastSubscriber(configKey, subscriberId, intentSender);
+                } else {
+                    service.unsetBroadcastSubscriber(configKey, subscriberId);
+                }
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to connect to statsd when adding broadcast subscriber", e);
+                throw new StatsUnavailableException("could not connect", e);
+            }
+        }
+    }
+
+    /**
+     * TODO: Temporary for backwards compatibility. Remove.
      */
     @RequiresPermission(Manifest.permission.DUMP)
     public boolean setBroadcastSubscriber(
             long configKey, long subscriberId, PendingIntent pendingIntent) {
-        synchronized (this) {
-            try {
-                IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when adding broadcast subscriber");
-                    return false;
-                }
-                if (pendingIntent != null) {
-                    // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
-                    IBinder intentSender = pendingIntent.getTarget().asBinder();
-                    return service.setBroadcastSubscriber(configKey, subscriberId, intentSender);
-                } else {
-                    return service.unsetBroadcastSubscriber(configKey, subscriberId);
-                }
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to connect to statsd when adding broadcast subscriber", e);
-                return false;
-            }
+        try {
+            setBroadcastSubscriber(pendingIntent, configKey, subscriberId);
+            return true;
+        } catch (StatsUnavailableException e) {
+            return false;
         }
     }
 
     /**
      * Registers the operation that is called to retrieve the metrics data. This must be called
-     * each time statsd starts. The config must have been added first (via addConfiguration(),
-     * although addConfiguration could have been called on a previous boot). This operation allows
+     * each time statsd starts. The config must have been added first (via {@link #addConfig},
+     * although addConfig could have been called on a previous boot). This operation allows
      * statsd to send metrics data whenever statsd determines that the metrics in memory are
-     * approaching the memory limits. The fetch operation should call {@link #getData} to fetch the
-     * data, which also deletes the retrieved metrics from statsd's memory.
+     * approaching the memory limits. The fetch operation should call {@link #getReports} to fetch
+     * the data, which also deletes the retrieved metrics from statsd's memory.
      *
-     * @param configKey     The integer naming the config to which this operation is attached.
      * @param pendingIntent the PendingIntent to use when broadcasting info to the subscriber
      *                      associated with the given subscriberId. May be null, in which case
      *                      it removes any associated pending intent with this configKey.
-     * @return true if successful
+     * @param configKey     The integer naming the config to which this operation is attached.
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
      */
     @RequiresPermission(Manifest.permission.DUMP)
-    public boolean setDataFetchOperation(long configKey, PendingIntent pendingIntent) {
+    public void setFetchReportsOperation(PendingIntent pendingIntent, long configKey)
+            throws StatsUnavailableException {
         synchronized (this) {
             try {
                 IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when registering data listener.");
-                    return false;
-                }
                 if (pendingIntent == null) {
-                    return service.removeDataFetchOperation(configKey);
+                    service.removeDataFetchOperation(configKey);
                 } else {
                     // Extracts IIntentSender from the PendingIntent and turns it into an IBinder.
                     IBinder intentSender = pendingIntent.getTarget().asBinder();
-                    return service.setDataFetchOperation(configKey, intentSender);
+                    service.setDataFetchOperation(configKey, intentSender);
                 }
 
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to connect to statsd when registering data listener.");
-                return false;
+                throw new StatsUnavailableException("could not connect", e);
             }
         }
     }
 
     /**
-     * Clients can request data with a binder call. This getter is destructive and also clears
-     * the retrieved metrics from statsd memory.
-     *
-     * @param configKey Configuration key to retrieve data from.
-     * @return Serialized ConfigMetricsReportList proto. Returns null on failure (eg, if statsd
-     * crashed).
+     * TODO: Temporary for backwards compatibility. Remove.
      */
     @RequiresPermission(Manifest.permission.DUMP)
-    public @Nullable byte[] getData(long configKey) {
+    public boolean setDataFetchOperation(long configKey, PendingIntent pendingIntent) {
+        try {
+            setFetchReportsOperation(pendingIntent, configKey);
+            return true;
+        } catch (StatsUnavailableException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Request the data collected for the given configKey.
+     * This getter is destructive - it also clears the retrieved metrics from statsd's memory.
+     *
+     * @param configKey Configuration key to retrieve data from.
+     * @return Serialized ConfigMetricsReportList proto.
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public byte[] getReports(long configKey) throws StatsUnavailableException {
         synchronized (this) {
             try {
                 IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when getting data");
-                    return null;
-                }
                 return service.getData(configKey);
             } catch (RemoteException e) {
                 Slog.e(TAG, "Failed to connect to statsd when getting data");
-                return null;
+                throw new StatsUnavailableException("could not connect", e);
+            }
+        }
+    }
+
+    /**
+     * TODO: Temporary for backwards compatibility. Remove.
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public @Nullable byte[] getData(long configKey) {
+        try {
+            return getReports(configKey);
+        } catch (StatsUnavailableException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Clients can request metadata for statsd. Will contain stats across all configurations but not
+     * the actual metrics themselves (metrics must be collected via {@link #getReports(long)}.
+     * This getter is not destructive and will not reset any metrics/counters.
+     *
+     * @return Serialized StatsdStatsReport proto.
+     * @throws StatsUnavailableException if unsuccessful due to failing to connect to stats service
+     */
+    @RequiresPermission(Manifest.permission.DUMP)
+    public byte[] getStatsMetadata() throws StatsUnavailableException {
+        synchronized (this) {
+            try {
+                IStatsManager service = getIStatsManagerLocked();
+                return service.getMetadata();
+            } catch (RemoteException e) {
+                Slog.e(TAG, "Failed to connect to statsd when getting metadata");
+                throw new StatsUnavailableException("could not connect", e);
             }
         }
     }
 
     /**
      * Clients can request metadata for statsd. Will contain stats across all configurations but not
-     * the actual metrics themselves (metrics must be collected via {@link #getData(String)}.
+     * the actual metrics themselves (metrics must be collected via {@link #getReports(long)}.
      * This getter is not destructive and will not reset any metrics/counters.
      *
      * @return Serialized StatsdStatsReport proto. Returns null on failure (eg, if statsd crashed).
      */
     @RequiresPermission(Manifest.permission.DUMP)
     public @Nullable byte[] getMetadata() {
-        synchronized (this) {
-            try {
-                IStatsManager service = getIStatsManagerLocked();
-                if (service == null) {
-                    Slog.e(TAG, "Failed to find statsd when getting metadata");
-                    return null;
-                }
-                return service.getMetadata();
-            } catch (RemoteException e) {
-                Slog.e(TAG, "Failed to connect to statsd when getting metadata");
-                return null;
-            }
+        try {
+            return getStatsMetadata();
+        } catch (StatsUnavailableException e) {
+            return null;
         }
     }
 
@@ -279,14 +341,33 @@
         }
     }
 
-    private IStatsManager getIStatsManagerLocked() throws RemoteException {
+    private IStatsManager getIStatsManagerLocked() throws StatsUnavailableException {
         if (mService != null) {
             return mService;
         }
         mService = IStatsManager.Stub.asInterface(ServiceManager.getService("stats"));
-        if (mService != null) {
+        if (mService == null) {
+            throw new StatsUnavailableException("could not be found");
+        }
+        try {
             mService.asBinder().linkToDeath(new StatsdDeathRecipient(), 0);
+        } catch (RemoteException e) {
+            throw new StatsUnavailableException("could not connect when linkToDeath", e);
         }
         return mService;
     }
+
+    /**
+     * Exception thrown when communication with the stats service fails (eg if it is not available).
+     * This might be thrown early during boot before the stats service has started or if it crashed.
+     */
+    public static class StatsUnavailableException extends AndroidException {
+        public StatsUnavailableException(String reason) {
+            super("Failed to connect to statsd: " + reason);
+        }
+
+        public StatsUnavailableException(String reason, Throwable e) {
+            super("Failed to connect to statsd: " + reason, e);
+        }
+    }
 }
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 17bc6ea..6c2fb2d 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -413,7 +413,7 @@
                 } catch (OutOfMemoryError e) {
                     Log.w(TAG, "Out of memory loading the current wallpaper: " + e);
                 } catch (SecurityException e) {
-                    if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+                    if (context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) {
                         Log.w(TAG, "No permission to access wallpaper, suppressing"
                                 + " exception to avoid crashing legacy app.");
                     } else {
@@ -977,7 +977,7 @@
             } catch (RemoteException e) {
                 throw e.rethrowFromSystemServer();
             } catch (SecurityException e) {
-                if (mContext.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.O) {
+                if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O_MR1) {
                     Log.w(TAG, "No permission to access wallpaper, suppressing"
                             + " exception to avoid crashing legacy app.");
                     return null;
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 4336f18..aadf904 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -197,6 +197,7 @@
     /**
      * Key to retrieve an extra added to an intent when the value of a slider is changed.
      * @deprecated remove once support lib is update to use EXTRA_RANGE_VALUE instead
+     * @removed
      */
     @Deprecated
     public static final String EXTRA_SLIDER_VALUE = "android.app.slice.extra.SLIDER_VALUE";
@@ -224,6 +225,7 @@
     /**
      * Subtype to tag an item as representing a slider.
      * @deprecated remove once support lib is update to use SUBTYPE_RANGE instead
+     * @removed
      */
     @Deprecated
     public static final String SUBTYPE_SLIDER = "slider";
@@ -360,6 +362,7 @@
 
         /**
          * @deprecated TO BE REMOVED
+         * @removed
          */
         @Deprecated
         public Builder(@NonNull Uri uri) {
@@ -388,7 +391,7 @@
 
         /**
          * Tells the system whether for this slice the return value of
-         * {@link SliceProvider#onBindSlice(Uri, List)} may be different depending on
+         * {@link SliceProvider#onBindSlice(Uri, java.util.Set)} may be different depending on
          * {@link SliceProvider#getCallingPackage()} and should not be cached for multiple
          * apps.
          */
@@ -411,6 +414,7 @@
 
         /**
          * @deprecated TO BE REMOVED
+         * @removed
          */
         public Builder setSpec(SliceSpec spec) {
             mSpec = spec;
@@ -490,6 +494,7 @@
 
         /**
          * @deprecated TO BE REMOVED.
+         * @removed
          */
         @Deprecated
         public Slice.Builder addTimestamp(long time, @Nullable @SliceSubtype String subType,
diff --git a/core/java/android/app/slice/SliceItem.java b/core/java/android/app/slice/SliceItem.java
index 019ae49..c058a14 100644
--- a/core/java/android/app/slice/SliceItem.java
+++ b/core/java/android/app/slice/SliceItem.java
@@ -46,7 +46,7 @@
  * <li>{@link #FORMAT_IMAGE}</li>
  * <li>{@link #FORMAT_ACTION}</li>
  * <li>{@link #FORMAT_INT}</li>
- * <li>{@link #FORMAT_TIMESTAMP}</li>
+ * <li>{@link #FORMAT_LONG}</li>
  * <li>{@link #FORMAT_REMOTE_INPUT}</li>
  * <li>{@link #FORMAT_BUNDLE}</li>
  *
@@ -103,6 +103,7 @@
     public static final String FORMAT_LONG = "long";
     /**
      * @deprecated TO BE REMOVED
+     * @removed
      */
     @Deprecated
     public static final String FORMAT_TIMESTAMP = FORMAT_LONG;
@@ -168,7 +169,7 @@
      * <li>{@link #FORMAT_IMAGE}</li>
      * <li>{@link #FORMAT_ACTION}</li>
      * <li>{@link #FORMAT_INT}</li>
-     * <li>{@link #FORMAT_TIMESTAMP}</li>
+     * <li>{@link #FORMAT_LONG}</li>
      * <li>{@link #FORMAT_REMOTE_INPUT}</li>
      * <li>{@link #FORMAT_BUNDLE}</li>
      * @see #getSubType() ()
@@ -249,8 +250,17 @@
     }
 
     /**
-     * @return The timestamp held by this {@link #FORMAT_TIMESTAMP} SliceItem
+     * @return The long held by this {@link #FORMAT_LONG} SliceItem
      */
+    public long getLong() {
+        return (Long) mObj;
+    }
+
+    /**
+     * @deprecated replaced by {@link #getLong()}
+     * @removed
+     */
+    @Deprecated
     public long getTimestamp() {
         return (Long) mObj;
     }
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index dc8a3b9..28e5938 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -139,6 +139,7 @@
 
     /**
      * @deprecated TO BE REMOVED
+     * @removed
      */
     @Deprecated
     public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) {
@@ -263,6 +264,7 @@
 
     /**
      * @deprecated TO BE REMOVED
+     * @removed
      */
     @Deprecated
     public @Nullable Slice bindSlice(@NonNull Uri uri, @NonNull List<SliceSpec> supportedSpecs) {
@@ -277,12 +279,12 @@
      * <ol>
      *  <li> If the intent contains data that {@link ContentResolver#getType} is
      *  {@link SliceProvider#SLICE_TYPE} then the data will be returned.</li>
-     *  <li>If the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
-     *  the provider will be asked to {@link SliceProvider#onMapIntentToUri} and that result
-     *  will be returned.</li>
-     *  <li>Lastly, if the intent explicitly points at an activity, and that activity has
+     *  <li>If the intent explicitly points at an activity, and that activity has
      *  meta-data for key {@link #SLICE_METADATA_KEY}, then the Uri specified there will be
      *  returned.</li>
+     *  <li>Lastly, if the intent with {@link #CATEGORY_SLICE} added resolves to a provider, then
+     *  the provider will be asked to {@link SliceProvider#onMapIntentToUri} and that result
+     *  will be returned.</li>
      *  <li>If no slice is found, then {@code null} is returned.</li>
      * </ol>
      * @param intent The intent associated with a slice.
@@ -292,37 +294,12 @@
      * @see Intent
      */
     public @Nullable Uri mapIntentToUri(@NonNull Intent intent) {
-        Preconditions.checkNotNull(intent, "intent");
-        Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null
-                || intent.getData() != null,
-                "Slice intent must be explicit %s", intent);
         ContentResolver resolver = mContext.getContentResolver();
-
-        // Check if the intent has data for the slice uri on it and use that
-        final Uri intentData = intent.getData();
-        if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
-            return intentData;
-        }
+        final Uri staticUri = resolveStatic(intent, resolver);
+        if (staticUri != null) return staticUri;
         // Otherwise ask the app
-        Intent queryIntent = new Intent(intent);
-        if (!queryIntent.hasCategory(CATEGORY_SLICE)) {
-            queryIntent.addCategory(CATEGORY_SLICE);
-        }
-        List<ResolveInfo> providers =
-                mContext.getPackageManager().queryIntentContentProviders(queryIntent, 0);
-        if (providers == null || providers.isEmpty()) {
-            // There are no providers, see if this activity has a direct link.
-            ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
-                    PackageManager.GET_META_DATA);
-            if (resolve != null && resolve.activityInfo != null
-                    && resolve.activityInfo.metaData != null
-                    && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
-                return Uri.parse(
-                        resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY));
-            }
-            return null;
-        }
-        String authority = providers.get(0).providerInfo.authority;
+        String authority = getAuthority(intent);
+        if (authority == null) return null;
         Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(authority).build();
         try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) {
@@ -343,10 +320,43 @@
         }
     }
 
+    private String getAuthority(Intent intent) {
+        Intent queryIntent = new Intent(intent);
+        if (!queryIntent.hasCategory(CATEGORY_SLICE)) {
+            queryIntent.addCategory(CATEGORY_SLICE);
+        }
+        List<ResolveInfo> providers =
+                mContext.getPackageManager().queryIntentContentProviders(queryIntent, 0);
+        return providers != null && !providers.isEmpty() ? providers.get(0).providerInfo.authority
+                : null;
+    }
+
+    private Uri resolveStatic(@NonNull Intent intent, ContentResolver resolver) {
+        Preconditions.checkNotNull(intent, "intent");
+        Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null
+                || intent.getData() != null,
+                "Slice intent must be explicit %s", intent);
+
+        // Check if the intent has data for the slice uri on it and use that
+        final Uri intentData = intent.getData();
+        if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
+            return intentData;
+        }
+        // There are no providers, see if this activity has a direct link.
+        ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
+                PackageManager.GET_META_DATA);
+        if (resolve != null && resolve.activityInfo != null
+                && resolve.activityInfo.metaData != null
+                && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
+            return Uri.parse(
+                    resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY));
+        }
+        return null;
+    }
+
     /**
-     * Turns a slice intent into slice content. Expects an explicit intent. If there is no
-     * {@link android.content.ContentProvider} associated with the given intent this will throw
-     * {@link IllegalArgumentException}.
+     * Turns a slice intent into slice content. Is a shortcut to perform the action
+     * of both {@link #mapIntentToUri(Intent)} and {@link #bindSlice(Uri, Set)} at once.
      *
      * @param intent The intent associated with a slice.
      * @param supportedSpecs List of supported specs.
@@ -362,28 +372,11 @@
                 || intent.getData() != null,
                 "Slice intent must be explicit %s", intent);
         ContentResolver resolver = mContext.getContentResolver();
-
-        // Check if the intent has data for the slice uri on it and use that
-        final Uri intentData = intent.getData();
-        if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
-            return bindSlice(intentData, supportedSpecs);
-        }
+        final Uri staticUri = resolveStatic(intent, resolver);
+        if (staticUri != null) return bindSlice(staticUri, supportedSpecs);
         // Otherwise ask the app
-        List<ResolveInfo> providers =
-                mContext.getPackageManager().queryIntentContentProviders(intent, 0);
-        if (providers == null || providers.isEmpty()) {
-            // There are no providers, see if this activity has a direct link.
-            ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
-                    PackageManager.GET_META_DATA);
-            if (resolve != null && resolve.activityInfo != null
-                    && resolve.activityInfo.metaData != null
-                    && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
-                return bindSlice(Uri.parse(resolve.activityInfo.metaData
-                        .getString(SLICE_METADATA_KEY)), supportedSpecs);
-            }
-            return null;
-        }
-        String authority = providers.get(0).providerInfo.authority;
+        String authority = getAuthority(intent);
+        if (authority == null) return null;
         Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
                 .authority(authority).build();
         try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) {
@@ -392,8 +385,6 @@
             }
             Bundle extras = new Bundle();
             extras.putParcelable(SliceProvider.EXTRA_INTENT, intent);
-            extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
-                    new ArrayList<>(supportedSpecs));
             final Bundle res = provider.call(SliceProvider.METHOD_MAP_INTENT, null, extras);
             if (res == null) {
                 return null;
@@ -408,6 +399,7 @@
 
     /**
      * @deprecated TO BE REMOVED.
+     * @removed
      */
     @Deprecated
     @Nullable
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index d369272..7d8e394 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -204,6 +204,7 @@
 
     /**
      * @deprecated TO BE REMOVED
+     * @removed
      */
     @Deprecated
     public Slice onBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java
index 7252f02..216a4a0 100644
--- a/core/java/android/app/usage/NetworkStats.java
+++ b/core/java/android/app/usage/NetworkStats.java
@@ -237,20 +237,26 @@
                 DEFAULT_NETWORK_YES
         })
         @Retention(RetentionPolicy.SOURCE)
-        public @interface DefaultNetwork {}
+        public @interface DefaultNetworkStatus {}
 
         /**
-         * Combined usage for this network regardless of whether it was the active default network.
+         * Combined usage for this network regardless of default network status.
          */
         public static final int DEFAULT_NETWORK_ALL = -1;
 
         /**
-         * Usage that occurs while this network is not the active default network.
+         * Usage that occurs while this network is not a default network.
+         *
+         * <p>This implies that the app responsible for this usage requested that it occur on a
+         * specific network different from the one(s) the system would have selected for it.
          */
         public static final int DEFAULT_NETWORK_NO = 0x1;
 
         /**
-         * Usage that occurs while this network is the active default network.
+         * Usage that occurs while this network is a default network.
+         *
+         * <p>This implies that the app either did not select a specific network for this usage,
+         * or it selected a network that the system could have selected for app traffic.
          */
         public static final int DEFAULT_NETWORK_YES = 0x2;
 
@@ -262,7 +268,7 @@
         private int mUid;
         private int mTag;
         private int mState;
-        private int mDefaultNetwork;
+        private int mDefaultNetworkStatus;
         private int mMetered;
         private int mRoaming;
         private long mBeginTimeStamp;
@@ -323,8 +329,9 @@
             return 0;
         }
 
-        private static @DefaultNetwork int convertDefaultNetwork(int defaultNetwork) {
-            switch (defaultNetwork) {
+        private static @DefaultNetworkStatus int convertDefaultNetworkStatus(
+                int defaultNetworkStatus) {
+            switch (defaultNetworkStatus) {
                 case android.net.NetworkStats.DEFAULT_NETWORK_ALL : return DEFAULT_NETWORK_ALL;
                 case android.net.NetworkStats.DEFAULT_NETWORK_NO: return DEFAULT_NETWORK_NO;
                 case android.net.NetworkStats.DEFAULT_NETWORK_YES: return DEFAULT_NETWORK_YES;
@@ -397,18 +404,15 @@
         }
 
         /**
-         * Default network state. One of the following values:<p/>
+         * Default network status. One of the following values:<p/>
          * <ul>
          * <li>{@link #DEFAULT_NETWORK_ALL}</li>
          * <li>{@link #DEFAULT_NETWORK_NO}</li>
          * <li>{@link #DEFAULT_NETWORK_YES}</li>
          * </ul>
-         * <p>Indicates whether the network usage occurred on the system default network for this
-         * type of traffic, or whether the application chose to send this traffic on a network that
-         * was not the one selected by the system.
          */
-        public @DefaultNetwork int getDefaultNetwork() {
-            return mDefaultNetwork;
+        public @DefaultNetworkStatus int getDefaultNetworkStatus() {
+            return mDefaultNetworkStatus;
         }
 
         /**
@@ -605,7 +609,7 @@
         bucketOut.mUid = Bucket.convertUid(mRecycledSummaryEntry.uid);
         bucketOut.mTag = Bucket.convertTag(mRecycledSummaryEntry.tag);
         bucketOut.mState = Bucket.convertState(mRecycledSummaryEntry.set);
-        bucketOut.mDefaultNetwork = Bucket.convertDefaultNetwork(
+        bucketOut.mDefaultNetworkStatus = Bucket.convertDefaultNetworkStatus(
                 mRecycledSummaryEntry.defaultNetwork);
         bucketOut.mMetered = Bucket.convertMetered(mRecycledSummaryEntry.metered);
         bucketOut.mRoaming = Bucket.convertRoaming(mRecycledSummaryEntry.roaming);
@@ -657,7 +661,7 @@
                 bucketOut.mUid = Bucket.convertUid(getUid());
                 bucketOut.mTag = Bucket.convertTag(mTag);
                 bucketOut.mState = mState;
-                bucketOut.mDefaultNetwork = Bucket.DEFAULT_NETWORK_ALL;
+                bucketOut.mDefaultNetworkStatus = Bucket.DEFAULT_NETWORK_ALL;
                 bucketOut.mMetered = Bucket.METERED_ALL;
                 bucketOut.mRoaming = Bucket.ROAMING_ALL;
                 bucketOut.mBeginTimeStamp = mRecycledHistoryEntry.bucketStart;
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index c5a39f4..d65e051 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -1694,7 +1694,7 @@
         if (mHiddenApiPolicy != HIDDEN_API_ENFORCEMENT_DEFAULT) {
             return mHiddenApiPolicy;
         }
-        if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+        if (targetSdkVersion < Build.VERSION_CODES.P) {
             return HIDDEN_API_ENFORCEMENT_BLACK;
         } else {
             return HIDDEN_API_ENFORCEMENT_DARK_GREY_AND_BLACK;
@@ -1728,9 +1728,9 @@
         if (isPackageWhitelistedForHiddenApis()) {
             return;
         }
-        if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+        if (targetSdkVersion < Build.VERSION_CODES.P) {
             setHiddenApiEnforcementPolicy(policyPreP);
-        } else if (targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+        } else if (targetSdkVersion >= Build.VERSION_CODES.P) {
             setHiddenApiEnforcementPolicy(policyP);
         }
 
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 627ceb7..5f9f8f1 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -244,7 +244,7 @@
      * the first position to be the same across updates.
      *
      * <strong>Deprecated</strong> This has been replaced by the
-     * {@link PackageInfo#signingCertificateHistory} field, which takes into
+     * {@link PackageInfo#signingInfo} field, which takes into
      * account signing certificate rotation.  For backwards compatibility in
      * the event of signing certificate rotation, this will return the oldest
      * reported signing certificate, so that an application will appear to
@@ -256,29 +256,15 @@
     public Signature[] signatures;
 
     /**
-     * Array of all signatures arrays read from the package file, potentially
+     * Signing information read from the package file, potentially
      * including past signing certificates no longer used after signing
-     * certificate rotation.  Though signing certificate rotation is only
-     * available for apps with a single signing certificate, this provides an
-     * array of arrays so that packages signed with multiple signing
-     * certificates can still return all signers.  This is only filled in if
+     * certificate rotation.  This is only filled in if
      * the flag {@link PackageManager#GET_SIGNING_CERTIFICATES} was set.
      *
-     * A package must be singed with at least one certificate, which is at
-     * position zero in the array.  An application may be signed by multiple
-     * certificates, which would be in the array at position zero in an
-     * indeterminate order.  A package may also have a history of certificates
-     * due to signing certificate rotation.  In this case, the array will be
-     * populated by a series of single-entry arrays corresponding to a signing
-     * certificate of the package.
-     *
-     * <strong>Note:</strong> Signature ordering is not guaranteed to be
-     * stable which means that a package signed with certificates A and B is
-     * equivalent to being signed with certificates B and A. This means that
-     * in case multiple signatures are reported you cannot assume the one at
-     * the first position will be the same across updates.
+     * Use this field instead of the deprecated {@code signatures} field.
+     * See {@link SigningInfo} for more information on its contents.
      */
-    public Signature[][] signingCertificateHistory;
+    public SigningInfo signingInfo;
 
     /**
      * Application specified preferred configuration
@@ -476,17 +462,11 @@
         dest.writeBoolean(mOverlayIsStatic);
         dest.writeInt(compileSdkVersion);
         dest.writeString(compileSdkVersionCodename);
-        writeSigningCertificateHistoryToParcel(dest, parcelableFlags);
-    }
-
-    private void writeSigningCertificateHistoryToParcel(Parcel dest, int parcelableFlags) {
-        if (signingCertificateHistory != null) {
-            dest.writeInt(signingCertificateHistory.length);
-            for (int i = 0; i < signingCertificateHistory.length; i++) {
-                dest.writeTypedArray(signingCertificateHistory[i], parcelableFlags);
-            }
+        if (signingInfo != null) {
+            dest.writeInt(1);
+            signingInfo.writeToParcel(dest, parcelableFlags);
         } else {
-            dest.writeInt(-1);
+            dest.writeInt(0);
         }
     }
 
@@ -544,7 +524,10 @@
         mOverlayIsStatic = source.readBoolean();
         compileSdkVersion = source.readInt();
         compileSdkVersionCodename = source.readString();
-        readSigningCertificateHistoryFromParcel(source);
+        int hasSigningInfo = source.readInt();
+        if (hasSigningInfo != 0) {
+            signingInfo = SigningInfo.CREATOR.createFromParcel(source);
+        }
 
         // The component lists were flattened with the redundant ApplicationInfo
         // instances omitted.  Distribute the canonical one here as appropriate.
@@ -556,16 +539,6 @@
         }
     }
 
-    private void readSigningCertificateHistoryFromParcel(Parcel source) {
-        int len = source.readInt();
-        if (len != -1) {
-            signingCertificateHistory = new Signature[len][];
-            for (int i = 0; i < len; i++) {
-                signingCertificateHistory[i] = source.createTypedArray(Signature.CREATOR);
-            }
-        }
-    }
-
     private void propagateApplicationInfo(ApplicationInfo appInfo, ComponentInfo[] components) {
         if (components != null) {
             for (ComponentInfo ci : components) {
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 699e81b..a9d0911 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -521,11 +521,6 @@
     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 3e0db60..453a74a 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -810,21 +810,11 @@
 
         // replacement for GET_SIGNATURES
         if ((flags & PackageManager.GET_SIGNING_CERTIFICATES) != 0) {
-            if (p.mSigningDetails.hasPastSigningCertificates()) {
-                // Package has included signing certificate rotation information.  Convert each
-                // entry to an array
-                int numberOfSigs = p.mSigningDetails.pastSigningCertificates.length;
-                pi.signingCertificateHistory = new Signature[numberOfSigs][];
-                for (int i = 0; i < numberOfSigs; i++) {
-                    pi.signingCertificateHistory[i] =
-                            new Signature[] { p.mSigningDetails.pastSigningCertificates[i] };
-                }
-            } else if (p.mSigningDetails.hasSignatures()) {
-                // otherwise keep old behavior
-                int numberOfSigs = p.mSigningDetails.signatures.length;
-                pi.signingCertificateHistory = new Signature[1][numberOfSigs];
-                System.arraycopy(p.mSigningDetails.signatures, 0,
-                        pi.signingCertificateHistory[0], 0, numberOfSigs);
+            if (p.mSigningDetails != SigningDetails.UNKNOWN) {
+                // only return a valid SigningInfo if there is signing information to report
+                pi.signingInfo = new SigningInfo(p.mSigningDetails);
+            } else {
+                pi.signingInfo = null;
             }
         }
         return pi;
@@ -2726,7 +2716,7 @@
 
         // Fot apps targeting O-MR1 we require explicit enumeration of all certs.
         String[] additionalCertSha256Digests = EmptyArray.STRING;
-        if (pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.O) {
+        if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O_MR1) {
             additionalCertSha256Digests = parseAdditionalCertificates(res, parser, outError);
             if (additionalCertSha256Digests == null) {
                 return false;
diff --git a/core/java/android/content/pm/PackageSharedLibraryUpdater.java b/core/java/android/content/pm/PackageSharedLibraryUpdater.java
index fa89432..b14b321 100644
--- a/core/java/android/content/pm/PackageSharedLibraryUpdater.java
+++ b/core/java/android/content/pm/PackageSharedLibraryUpdater.java
@@ -62,7 +62,7 @@
 
     static boolean apkTargetsApiLevelLessThanOrEqualToOMR1(PackageParser.Package pkg) {
         int targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
-        return targetSdkVersion <= Build.VERSION_CODES.O_MR1;
+        return targetSdkVersion < Build.VERSION_CODES.P;
     }
 
     /**
diff --git a/core/java/android/content/pm/SigningInfo.java b/core/java/android/content/pm/SigningInfo.java
new file mode 100644
index 0000000..ef87403
--- /dev/null
+++ b/core/java/android/content/pm/SigningInfo.java
@@ -0,0 +1,139 @@
+/*
+ * 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.content.pm;
+
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Information pertaining to the signing certificates used to sign a package.
+ */
+public final class SigningInfo implements Parcelable {
+
+    @NonNull
+    private final PackageParser.SigningDetails mSigningDetails;
+
+    public SigningInfo() {
+        mSigningDetails = PackageParser.SigningDetails.UNKNOWN;
+    }
+
+    /**
+     * @hide only packagemanager should be populating this
+     */
+    public SigningInfo(PackageParser.SigningDetails signingDetails) {
+        mSigningDetails = new PackageParser.SigningDetails(signingDetails);
+    }
+
+    public SigningInfo(SigningInfo orig) {
+        mSigningDetails = new PackageParser.SigningDetails(orig.mSigningDetails);
+    }
+
+    private SigningInfo(Parcel source) {
+        mSigningDetails = PackageParser.SigningDetails.CREATOR.createFromParcel(source);
+    }
+
+    /**
+     * Although relatively uncommon, packages may be signed by more than one signer, in which case
+     * their identity is viewed as being the set of all signers, not just any one.
+     */
+    public boolean hasMultipleSigners() {
+        return mSigningDetails.signatures != null && mSigningDetails.signatures.length > 1;
+    }
+
+    /**
+     * APK Signature Scheme v3 enables packages to provide a proof-of-rotation record that the
+     * platform verifies, and uses, to allow the use of new signing certificates.  This is only
+     * available to packages that are not signed by multiple signers.  In the event of a change to a
+     * new signing certificate, the package's past signing certificates are presented as well.  Any
+     * check of a package's signing certificate should also include a search through its entire
+     * signing history, since it could change to a new signing certificate at any time.
+     */
+    public boolean hasPastSigningCertificates() {
+        return mSigningDetails.signatures != null
+                && mSigningDetails.pastSigningCertificates != null;
+    }
+
+    /**
+     * Returns the signing certificates this package has proven it is authorized to use. This
+     * includes both the signing certificate associated with the signer of the package and the past
+     * signing certificates it included as its proof of signing certificate rotation.  This method
+     * is the preferred replacement for the {@code GET_SIGNATURES} flag used with {@link
+     * PackageManager#getPackageInfo(String, int)}.  When determining if a package is signed by a
+     * desired certificate, the returned array should be checked to determine if it is one of the
+     * entries.
+     *
+     * <note>
+     *     This method returns null if the package is signed by multiple signing certificates, as
+     *     opposed to being signed by one current signer and also providing the history of past
+     *     signing certificates.  {@link #hasMultipleSigners()} may be used to determine if this
+     *     package is signed by multiple signers.  Packages which are signed by multiple signers
+     *     cannot change their signing certificates and their {@code Signature} array should be
+     *     checked to make sure that every entry matches the looked-for signing certificates.
+     * </note>
+     */
+    public Signature[] getSigningCertificateHistory() {
+        if (hasMultipleSigners()) {
+            return null;
+        } else if (!hasPastSigningCertificates()) {
+
+            // this package is only signed by one signer with no history, return it
+            return mSigningDetails.signatures;
+        } else {
+
+            // this package has provided proof of past signing certificates, include them
+            return mSigningDetails.pastSigningCertificates;
+        }
+    }
+
+    /**
+     * Returns the signing certificates used to sign the APK contents of this application.  Not
+     * including any past signing certificates the package proved it is authorized to use.
+     * <note>
+     *     This method should not be used unless {@link #hasMultipleSigners()} returns true,
+     *     indicating that {@link #getSigningCertificateHistory()} cannot be used, otherwise {@link
+     *     #getSigningCertificateHistory()} should be preferred.
+     * </note>
+     */
+    public Signature[] getApkContentsSigners() {
+        return mSigningDetails.signatures;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int parcelableFlags) {
+        mSigningDetails.writeToParcel(dest, parcelableFlags);
+    }
+
+    public static final Parcelable.Creator<SigningInfo> CREATOR =
+            new Parcelable.Creator<SigningInfo>() {
+        @Override
+        public SigningInfo createFromParcel(Parcel source) {
+            return new SigningInfo(source);
+        }
+
+        @Override
+        public SigningInfo[] newArray(int size) {
+            return new SigningInfo[size];
+        }
+    };
+}
diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java
index 8732375..a61ea50 100644
--- a/core/java/android/net/IpSecManager.java
+++ b/core/java/android/net/IpSecManager.java
@@ -20,7 +20,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
 import android.annotation.SystemService;
 import android.annotation.TestApi;
 import android.content.Context;
@@ -666,7 +665,6 @@
      * to create Network objects which are accessible to the Android system.
      * @hide
      */
-    @SystemApi
     public static final class IpSecTunnelInterface implements AutoCloseable {
         private final String mOpPackageName;
         private final IIpSecService mService;
@@ -693,7 +691,6 @@
          * @param prefixLen length of the InetAddress prefix
          * @hide
          */
-        @SystemApi
         @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
         public void addAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
             try {
@@ -713,7 +710,6 @@
          * @param prefixLen length of the InetAddress prefix
          * @hide
          */
-        @SystemApi
         @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
         public void removeAddress(@NonNull InetAddress address, int prefixLen) throws IOException {
             try {
@@ -809,7 +805,6 @@
      * @throws ResourceUnavailableException indicating that too many encapsulation sockets are open
      * @hide
      */
-    @SystemApi
     @NonNull
     @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
     public IpSecTunnelInterface createIpSecTunnelInterface(@NonNull InetAddress localAddress,
@@ -836,7 +831,6 @@
      *         layer failure.
      * @hide
      */
-    @SystemApi
     @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
     public void applyTunnelModeTransform(@NonNull IpSecTunnelInterface tunnel,
             @PolicyDirection int direction, @NonNull IpSecTransform transform) throws IOException {
diff --git a/core/java/android/net/IpSecTransform.java b/core/java/android/net/IpSecTransform.java
index fb5f46c..62f7996 100644
--- a/core/java/android/net/IpSecTransform.java
+++ b/core/java/android/net/IpSecTransform.java
@@ -22,7 +22,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Handler;
@@ -250,7 +249,6 @@
      *
      * @hide
      */
-    @SystemApi
     public static class NattKeepaliveCallback {
         /** The specified {@code Network} is not connected. */
         public static final int ERROR_INVALID_NETWORK = 1;
@@ -281,7 +279,6 @@
      *
      * @hide
      */
-    @SystemApi
     @RequiresPermission(anyOf = {
             android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
             android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
@@ -324,7 +321,6 @@
      *
      * @hide
      */
-    @SystemApi
     @RequiresPermission(anyOf = {
             android.Manifest.permission.MANAGE_IPSEC_TUNNELS,
             android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD
@@ -477,7 +473,6 @@
          * @throws IOException indicating other errors
          * @hide
          */
-        @SystemApi
         @NonNull
         @RequiresPermission(android.Manifest.permission.MANAGE_IPSEC_TUNNELS)
         public IpSecTransform buildTunnelModeTransform(
diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java
index c314a35..a8e8179 100644
--- a/core/java/android/net/NetworkCapabilities.java
+++ b/core/java/android/net/NetworkCapabilities.java
@@ -254,9 +254,8 @@
     /**
      * Indicates that this network is not congested.
      * <p>
-     * When a network is congested, the device should defer network traffic that
-     * can be done at a later time without breaking developer contracts.
-     * @hide
+     * When a network is congested, applications should defer network traffic
+     * that can be done at a later time, such as uploading analytics.
      */
     public static final int NET_CAPABILITY_NOT_CONGESTED = 20;
 
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
index 6363161..954071a 100644
--- a/core/java/android/os/BatteryManager.java
+++ b/core/java/android/os/BatteryManager.java
@@ -353,4 +353,20 @@
     public static boolean isPlugWired(int plugType) {
         return plugType == BATTERY_PLUGGED_USB || plugType == BATTERY_PLUGGED_AC;
     }
+
+    /**
+     * Compute an approximation for how much time (in milliseconds) remains until the battery is
+     * fully charged. Returns -1 if no time can be computed: either there is not enough current
+     * data to make a decision or the battery is currently discharging.
+     *
+     * @return how much time is left, in milliseconds, until the battery is fully charged or -1 if
+     *         the computation fails
+     */
+    public long computeChargeTimeRemaining() {
+        try {
+            return mBatteryStats.computeChargeTimeRemaining();
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 6ebb102..1d232bf 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -3814,6 +3814,9 @@
                 final BatterySipper bs = sippers.get(i);
                 String label;
                 switch (bs.drainType) {
+                    case AMBIENT_DISPLAY:
+                        label = "ambi";
+                        break;
                     case IDLE:
                         label="idle";
                         break;
@@ -4975,6 +4978,9 @@
                 final BatterySipper bs = sippers.get(i);
                 pw.print(prefix);
                 switch (bs.drainType) {
+                    case AMBIENT_DISPLAY:
+                        pw.print("    Ambient display: ");
+                        break;
                     case IDLE:
                         pw.print("    Idle: ");
                         break;
@@ -7777,6 +7783,9 @@
                 int n = SystemProto.PowerUseItem.UNKNOWN_SIPPER;
                 int uid = 0;
                 switch (bs.drainType) {
+                    case AMBIENT_DISPLAY:
+                        n = SystemProto.PowerUseItem.AMBIENT_DISPLAY;
+                        break;
                     case IDLE:
                         n = SystemProto.PowerUseItem.IDLE;
                         break;
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 8378a82..7162b8a 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -907,6 +907,8 @@
          * <li>{@link android.app.Service#startForeground Service.startForeground} requires
          * that apps hold the permission
          * {@link android.Manifest.permission#FOREGROUND_SERVICE}.</li>
+         * <li>{@link android.widget.LinearLayout} will always remeasure weighted children,
+         * even if there is no excess space.</li>
          * </ul>
          */
         public static final int P = CUR_DEVELOPMENT; // STOPSHIP Replace with the real version.
diff --git a/core/java/android/os/EventLogTags.logtags b/core/java/android/os/EventLogTags.logtags
new file mode 100644
index 0000000..b143a74
--- /dev/null
+++ b/core/java/android/os/EventLogTags.logtags
@@ -0,0 +1,6 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package android.os
+
+230000 service_manager_stats (call_count|1),(total_time|1|3),(duration|1|3)
+230001 service_manager_slow (time|1|3),(service|3)
diff --git a/core/java/android/os/IStatsManager.aidl b/core/java/android/os/IStatsManager.aidl
index 2a68714..3b32c52 100644
--- a/core/java/android/os/IStatsManager.aidl
+++ b/core/java/android/os/IStatsManager.aidl
@@ -77,45 +77,51 @@
     /**
      * Fetches data for the specified configuration key. Returns a byte array representing proto
      * wire-encoded of ConfigMetricsReportList.
+     *
+     * Requires Manifest.permission.DUMP.
      */
     byte[] getData(in long key);
 
     /**
      * Fetches metadata across statsd. Returns byte array representing wire-encoded proto.
+     *
+     * Requires Manifest.permission.DUMP.
      */
     byte[] getMetadata();
 
     /**
      * Sets a configuration with the specified config key and subscribes to updates for this
      * configuration key. Broadcasts will be sent if this configuration needs to be collected.
-     * The configuration must be a wire-encoded StatsDConfig. The receiver for this data is
+     * The configuration must be a wire-encoded StatsdConfig. The receiver for this data is
      * registered in a separate function.
      *
-     * Returns if this configuration was correctly registered.
+     * Requires Manifest.permission.DUMP.
      */
-    boolean addConfiguration(in long configKey, in byte[] config);
+    void addConfiguration(in long configKey, in byte[] config);
 
     /**
      * Registers the given pending intent for this config key. This intent is invoked when the
      * memory consumed by the metrics for this configuration approach the pre-defined limits. There
      * can be at most one listener per config key.
      *
-     * Returns if this listener was correctly registered.
+     * Requires Manifest.permission.DUMP.
      */
-    boolean setDataFetchOperation(long configKey, in IBinder intentSender);
+    void setDataFetchOperation(long configKey, in IBinder intentSender);
 
     /**
      * Removes the data fetch operation for the specified configuration.
+     *
+     * Requires Manifest.permission.DUMP.
      */
-    boolean removeDataFetchOperation(long configKey);
+    void removeDataFetchOperation(long configKey);
 
     /**
      * Removes the configuration with the matching config key. No-op if this config key does not
      * exist.
      *
-     * Returns if this configuration key was removed.
+     * Requires Manifest.permission.DUMP.
      */
-    boolean removeConfiguration(in long configKey);
+    void removeConfiguration(in long configKey);
 
     /**
      * Set the IIntentSender (i.e. PendingIntent) to be used when broadcasting subscriber
@@ -133,16 +139,16 @@
      * intentSender must be convertible into an IntentSender using IntentSender(IBinder)
      * and cannot be null.
      *
-     * Returns true if successful.
+     * Requires Manifest.permission.DUMP.
      */
-    boolean setBroadcastSubscriber(long configKey, long subscriberId, in IBinder intentSender);
+    void setBroadcastSubscriber(long configKey, long subscriberId, in IBinder intentSender);
 
     /**
      * Undoes setBroadcastSubscriber() for the (configKey, subscriberId) pair.
      * Any broadcasts associated with subscriberId will henceforth not be sent.
      * No-op if this (configKey, subsriberId) pair was not associated with an IntentSender.
      *
-     * Returns true if successful.
+     * Requires Manifest.permission.DUMP.
      */
-    boolean unsetBroadcastSubscriber(long configKey, long subscriberId);
+    void unsetBroadcastSubscriber(long configKey, long subscriberId);
 }
diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java
index 96e7a59..b1c33c2 100644
--- a/core/java/android/os/MessageQueue.java
+++ b/core/java/android/os/MessageQueue.java
@@ -254,6 +254,7 @@
         } else if (record != null) {
             record.mEvents = 0;
             mFileDescriptorRecords.removeAt(index);
+            nativeSetFileDescriptorEvents(mPtr, fdNum, 0);
         }
     }
 
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index 3be76d6..165276d 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -18,7 +18,9 @@
 
 import android.util.Log;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.os.BinderInternal;
+import com.android.internal.util.StatLogger;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -26,9 +28,76 @@
 /** @hide */
 public final class ServiceManager {
     private static final String TAG = "ServiceManager";
+    private static final Object sLock = new Object();
+
     private static IServiceManager sServiceManager;
+
+    /**
+     * Cache for the "well known" services, such as WM and AM.
+     */
     private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();
 
+    /**
+     * We do the "slow log" at most once every this interval.
+     */
+    private static final int SLOW_LOG_INTERVAL_MS = 5000;
+
+    /**
+     * We do the "stats log" at most once every this interval.
+     */
+    private static final int STATS_LOG_INTERVAL_MS = 5000;
+
+    /**
+     * Threshold in uS for a "slow" call, used on core UIDs. We use a more relax value to
+     * avoid logspam.
+     */
+    private static final long GET_SERVICE_SLOW_THRESHOLD_US_CORE =
+            SystemProperties.getInt("debug.servicemanager.slow_call_core_ms", 10) * 1000;
+
+    /**
+     * Threshold in uS for a "slow" call, used on non-core UIDs. We use a more relax value to
+     * avoid logspam.
+     */
+    private static final long GET_SERVICE_SLOW_THRESHOLD_US_NON_CORE =
+            SystemProperties.getInt("debug.servicemanager.slow_call_ms", 50) * 1000;
+
+    /**
+     * We log stats logging ever this many getService() calls.
+     */
+    private static final int GET_SERVICE_LOG_EVERY_CALLS_CORE =
+            SystemProperties.getInt("debug.servicemanager.log_calls_core", 100);
+
+    /**
+     * We log stats logging ever this many getService() calls.
+     */
+    private static final int GET_SERVICE_LOG_EVERY_CALLS_NON_CORE =
+            SystemProperties.getInt("debug.servicemanager.log_calls", 200);
+
+    @GuardedBy("sLock")
+    private static int sGetServiceAccumulatedUs;
+
+    @GuardedBy("sLock")
+    private static int sGetServiceAccumulatedCallCount;
+
+    @GuardedBy("sLock")
+    private static long sLastStatsLogUptime;
+
+    @GuardedBy("sLock")
+    private static long sLastSlowLogUptime;
+
+    @GuardedBy("sLock")
+    private static long sLastSlowLogActualTime;
+
+    interface Stats {
+        int GET_SERVICE = 0;
+
+        int COUNT = GET_SERVICE + 1;
+    }
+
+    public static final StatLogger sStatLogger = new StatLogger(new String[] {
+            "getService()",
+    });
+
     private static IServiceManager getIServiceManager() {
         if (sServiceManager != null) {
             return sServiceManager;
@@ -52,7 +121,7 @@
             if (service != null) {
                 return service;
             } else {
-                return Binder.allowBlocking(getIServiceManager().getService(name));
+                return Binder.allowBlocking(rawGetService(name));
             }
         } catch (RemoteException e) {
             Log.e(TAG, "error in getService", e);
@@ -177,4 +246,59 @@
             super("No service published for: " + name);
         }
     }
+
+    private static IBinder rawGetService(String name) throws RemoteException {
+        final long start = sStatLogger.getTime();
+
+        final IBinder binder = getIServiceManager().getService(name);
+
+        final int time = (int) sStatLogger.logDurationStat(Stats.GET_SERVICE, start);
+
+        final int myUid = Process.myUid();
+        final boolean isCore = UserHandle.isCore(myUid);
+
+        final long slowThreshold = isCore
+                ? GET_SERVICE_SLOW_THRESHOLD_US_CORE
+                : GET_SERVICE_SLOW_THRESHOLD_US_NON_CORE;
+
+        synchronized (sLock) {
+            sGetServiceAccumulatedUs += time;
+            sGetServiceAccumulatedCallCount++;
+
+            final long nowUptime = SystemClock.uptimeMillis();
+
+            // Was a slow call?
+            if (time >= slowThreshold) {
+                // We do a slow log:
+                // - At most once in every SLOW_LOG_INTERVAL_MS
+                // - OR it was slower than the previously logged slow call.
+                if ((nowUptime > (sLastSlowLogUptime + SLOW_LOG_INTERVAL_MS))
+                        || (sLastSlowLogActualTime < time)) {
+                    EventLogTags.writeServiceManagerSlow(time / 1000, name);
+
+                    sLastSlowLogUptime = nowUptime;
+                    sLastSlowLogActualTime = time;
+                }
+            }
+
+            // Every GET_SERVICE_LOG_EVERY_CALLS calls, log the total time spent in getService().
+
+            final int logInterval = isCore
+                    ? GET_SERVICE_LOG_EVERY_CALLS_CORE
+                    : GET_SERVICE_LOG_EVERY_CALLS_NON_CORE;
+
+            if ((sGetServiceAccumulatedCallCount >= logInterval)
+                    && (nowUptime >= (sLastStatsLogUptime + STATS_LOG_INTERVAL_MS))) {
+
+                EventLogTags.writeServiceManagerStats(
+                        sGetServiceAccumulatedCallCount, // Total # of getService() calls.
+                        sGetServiceAccumulatedUs / 1000, // Total time spent in getService() calls.
+                        (int) (nowUptime - sLastStatsLogUptime)); // Uptime duration since last log.
+                sGetServiceAccumulatedCallCount = 0;
+                sGetServiceAccumulatedUs = 0;
+                sLastStatsLogUptime = nowUptime;
+            }
+        }
+        return binder;
+    }
 }
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 17d83db..3270719 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -924,13 +924,17 @@
         /** @hide */
         @VisibleForTesting
         public int[] getUids() {
-            return mUids;
+            int[] uids = new int[mSize];
+            System.arraycopy(mUids, 0, uids, 0, mSize);
+            return uids;
         }
 
         /** @hide */
         @VisibleForTesting
         public String[] getTags() {
-            return mTags;
+            String[] tags = new String[mSize];
+            System.arraycopy(mTags, 0, tags, 0, mSize);
+            return tags;
         }
 
         /** @hide */
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index d1d5d8e..673da50 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -166,6 +166,11 @@
     private List<String> mApiBlacklistExemptions = Collections.emptyList();
 
     /**
+     * Proportion of hidden API accesses that should be logged to the event log; 0 - 0x10000.
+     */
+    private int mHiddenApiAccessLogSampleRate;
+
+    /**
      * The state of the connection to the primary zygote.
      */
     private ZygoteState primaryZygoteState;
@@ -478,6 +483,21 @@
         }
     }
 
+    /**
+     * Set the precentage of detected hidden API accesses that are logged to the event log.
+     *
+     * <p>This rate will take affect for all new processes forked from the zygote after this call.
+     *
+     * @param rate An integer between 0 and 0x10000 inclusive. 0 means no event logging.
+     */
+    public void setHiddenApiAccessLogSampleRate(int rate) {
+        synchronized (mLock) {
+            mHiddenApiAccessLogSampleRate = rate;
+            maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
+            maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState);
+        }
+    }
+
     @GuardedBy("mLock")
     private void maybeSetApiBlacklistExemptions(ZygoteState state, boolean sendIfEmpty) {
         if (state == null || state.isClosed()) {
@@ -505,6 +525,29 @@
         }
     }
 
+    private void maybeSetHiddenApiAccessLogSampleRate(ZygoteState state) {
+        if (state == null || state.isClosed()) {
+            return;
+        }
+        if (mHiddenApiAccessLogSampleRate == -1) {
+            return;
+        }
+        try {
+            state.writer.write(Integer.toString(1));
+            state.writer.newLine();
+            state.writer.write("--hidden-api-log-sampling-rate="
+                    + Integer.toString(mHiddenApiAccessLogSampleRate));
+            state.writer.newLine();
+            state.writer.flush();
+            int status = state.inputStream.readInt();
+            if (status != 0) {
+                Slog.e(LOG_TAG, "Failed to set hidden API log sampling rate; status " + status);
+            }
+        } catch (IOException ioe) {
+            Slog.e(LOG_TAG, "Failed to set hidden API log sampling rate", ioe);
+        }
+    }
+
     /**
      * Tries to open socket to Zygote process if not already open. If
      * already open, does nothing.  May block and retry.  Requires that mLock be held.
@@ -520,6 +563,7 @@
                 throw new ZygoteStartFailedEx("Error connecting to primary zygote", ioe);
             }
             maybeSetApiBlacklistExemptions(primaryZygoteState, false);
+            maybeSetHiddenApiAccessLogSampleRate(primaryZygoteState);
         }
         if (primaryZygoteState.matches(abi)) {
             return primaryZygoteState;
@@ -533,6 +577,7 @@
                 throw new ZygoteStartFailedEx("Error connecting to secondary zygote", ioe);
             }
             maybeSetApiBlacklistExemptions(secondaryZygoteState, false);
+            maybeSetHiddenApiAccessLogSampleRate(secondaryZygoteState);
         }
 
         if (secondaryZygoteState.matches(abi)) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c7c2c15..5b7adf0 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11766,6 +11766,15 @@
                 "hidden_api_blacklist_exemptions";
 
         /**
+         * Sampling rate for hidden API access event logs, as an integer in the range 0 to 0x10000
+         * inclusive.
+         *
+         * @hide
+         */
+        public static final String HIDDEN_API_ACCESS_LOG_SAMPLING_RATE =
+                "hidden_api_access_log_sampling_rate";
+
+        /**
          * Hidden API enforcement policy for apps targeting SDK versions prior to the latest
          * version.
          *
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index 9334aa9..54f82f9 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -119,6 +119,7 @@
      * See implementation for binary key format.
      *
      * @deprecated Use {@link #getTrustedHardwareCertPath} instead.
+     * @removed
      */
     @Deprecated
     public @NonNull byte[] getTrustedHardwarePublicKey() {
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index f351c5a..fa4964d 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemApi;
+import android.app.KeyguardManager;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -288,7 +289,20 @@
     }
 
     /**
+     * Checks whether the recoverable key store is currently available.
+     *
+     * <p>If it returns true, the device must currently be using a screen lock that is supported for
+     * use with the recoverable key store, i.e. AOSP PIN, pattern or password.
+     */
+    @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+    public static boolean isRecoverableKeyStoreEnabled(@NonNull Context context) {
+        KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class);
+        return keyguardManager != null && keyguardManager.isDeviceSecure();
+    }
+
+    /**
      * @deprecated Use {@link #initRecoveryService(String, byte[], byte[])} instead.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -360,6 +374,7 @@
 
     /**
      * @deprecated Use {@link #getKeyChainSnapshot()}
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -436,6 +451,7 @@
 
     /**
      * @deprecated Use {@link #getAliases()}.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -461,6 +477,7 @@
 
     /**
      * @deprecated Use {@link #setRecoveryStatus(String, int)}
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -495,6 +512,7 @@
 
     /**
      * @deprecated Use {@link #getRecoveryStatus(String)}.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -587,7 +605,10 @@
      * @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.
+     * @deprecated Use {@link #generateKey(String)}
+     * @removed
      */
+    @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
     public byte[] generateAndStoreKey(@NonNull String alias, byte[] account)
             throws InternalRecoveryServiceException, LockScreenRequiredException {
@@ -596,6 +617,7 @@
 
     /**
      * @deprecated Use {@link #generateKey(String)}.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 8353389..dc2961b 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -79,6 +79,7 @@
 
     /**
      * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -110,6 +111,7 @@
 
     /**
      * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@@ -199,6 +201,7 @@
 
     /**
      * @deprecated Use {@link #recoverKeyChainSnapshot(byte[], List)} instead.
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index 32952db..7f81d04 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -76,6 +76,7 @@
 
         /**
          * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+         * @removed
          */
         @Deprecated
         public Builder setAccount(@NonNull byte[] account) {
@@ -134,6 +135,7 @@
 
     /**
      * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+     * @removed
      */
     @Deprecated
     public @NonNull byte[] getAccount() {
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index daecea7..7b01f7a 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -83,7 +83,8 @@
     private static final int DAY_MINUTES = 24 * 60;
     private static final int ZERO_VALUE_MS = 10 * SECONDS_MS;
 
-    // Default allow categories set in readXml() from default_zen_mode_config.xml, fallback values:
+    // Default allow categories set in readXml() from default_zen_mode_config.xml,
+    // fallback/upgrade values:
     private static final boolean DEFAULT_ALLOW_ALARMS = true;
     private static final boolean DEFAULT_ALLOW_MEDIA = true;
     private static final boolean DEFAULT_ALLOW_SYSTEM = false;
@@ -97,7 +98,7 @@
     private static final int DEFAULT_SUPPRESSED_VISUAL_EFFECTS =
             Policy.getAllSuppressedVisualEffects();
 
-    public static final int XML_VERSION = 6;
+    public static final int XML_VERSION = 7;
     public static final String ZEN_TAG = "zen";
     private static final String ZEN_ATT_VERSION = "version";
     private static final String ZEN_ATT_USER = "user";
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index a132730..7f75f0a 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -813,7 +813,7 @@
                     }
                     final int relayoutResult = mSession.relayout(
                         mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
-                            View.VISIBLE, 0, mWinFrame, mOverscanInsets, mContentInsets,
+                            View.VISIBLE, 0, -1, mWinFrame, mOverscanInsets, mContentInsets,
                             mVisibleInsets, mStableInsets, mOutsets, mBackdropFrame,
                             mDisplayCutout, mMergedConfiguration, mSurfaceHolder.mSurface);
 
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index f332358..e60377b 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -219,7 +219,7 @@
                     links[0].onClick(widget);
                 } else if (action == MotionEvent.ACTION_DOWN) {
                     if (widget.getContext().getApplicationInfo().targetSdkVersion
-                            > Build.VERSION_CODES.O_MR1) {
+                            >= Build.VERSION_CODES.P) {
                         // Selection change will reposition the toolbar. Hide it for a few ms for a
                         // smoother transition.
                         widget.hideFloatingToolbar(HIDE_FLOATING_TOOLBAR_DELAY_MS);
diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java
index 975ad48..9c89876 100644
--- a/core/java/android/util/RecurrenceRule.java
+++ b/core/java/android/util/RecurrenceRule.java
@@ -149,6 +149,10 @@
         }
     };
 
+    public boolean isRecurring() {
+        return period != null;
+    }
+
     @Deprecated
     public boolean isMonthly() {
         return start != null
diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java
index 66a9c6c..f59c0b5 100644
--- a/core/java/android/view/DisplayCutout.java
+++ b/core/java/android/view/DisplayCutout.java
@@ -31,6 +31,7 @@
 import android.os.Parcelable;
 import android.text.TextUtils;
 import android.util.Log;
+import android.util.Pair;
 import android.util.PathParser;
 import android.util.proto.ProtoOutputStream;
 
@@ -75,15 +76,19 @@
             false /* copyArguments */);
 
 
+    private static final Pair<Path, DisplayCutout> NULL_PAIR = new Pair<>(null, null);
     private static final Object CACHE_LOCK = new Object();
+
     @GuardedBy("CACHE_LOCK")
     private static String sCachedSpec;
     @GuardedBy("CACHE_LOCK")
     private static int sCachedDisplayWidth;
     @GuardedBy("CACHE_LOCK")
+    private static int sCachedDisplayHeight;
+    @GuardedBy("CACHE_LOCK")
     private static float sCachedDensity;
     @GuardedBy("CACHE_LOCK")
-    private static DisplayCutout sCachedCutout;
+    private static Pair<Path, DisplayCutout> sCachedCutout = NULL_PAIR;
 
     private final Rect mSafeInsets;
     private final Region mBounds;
@@ -347,7 +352,7 @@
     }
 
     /**
-     * Creates an instance according to @android:string/config_mainBuiltInDisplayCutout.
+     * Creates the bounding path according to @android:string/config_mainBuiltInDisplayCutout.
      *
      * @hide
      */
@@ -357,6 +362,16 @@
     }
 
     /**
+     * Creates an instance according to @android:string/config_mainBuiltInDisplayCutout.
+     *
+     * @hide
+     */
+    public static Path pathFromResources(Resources res, int displayWidth, int displayHeight) {
+        return pathAndDisplayCutoutFromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout),
+                displayWidth, displayHeight, res.getDisplayMetrics().density).first;
+    }
+
+    /**
      * Creates an instance according to the supplied {@link android.util.PathParser.PathData} spec.
      *
      * @hide
@@ -364,11 +379,17 @@
     @VisibleForTesting(visibility = PRIVATE)
     public static DisplayCutout fromSpec(String spec, int displayWidth, int displayHeight,
             float density) {
+        return pathAndDisplayCutoutFromSpec(spec, displayWidth, displayHeight, density).second;
+    }
+
+    private static Pair<Path, DisplayCutout> pathAndDisplayCutoutFromSpec(String spec,
+            int displayWidth, int displayHeight, float density) {
         if (TextUtils.isEmpty(spec)) {
-            return null;
+            return NULL_PAIR;
         }
         synchronized (CACHE_LOCK) {
             if (spec.equals(sCachedSpec) && sCachedDisplayWidth == displayWidth
+                    && sCachedDisplayHeight == displayHeight
                     && sCachedDensity == density) {
                 return sCachedCutout;
             }
@@ -398,7 +419,7 @@
             p = PathParser.createPathFromPathData(spec);
         } catch (Throwable e) {
             Log.wtf(TAG, "Could not inflate cutout: ", e);
-            return null;
+            return NULL_PAIR;
         }
 
         final Matrix m = new Matrix();
@@ -414,7 +435,7 @@
                 bottomPath = PathParser.createPathFromPathData(bottomSpec);
             } catch (Throwable e) {
                 Log.wtf(TAG, "Could not inflate bottom cutout: ", e);
-                return null;
+                return NULL_PAIR;
             }
             // Keep top transform
             m.postTranslate(0, displayHeight);
@@ -422,10 +443,11 @@
             p.addPath(bottomPath);
         }
 
-        final DisplayCutout result = fromBounds(p);
+        final Pair<Path, DisplayCutout> result = new Pair<>(p, fromBounds(p));
         synchronized (CACHE_LOCK) {
             sCachedSpec = spec;
             sCachedDisplayWidth = displayWidth;
+            sCachedDisplayHeight = displayHeight;
             sCachedDensity = density;
             sCachedCutout = result;
         }
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index d8a5609..f868a00 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -66,6 +66,7 @@
      * @param viewVisibility Window root view's visibility.
      * @param flags Request flags: {@link WindowManagerGlobal#RELAYOUT_INSETS_PENDING},
      * {@link WindowManagerGlobal#RELAYOUT_DEFER_SURFACE_DESTROY}.
+     * @param frameNumber A frame number in which changes requested in this layout will be rendered.
      * @param outFrame Rect in which is placed the new position/size on
      * screen.
      * @param outOverscanInsets Rect in which is placed the offsets from
@@ -96,7 +97,7 @@
      */
     int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs,
             int requestedWidth, int requestedHeight, int viewVisibility,
-            int flags, out Rect outFrame, out Rect outOverscanInsets,
+            int flags, long frameNumber, out Rect outFrame, out Rect outOverscanInsets,
             out Rect outContentInsets, out Rect outVisibleInsets, out Rect outStableInsets,
             out Rect outOutsets, out Rect outBackdropFrame,
             out DisplayCutout.ParcelableWrapper displayCutout,
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index b367dc7..71b6084 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -697,6 +697,7 @@
  * security policy. See also {@link MotionEvent#FLAG_WINDOW_IS_OBSCURED}.
  * </p>
  *
+ * @attr ref android.R.styleable#View_accessibilityHeading
  * @attr ref android.R.styleable#View_alpha
  * @attr ref android.R.styleable#View_background
  * @attr ref android.R.styleable#View_clickable
@@ -2955,7 +2956,7 @@
      *     1                             PFLAG3_SCREEN_READER_FOCUSABLE
      *    1                              PFLAG3_AGGREGATED_VISIBLE
      *   1                               PFLAG3_AUTOFILLID_EXPLICITLY_SET
-     *  1                                available
+     *  1                                PFLAG3_ACCESSIBILITY_HEADING
      * |-------|-------|-------|-------|
      */
 
@@ -3252,6 +3253,11 @@
      */
     private static final int PFLAG3_AUTOFILLID_EXPLICITLY_SET = 0x40000000;
 
+    /**
+     * Indicates if the View is a heading for accessibility purposes
+     */
+    private static final int PFLAG3_ACCESSIBILITY_HEADING = 0x80000000;
+
     /* End of masks for mPrivateFlags3 */
 
     /**
@@ -5475,6 +5481,8 @@
                 case R.styleable.View_outlineAmbientShadowColor:
                     setOutlineAmbientShadowColor(a.getColor(attr, Color.BLACK));
                     break;
+                case com.android.internal.R.styleable.View_accessibilityHeading:
+                    setAccessibilityHeading(a.getBoolean(attr, false));
             }
         }
 
@@ -8795,6 +8803,7 @@
         info.addAction(AccessibilityAction.ACTION_SHOW_ON_SCREEN);
         populateAccessibilityNodeInfoDrawingOrderInParent(info);
         info.setPaneTitle(mAccessibilityPaneTitle);
+        info.setHeading(isAccessibilityHeading());
     }
 
     /**
@@ -10782,11 +10791,37 @@
      *                              accessibility tools.
      */
     public void setScreenReaderFocusable(boolean screenReaderFocusable) {
+        updatePflags3AndNotifyA11yIfChanged(PFLAG3_SCREEN_READER_FOCUSABLE, screenReaderFocusable);
+    }
+
+    /**
+     * Gets whether this view is a heading for accessibility purposes.
+     *
+     * @return {@code true} if the view is a heading, {@code false} otherwise.
+     *
+     * @attr ref android.R.styleable#View_accessibilityHeading
+     */
+    public boolean isAccessibilityHeading() {
+        return (mPrivateFlags3 & PFLAG3_ACCESSIBILITY_HEADING) != 0;
+    }
+
+    /**
+     * Set if view is a heading for a section of content for accessibility purposes.
+     *
+     * @param isHeading {@code true} if the view is a heading, {@code false} otherwise.
+     *
+     * @attr ref android.R.styleable#View_accessibilityHeading
+     */
+    public void setAccessibilityHeading(boolean isHeading) {
+        updatePflags3AndNotifyA11yIfChanged(PFLAG3_ACCESSIBILITY_HEADING, isHeading);
+    }
+
+    private void updatePflags3AndNotifyA11yIfChanged(int mask, boolean newValue) {
         int pflags3 = mPrivateFlags3;
-        if (screenReaderFocusable) {
-            pflags3 |= PFLAG3_SCREEN_READER_FOCUSABLE;
+        if (newValue) {
+            pflags3 |= mask;
         } else {
-            pflags3 &= ~PFLAG3_SCREEN_READER_FOCUSABLE;
+            pflags3 &= ~mask;
         }
 
         if (pflags3 != mPrivateFlags3) {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f6d9a16..730c372 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -6482,17 +6482,17 @@
                     params.type = mOrigWindowType;
                 }
             }
-
-            if (mSurface.isValid()) {
-                params.frameNumber = mSurface.getNextFrameNumber();
-            }
         }
 
-        int relayoutResult = mWindowSession.relayout(
-                mWindow, mSeq, params,
+        long frameNumber = -1;
+        if (mSurface.isValid()) {
+            frameNumber = mSurface.getNextFrameNumber();
+        }
+
+        int relayoutResult = mWindowSession.relayout(mWindow, mSeq, params,
                 (int) (mView.getMeasuredWidth() * appScale + 0.5f),
-                (int) (mView.getMeasuredHeight() * appScale + 0.5f),
-                viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0,
+                (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility,
+                insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber,
                 mWinFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets,
                 mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingDisplayCutout,
                 mPendingMergedConfiguration, mSurface);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index f6181d7..0f5c23f 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -2438,13 +2438,6 @@
         public long hideTimeoutMilliseconds = -1;
 
         /**
-         * A frame number in which changes requested in this layout will be rendered.
-         *
-         * @hide
-         */
-        public long frameNumber = -1;
-
-        /**
          * The color mode requested by this window. The target display may
          * not be able to honor the request. When the color mode is not set
          * to {@link ActivityInfo#COLOR_MODE_DEFAULT}, it might override the
@@ -2617,7 +2610,6 @@
             TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags);
             out.writeInt(mColorMode);
             out.writeLong(hideTimeoutMilliseconds);
-            out.writeLong(frameNumber);
         }
 
         public static final Parcelable.Creator<LayoutParams> CREATOR
@@ -2674,7 +2666,6 @@
             accessibilityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
             mColorMode = in.readInt();
             hideTimeoutMilliseconds = in.readLong();
-            frameNumber = in.readLong();
         }
 
         @SuppressWarnings({"PointlessBitwiseExpression"})
@@ -2875,10 +2866,6 @@
                 changes |= SURFACE_INSETS_CHANGED;
             }
 
-            // The frame number changing is only relevant in the context of other
-            // changes, and so we don't need to track it with a flag.
-            frameNumber = o.frameNumber;
-
             if (hasManualSurfaceInsets != o.hasManualSurfaceInsets) {
                 hasManualSurfaceInsets = o.hasManualSurfaceInsets;
                 changes |= SURFACE_INSETS_CHANGED;
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 95a83da..7946e9e 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -201,6 +201,7 @@
  * <em>Properties:</em></br>
  * <ul>
  *   <li>{@link #getEventType()} - The type of the event.</li>
+ *   <li>{@link #getContentChangeTypes()} - The type of state changes.</li>
  *   <li>{@link #getSource()} - The source info (for registered clients).</li>
  *   <li>{@link #getClassName()} - The class name of the source.</li>
  *   <li>{@link #getPackageName()} - The package name of the source.</li>
@@ -863,16 +864,17 @@
     }
 
     /**
-     * Gets the bit mask of change types signaled by an
-     * {@link #TYPE_WINDOW_CONTENT_CHANGED} event. A single event may represent
-     * multiple change types.
+     * Gets the bit mask of change types signaled by a
+     * {@link #TYPE_WINDOW_CONTENT_CHANGED} event or {@link #TYPE_WINDOW_STATE_CHANGED}. A single
+     * event may represent multiple change types.
      *
      * @return The bit mask of change types. One or more of:
      *         <ul>
-     *         <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION}
-     *         <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_SUBTREE}
-     *         <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_TEXT}
-     *         <li>{@link AccessibilityEvent#CONTENT_CHANGE_TYPE_UNDEFINED}
+     *         <li>{@link #CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION}
+     *         <li>{@link #CONTENT_CHANGE_TYPE_SUBTREE}
+     *         <li>{@link #CONTENT_CHANGE_TYPE_TEXT}
+     *         <li>{@link #CONTENT_CHANGE_TYPE_PANE_TITLE}
+     *         <li>{@link #CONTENT_CHANGE_TYPE_UNDEFINED}
      *         </ul>
      */
     @ContentChangeTypes
@@ -891,6 +893,7 @@
             }
             case CONTENT_CHANGE_TYPE_SUBTREE: return "CONTENT_CHANGE_TYPE_SUBTREE";
             case CONTENT_CHANGE_TYPE_TEXT: return "CONTENT_CHANGE_TYPE_TEXT";
+            case CONTENT_CHANGE_TYPE_PANE_TITLE: return "CONTENT_CHANGE_TYPE_PANE_TITLE";
             case CONTENT_CHANGE_TYPE_UNDEFINED: return "CONTENT_CHANGE_TYPE_UNDEFINED";
             default: return Integer.toHexString(type);
         }
@@ -1324,7 +1327,7 @@
         }
         if (!DEBUG_CONCISE_TOSTRING || mWindowChangeTypes != 0) {
             builder.append("; WindowChangeTypes: ").append(
-                    contentChangeTypesToString(mWindowChangeTypes));
+                    windowChangeTypesToString(mWindowChangeTypes));
         }
         super.appendTo(builder);
         if (DEBUG || DEBUG_CONCISE_TOSTRING) {
diff --git a/core/java/android/webkit/TracingConfig.java b/core/java/android/webkit/TracingConfig.java
index d95ca61..2080168 100644
--- a/core/java/android/webkit/TracingConfig.java
+++ b/core/java/android/webkit/TracingConfig.java
@@ -54,37 +54,37 @@
 
     /**
      * Predefined set of categories typically useful for analyzing WebViews.
-     * Typically includes android_webview and Java.
+     * Typically includes "android_webview" and "Java" categories.
      */
     public static final int CATEGORIES_ANDROID_WEBVIEW = 1 << 1;
 
     /**
      * Predefined set of categories typically useful for web developers.
-     * Typically includes blink, compositor, renderer.scheduler and v8 categories.
+     * Typically includes "blink", "compositor", "renderer.scheduler" and "v8" categories.
      */
     public static final int CATEGORIES_WEB_DEVELOPER = 1 << 2;
 
     /**
      * Predefined set of categories for analyzing input latency issues.
-     * Typically includes input, renderer.scheduler categories.
+     * Typically includes "input", "renderer.scheduler" categories.
      */
     public static final int CATEGORIES_INPUT_LATENCY = 1 << 3;
 
     /**
      * Predefined set of categories for analyzing rendering issues.
-     * Typically includes blink, compositor and gpu categories.
+     * Typically includes "blink", "compositor" and "gpu" categories.
      */
     public static final int CATEGORIES_RENDERING = 1 << 4;
 
     /**
      * Predefined set of categories for analyzing javascript and rendering issues.
-     * Typically includes blink, compositor, gpu, renderer.scheduler and v8 categories.
+     * Typically includes "blink", "compositor", "gpu", "renderer.scheduler" and "v8" categories.
      */
     public static final int CATEGORIES_JAVASCRIPT_AND_RENDERING = 1 << 5;
 
     /**
      * Predefined set of categories for studying difficult rendering performance problems.
-     * Typically includes blink, compositor, gpu, renderer.scheduler, v8 and
+     * Typically includes "blink", "compositor", "gpu", "renderer.scheduler", "v8" and
      * some other compositor categories which are disabled by default.
      */
     public static final int CATEGORIES_FRAME_VIEWER = 1 << 6;
@@ -123,7 +123,9 @@
     }
 
     /**
-     * Returns a bitmask of the predefined categories values of this configuration.
+     * Returns a bitmask of the predefined category sets of this configuration.
+     *
+     * @return Bitmask of predefined category sets.
      */
     @PredefinedCategories
     public int getPredefinedCategories() {
@@ -133,7 +135,7 @@
     /**
      * Returns the list of included custom category patterns for this configuration.
      *
-     * @return empty list if no custom category patterns are specified.
+     * @return Empty list if no custom category patterns are specified.
      */
     @NonNull
     public List<String> getCustomIncludedCategories() {
@@ -142,6 +144,8 @@
 
     /**
      * Returns the tracing mode of this configuration.
+     *
+     * @return The tracing mode of this configuration.
      */
     @TracingMode
     public int getTracingMode() {
@@ -150,28 +154,37 @@
 
     /**
      * Builder used to create {@link TracingConfig} objects.
-     *
+     * <p>
      * Examples:
-     *   new TracingConfig.Builder().build()
-     *       -- creates a configuration with default options: {@link #CATEGORIES_NONE},
-     *          {@link #RECORD_UNTIL_FULL}.
-     *   new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER).build()
-     *       -- records trace events from the "web developer" predefined category sets.
-     *   new TracingConfig.Builder().addCategories(CATEGORIES_RENDERING,
-     *                                             CATEGORIES_INPUT_LATENCY).build()
-     *       -- records trace events from the "rendering" and "input latency" predefined
-     *          category sets.
-     *   new TracingConfig.Builder().addCategories("browser").build()
-     *       -- records only the trace events from the "browser" category.
-     *   new TracingConfig.Builder().addCategories("blink*","renderer*").build()
-     *       -- records only the trace events matching the "blink*" and "renderer*" patterns
-     *          (e.g. "blink.animations", "renderer_host" and "renderer.scheduler" categories).
-     *   new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER)
+     * <pre class="prettyprint">
+     *   // Create a configuration with default options: {@link #CATEGORIES_NONE},
+     *   // {@link #RECORD_CONTINUOUSLY}.
+     *   <code>new TracingConfig.Builder().build()</code>
+     *
+     *   // Record trace events from the "web developer" predefined category sets.
+     *   // Uses a ring buffer (the default {@link #RECORD_CONTINUOUSLY} mode) for
+     *   // internal storage during tracing.
+     *   <code>new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER).build()</code>
+     *
+     *   // Record trace events from the "rendering" and "input latency" predefined
+     *   // category sets.
+     *   <code>new TracingConfig.Builder().addCategories(CATEGORIES_RENDERING,
+     *                                     CATEGORIES_INPUT_LATENCY).build()</code>
+     *
+     *   // Record only the trace events from the "browser" category.
+     *   <code>new TracingConfig.Builder().addCategories("browser").build()</code>
+     *
+     *   // Record only the trace events matching the "blink*" and "renderer*" patterns
+     *   // (e.g. "blink.animations", "renderer_host" and "renderer.scheduler" categories).
+     *   <code>new TracingConfig.Builder().addCategories("blink*","renderer*").build()</code>
+     *
+     *   // Record events from the "web developer" predefined category set and events from
+     *   // the "disabled-by-default-v8.gc" category to understand where garbage collection
+     *   // is being triggered. Uses a limited size buffer for internal storage during tracing.
+     *   <code>new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER)
      *                              .addCategories("disabled-by-default-v8.gc")
-     *                              .setTracingMode(RECORD_CONTINUOUSLY).build()
-     *       -- records events from the "web developer" predefined category set and events from
-     *          the "disabled-by-default-v8.gc" category to understand where garbage collection
-     *          is being triggered. Uses a ring buffer for internal storage during tracing.
+     *                              .setTracingMode(RECORD_UNTIL_FULL).build()</code>
+     * </pre>
      */
     public static class Builder {
         private @PredefinedCategories int mPredefinedCategories = CATEGORIES_NONE;
@@ -185,6 +198,8 @@
 
         /**
          * Build {@link TracingConfig} using the current settings.
+         *
+         * @return The {@link TracingConfig} with the current settings.
          */
         public TracingConfig build() {
             return new TracingConfig(mPredefinedCategories, mCustomIncludedCategories,
@@ -192,16 +207,15 @@
         }
 
         /**
-         * Adds categories from a predefined set of categories to be included in the trace output.
+         * Adds predefined sets of categories to be included in the trace output.
          *
-         * @param predefinedCategories list or bitmask of predefined category sets to use:
-         *                    {@link #CATEGORIES_NONE}, {@link #CATEGORIES_ALL},
-         *                    {@link #CATEGORIES_ANDROID_WEBVIEW},
-         *                    {@link #CATEGORIES_WEB_DEVELOPER},
-         *                    {@link #CATEGORIES_INPUT_LATENCY},
-         *                    {@link #CATEGORIES_RENDERING},
-         *                    {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
-         *                    {@link #CATEGORIES_FRAME_VIEWER}.
+         * A predefined category set can be one of {@link #CATEGORIES_NONE},
+         * {@link #CATEGORIES_ALL}, {@link #CATEGORIES_ANDROID_WEBVIEW},
+         * {@link #CATEGORIES_WEB_DEVELOPER}, {@link #CATEGORIES_INPUT_LATENCY},
+         * {@link #CATEGORIES_RENDERING}, {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
+         * {@link #CATEGORIES_FRAME_VIEWER}.
+         *
+         * @param predefinedCategories A list or bitmask of predefined category sets.
          * @return The builder to facilitate chaining.
          */
         public Builder addCategories(@PredefinedCategories int... predefinedCategories) {
@@ -215,11 +229,11 @@
          * Adds custom categories to be included in trace output.
          *
          * Note that the categories are defined by the currently-in-use version of WebView. They
-         * live in chromium code and are not part of the Android API. See
+         * live in chromium code and are not part of the Android API.
          * See <a href="https://www.chromium.org/developers/how-tos/trace-event-profiling-tool">
          * chromium documentation on tracing</a> for more details.
          *
-         * @param categories a list of category patterns. A category pattern can contain wilcards,
+         * @param categories A list of category patterns. A category pattern can contain wildcards,
          *        e.g. "blink*" or full category name e.g. "renderer.scheduler".
          * @return The builder to facilitate chaining.
          */
@@ -235,7 +249,7 @@
          *
          * Same as {@link #addCategories(String...)} but allows to pass a Collection as a parameter.
          *
-         * @param categories a list of category patters.
+         * @param categories A list of category patterns.
          * @return The builder to facilitate chaining.
          */
         public Builder addCategories(Collection<String> categories) {
@@ -245,8 +259,9 @@
 
         /**
          * Sets the tracing mode for this configuration.
+         * When tracingMode is not set explicitly, the default is {@link #RECORD_CONTINUOUSLY}.
          *
-         * @param tracingMode tracing mode to use, one of {@link #RECORD_UNTIL_FULL} or
+         * @param tracingMode The tracing mode to use, one of {@link #RECORD_UNTIL_FULL} or
          *                    {@link #RECORD_CONTINUOUSLY}.
          * @return The builder to facilitate chaining.
          */
diff --git a/core/java/android/webkit/TracingController.java b/core/java/android/webkit/TracingController.java
index 50068f5..05c0304 100644
--- a/core/java/android/webkit/TracingController.java
+++ b/core/java/android/webkit/TracingController.java
@@ -35,9 +35,9 @@
  * Example usage:
  * <pre class="prettyprint">
  * TracingController tracingController = TracingController.getInstance();
- * tracingController.start(new TraceConfig.Builder()
+ * tracingController.start(new TracingConfig.Builder()
  *                  .addCategories(CATEGORIES_WEB_DEVELOPER).build());
- * [..]
+ * ...
  * tracingController.stop(new FileOutputStream("trace.json"),
  *                        Executors.newSingleThreadExecutor());
  * </pre></p>
@@ -49,7 +49,7 @@
      * only one TracingController instance for all WebView instances,
      * however this restriction may be relaxed in a future Android release.
      *
-     * @return the default TracingController instance
+     * @return The default TracingController instance.
      */
     @NonNull
     public static TracingController getInstance() {
@@ -65,8 +65,10 @@
      * using an internal buffer and flushed to the outputStream when
      * {@link #stop(OutputStream, Executor)} is called.
      *
-     * @param tracingConfig configuration options to use for tracing
-     * @throws IllegalStateException if the system is already tracing.
+     * @param tracingConfig Configuration options to use for tracing.
+     * @throws IllegalStateException If the system is already tracing.
+     * @throws IllegalArgumentException If the configuration is invalid (e.g.
+     *         invalid category pattern or invalid tracing mode).
      */
     public abstract void start(@NonNull TracingConfig tracingConfig);
 
@@ -77,17 +79,22 @@
      * in chunks by invoking {@link java.io.OutputStream#write(byte[])}. On completion
      * the {@link java.io.OutputStream#close()} method is called.
      *
-     * @param outputStream the output steam the tracing data will be sent to. If null
+     * @param outputStream The output stream the tracing data will be sent to. If null
      *                     the tracing data will be discarded.
-     * @param executor the {@link java.util.concurrent.Executor} on which the
-     *        outputStream #write and #close methods will be invoked.
-     * @return false if the system was not tracing at the time of the call, true
-     *         otherwise.
+     * @param executor The {@link java.util.concurrent.Executor} on which the
+     *        outputStream {@link java.io.OutputStream#write(byte[])} and
+     *        {@link java.io.OutputStream#close()} methods will be invoked.
+     * @return False if the WebView framework was not tracing at the time of the call,
+     *         true otherwise.
      */
     public abstract boolean stop(@Nullable OutputStream outputStream,
             @NonNull @CallbackExecutor Executor executor);
 
-    /** True if the system is tracing */
+    /**
+     * Returns whether the WebView framework is tracing.
+     *
+     * @return True if tracing is enabled.
+     */
     public abstract boolean isTracing();
 
 }
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 6af678b..dac100a 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -39,6 +39,7 @@
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
+import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -4837,14 +4838,48 @@
             return true;
         }
 
-        private boolean handleOverlapsMagnifier() {
-            final int handleY = mContainer.getDecorViewLayoutParams().y;
-            final int magnifierBottomWhenAtWindowTop =
-                    mTextView.getRootWindowInsets().getSystemWindowInsetTop()
-                        + mMagnifierAnimator.mMagnifier.getHeight();
-            return handleY <= magnifierBottomWhenAtWindowTop;
+        private boolean handleOverlapsMagnifier(@NonNull final HandleView handle,
+                @NonNull final Rect magnifierRect) {
+            final PopupWindow window = handle.mContainer;
+            if (!window.hasDecorView()) {
+                return false;
+            }
+            final Rect handleRect = new Rect(
+                    window.getDecorViewLayoutParams().x,
+                    window.getDecorViewLayoutParams().y,
+                    window.getDecorViewLayoutParams().x + window.getContentView().getWidth(),
+                    window.getDecorViewLayoutParams().y + window.getContentView().getHeight());
+            return Rect.intersects(handleRect, magnifierRect);
         }
 
+        private @Nullable HandleView getOtherSelectionHandle() {
+            final SelectionModifierCursorController controller = getSelectionController();
+            if (controller == null || !controller.isActive()) {
+                return null;
+            }
+            return controller.mStartHandle != this
+                    ? controller.mStartHandle
+                    : controller.mEndHandle;
+        }
+
+        private final Magnifier.Callback mHandlesVisibilityCallback = new Magnifier.Callback() {
+            @Override
+            public void onOperationComplete() {
+                final Point magnifierTopLeft = mMagnifierAnimator.mMagnifier.getWindowCoords();
+                if (magnifierTopLeft == null) {
+                    return;
+                }
+                final Rect magnifierRect = new Rect(magnifierTopLeft.x, magnifierTopLeft.y,
+                        magnifierTopLeft.x + mMagnifierAnimator.mMagnifier.getWidth(),
+                        magnifierTopLeft.y + mMagnifierAnimator.mMagnifier.getHeight());
+                setVisible(!handleOverlapsMagnifier(HandleView.this, magnifierRect));
+                final HandleView otherHandle = getOtherSelectionHandle();
+                if (otherHandle != null) {
+                    otherHandle.setVisible(!handleOverlapsMagnifier(otherHandle, magnifierRect));
+                }
+            }
+        };
+
         protected final void updateMagnifier(@NonNull final MotionEvent event) {
             if (mMagnifierAnimator == null) {
                 return;
@@ -4858,12 +4893,8 @@
                 mRenderCursorRegardlessTiming = true;
                 mTextView.invalidateCursorPath();
                 suspendBlink();
-                // Hide handle if it overlaps the magnifier.
-                if (handleOverlapsMagnifier()) {
-                    setVisible(false);
-                } else {
-                    setVisible(true);
-                }
+                mMagnifierAnimator.mMagnifier
+                        .setOnOperationCompleteCallback(mHandlesVisibilityCallback);
 
                 mMagnifierAnimator.show(showPosInView.x, showPosInView.y);
             } else {
@@ -4877,6 +4908,10 @@
                 mRenderCursorRegardlessTiming = false;
                 resumeBlink();
                 setVisible(true);
+                final HandleView otherHandle = getOtherSelectionHandle();
+                if (otherHandle != null) {
+                    otherHandle.setVisible(true);
+                }
             }
         }
 
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index d32e93c..40f9652 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -217,6 +217,17 @@
 
     private int mLayoutDirection = View.LAYOUT_DIRECTION_UNDEFINED;
 
+    /**
+     * Signals that compatibility booleans have been initialized according to
+     * target SDK versions.
+     */
+    private static boolean sCompatibilityDone = false;
+
+    /**
+     * Behavior change in P; always remeasure weighted children, regardless of excess space.
+     */
+    private static boolean sRemeasureWeightedChildren = true;
+
     public LinearLayout(Context context) {
         this(context, null);
     }
@@ -232,6 +243,15 @@
     public LinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
 
+        if (!sCompatibilityDone && context != null) {
+            final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
+
+            // Older apps only remeasure non-zero children
+            sRemeasureWeightedChildren = targetSdkVersion >= Build.VERSION_CODES.P;
+
+            sCompatibilityDone = true;
+        }
+
         final TypedArray a = context.obtainStyledAttributes(
                 attrs, com.android.internal.R.styleable.LinearLayout, defStyleAttr, defStyleRes);
 
@@ -917,7 +937,8 @@
         // measurement on any children, we need to measure them now.
         int remainingExcess = heightSize - mTotalLength
                 + (mAllowInconsistentMeasurement ? 0 : consumedExcessSpace);
-        if (skippedMeasure || totalWeight > 0.0f) {
+        if (skippedMeasure
+                || ((sRemeasureWeightedChildren || remainingExcess != 0) && totalWeight > 0.0f)) {
             float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;
 
             mTotalLength = 0;
@@ -1300,7 +1321,8 @@
         // measurement on any children, we need to measure them now.
         int remainingExcess = widthSize - mTotalLength
                 + (mAllowInconsistentMeasurement ? 0 : usedExcessSpace);
-        if (skippedMeasure || totalWeight > 0.0f) {
+        if (skippedMeasure
+                || ((sRemeasureWeightedChildren || remainingExcess != 0) && totalWeight > 0.0f)) {
             float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;
 
             maxAscent[0] = maxAscent[1] = maxAscent[2] = maxAscent[3] = -1;
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 5eb6699..cb362e6 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -233,6 +233,17 @@
         return mZoom;
     }
 
+    /**
+     * @hide
+     */
+    @Nullable
+    public Point getWindowCoords() {
+        if (mWindow == null) {
+            return null;
+        }
+        return new Point(mWindow.mLastDrawContentPositionX, mWindow.mLastDrawContentPositionY);
+    }
+
     @Nullable
     private Surface getValidViewSurface() {
         // TODO: deduplicate this against the first part of #performPixelCopy
@@ -374,8 +385,11 @@
         private final Runnable mMagnifierUpdater;
         // The handler where the magnifier updater jobs will be post'd.
         private final Handler mHandler;
-        // The callback to be run after the next draw. Only used for testing.
+        // The callback to be run after the next draw.
         private Callback mCallback;
+        // The position of the magnifier content when the last draw was requested.
+        private int mLastDrawContentPositionX;
+        private int mLastDrawContentPositionY;
 
         // Members below describe the state of the magnifier. Reads/writes to them
         // have to be synchronized between the UI thread and the thread that handles
@@ -598,6 +612,8 @@
                     callback = null;
                 }
 
+                mLastDrawContentPositionX = mWindowPositionX + mOffsetX;
+                mLastDrawContentPositionY = mWindowPositionY + mOffsetY;
                 mFrameDrawScheduled = false;
             }
 
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 468abdc..1f2b90a 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -969,7 +969,7 @@
             mHot = true;
             trimText();
             final TextSelection selection;
-            if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+            if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.P) {
                 final TextSelection.Request request = new TextSelection.Request.Builder(
                         mTrimmedText, mRelativeStart, mRelativeEnd)
                         .setDefaultLocales(mDefaultLocales)
@@ -1023,7 +1023,7 @@
 
                 trimText();
                 final TextClassification classification;
-                if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) {
+                if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.P) {
                     final TextClassification.Request request =
                             new TextClassification.Request.Builder(
                                     mTrimmedText, mRelativeStart, mRelativeEnd)
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index fae6db5d..7b9ecca 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -317,7 +317,6 @@
  * @attr ref android.R.styleable#TextView_autoSizeMaxTextSize
  * @attr ref android.R.styleable#TextView_autoSizeStepGranularity
  * @attr ref android.R.styleable#TextView_autoSizePresetSizes
- * @attr ref android.R.styleable#TextView_accessibilityHeading
  */
 @RemoteView
 public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {
@@ -417,7 +416,6 @@
     private int mCurTextColor;
     private int mCurHintTextColor;
     private boolean mFreezesText;
-    private boolean mIsAccessibilityHeading;
 
     private Editable.Factory mEditableFactory = Editable.Factory.getInstance();
     private Spannable.Factory mSpannableFactory = Spannable.Factory.getInstance();
@@ -1294,8 +1292,6 @@
                 case com.android.internal.R.styleable.TextView_lineHeight:
                     lineHeight = a.getDimensionPixelSize(attr, -1);
                     break;
-                case com.android.internal.R.styleable.TextView_accessibilityHeading:
-                    mIsAccessibilityHeading = a.getBoolean(attr, false);
             }
         }
 
@@ -5213,32 +5209,6 @@
     }
 
     /**
-     * Gets whether this view is a heading for accessibility purposes.
-     *
-     * @return {@code true} if the view is a heading, {@code false} otherwise.
-     *
-     * @attr ref android.R.styleable#TextView_accessibilityHeading
-     */
-    public boolean isAccessibilityHeading() {
-        return mIsAccessibilityHeading;
-    }
-
-    /**
-     * Set if view is a heading for a section of content for accessibility purposes.
-     *
-     * @param isHeading {@code true} if the view is a heading, {@code false} otherwise.
-     *
-     * @attr ref android.R.styleable#TextView_accessibilityHeading
-     */
-    public void setAccessibilityHeading(boolean isHeading) {
-        if (isHeading != mIsAccessibilityHeading) {
-            mIsAccessibilityHeading = isHeading;
-            notifyViewAccessibilityStateChangedIfNeeded(
-                    AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
-        }
-    }
-
-    /**
      * Convenience method to append the specified text to the TextView's
      * display buffer, upgrading it to {@link android.widget.TextView.BufferType#EDITABLE}
      * if it was not already editable.
@@ -10833,7 +10803,6 @@
         info.setText(getTextForAccessibility());
         info.setHintText(mHint);
         info.setShowingHintText(isShowingHint());
-        info.setHeading(mIsAccessibilityHeading);
 
         if (mBufferType == BufferType.EDITABLE) {
             info.setEditable(true);
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 322c876..25af355 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -19,10 +19,10 @@
 import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 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;
@@ -31,6 +31,10 @@
         implements DialogInterface.OnClickListener {
     private static final String TAG = "SuspendedAppActivity";
 
+    public static final String EXTRA_SUSPENDED_PACKAGE =
+            "SuspendedAppActivity.extra.SUSPENDED_PACKAGE";
+    public static final String EXTRA_SUSPENDING_PACKAGE =
+            "SuspendedAppActivity.extra.SUSPENDING_PACKAGE";
     public static final String EXTRA_DIALOG_MESSAGE = "SuspendedAppActivity.extra.DIALOG_MESSAGE";
     public static final String EXTRA_MORE_DETAILS_INTENT =
             "SuspendedAppActivity.extra.MORE_DETAILS_INTENT";
@@ -38,10 +42,19 @@
     private Intent mMoreDetailsIntent;
     private int mUserId;
 
+    private CharSequence getAppLabel(String packageName) {
+        final PackageManager pm = getPackageManager();
+        try {
+            return pm.getApplicationInfoAsUser(packageName, 0, mUserId).loadLabel(pm);
+        } catch (PackageManager.NameNotFoundException ne) {
+            Slog.e(TAG, "Package " + packageName + " not found", ne);
+        }
+        return packageName;
+    }
+
     @Override
     public void onCreate(Bundle icicle) {
-        Window window = getWindow();
-        window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
+        getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
         super.onCreate(icicle);
 
         final Intent intent = getIntent();
@@ -52,15 +65,22 @@
             finish();
             return;
         }
-        String dialogMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
-        if (dialogMessage == null) {
-            dialogMessage = getString(R.string.app_suspended_default_message);
+        final String suppliedMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
+        final CharSequence suspendedAppLabel = getAppLabel(
+                intent.getStringExtra(EXTRA_SUSPENDED_PACKAGE));
+        final CharSequence dialogMessage;
+        if (suppliedMessage == null) {
+            dialogMessage = getString(R.string.app_suspended_default_message,
+                    suspendedAppLabel,
+                    getAppLabel(intent.getStringExtra(EXTRA_SUSPENDING_PACKAGE)));
+        } else {
+            dialogMessage = String.format(getResources().getConfiguration().getLocales().get(0),
+                    suppliedMessage, suspendedAppLabel);
         }
 
         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.mMessage = dialogMessage;
         ap.mPositiveButtonText = getString(android.R.string.ok);
         if (mMoreDetailsIntent != null) {
             ap.mNeutralButtonText = getString(R.string.app_suspended_more_details);
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 5d40a73..f537e3e 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -166,6 +166,11 @@
             return null;
         }
 
+        if (parsedArgs.hiddenApiAccessLogSampleRate != -1) {
+            handleHiddenApiAccessLogSampleRate(parsedArgs.hiddenApiAccessLogSampleRate);
+            return null;
+        }
+
         if (parsedArgs.permittedCapabilities != 0 || parsedArgs.effectiveCapabilities != 0) {
             throw new ZygoteSecurityException("Client may not specify capabilities: " +
                     "permitted=0x" + Long.toHexString(parsedArgs.permittedCapabilities) +
@@ -294,6 +299,15 @@
         }
     }
 
+    private void handleHiddenApiAccessLogSampleRate(int percent) {
+        try {
+            ZygoteInit.setHiddenApiAccessLogSampleRate(percent);
+            mSocketOutStream.writeInt(0);
+        } catch (IOException ioe) {
+            throw new IllegalStateException("Error writing to command socket", ioe);
+        }
+    }
+
     protected void preload() {
         ZygoteInit.lazyPreload();
     }
@@ -461,6 +475,12 @@
         String[] apiBlacklistExemptions;
 
         /**
+         * Sampling rate for logging hidden API accesses to the event log. This is sent to the
+         * pre-forked zygote at boot time, or when it changes, via --hidden-api-log-sampling-rate.
+         */
+        int hiddenApiAccessLogSampleRate = -1;
+
+        /**
          * Constructs instance and parses args
          * @param args zygote command-line args
          * @throws IllegalArgumentException
@@ -483,6 +503,7 @@
 
             boolean seenRuntimeArgs = false;
 
+            boolean expectRuntimeArgs = true;
             for ( /* curArg */ ; curArg < args.length; curArg++) {
                 String arg = args[curArg];
 
@@ -612,6 +633,7 @@
                     preloadPackageCacheKey = args[++curArg];
                 } else if (arg.equals("--preload-default")) {
                     preloadDefault = true;
+                    expectRuntimeArgs = false;
                 } else if (arg.equals("--start-child-zygote")) {
                     startChildZygote = true;
                 } else if (arg.equals("--set-api-blacklist-exemptions")) {
@@ -619,6 +641,16 @@
                     // with the regular fork command.
                     apiBlacklistExemptions = Arrays.copyOfRange(args, curArg + 1, args.length);
                     curArg = args.length;
+                    expectRuntimeArgs = false;
+                } else if (arg.startsWith("--hidden-api-log-sampling-rate=")) {
+                    String rateStr = arg.substring(arg.indexOf('=') + 1);
+                    try {
+                        hiddenApiAccessLogSampleRate = Integer.parseInt(rateStr);
+                    } catch (NumberFormatException nfe) {
+                        throw new IllegalArgumentException(
+                                "Invalid log sampling rate: " + rateStr, nfe);
+                    }
+                    expectRuntimeArgs = false;
                 } else {
                     break;
                 }
@@ -633,7 +665,7 @@
                     throw new IllegalArgumentException(
                             "Unexpected arguments after --preload-package.");
                 }
-            } else if (!preloadDefault && apiBlacklistExemptions == null) {
+            } else if (expectRuntimeArgs) {
                 if (!seenRuntimeArgs) {
                     throw new IllegalArgumentException("Unexpected argument : " + args[curArg]);
                 }
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index c5d41db..6f58365 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -26,8 +26,8 @@
 import android.icu.util.ULocale;
 import android.opengl.EGL14;
 import android.os.Build;
-import android.os.IInstalld;
 import android.os.Environment;
+import android.os.IInstalld;
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
@@ -44,16 +44,16 @@
 import android.system.StructCapUserData;
 import android.system.StructCapUserHeader;
 import android.text.Hyphenator;
-import android.util.TimingsTraceLog;
 import android.util.EventLog;
 import android.util.Log;
 import android.util.Slog;
+import android.util.TimingsTraceLog;
 import android.webkit.WebViewFactory;
 import android.widget.TextView;
 
 import com.android.internal.logging.MetricsLogger;
-
 import com.android.internal.util.Preconditions;
+
 import dalvik.system.DexFile;
 import dalvik.system.VMRuntime;
 import dalvik.system.ZygoteHooks;
@@ -67,8 +67,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.security.Security;
 import java.security.Provider;
+import java.security.Security;
 
 /**
  * Startup class for the zygote process.
@@ -518,6 +518,10 @@
         VMRuntime.getRuntime().setHiddenApiExemptions(exemptions);
     }
 
+    public static void setHiddenApiAccessLogSampleRate(int percent) {
+        VMRuntime.getRuntime().setHiddenApiAccessLogSamplingRate(percent);
+    }
+
     /**
      * Creates a PathClassLoader for the given class path that is associated with a shared
      * namespace, i.e., this classloader can access platform-private native libraries. The
diff --git a/core/java/com/android/internal/util/StatLogger.java b/core/java/com/android/internal/util/StatLogger.java
new file mode 100644
index 0000000..1dac136
--- /dev/null
+++ b/core/java/com/android/internal/util/StatLogger.java
@@ -0,0 +1,173 @@
+/*
+ * 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.util;
+
+import android.os.SystemClock;
+import android.util.Slog;
+import android.util.proto.ProtoOutputStream;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.StatLoggerProto;
+import com.android.server.StatLoggerProto.Event;
+
+import java.io.PrintWriter;
+
+/**
+ * Simple class to keep track of the number of times certain events happened and their durations for
+ * benchmarking.
+ *
+ * @hide
+ */
+public class StatLogger {
+    private static final String TAG = "StatLogger";
+
+    private final Object mLock = new Object();
+
+    private final int SIZE;
+
+    @GuardedBy("mLock")
+    private final int[] mCountStats;
+
+    @GuardedBy("mLock")
+    private final long[] mDurationStats;
+
+    @GuardedBy("mLock")
+    private final int[] mCallsPerSecond;
+
+    @GuardedBy("mLock")
+    private final long[] mDurationPerSecond;
+
+    @GuardedBy("mLock")
+    private final int[] mMaxCallsPerSecond;
+
+    @GuardedBy("mLock")
+    private final long[] mMaxDurationPerSecond;
+
+    @GuardedBy("mLock")
+    private final long[] mMaxDurationStats;
+
+    @GuardedBy("mLock")
+    private long mNextTickTime = SystemClock.elapsedRealtime() + 1000;
+
+    private final String[] mLabels;
+
+    public StatLogger(String[] eventLabels) {
+        SIZE = eventLabels.length;
+        mCountStats = new int[SIZE];
+        mDurationStats = new long[SIZE];
+        mCallsPerSecond = new int[SIZE];
+        mMaxCallsPerSecond = new int[SIZE];
+        mDurationPerSecond = new long[SIZE];
+        mMaxDurationPerSecond = new long[SIZE];
+        mMaxDurationStats = new long[SIZE];
+        mLabels = eventLabels;
+    }
+
+    /**
+     * Return the current time in the internal time unit.
+     * Call it before an event happens, and
+     * give it back to the {@link #logDurationStat(int, long)}} after the event.
+     */
+    public long getTime() {
+        return SystemClock.elapsedRealtimeNanos() / 1000;
+    }
+
+    /**
+     * @see {@link #getTime()}
+     *
+     * @return the duration in microseconds.
+     */
+    public long logDurationStat(int eventId, long start) {
+        synchronized (mLock) {
+            final long duration = getTime() - start;
+            if (eventId >= 0 && eventId < SIZE) {
+                mCountStats[eventId]++;
+                mDurationStats[eventId] += duration;
+            } else {
+                Slog.wtf(TAG, "Invalid event ID: " + eventId);
+                return duration;
+            }
+            if (mMaxDurationStats[eventId] < duration) {
+                mMaxDurationStats[eventId] = duration;
+            }
+
+            // Keep track of the per-second max.
+            final long nowRealtime = SystemClock.elapsedRealtime();
+            if (nowRealtime > mNextTickTime) {
+                if (mMaxCallsPerSecond[eventId] < mCallsPerSecond[eventId]) {
+                    mMaxCallsPerSecond[eventId] = mCallsPerSecond[eventId];
+                }
+                if (mMaxDurationPerSecond[eventId] < mDurationPerSecond[eventId]) {
+                    mMaxDurationPerSecond[eventId] = mDurationPerSecond[eventId];
+                }
+
+                mCallsPerSecond[eventId] = 0;
+                mDurationPerSecond[eventId] = 0;
+
+                mNextTickTime = nowRealtime + 1000;
+            }
+
+            mCallsPerSecond[eventId]++;
+            mDurationPerSecond[eventId] += duration;
+
+            return duration;
+        }
+    }
+
+    public void dump(PrintWriter pw, String prefix) {
+        dump(new IndentingPrintWriter(pw, "  ").setIndent(prefix));
+    }
+
+    public void dump(IndentingPrintWriter pw) {
+        synchronized (mLock) {
+            pw.println("Stats:");
+            pw.increaseIndent();
+            for (int i = 0; i < SIZE; i++) {
+                final int count = mCountStats[i];
+                final double durationMs = mDurationStats[i] / 1000.0;
+
+                pw.println(String.format(
+                        "%s: count=%d, total=%.1fms, avg=%.3fms, max calls/s=%d max dur/s=%.1fms"
+                        + " max time=%.1fms",
+                        mLabels[i], count, durationMs,
+                        (count == 0 ? 0 : durationMs / count),
+                        mMaxCallsPerSecond[i], mMaxDurationPerSecond[i] / 1000.0,
+                        mMaxDurationStats[i] / 1000.0));
+            }
+            pw.decreaseIndent();
+        }
+    }
+
+    public void dumpProto(ProtoOutputStream proto, long fieldId) {
+        synchronized (mLock) {
+            final long outer = proto.start(fieldId);
+
+            for (int i = 0; i < mLabels.length; i++) {
+                final long inner = proto.start(StatLoggerProto.EVENTS);
+
+                proto.write(Event.EVENT_ID, i);
+                proto.write(Event.LABEL, mLabels[i]);
+                proto.write(Event.COUNT, mCountStats[i]);
+                proto.write(Event.TOTAL_DURATION_MICROS, mDurationStats[i]);
+
+                proto.end(inner);
+            }
+
+            proto.end(outer);
+        }
+    }
+}
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 35aae15..2ce5a0b 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -1706,6 +1706,7 @@
         contentContainer.setLayoutParams(new ViewGroup.LayoutParams(
                 ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
         contentContainer.setTag(FLOATING_TOOLBAR_TAG);
+        contentContainer.setClipToOutline(true);
         return contentContainer;
     }
 
diff --git a/core/proto/android/app/activitymanager.proto b/core/proto/android/app/activitymanager.proto
index 4756c13..ead7e16 100644
--- a/core/proto/android/app/activitymanager.proto
+++ b/core/proto/android/app/activitymanager.proto
@@ -23,14 +23,14 @@
 
 // ActivityManager.java UID_OBSERVERs flags
 enum UidObserverFlag {
-  // report changes in process state, original value is 1 << 0
-  UID_OBSERVER_FLAG_PROCSTATE = 1;
-  // report uid gone, original value is 1 << 1
-  UID_OBSERVER_FLAG_GONE = 2;
-  // report uid has become idle, original value is 1 << 2
-  UID_OBSERVER_FLAG_IDLE = 3;
-  // report uid has become active, original value is 1 << 3
-  UID_OBSERVER_FLAG_ACTIVE = 4;
-  // report uid cached state has changed, original value is 1 << 4
-  UID_OBSERVER_FLAG_CACHED = 5;
+    // report changes in process state, original value is 1 << 0
+    UID_OBSERVER_FLAG_PROCSTATE = 1;
+    // report uid gone, original value is 1 << 1
+    UID_OBSERVER_FLAG_GONE = 2;
+    // report uid has become idle, original value is 1 << 2
+    UID_OBSERVER_FLAG_IDLE = 3;
+    // report uid has become active, original value is 1 << 3
+    UID_OBSERVER_FLAG_ACTIVE = 4;
+    // report uid cached state has changed, original value is 1 << 4
+    UID_OBSERVER_FLAG_CACHED = 5;
 }
diff --git a/core/proto/android/app/alarmmanager.proto b/core/proto/android/app/alarmmanager.proto
index 7ef08ca..53be1ee 100644
--- a/core/proto/android/app/alarmmanager.proto
+++ b/core/proto/android/app/alarmmanager.proto
@@ -27,31 +27,31 @@
  * An android.app.AlarmManager object.
  */
 message AlarmManagerProto {
-  enum AlarmType {
-    // Alarm time in System.currentTimeMillis() (wall clock time in UTC), which
-    // will wake up the device when it goes off.
-    RTC_WAKEUP = 0;
-    // Alarm time in System.currentTimeMillis() (wall clock time in UTC).  This
-    // alarm does not wake the device up; if it goes off while the device is
-    // asleep, it will not be delivered until the next time the device wakes up.
-    RTC = 1;
-    // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
-    // sleep), which will wake up the device when it goes off.
-    ELAPSED_REALTIME_WAKEUP = 2;
-    // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
-    // sleep). This alarm does not wake the device up; if it goes off while the
-    // device is asleep, it will not be delivered until the next time the device
-    // wakes up.
-    ELAPSED_REALTIME = 3;
-  }
+    enum AlarmType {
+        // Alarm time in System.currentTimeMillis() (wall clock time in UTC), which
+        // will wake up the device when it goes off.
+        RTC_WAKEUP = 0;
+        // Alarm time in System.currentTimeMillis() (wall clock time in UTC). This
+        // alarm does not wake the device up; if it goes off while the device is
+        // asleep, it will not be delivered until the next time the device wakes up.
+        RTC = 1;
+        // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
+        // sleep), which will wake up the device when it goes off.
+        ELAPSED_REALTIME_WAKEUP = 2;
+        // Alarm time in SystemClock.elapsedRealtime() (time since boot, including
+        // sleep). This alarm does not wake the device up; if it goes off while the
+        // device is asleep, it will not be delivered until the next time the device
+        // wakes up.
+        ELAPSED_REALTIME = 3;
+    }
 }
 
 // An android.app.AlarmManager.AlarmClockInfo object.
 message AlarmClockInfoProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // This value is UTC wall clock time in milliseconds, as returned by
-  // System#currentTimeMillis() for example.
-  optional int64 trigger_time_ms = 1;
-  optional android.app.PendingIntentProto show_intent = 2;
+    // This value is UTC wall clock time in milliseconds, as returned by
+    // System#currentTimeMillis() for example.
+    optional int64 trigger_time_ms = 1;
+    optional android.app.PendingIntentProto show_intent = 2;
 }
diff --git a/core/proto/android/app/job/enums.proto b/core/proto/android/app/job/enums.proto
index 17bf4fb..2290b2f 100644
--- a/core/proto/android/app/job/enums.proto
+++ b/core/proto/android/app/job/enums.proto
@@ -24,10 +24,10 @@
 // Reasons a job is stopped.
 // Primarily used in android.app.job.JobParameters.java.
 enum StopReasonEnum {
-  STOP_REASON_UNKNOWN = -1;
-  STOP_REASON_CANCELLED = 0;
-  STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
-  STOP_REASON_PREEMPT = 2;
-  STOP_REASON_TIMEOUT = 3;
-  STOP_REASON_DEVICE_IDLE = 4;
+    STOP_REASON_UNKNOWN = -1;
+    STOP_REASON_CANCELLED = 0;
+    STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1;
+    STOP_REASON_PREEMPT = 2;
+    STOP_REASON_TIMEOUT = 3;
+    STOP_REASON_DEVICE_IDLE = 4;
 }
diff --git a/core/proto/android/app/pendingintent.proto b/core/proto/android/app/pendingintent.proto
index ab0d34e..04ce850 100644
--- a/core/proto/android/app/pendingintent.proto
+++ b/core/proto/android/app/pendingintent.proto
@@ -26,7 +26,7 @@
  * An android.app.PendingIntent object.
  */
 message PendingIntentProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string target = 1;
+    optional string target = 1;
 }
diff --git a/core/proto/android/app/statusbarmanager.proto b/core/proto/android/app/statusbarmanager.proto
index 3d1447a..1108508 100644
--- a/core/proto/android/app/statusbarmanager.proto
+++ b/core/proto/android/app/statusbarmanager.proto
@@ -19,15 +19,15 @@
 option java_multiple_files = true;
 
 message StatusBarManagerProto {
-  enum WindowState {
-    WINDOW_STATE_SHOWING = 0;
-    WINDOW_STATE_HIDING = 1;
-    WINDOW_STATE_HIDDEN = 2;
-  }
-  enum TransientWindowState {
-    TRANSIENT_BAR_NONE = 0;
-    TRANSIENT_BAR_SHOW_REQUESTED = 1;
-    TRANSIENT_BAR_SHOWING = 2;
-    TRANSIENT_BAR_HIDING = 3;
-  }
+    enum WindowState {
+        WINDOW_STATE_SHOWING = 0;
+        WINDOW_STATE_HIDING = 1;
+        WINDOW_STATE_HIDDEN = 2;
+    }
+    enum TransientWindowState {
+        TRANSIENT_BAR_NONE = 0;
+        TRANSIENT_BAR_SHOW_REQUESTED = 1;
+        TRANSIENT_BAR_SHOWING = 2;
+        TRANSIENT_BAR_HIDING = 3;
+    }
 }
diff --git a/core/proto/android/app/window_configuration.proto b/core/proto/android/app/window_configuration.proto
index 1e8ace4..c9f3986 100644
--- a/core/proto/android/app/window_configuration.proto
+++ b/core/proto/android/app/window_configuration.proto
@@ -25,9 +25,9 @@
 
 /** Proto representation for WindowConfiguration.java class. */
 message WindowConfigurationProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.RectProto app_bounds = 1;
-  optional int32 windowing_mode = 2;
-  optional int32 activity_type = 3;
+    optional .android.graphics.RectProto app_bounds = 1;
+    optional int32 windowing_mode = 2;
+    optional int32 activity_type = 3;
 }
diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto
index 9e459e6..d0c9226 100644
--- a/core/proto/android/bluetooth/enums.proto
+++ b/core/proto/android/bluetooth/enums.proto
@@ -22,22 +22,22 @@
 
 // Bluetooth connection states.
 enum ConnectionStateEnum {
-  CONNECTION_STATE_DISCONNECTED = 0;
-  CONNECTION_STATE_CONNECTING = 1;
-  CONNECTION_STATE_CONNECTED = 2;
-  CONNECTION_STATE_DISCONNECTING = 3;
+    CONNECTION_STATE_DISCONNECTED = 0;
+    CONNECTION_STATE_CONNECTING = 1;
+    CONNECTION_STATE_CONNECTED = 2;
+    CONNECTION_STATE_DISCONNECTING = 3;
 }
 
 // Bluetooth Adapter Enable and Disable Reasons
 enum EnableDisableReasonEnum {
-  ENABLE_DISABLE_REASON_UNSPECIFIED = 0;
-  ENABLE_DISABLE_REASON_APPLICATION_REQUEST = 1;
-  ENABLE_DISABLE_REASON_AIRPLANE_MODE = 2;
-  ENABLE_DISABLE_REASON_DISALLOWED = 3;
-  ENABLE_DISABLE_REASON_RESTARTED = 4;
-  ENABLE_DISABLE_REASON_START_ERROR = 5;
-  ENABLE_DISABLE_REASON_SYSTEM_BOOT = 6;
-  ENABLE_DISABLE_REASON_CRASH = 7;
-  ENABLE_DISABLE_REASON_USER_SWITCH = 8;
-  ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9;
-}
\ No newline at end of file
+    ENABLE_DISABLE_REASON_UNSPECIFIED = 0;
+    ENABLE_DISABLE_REASON_APPLICATION_REQUEST = 1;
+    ENABLE_DISABLE_REASON_AIRPLANE_MODE = 2;
+    ENABLE_DISABLE_REASON_DISALLOWED = 3;
+    ENABLE_DISABLE_REASON_RESTARTED = 4;
+    ENABLE_DISABLE_REASON_START_ERROR = 5;
+    ENABLE_DISABLE_REASON_SYSTEM_BOOT = 6;
+    ENABLE_DISABLE_REASON_CRASH = 7;
+    ENABLE_DISABLE_REASON_USER_SWITCH = 8;
+    ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9;
+}
diff --git a/core/proto/android/content/activityinfo.proto b/core/proto/android/content/activityinfo.proto
index 012752a..87acd84 100644
--- a/core/proto/android/content/activityinfo.proto
+++ b/core/proto/android/content/activityinfo.proto
@@ -19,24 +19,24 @@
 option java_multiple_files = true;
 
 message ActivityInfoProto {
-  enum ScreenOrientation {
-    SCREEN_ORIENTATION_UNSET = -2;
-    SCREEN_ORIENTATION_UNSPECIFIED = -1;
-    SCREEN_ORIENTATION_LANDSCAPE = 0;
-    SCREEN_ORIENTATION_PORTRAIT = 1;
-    SCREEN_ORIENTATION_USER = 2;
-    SCREEN_ORIENTATION_BEHIND = 3;
-    SCREEN_ORIENTATION_SENSOR = 4;
-    SCREEN_ORIENTATION_NOSENSOR = 5;
-    SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;
-    SCREEN_ORIENTATION_SENSOR_PORTRAIT = 7;
-    SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
-    SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
-    SCREEN_ORIENTATION_FULL_SENSOR = 10;
-    SCREEN_ORIENTATION_USER_LANDSCAPE = 11;
-    SCREEN_ORIENTATION_USER_PORTRAIT = 12;
-    SCREEN_ORIENTATION_FULL_USER = 13;
-    SCREEN_ORIENTATION_LOCKED = 14;
-  }
+    enum ScreenOrientation {
+        SCREEN_ORIENTATION_UNSET = -2;
+        SCREEN_ORIENTATION_UNSPECIFIED = -1;
+        SCREEN_ORIENTATION_LANDSCAPE = 0;
+        SCREEN_ORIENTATION_PORTRAIT = 1;
+        SCREEN_ORIENTATION_USER = 2;
+        SCREEN_ORIENTATION_BEHIND = 3;
+        SCREEN_ORIENTATION_SENSOR = 4;
+        SCREEN_ORIENTATION_NOSENSOR = 5;
+        SCREEN_ORIENTATION_SENSOR_LANDSCAPE = 6;
+        SCREEN_ORIENTATION_SENSOR_PORTRAIT = 7;
+        SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8;
+        SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9;
+        SCREEN_ORIENTATION_FULL_SENSOR = 10;
+        SCREEN_ORIENTATION_USER_LANDSCAPE = 11;
+        SCREEN_ORIENTATION_USER_PORTRAIT = 12;
+        SCREEN_ORIENTATION_FULL_USER = 13;
+        SCREEN_ORIENTATION_LOCKED = 14;
+    }
 }
 
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index 6a174e8..5755c59 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -28,63 +28,63 @@
  * An android Configuration object.
  */
 message ConfigurationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional float font_scale = 1;
-  optional uint32 mcc = 2;
-  optional uint32 mnc = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  repeated LocaleProto locales = 4;
-  optional uint32 screen_layout = 5;
-  optional uint32 color_mode = 6;
-  optional uint32 touchscreen = 7;
-  optional uint32 keyboard = 8;
-  optional uint32 keyboard_hidden = 9;
-  optional uint32 hard_keyboard_hidden = 10;
-  optional uint32 navigation = 11;
-  optional uint32 navigation_hidden = 12;
-  optional uint32 orientation = 13;
-  optional uint32 ui_mode = 14;
-  optional uint32 screen_width_dp = 15;
-  optional uint32 screen_height_dp = 16;
-  optional uint32 smallest_screen_width_dp = 17;
-  optional uint32 density_dpi = 18;
-  optional .android.app.WindowConfigurationProto window_configuration = 19;
+    optional float font_scale = 1;
+    optional uint32 mcc = 2;
+    optional uint32 mnc = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    repeated LocaleProto locales = 4;
+    optional uint32 screen_layout = 5;
+    optional uint32 color_mode = 6;
+    optional uint32 touchscreen = 7;
+    optional uint32 keyboard = 8;
+    optional uint32 keyboard_hidden = 9;
+    optional uint32 hard_keyboard_hidden = 10;
+    optional uint32 navigation = 11;
+    optional uint32 navigation_hidden = 12;
+    optional uint32 orientation = 13;
+    optional uint32 ui_mode = 14;
+    optional uint32 screen_width_dp = 15;
+    optional uint32 screen_height_dp = 16;
+    optional uint32 smallest_screen_width_dp = 17;
+    optional uint32 density_dpi = 18;
+    optional .android.app.WindowConfigurationProto window_configuration = 19;
 }
 
 /**
  * All current configuration data used to select resources.
  */
 message ResourcesConfigurationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  required ConfigurationProto configuration = 1;
+    required ConfigurationProto configuration = 1;
 
-  optional uint32 sdk_version = 2;
-  optional uint32 screen_width_px = 3;
-  optional uint32 screen_height_px = 4;
+    optional uint32 sdk_version = 2;
+    optional uint32 screen_width_px = 3;
+    optional uint32 screen_height_px = 4;
 }
 
 /**
  * Overall device configuration data.
  */
 message DeviceConfigurationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional uint32 stable_screen_width_px = 1;
-  optional uint32 stable_screen_height_px = 2;
-  optional uint32 stable_density_dpi = 3;
+    optional uint32 stable_screen_width_px = 1;
+    optional uint32 stable_screen_height_px = 2;
+    optional uint32 stable_density_dpi = 3;
 
-  optional uint64 total_ram = 4;
-  optional bool low_ram = 5;
-  optional uint32 max_cores = 6;
-  optional bool has_secure_screen_lock = 7;
+    optional uint64 total_ram = 4;
+    optional bool low_ram = 5;
+    optional uint32 max_cores = 6;
+    optional bool has_secure_screen_lock = 7;
 
-  optional uint32 opengl_version = 8;
-  repeated string opengl_extensions = 9;
+    optional uint32 opengl_version = 8;
+    repeated string opengl_extensions = 9;
 
-  repeated string shared_libraries = 10;
-  repeated string features = 11;
-  repeated string cpu_architectures = 12;
+    repeated string shared_libraries = 10;
+    repeated string features = 11;
+    repeated string cpu_architectures = 12;
 }
 
 /**
@@ -92,8 +92,8 @@
  * to filter and target apps.
  */
 message GlobalConfigurationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ResourcesConfigurationProto resources = 1;
-  optional DeviceConfigurationProto device = 2;
+    optional ResourcesConfigurationProto resources = 1;
+    optional DeviceConfigurationProto device = 2;
 }
diff --git a/core/proto/android/content/locale.proto b/core/proto/android/content/locale.proto
index 2be3ab9..87b555c 100644
--- a/core/proto/android/content/locale.proto
+++ b/core/proto/android/content/locale.proto
@@ -23,10 +23,10 @@
 package android.content;
 
 message LocaleProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string language = 1;
-  optional string country = 2;
-  optional string variant = 3;
+    optional string language = 1;
+    optional string country = 2;
+    optional string variant = 3;
 }
 
diff --git a/core/proto/android/graphics/pixelformat.proto b/core/proto/android/graphics/pixelformat.proto
index 4e42c92..d7f5f0c 100644
--- a/core/proto/android/graphics/pixelformat.proto
+++ b/core/proto/android/graphics/pixelformat.proto
@@ -19,16 +19,16 @@
 option java_multiple_files = true;
 
 message PixelFormatProto {
-  enum Format {
-      UNKNOWN      = 0;
-      TRANSLUCENT  = -3;
-      TRANSPARENT  = -2;
-      OPAQUE       = -1;
-      RGBA_8888    = 1;
-      RGBX_8888    = 2;
-      RGB_888      = 3;
-      RGB_565      = 4;
-      RGBA_F16     = 0x16;
-      RGBA_1010102 = 0x2B;
-  }
+    enum Format {
+        UNKNOWN      = 0;
+        TRANSLUCENT  = -3;
+        TRANSPARENT  = -2;
+        OPAQUE       = -1;
+        RGBA_8888    = 1;
+        RGBX_8888    = 2;
+        RGB_888      = 3;
+        RGB_565      = 4;
+        RGBA_F16     = 0x16;
+        RGBA_1010102 = 0x2B;
+    }
 }
diff --git a/core/proto/android/graphics/point.proto b/core/proto/android/graphics/point.proto
index 035b9fe..04d879f 100644
--- a/core/proto/android/graphics/point.proto
+++ b/core/proto/android/graphics/point.proto
@@ -22,9 +22,9 @@
 option java_multiple_files = true;
 
 message PointProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 x = 1;
-  optional int32 y = 2;
+    optional int32 x = 1;
+    optional int32 y = 2;
 }
 
diff --git a/core/proto/android/graphics/rect.proto b/core/proto/android/graphics/rect.proto
index eb403fe..c216b2b 100644
--- a/core/proto/android/graphics/rect.proto
+++ b/core/proto/android/graphics/rect.proto
@@ -22,11 +22,11 @@
 option java_multiple_files = true;
 
 message RectProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 left = 1;
-  optional int32 top = 2;
-  optional int32 right = 3;
-  optional int32 bottom = 4;
+    optional int32 left = 1;
+    optional int32 top = 2;
+    optional int32 right = 3;
+    optional int32 bottom = 4;
 }
 
diff --git a/core/proto/android/internal/locallog.proto b/core/proto/android/internal/locallog.proto
index 73d1492..df0b90b 100644
--- a/core/proto/android/internal/locallog.proto
+++ b/core/proto/android/internal/locallog.proto
@@ -22,7 +22,7 @@
 import "frameworks/base/libs/incident/proto/android/privacy.proto";
 
 message LocalLogProto {
-  option (.android.msg_privacy).dest = DEST_EXPLICIT;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
-  repeated string lines = 1;
+    repeated string lines = 1;
 }
diff --git a/core/proto/android/internal/processstats.proto b/core/proto/android/internal/processstats.proto
index 5629c2d..7c1ac3f 100644
--- a/core/proto/android/internal/processstats.proto
+++ b/core/proto/android/internal/processstats.proto
@@ -19,10 +19,10 @@
 package com.android.internal.app.procstats;
 
 message ProcessStatsProto {
-  enum MemoryFactor {
-    MEM_FACTOR_NORMAL = 0;
-    MEM_FACTOR_MODERATE = 1;
-    MEM_FACTOR_LOW = 2;
-    MEM_FACTOR_CRITICAL = 3;
-  }
+    enum MemoryFactor {
+        MEM_FACTOR_NORMAL = 0;
+        MEM_FACTOR_MODERATE = 1;
+        MEM_FACTOR_LOW = 2;
+        MEM_FACTOR_CRITICAL = 3;
+    }
 }
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 8e98ac9..0970bd5 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -25,859 +25,860 @@
 import "frameworks/base/libs/incident/proto/android/privacy.proto";
 
 message BatteryStatsProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 report_version = 1;
-  optional int64 parcel_version = 2;
-  optional string start_platform_version = 3;
-  optional string end_platform_version = 4;
-  repeated UidProto uids = 5;
-  optional SystemProto system = 6;
+    optional int32 report_version = 1;
+    optional int64 parcel_version = 2;
+    optional string start_platform_version = 3;
+    optional string end_platform_version = 4;
+    repeated UidProto uids = 5;
+    optional SystemProto system = 6;
 }
 
 message ControllerActivityProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  // Time (milliseconds) spent in the idle state.
-  optional int64 idle_duration_ms = 1;
-  // Time (milliseconds) spent in the receive state.
-  optional int64 rx_duration_ms = 2;
-  // Total power (mAh) consumed by the controller in all states. The value may
-  // always be 0 if the device doesn't support power calculations.
-  optional int64 power_mah = 3;
-
-  // Represents a transmit level, where each level may draw a different amount
-  // of power. The levels themselves are controller-specific (and may possibly
-  // be device specific...yet to be confirmed).
-  message TxLevel {
     option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Transmit level. Higher levels draw more power.
-    optional int32 level = 1;
-    // Time spent in this specific transmit level state.
-    optional int64 duration_ms = 2;
-  }
-  repeated TxLevel tx = 4;
+    // Time (milliseconds) spent in the idle state.
+    optional int64 idle_duration_ms = 1;
+    // Time (milliseconds) spent in the receive state.
+    optional int64 rx_duration_ms = 2;
+    // Total power (mAh) consumed by the controller in all states. The value may
+    // always be 0 if the device doesn't support power calculations.
+    optional int64 power_mah = 3;
+
+    // Represents a transmit level, where each level may draw a different amount
+    // of power. The levels themselves are controller-specific (and may possibly
+    // be device specific...yet to be confirmed).
+    message TxLevel {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // Transmit level. Higher levels draw more power.
+        optional int32 level = 1;
+        // Time spent in this specific transmit level state.
+        optional int64 duration_ms = 2;
+    }
+    repeated TxLevel tx = 4;
 }
 
 message SystemProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  message Battery {
     option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Wall clock time when the data collection started.
-    // In case of device time manually reset by users:
-    //   start_clock_time_ms keeps the same value in the current collection
-    //   period and changes for later collection periods.
-    optional int64 start_clock_time_ms = 1;
-    // #times the device has been started since start_clock_time_millis.
-    optional int64 start_count = 2;
-    // Total realtime duration (= SINCE_UNPLUGGED battery_realtime_millis.)
-    optional int64 total_realtime_ms = 3;
-    optional int64 total_uptime_ms = 4;
-    // Realtime duration on battery.
-    optional int64 battery_realtime_ms = 5;
-    // Uptime duration (i.e., not suspend).
-    // Uptime is anytime the CPUs were on. The radio and Wifi chip
-    // can be running while the CPUs are off.
-    optional int64 battery_uptime_ms = 6;
-    // Total realtime duration measured with screen off or dozing.
-    optional int64 screen_off_realtime_ms = 7;
-    // Total uptime duration measured with screen off or dozing.
-    optional int64 screen_off_uptime_ms = 8;
-    // Total time the screen was dozing while the device was running on battery.
-    // For historical reasons, screen_doze_duration_msec is a subset of
-    // screen_off_realtime_msec.
-    optional int64 screen_doze_duration_ms = 9;
-    // The estimated real battery capacity, which may be less than the declared
-    // battery capacity (for example, because of battery aging). This field is
-    // less reliable than min(max)_learned_battery_capacity_uah, use those two
-    // fields whenever possible.
-    optional int64 estimated_battery_capacity_mah = 10;
-    // The minimum learned battery capacity in uAh.
-    optional int64 min_learned_battery_capacity_uah = 11;
-    // The maximum learned battery capacity in uAh.
-    optional int64 max_learned_battery_capacity_uah = 12;
-  };
-  optional Battery battery = 1;
+    message Battery {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message BatteryDischarge {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        // Wall clock time when the data collection started.
+        // In case of device time manually reset by users:
+        //     start_clock_time_ms keeps the same value in the current collection
+        //     period and changes for later collection periods.
+        optional int64 start_clock_time_ms = 1;
+        // #times the device has been started since start_clock_time_millis.
+        optional int64 start_count = 2;
+        // Total realtime duration (= SINCE_UNPLUGGED battery_realtime_millis.)
+        optional int64 total_realtime_ms = 3;
+        optional int64 total_uptime_ms = 4;
+        // Realtime duration on battery.
+        optional int64 battery_realtime_ms = 5;
+        // Uptime duration (i.e., not suspend).
+        // Uptime is anytime the CPUs were on. The radio and Wifi chip
+        // can be running while the CPUs are off.
+        optional int64 battery_uptime_ms = 6;
+        // Total realtime duration measured with screen off or dozing.
+        optional int64 screen_off_realtime_ms = 7;
+        // Total uptime duration measured with screen off or dozing.
+        optional int64 screen_off_uptime_ms = 8;
+        // Total time the screen was dozing while the device was running on battery.
+        // For historical reasons, screen_doze_duration_msec is a subset of
+        // screen_off_realtime_msec.
+        optional int64 screen_doze_duration_ms = 9;
+        // The estimated real battery capacity, which may be less than the declared
+        // battery capacity (for example, because of battery aging). This field is
+        // less reliable than min(max)_learned_battery_capacity_uah, use those two
+        // fields whenever possible.
+        optional int64 estimated_battery_capacity_mah = 10;
+        // The minimum learned battery capacity in uAh.
+        optional int64 min_learned_battery_capacity_uah = 11;
+        // The maximum learned battery capacity in uAh.
+        optional int64 max_learned_battery_capacity_uah = 12;
+    };
+    optional Battery battery = 1;
 
-    // Discharged battery percentage points since the stats were last reset
-    // after charging (lower bound approximation).
-    optional int32 lower_bound_since_charge = 1;
-    // Upper bound approximation.
-    optional int32 upper_bound_since_charge = 2;
-    // Discharged points while screen is on.
-    optional int32 screen_on_since_charge = 3;
-    // Discharged points while screen is off.
-    optional int32 screen_off_since_charge = 4;
-    // Discharged points while screen was dozing. For historical reasons,
-    // screen_doze_since_charge is a subset of screen_off_since_charge.
-    optional int32 screen_doze_since_charge = 5;
-    // Total amount of battery discharged in mAh. This will only be non-zero for
-    // devices that report battery discharge via a coulomb counter.
-    optional int64 total_mah = 6;
-    // Total amount of battery discharged while the screen was off in mAh.
-    // This will only be non-zero for devices that report battery discharge
-    // via a coulomb counter.
-    optional int64 total_mah_screen_off = 7;
-    // Total amount of battery discharged while the screen was dozing in mAh.
-    // This will only be non-zero for devices that report battery discharge
-    // via a coulomb counter. For historical reasons, total_mah_screen_doze is
-    // a subset of total_mah_screen_off.
-    optional int64 total_mah_screen_doze = 8;
-    // Total amount of battery discharged in mAh while the device was in light doze mode.
-    // This will only be non-zero for devices that report battery discharge
-    // via a coulomb counter.
-    optional int64 total_mah_light_doze = 9;
-    // Total amount of battery discharged in mAh while the device was in deep doze mode.
-    // This will only be non-zero for devices that report battery discharge
-    // via a coulomb counter.
-    optional int64 total_mah_deep_doze = 10;
-  };
-  optional BatteryDischarge battery_discharge = 2;
+    message BatteryDischarge {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  oneof time_remaining {
-    // Approximation for how much time remains until the battery is fully
-    // charged. The device will print -1 if there wasn't enough data to
-    // calculate an estimate, or if the battery is currently discharging.
-    int64 charge_time_remaining_ms = 3;
-    // Approximation for how much time remains until the battery is fully
-    // discharged. The device will print -1 if there wasn't enough data to
-    // calculate an estimate, or if the battery is currently charging.
-    int64 discharge_time_remaining_ms = 4;
-  }
+        // Discharged battery percentage points since the stats were last reset
+        // after charging (lower bound approximation).
+        optional int32 lower_bound_since_charge = 1;
+        // Upper bound approximation.
+        optional int32 upper_bound_since_charge = 2;
+        // Discharged points while screen is on.
+        optional int32 screen_on_since_charge = 3;
+        // Discharged points while screen is off.
+        optional int32 screen_off_since_charge = 4;
+        // Discharged points while screen was dozing. For historical reasons,
+        // screen_doze_since_charge is a subset of screen_off_since_charge.
+        optional int32 screen_doze_since_charge = 5;
+        // Total amount of battery discharged in mAh. This will only be non-zero for
+        // devices that report battery discharge via a coulomb counter.
+        optional int64 total_mah = 6;
+        // Total amount of battery discharged while the screen was off in mAh.
+        // This will only be non-zero for devices that report battery discharge
+        // via a coulomb counter.
+        optional int64 total_mah_screen_off = 7;
+        // Total amount of battery discharged while the screen was dozing in mAh.
+        // This will only be non-zero for devices that report battery discharge
+        // via a coulomb counter. For historical reasons, total_mah_screen_doze is
+        // a subset of total_mah_screen_off.
+        optional int64 total_mah_screen_doze = 8;
+        // Total amount of battery discharged in mAh while the device was in light doze mode.
+        // This will only be non-zero for devices that report battery discharge
+        // via a coulomb counter.
+        optional int64 total_mah_light_doze = 9;
+        // Total amount of battery discharged in mAh while the device was in deep doze mode.
+        // This will only be non-zero for devices that report battery discharge
+        // via a coulomb counter.
+        optional int64 total_mah_deep_doze = 10;
+    };
+    optional BatteryDischarge battery_discharge = 2;
 
-  // BatteryLevelStep tracks data for which conditions were continuously held for
-  // the entire duration. Field for which the conditions were not consistent
-  // for the entire duration should be marked MIXED.
-  message BatteryLevelStep {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // How long the battery was at the current level.
-    optional int64 duration_ms = 1;
-    // Battery level
-    optional int32 level = 2;
-
-    // State of the display. A special enum is used rather than
-    // DisplayProto.State because a MIXED value needs to be in the enum, and
-    // batterystats doesn't care about all of the different display states.
-    enum DisplayState {
-      DS_MIXED = 0;
-      DS_ON = 1;
-      DS_OFF = 2;
-      DS_DOZE = 3;
-      DS_DOZE_SUSPEND = 4;
-      // Any display state error that comes through should be sent to hackbod@.
-      DS_ERROR = 5;
+    oneof time_remaining {
+        // Approximation for how much time remains until the battery is fully
+        // charged. The device will print -1 if there wasn't enough data to
+        // calculate an estimate, or if the battery is currently discharging.
+        int64 charge_time_remaining_ms = 3;
+        // Approximation for how much time remains until the battery is fully
+        // discharged. The device will print -1 if there wasn't enough data to
+        // calculate an estimate, or if the battery is currently charging.
+        int64 discharge_time_remaining_ms = 4;
     }
-    // The state of the display for the entire battery level step. MIXED is used
-    // if there were multiple states for this step.
-    optional DisplayState display_state = 3;
 
-    // Indicates status in power save mode.
-    enum PowerSaveMode {
-      PSM_MIXED = 0;
-      PSM_ON = 1;
-      PSM_OFF = 2;
+    // BatteryLevelStep tracks data for which conditions were continuously held for
+    // the entire duration. Field for which the conditions were not consistent
+    // for the entire duration should be marked MIXED.
+    message BatteryLevelStep {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // How long the battery was at the current level.
+        optional int64 duration_ms = 1;
+        // Battery level
+        optional int32 level = 2;
+
+        // State of the display. A special enum is used rather than
+        // DisplayProto.State because a MIXED value needs to be in the enum, and
+        // batterystats doesn't care about all of the different display states.
+        enum DisplayState {
+            DS_MIXED = 0;
+            DS_ON = 1;
+            DS_OFF = 2;
+            DS_DOZE = 3;
+            DS_DOZE_SUSPEND = 4;
+            // Any display state error that comes through should be sent to hackbod@.
+            DS_ERROR = 5;
+        }
+        // The state of the display for the entire battery level step. MIXED is used
+        // if there were multiple states for this step.
+        optional DisplayState display_state = 3;
+
+        // Indicates status in power save mode.
+        enum PowerSaveMode {
+            PSM_MIXED = 0;
+            PSM_ON = 1;
+            PSM_OFF = 2;
+        }
+        // Battery Saver mode for the entire battery level step. MIXED is used
+        // if there were multiple states for this step.
+        optional PowerSaveMode power_save_mode = 4;
+
+        // Indicates status in idle mode.
+        enum IdleMode {
+            IM_MIXED = 0;
+            IM_ON = 2;
+            IM_OFF = 3;
+        }
+        // Doze mode for the entire battery level step. MIXED is used if there were
+        // multiple states for this step.
+        optional IdleMode idle_mode = 5;
+    };
+    // Battery level steps when the device was charging.
+    repeated BatteryLevelStep charge_step = 5;
+    // Battery level steps when the device was discharging.
+    repeated BatteryLevelStep discharge_step = 6;
+
+    // All CPU frequencies of the device.
+    repeated int64 cpu_frequency = 7;
+
+    message DataConnection {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        oneof type {
+            android.telephony.NetworkTypeEnum name = 1;
+            // If is_none is not set, then the name is a valid network type.
+            bool is_none = 2;
+        }
+        optional TimerProto total = 3;
+    };
+    repeated DataConnection data_connection = 8;
+
+    optional ControllerActivityProto global_bluetooth_controller = 9;
+    optional ControllerActivityProto global_modem_controller = 10;
+    optional ControllerActivityProto global_wifi_controller = 11;
+
+    message GlobalNetwork {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // Total Bytes received on mobile connections.
+        optional int64 mobile_bytes_rx = 1;
+        // Total Bytes transmitted on mobile connections.
+        optional int64 mobile_bytes_tx = 2;
+        // Total Bytes received on wifi connections.
+        optional int64 wifi_bytes_rx = 3;
+        // Total Bytes transmitted on wifi connections.
+        optional int64 wifi_bytes_tx = 4;
+        // Total Packets received on mobile connections.
+        optional int64 mobile_packets_rx = 5;
+        // Total Packets transmitted on mobile connections.
+        optional int64 mobile_packets_tx = 6;
+        // Total Packets received on wifi connections.
+        optional int64 wifi_packets_rx = 7;
+        // Total Packets transmitted on wifi connections.
+        optional int64 wifi_packets_tx = 8;
+        // Total Bytes received on bluetooth connections.
+        optional int64 bt_bytes_rx = 9;
+        // Total Bytes transmitted on bluetooth connections.
+        optional int64 bt_bytes_tx = 10;
+    };
+    optional GlobalNetwork global_network = 12;
+
+    message GlobalWifi {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // The amount of time that wifi has been on while the device was running on
+        // battery.
+        optional int64 on_duration_ms = 1;
+        // The amount of time that wifi has been on and the driver has been in the
+        // running state while the device was running on battery.
+        optional int64 running_duration_ms = 2;
     }
-    // Battery Saver mode for the entire battery level step. MIXED is used
-    // if there were multiple states for this step.
-    optional PowerSaveMode power_save_mode = 4;
+    optional GlobalWifi global_wifi = 13;
 
-    // Indicates status in idle mode.
-    enum IdleMode {
-      IM_MIXED = 0;
-      IM_ON = 2;
-      IM_OFF = 3;
+    // Kernel wakelock metrics are only recorded when the device is unplugged
+    // *and* the screen is off.
+    message KernelWakelock {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string name = 1;
+        // Kernel wakelock stats aren't apportioned across all kernel wakelocks (as
+        // app wakelocks stats are).
+        optional TimerProto total = 2;
+        // The kernel doesn't have the data to enable printing out current and max
+        // durations.
+    };
+    repeated KernelWakelock kernel_wakelock = 14;
+
+    message Misc {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int64 screen_on_duration_ms = 1;
+        optional int64 phone_on_duration_ms = 2;
+        optional int64 full_wakelock_total_duration_ms = 3;
+        // The total elapsed time that a partial wakelock was held. This duration
+        // does not double count wakelocks held at the same time.
+        optional int64 partial_wakelock_total_duration_ms = 4;
+        optional int64 mobile_radio_active_duration_ms = 5;
+        // The time that is the difference between the mobile radio time we saw
+        // based on the elapsed timestamp when going down vs. the given time stamp
+        // from the radio.
+        optional int64 mobile_radio_active_adjusted_time_ms = 6;
+        optional int32 mobile_radio_active_count = 7;
+        // The amount of time that the mobile network has been active (in a high
+        // power state) but not being able to blame on an app.
+        optional int32 mobile_radio_active_unknown_duration_ms = 8;
+        // Total amount of time the device was in the interactive state.
+        optional int64 interactive_duration_ms = 9;
+        optional int64 battery_saver_mode_enabled_duration_ms = 10;
+        optional int32 num_connectivity_changes = 11;
+        // Amount of time the device was in deep Doze.
+        optional int64 deep_doze_enabled_duration_ms = 12;
+        // How many times the device went into deep Doze mode.
+        optional int32 deep_doze_count = 13;
+        // Amount of time the device was idling in deep Doze. Idling time
+        // encompasses "doze" time and the maintenance windows that allow apps to
+        // operate.
+        optional int64 deep_doze_idling_duration_ms = 14;
+        // How many times the device idling for deep Doze mode.
+        optional int32 deep_doze_idling_count = 15;
+        optional int64 longest_deep_doze_duration_ms = 16;
+        // Amount of time the device was in Doze Light.
+        optional int64 light_doze_enabled_duration_ms = 17;
+        // How many times the device went into Doze Light mode.
+        optional int32 light_doze_count = 18;
+        // Amount of time the device was idling in Doze Light. Idling time
+        // encompasses "doze" time and the maintenance windows that allow apps to
+        // operate.
+        optional int64 light_doze_idling_duration_ms = 19;
+        // How many times the device idling for Doze Light mode.
+        optional int32 light_doze_idling_count = 20;
+        optional int64 longest_light_doze_duration_ms = 21;
     }
-    // Doze mode for the entire battery level step. MIXED is used if there were
-    // multiple states for this step.
-    optional IdleMode idle_mode = 5;
-  };
-  // Battery level steps when the device was charging.
-  repeated BatteryLevelStep charge_step = 5;
-  // Battery level steps when the device was discharging.
-  repeated BatteryLevelStep discharge_step = 6;
+    optional Misc misc = 15;
 
-  // All CPU frequencies of the device.
-  repeated int64 cpu_frequency = 7;
+    message PhoneSignalStrength {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message DataConnection {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-    oneof type {
-      android.telephony.NetworkTypeEnum name = 1;
-      // If is_none is not set, then the name is a valid network type.
-      bool is_none = 2;
+        optional android.telephony.SignalStrengthEnum name = 1;
+        optional TimerProto total = 2;
+    };
+    repeated PhoneSignalStrength phone_signal_strength = 16;
+
+    message PowerUseItem {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        enum Sipper {
+            UNKNOWN_SIPPER = 0;
+            IDLE = 1;
+            CELL = 2;
+            PHONE = 3;
+            WIFI = 4;
+            BLUETOOTH = 5;
+            FLASHLIGHT = 6;
+            SCREEN = 7;
+            USER = 8;
+            UNACCOUNTED = 9;
+            OVERCOUNTED = 10;
+            CAMERA = 11;
+            MEMORY = 12;
+            AMBIENT_DISPLAY = 13;
+        };
+        optional Sipper name = 1;
+        // UID, only valid for the USER sipper.
+        optional int32 uid = 2;
+        // Estimated power use in mAh.
+        optional double computed_power_mah = 3;
+        // Starting in Oreo, Battery Settings has two modes to display the battery
+        // info. The first is "app usage list". In this mode, items with should_hide
+        // enabled are hidden.
+        optional bool should_hide = 4;
+        // Smeared power from screen usage. Screen usage power is split and smeared
+        // among apps, based on activity time.
+        optional double screen_power_mah = 5;
+        // Smeared power using proportional method. Power usage from hidden sippers
+        // is smeared to all apps proportionally (except for screen usage).
+        optional double proportional_smear_mah = 6;
+    };
+    repeated PowerUseItem power_use_item = 17;
+
+    message PowerUseSummary {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional double battery_capacity_mah = 1;
+        optional double computed_power_mah = 2;
+        // Lower bound of actual power drained.
+        optional double min_drained_power_mah = 3;
+        // Upper bound of actual power drained.
+        optional double max_drained_power_mah = 4;
+    };
+    optional PowerUseSummary power_use_summary = 18;
+
+    message ResourcePowerManager {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // Either StateName or StateName.VoterName.
+        optional string name = 1;
+        optional TimerProto total = 2;
+        optional TimerProto screen_off = 3;
     }
-    optional TimerProto total = 3;
-  };
-  repeated DataConnection data_connection = 8;
+    repeated ResourcePowerManager resource_power_manager = 19;
 
-  optional ControllerActivityProto global_bluetooth_controller = 9;
-  optional ControllerActivityProto global_modem_controller = 10;
-  optional ControllerActivityProto global_wifi_controller = 11;
+    message ScreenBrightness {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message GlobalNetwork {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // Total Bytes received on mobile connections.
-    optional int64 mobile_bytes_rx = 1;
-    // Total Bytes transmitted on mobile connections.
-    optional int64 mobile_bytes_tx = 2;
-    // Total Bytes received on wifi connections.
-    optional int64 wifi_bytes_rx = 3;
-    // Total Bytes transmitted on wifi connections.
-    optional int64 wifi_bytes_tx = 4;
-    // Total Packets received on mobile connections.
-    optional int64 mobile_packets_rx = 5;
-    // Total Packets transmitted on mobile connections.
-    optional int64 mobile_packets_tx = 6;
-    // Total Packets received on wifi connections.
-    optional int64 wifi_packets_rx = 7;
-    // Total Packets transmitted on wifi connections.
-    optional int64 wifi_packets_tx = 8;
-    // Total Bytes received on bluetooth connections.
-    optional int64 bt_bytes_rx = 9;
-    // Total Bytes transmitted on bluetooth connections.
-    optional int64 bt_bytes_tx = 10;
-  };
-  optional GlobalNetwork global_network = 12;
-
-  message GlobalWifi {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // The amount of time that wifi has been on while the device was running on
-    // battery.
-    optional int64 on_duration_ms = 1;
-    // The amount of time that wifi has been on and the driver has been in the
-    // running state while the device was running on battery.
-    optional int64 running_duration_ms = 2;
-  }
-  optional GlobalWifi global_wifi = 13;
-
-  // Kernel wakelock metrics are only recorded when the device is unplugged
-  // *and* the screen is off.
-  message KernelWakelock {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional string name = 1;
-    // Kernel wakelock stats aren't apportioned across all kernel wakelocks (as
-    // app wakelocks stats are).
-    optional TimerProto total = 2;
-    // The kernel doesn't have the data to enable printing out current and max
-    // durations.
-  };
-  repeated KernelWakelock kernel_wakelock = 14;
-
-  message Misc {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional int64 screen_on_duration_ms = 1;
-    optional int64 phone_on_duration_ms = 2;
-    optional int64 full_wakelock_total_duration_ms = 3;
-    // The total elapsed time that a partial wakelock was held. This duration
-    // does not double count wakelocks held at the same time.
-    optional int64 partial_wakelock_total_duration_ms = 4;
-    optional int64 mobile_radio_active_duration_ms = 5;
-    // The time that is the difference between the mobile radio time we saw
-    // based on the elapsed timestamp when going down vs. the given time stamp
-    // from the radio.
-    optional int64 mobile_radio_active_adjusted_time_ms = 6;
-    optional int32 mobile_radio_active_count = 7;
-    // The amount of time that the mobile network has been active (in a high
-    // power state) but not being able to blame on an app.
-    optional int32 mobile_radio_active_unknown_duration_ms = 8;
-    // Total amount of time the device was in the interactive state.
-    optional int64 interactive_duration_ms = 9;
-    optional int64 battery_saver_mode_enabled_duration_ms = 10;
-    optional int32 num_connectivity_changes = 11;
-    // Amount of time the device was in deep Doze.
-    optional int64 deep_doze_enabled_duration_ms = 12;
-    // How many times the device went into deep Doze mode.
-    optional int32 deep_doze_count = 13;
-    // Amount of time the device was idling in deep Doze. Idling time
-    // encompasses "doze" time and the maintenance windows that allow apps to
-    // operate.
-    optional int64 deep_doze_idling_duration_ms = 14;
-    // How many times the device idling for deep Doze mode.
-    optional int32 deep_doze_idling_count = 15;
-    optional int64 longest_deep_doze_duration_ms = 16;
-    // Amount of time the device was in Doze Light.
-    optional int64 light_doze_enabled_duration_ms = 17;
-    // How many times the device went into Doze Light mode.
-    optional int32 light_doze_count = 18;
-    // Amount of time the device was idling in Doze Light. Idling time
-    // encompasses "doze" time and the maintenance windows that allow apps to
-    // operate.
-    optional int64 light_doze_idling_duration_ms = 19;
-    // How many times the device idling for Doze Light mode.
-    optional int32 light_doze_idling_count = 20;
-    optional int64 longest_light_doze_duration_ms = 21;
-  }
-  optional Misc misc = 15;
-
-  message PhoneSignalStrength {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional android.telephony.SignalStrengthEnum name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated PhoneSignalStrength phone_signal_strength = 16;
-
-  message PowerUseItem {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    enum Sipper {
-      UNKNOWN_SIPPER = 0;
-      IDLE = 1;
-      CELL = 2;
-      PHONE = 3;
-      WIFI = 4;
-      BLUETOOTH = 5;
-      FLASHLIGHT = 6;
-      SCREEN = 7;
-      USER = 8;
-      UNACCOUNTED = 9;
-      OVERCOUNTED = 10;
-      CAMERA = 11;
-      MEMORY = 12;
+        enum Name {
+            DARK = 0; // Not screen-off.
+            DIM = 1;
+            MEDIUM = 2;
+            LIGHT = 3;
+            BRIGHT = 4;
+        };
+        optional Name name = 1;
+        optional TimerProto total = 2;
     };
-    optional Sipper name = 1;
-    // UID, only valid for the USER sipper.
-    optional int32 uid = 2;
-    // Estimated power use in mAh.
-    optional double computed_power_mah = 3;
-    // Starting in Oreo, Battery Settings has two modes to display the battery
-    // info. The first is "app usage list". In this mode, items with should_hide
-    // enabled are hidden.
-    optional bool should_hide = 4;
-    // Smeared power from screen usage. Screen usage power is split and smeared
-    // among apps, based on activity time.
-    optional double screen_power_mah = 5;
-    // Smeared power using proportional method. Power usage from hidden sippers
-    // is smeared to all apps proportionally (except for screen usage).
-    optional double proportional_smear_mah = 6;
-  };
-  repeated PowerUseItem power_use_item = 17;
+    repeated ScreenBrightness screen_brightness = 20;
 
-  message PowerUseSummary {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    // Duration and number of times trying to acquire a signal
+    optional TimerProto signal_scanning = 21;
 
-    optional double battery_capacity_mah = 1;
-    optional double computed_power_mah = 2;
-    // Lower bound of actual power drained.
-    optional double min_drained_power_mah = 3;
-    // Upper bound of actual power drained.
-    optional double max_drained_power_mah = 4;
-  };
-  optional PowerUseSummary power_use_summary = 18;
+    message WakeupReason {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message ResourcePowerManager {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // Either StateName or StateName.VoterName.
-    optional string name = 1;
-    optional TimerProto total = 2;
-    optional TimerProto screen_off = 3;
-  }
-  repeated ResourcePowerManager resource_power_manager = 19;
-
-  message ScreenBrightness {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    enum Name {
-      DARK = 0; // Not screen-off.
-      DIM = 1;
-      MEDIUM = 2;
-      LIGHT = 3;
-      BRIGHT = 4;
+        optional string name = 1;
+        optional TimerProto total = 2;
     };
-    optional Name name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated ScreenBrightness screen_brightness = 20;
+    repeated WakeupReason wakeup_reason = 22;
 
-  // Duration and number of times trying to acquire a signal
-  optional TimerProto signal_scanning = 21;
+    message WifiMulticastWakelockTotal {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message WakeupReason {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional int64 duration_ms = 1;
+        optional int32 count = 2;
+    }
+    optional WifiMulticastWakelockTotal wifi_multicast_wakelock_total = 23;
 
-    optional string name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated WakeupReason wakeup_reason = 22;
+    message WifiSignalStrength {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message WifiMulticastWakelockTotal {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional int64 duration_ms = 1;
-    optional int32 count = 2;
-  }
-  optional WifiMulticastWakelockTotal wifi_multicast_wakelock_total = 23;
-
-  message WifiSignalStrength {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    enum Name {
-      NONE = 0;
-      POOR = 1;
-      MODERATE = 2;
-      GOOD = 3;
-      GREAT = 4;
+        enum Name {
+            NONE = 0;
+            POOR = 1;
+            MODERATE = 2;
+            GOOD = 3;
+            GREAT = 4;
+        };
+        optional Name name = 1;
+        optional TimerProto total = 2;
     };
-    optional Name name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated WifiSignalStrength wifi_signal_strength = 24;
+    repeated WifiSignalStrength wifi_signal_strength = 24;
 
-  message WifiState {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message WifiState {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    enum Name {
-      OFF = 0;
-      OFF_SCANNING = 1;
-      ON_NO_NETWORKS = 2;
-      ON_DISCONNECTED = 3;
-      ON_CONNECTED_STA = 4;
-      ON_CONNECTED_P2P = 5;
-      ON_CONNECTED_STA_P2P = 6;
-      SOFT_AP = 7;
+        enum Name {
+            OFF = 0;
+            OFF_SCANNING = 1;
+            ON_NO_NETWORKS = 2;
+            ON_DISCONNECTED = 3;
+            ON_CONNECTED_STA = 4;
+            ON_CONNECTED_P2P = 5;
+            ON_CONNECTED_STA_P2P = 6;
+            SOFT_AP = 7;
+        };
+        optional Name name = 1;
+        optional TimerProto total = 2;
     };
-    optional Name name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated WifiState wifi_state = 25;
+    repeated WifiState wifi_state = 25;
 
-  message WifiSupplicantState {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message WifiSupplicantState {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    enum Name {
-      INVALID = 0;
-      DISCONNECTED = 1;
-      INTERFACE_DISABLED = 2;
-      INACTIVE = 3;
-      SCANNING = 4;
-      AUTHENTICATING = 5;
-      ASSOCIATING = 6;
-      ASSOCIATED = 7;
-      FOUR_WAY_HANDSHAKE = 8;
-      GROUP_HANDSHAKE = 9;
-      COMPLETED = 10;
-      DORMANT = 11;
-      UNINITIALIZED = 12;
+        enum Name {
+            INVALID = 0;
+            DISCONNECTED = 1;
+            INTERFACE_DISABLED = 2;
+            INACTIVE = 3;
+            SCANNING = 4;
+            AUTHENTICATING = 5;
+            ASSOCIATING = 6;
+            ASSOCIATED = 7;
+            FOUR_WAY_HANDSHAKE = 8;
+            GROUP_HANDSHAKE = 9;
+            COMPLETED = 10;
+            DORMANT = 11;
+            UNINITIALIZED = 12;
+        };
+        optional Name name = 1;
+        optional TimerProto total = 2;
     };
-    optional Name name = 1;
-    optional TimerProto total = 2;
-  };
-  repeated WifiSupplicantState wifi_supplicant_state = 26;
+    repeated WifiSupplicantState wifi_supplicant_state = 26;
 }
 
 message TimerProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // This may be an apportioned time.
-  optional int64 duration_ms = 1;
-  optional int64 count = 2;
-  // The max duration if it is being tracked. Not all Timer subclasses
-  // track the max duration.
-  optional int64 max_duration_ms = 3;
-  // The current time the timer has been active, if it is being tracked.
-  // Not all Timer subclasses track the current duration.
-  optional int64 current_duration_ms = 4;
-  // The total cumulative duration (i.e. sum of past durations) that this timer
-  // has been on since reset. This may differ from duration_ms since, depending
-  // on the Timer, getTotalTimeLocked may represent the total 'blamed' or
-  // 'pooled' time, rather than the actual time. By contrast, total_duration_ms
-  // always gives the actual total time. Not all Timer subclasses track the
-  // total duration.
-  optional int64 total_duration_ms = 5;
+    // This may be an apportioned time.
+    optional int64 duration_ms = 1;
+    optional int64 count = 2;
+    // The max duration if it is being tracked. Not all Timer subclasses
+    // track the max duration.
+    optional int64 max_duration_ms = 3;
+    // The current time the timer has been active, if it is being tracked.
+    // Not all Timer subclasses track the current duration.
+    optional int64 current_duration_ms = 4;
+    // The total cumulative duration (i.e. sum of past durations) that this timer
+    // has been on since reset. This may differ from duration_ms since, depending
+    // on the Timer, getTotalTimeLocked may represent the total 'blamed' or
+    // 'pooled' time, rather than the actual time. By contrast, total_duration_ms
+    // always gives the actual total time. Not all Timer subclasses track the
+    // total duration.
+    optional int64 total_duration_ms = 5;
 }
 
 message UidProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  // Combination of app ID and user ID.
-  optional int32 uid = 1;
-
-  // The statistics associated with a particular package.
-  message Package {
     option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string name = 1;
+    // Combination of app ID and user ID.
+    optional int32 uid = 1;
 
-    message Service {
-      option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    // The statistics associated with a particular package.
+    message Package {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional string name = 1;
-      // Time spent started.
-      optional int64 start_duration_ms = 2;
-      optional int32 start_count = 3;
-      optional int32 launch_count = 4;
+        optional string name = 1;
+
+        message Service {
+            option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional string name = 1;
+            // Time spent started.
+            optional int64 start_duration_ms = 2;
+            optional int32 start_count = 3;
+            optional int32 launch_count = 4;
+        }
+        repeated Service services = 2;
     }
-    repeated Service services = 2;
-  }
-  repeated Package packages = 2;
+    repeated Package packages = 2;
 
-  optional ControllerActivityProto bluetooth_controller = 3;
-  optional ControllerActivityProto modem_controller = 4;
-  optional ControllerActivityProto wifi_controller = 5;
+    optional ControllerActivityProto bluetooth_controller = 3;
+    optional ControllerActivityProto modem_controller = 4;
+    optional ControllerActivityProto wifi_controller = 5;
 
-  // Bluetooth misc data.
-  message BluetoothMisc {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    // Bluetooth misc data.
+    message BluetoothMisc {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Duration spent BLE scanning blamed on this App (i.e. apportioned to this
-    // app amongst all apps doing BLE scanning; see explanation of 'apportioned'
-    // in App's comment).
-    optional TimerProto apportioned_ble_scan = 1;
-    // Background times aren't apportioned.
-    optional TimerProto background_ble_scan = 2;
-    // Running unoptimized BLE scanning, as defined by Bluetooth's
-    // AppScanStats.recordScanStart. As of May 2017, these are unfiltered,
-    // non-opportunistic, non-first-match scans. Durations are not
-    // pooled/apportioned.
-    optional TimerProto unoptimized_ble_scan = 3;
-    // Running unoptimized BLE scanning when app is in background. Durations are
-    // not pooled/apportioned.
-    optional TimerProto background_unoptimized_ble_scan = 4;
-    // Count of results returned by BLE scanning.
-    optional int32 ble_scan_result_count = 5;
-    // Count of results returned by BLE scans when app is in background.
-    // (Included in ble_scan_result_count.)
-    optional int32 background_ble_scan_result_count = 6;
-  }
-  optional BluetoothMisc bluetooth_misc = 6;
-
-  message Cpu {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // Total CPU time with processes executing in userspace. Summed up across
-    // multiple cores.
-    optional int64 user_duration_ms = 1;
-    // Total CPU time with processes executing kernel syscalls. Summed up across
-    // multiple cores.
-    optional int64 system_duration_ms = 2;
-
-    // CPU time broken down by CPU frequency (go/cpu-battery-metrics).
-    //
-    // These are real CPU time measurement from the kernel, so their sum can
-    // be different from the sum of user_duration_millis and
-    // system_duration_millis, which are just approximations. Data is not
-    // tracked when device is charging.
-    message ByFrequency {
-      option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      // Index of the frequency in system.cpu_frequency. It starts from 1, to
-      // make it easier to analyze.
-      optional int32 frequency_index = 1;
-      // CPU time in milliseconds.
-      optional int64 total_duration_ms = 2;
-      // Screen-off CPU time in milliseconds.
-      optional int64 screen_off_duration_ms = 3;
+        // Duration spent BLE scanning blamed on this App (i.e. apportioned to this
+        // app amongst all apps doing BLE scanning; see explanation of 'apportioned'
+        // in App's comment).
+        optional TimerProto apportioned_ble_scan = 1;
+        // Background times aren't apportioned.
+        optional TimerProto background_ble_scan = 2;
+        // Running unoptimized BLE scanning, as defined by Bluetooth's
+        // AppScanStats.recordScanStart. As of May 2017, these are unfiltered,
+        // non-opportunistic, non-first-match scans. Durations are not
+        // pooled/apportioned.
+        optional TimerProto unoptimized_ble_scan = 3;
+        // Running unoptimized BLE scanning when app is in background. Durations are
+        // not pooled/apportioned.
+        optional TimerProto background_unoptimized_ble_scan = 4;
+        // Count of results returned by BLE scanning.
+        optional int32 ble_scan_result_count = 5;
+        // Count of results returned by BLE scans when app is in background.
+        // (Included in ble_scan_result_count.)
+        optional int32 background_ble_scan_result_count = 6;
     }
-    // CPU times accumulated across all process states.
-    repeated ByFrequency by_frequency = 3;
+    optional BluetoothMisc bluetooth_misc = 6;
 
-    enum ProcessState {
-      TOP = 0;
-      FOREGROUND_SERVICE = 1;
-      FOREGROUND = 2;
-      BACKGROUND = 3;
-      TOP_SLEEPING = 4;
-      HEAVY_WEIGHT = 5;
-      CACHED = 6;
+    message Cpu {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // Total CPU time with processes executing in userspace. Summed up across
+        // multiple cores.
+        optional int64 user_duration_ms = 1;
+        // Total CPU time with processes executing kernel syscalls. Summed up across
+        // multiple cores.
+        optional int64 system_duration_ms = 2;
+
+        // CPU time broken down by CPU frequency (go/cpu-battery-metrics).
+        //
+        // These are real CPU time measurement from the kernel, so their sum can
+        // be different from the sum of user_duration_millis and
+        // system_duration_millis, which are just approximations. Data is not
+        // tracked when device is charging.
+        message ByFrequency {
+            option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            // Index of the frequency in system.cpu_frequency. It starts from 1, to
+            // make it easier to analyze.
+            optional int32 frequency_index = 1;
+            // CPU time in milliseconds.
+            optional int64 total_duration_ms = 2;
+            // Screen-off CPU time in milliseconds.
+            optional int64 screen_off_duration_ms = 3;
+        }
+        // CPU times accumulated across all process states.
+        repeated ByFrequency by_frequency = 3;
+
+        enum ProcessState {
+            TOP = 0;
+            FOREGROUND_SERVICE = 1;
+            FOREGROUND = 2;
+            BACKGROUND = 3;
+            TOP_SLEEPING = 4;
+            HEAVY_WEIGHT = 5;
+            CACHED = 6;
+        }
+        // CPU times at different process states.
+        message ByProcessState {
+            option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional ProcessState process_state = 1;
+            repeated ByFrequency by_frequency = 2;
+        }
+        repeated ByProcessState by_process_state = 4;
     }
-    // CPU times at different process states.
-    message ByProcessState {
-      option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    optional Cpu cpu = 7;
 
-      optional ProcessState process_state = 1;
-      repeated ByFrequency by_frequency = 2;
+    // Duration is pooled/apportioned.
+    optional TimerProto audio = 8;
+    // Duration is pooled/apportioned.
+    optional TimerProto camera = 9;
+    // Duration is pooled/apportioned.
+    optional TimerProto flashlight = 10;
+    // Duration is not pooled/apportioned.
+    optional TimerProto foreground_activity = 11;
+    // Duration is not pooled/apportioned.
+    optional TimerProto foreground_service = 12;
+    // Duration is not pooled/apportioned.
+    optional TimerProto vibrator = 13;
+    // Duration is pooled/apportioned.
+    optional TimerProto video = 14;
+
+    message Job {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string name = 1;
+        // Job times aren't apportioned.
+        optional TimerProto total = 2;
+        optional TimerProto background = 3;
     }
-    repeated ByProcessState by_process_state = 4;
-  }
-  optional Cpu cpu = 7;
+    repeated Job jobs = 15;
 
-  // Duration is pooled/apportioned.
-  optional TimerProto audio = 8;
-  // Duration is pooled/apportioned.
-  optional TimerProto camera = 9;
-  // Duration is pooled/apportioned.
-  optional TimerProto flashlight = 10;
-  // Duration is not pooled/apportioned.
-  optional TimerProto foreground_activity = 11;
-  // Duration is not pooled/apportioned.
-  optional TimerProto foreground_service = 12;
-  // Duration is not pooled/apportioned.
-  optional TimerProto vibrator = 13;
-  // Duration is pooled/apportioned.
-  optional TimerProto video = 14;
+    message JobCompletion {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message Job {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        // Job name.
+        optional string name = 1;
 
-    optional string name = 1;
-    // Job times aren't apportioned.
-    optional TimerProto total = 2;
-    optional TimerProto background = 3;
-  }
-  repeated Job jobs = 15;
+        message ReasonCount {
+            option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message JobCompletion {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+            optional android.app.job.StopReasonEnum name = 1;
+            optional int32 count = 2;
+        }
+        repeated ReasonCount reason_count = 2;
+    };
+    repeated JobCompletion job_completion = 16;
 
-    // Job name.
-    optional string name = 1;
+    message Network {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    message ReasonCount {
-      option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        // Mobile data traffic (total, background + foreground).
+        optional int64 mobile_bytes_rx = 1;
+        optional int64 mobile_bytes_tx = 2;
+        // Wifi data traffic (total, background + foreground).
+        optional int64 wifi_bytes_rx = 3;
+        optional int64 wifi_bytes_tx = 4;
+        // Bluetooth data traffic (total, background + foreground).
+        optional int64 bt_bytes_rx = 5;
+        optional int64 bt_bytes_tx = 6;
+        // In packets (total, background + foreground).
+        optional int64 mobile_packets_rx = 7;
+        optional int64 mobile_packets_tx = 8;
+        optional int64 wifi_packets_rx = 9;
+        optional int64 wifi_packets_tx = 10;
+        // Radio active duration.
+        optional int64 mobile_active_duration_ms = 11;
+        optional int32 mobile_active_count = 12;
+        // Number of times the app woke up the mobile radio.
+        optional int32 mobile_wakeup_count = 13;
+        // Number of times the app woke up the wifi radio.
+        optional int32 wifi_wakeup_count = 14;
+        // Mobile data traffic in the background only, included in total above.
+        optional int64 mobile_bytes_bg_rx = 15;
+        optional int64 mobile_bytes_bg_tx = 16;
+        // Wifi data traffic in the background only, included in total above.
+        optional int64 wifi_bytes_bg_rx = 17;
+        optional int64 wifi_bytes_bg_tx = 18;
+        // In packets (background only, included in total packets above).
+        optional int64 mobile_packets_bg_rx = 19;
+        optional int64 mobile_packets_bg_tx = 20;
+        optional int64 wifi_packets_bg_rx = 21;
+        optional int64 wifi_packets_bg_tx = 22;
+    };
+    optional Network network = 17;
 
-      optional android.app.job.StopReasonEnum name = 1;
-      optional int32 count = 2;
+    // TODO: combine System and App messages?
+    message PowerUseItem {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // Estimated power use in mAh.
+        optional double computed_power_mah = 1;
+        // Starting in Oreo, Battery Settings has two modes to display the battery
+        // info. The first is "app usage list". In this mode, items with should_hide
+        // enabled are hidden.
+        optional bool should_hide = 2;
+        // Smeared power from screen usage. Screen usage power is split and smeared
+        // among apps, based on activity time.
+        optional double screen_power_mah = 3;
+        // Smeared power using proportional method. Power usage from hidden sippers
+        // is smeared to all apps proportionally (except for screen usage).
+        optional double proportional_smear_mah = 4;
+    };
+    optional PowerUseItem power_use_item = 18;
+
+    // Durations are not pooled/apportioned.
+    message Process {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string name = 1;
+        // Time spent executing in user code.
+        optional int64 user_duration_ms = 2;
+        // Time spent executing in kernel code.
+        optional int64 system_duration_ms = 3;
+        // Time the process was running in the foreground.
+        optional int64 foreground_duration_ms = 4;
+        // Number of times the process has been started.
+        optional int32 start_count = 5;
+        // Number of times the process has had an ANR.
+        optional int32 anr_count = 6;
+        // Number of times the process has crashed.
+        optional int32 crash_count = 7;
+    };
+    repeated Process process = 19;
+
+    message StateTime {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        // All of these (non-deprecated) states are mutually exclusive and can be
+        // added together to find the total time a uid has had any processes running
+        // at all.
+
+        // In approximate order or priority (top being what the framework considers
+        // most important and is thus least likely to kill when resources are
+        // needed:
+        // top > foreground service > foreground > background > top sleeping > heavy weight > cache
+        enum State {
+            // Time this uid has any processes in the top state.
+            PROCESS_STATE_TOP = 0;
+            // Time this uid has any process with a started foreground service, but
+            // none in the "top" state.
+            PROCESS_STATE_FOREGROUND_SERVICE = 1;
+            // Time this uid has any process in an active foreground state, but none in the
+            // "foreground service" or better state. Persistent and other foreground states go here.
+            PROCESS_STATE_FOREGROUND = 2;
+            // Time this uid has any process in an active background state, but none
+            // in the "foreground" or better state.
+            PROCESS_STATE_BACKGROUND = 3;
+            // Time this uid has any process that is top while the device is sleeping,
+            // but not active for any other reason. We consider is a kind of cached
+            // process for execution restrictions. Sleeping is mostly screen off, but
+            // also includes the time when the screen is on but the device has not yet
+            // been unlocked.
+            PROCESS_STATE_TOP_SLEEPING = 4;
+            // Time this uid has any process that is in the background but it has an
+            // activity marked as "can't save state". This is essentially a cached
+            // process, though the system will try much harder than normal to avoid
+            // killing it.
+            PROCESS_STATE_HEAVY_WEIGHT = 5;
+            // Time this uid has any processes that are sitting around cached, not in
+            // one of the other active states.
+            PROCESS_STATE_CACHED = 6;
+        }
+        optional State state = 1;
+        optional int64 duration_ms = 2;
     }
-    repeated ReasonCount reason_count = 2;
-  };
-  repeated JobCompletion job_completion = 16;
+    repeated StateTime states = 20;
 
-  message Network {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message Sensor {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Mobile data traffic (total, background + foreground).
-    optional int64 mobile_bytes_rx = 1;
-    optional int64 mobile_bytes_tx = 2;
-    // Wifi data traffic (total, background + foreground).
-    optional int64 wifi_bytes_rx = 3;
-    optional int64 wifi_bytes_tx = 4;
-    // Bluetooth data traffic (total, background + foreground).
-    optional int64 bt_bytes_rx = 5;
-    optional int64 bt_bytes_tx = 6;
-    // In packets (total, background + foreground).
-    optional int64 mobile_packets_rx = 7;
-    optional int64 mobile_packets_tx = 8;
-    optional int64 wifi_packets_rx = 9;
-    optional int64 wifi_packets_tx = 10;
-    // Radio active duration.
-    optional int64 mobile_active_duration_ms = 11;
-    optional int32 mobile_active_count = 12;
-    // Number of times the app woke up the mobile radio.
-    optional int32 mobile_wakeup_count = 13;
-    // Number of times the app woke up the wifi radio.
-    optional int32 wifi_wakeup_count = 14;
-    // Mobile data traffic in the background only, included in total above.
-    optional int64 mobile_bytes_bg_rx = 15;
-    optional int64 mobile_bytes_bg_tx = 16;
-    // Wifi data traffic in the background only, included in total above.
-    optional int64 wifi_bytes_bg_rx = 17;
-    optional int64 wifi_bytes_bg_tx = 18;
-    // In packets (background only, included in total packets above).
-    optional int64 mobile_packets_bg_rx = 19;
-    optional int64 mobile_packets_bg_tx = 20;
-    optional int64 wifi_packets_bg_rx = 21;
-    optional int64 wifi_packets_bg_tx = 22;
-  };
-  optional Network network = 17;
-
-  // TODO: combine System and App messages?
-  message PowerUseItem {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // Estimated power use in mAh.
-    optional double computed_power_mah = 1;
-    // Starting in Oreo, Battery Settings has two modes to display the battery
-    // info. The first is "app usage list". In this mode, items with should_hide
-    // enabled are hidden.
-    optional bool should_hide = 2;
-    // Smeared power from screen usage. Screen usage power is split and smeared
-    // among apps, based on activity time.
-    optional double screen_power_mah = 3;
-    // Smeared power using proportional method. Power usage from hidden sippers
-    // is smeared to all apps proportionally (except for screen usage).
-    optional double proportional_smear_mah = 4;
-  };
-  optional PowerUseItem power_use_item = 18;
-
-  // Durations are not pooled/apportioned.
-  message Process {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional string name = 1;
-    // Time spent executing in user code.
-    optional int64 user_duration_ms = 2;
-    // Time spent executing in kernel code.
-    optional int64 system_duration_ms = 3;
-    // Time the process was running in the foreground.
-    optional int64 foreground_duration_ms = 4;
-    // Number of times the process has been started.
-    optional int32 start_count = 5;
-    // Number of times the process has had an ANR.
-    optional int32 anr_count = 6;
-    // Number of times the process has crashed.
-    optional int32 crash_count = 7;
-  };
-  repeated Process process = 19;
-
-  message StateTime {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // All of these (non-deprecated) states are mutually exclusive and can be
-    // added together to find the total time a uid has had any processes running
-    // at all.
-
-    // In approximate order or priority (top being what the framework considers
-    // most important and is thus least likely to kill when resources are
-    // needed:
-    // top > foreground service > foreground > background > top sleeping > heavy weight > cache
-    enum State {
-      // Time this uid has any processes in the top state.
-      PROCESS_STATE_TOP = 0;
-      // Time this uid has any process with a started foreground service, but
-      // none in the "top" state.
-      PROCESS_STATE_FOREGROUND_SERVICE = 1;
-      // Time this uid has any process in an active foreground state, but none in the
-      // "foreground service" or better state. Persistent and other foreground states go here.
-      PROCESS_STATE_FOREGROUND = 2;
-      // Time this uid has any process in an active background state, but none
-      // in the "foreground" or better state.
-      PROCESS_STATE_BACKGROUND = 3;
-      // Time this uid has any process that is top while the device is sleeping,
-      // but not active for any other reason. We consider is a kind of cached
-      // process for execution restrictions. Sleeping is mostly screen off, but
-      // also includes the time when the screen is on but the device has not yet
-      // been unlocked.
-      PROCESS_STATE_TOP_SLEEPING = 4;
-      // Time this uid has any process that is in the background but it has an
-      // activity marked as "can't save state".  This is essentially a cached
-      // process, though the system will try much harder than normal to avoid
-      // killing it.
-      PROCESS_STATE_HEAVY_WEIGHT = 5;
-      // Time this uid has any processes that are sitting around cached, not in
-      // one of the other active states.
-      PROCESS_STATE_CACHED = 6;
+        optional int32 id = 1;
+        optional TimerProto apportioned = 2;
+        // Background times aren't apportioned.
+        optional TimerProto background = 3;
     }
-    optional State state = 1;
-    optional int64 duration_ms = 2;
-  }
-  repeated StateTime states = 20;
+    repeated Sensor sensors = 21;
 
-  message Sensor {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message Sync {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 id = 1;
-    optional TimerProto apportioned = 2;
-    // Background times aren't apportioned.
-    optional TimerProto background = 3;
-  }
-  repeated Sensor sensors = 21;
+        optional string name = 1;
+        // Sync times aren't apportioned.
+        optional TimerProto total = 2;
+        optional TimerProto background = 3;
+    }
+    repeated Sync syncs = 22;
 
-  message Sync {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message UserActivity {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string name = 1;
-    // Sync times aren't apportioned.
-    optional TimerProto total = 2;
-    optional TimerProto background = 3;
-  }
-  repeated Sync syncs = 22;
+        optional android.os.PowerManagerProto.UserActivityEvent name = 1;
+        optional int32 count = 2;
+    };
+    repeated UserActivity user_activity = 23;
 
-  message UserActivity {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    // Aggregated wakelock data for an app overall, across all of its wakelocks.
+    // The Wakelock message holds data about each *individual* wakelock, but it
+    // cannot be used to ascertain the aggregated time the app spent holding
+    // wakelocks, since merely summing Wakelock data will either underestimate (in
+    // the case of wakelock.partial.duration_ms) or overestimate (in the case of
+    // wakelock.partial.total_duration_ms) the total time, due to overlapping
+    // wakelocks. AggregatedWakelock, on the other hand, holds overall per-app
+    // wakelock data.
+    message AggregatedWakelock {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional android.os.PowerManagerProto.UserActivityEvent name = 1;
-    optional int32 count = 2;
-  };
-  repeated UserActivity user_activity = 23;
+        // The total duration that the app spent holding partial wakelocks.
+        // It includes both foreground + background use.
+        optional int64 partial_duration_ms = 1;
+        // The total duration that the app spent holding partial wakelocks while the
+        // app was in the background. Subtracting from partial_duration_ms will
+        // yield foreground usage.
+        optional int64 background_partial_duration_ms = 2;
+    };
+    optional AggregatedWakelock aggregated_wakelock = 24;
 
-  // Aggregated wakelock data for an app overall, across all of its wakelocks.
-  // The Wakelock message holds data about each *individual* wakelock, but it
-  // cannot be used to ascertain the aggregated time the app spent holding
-  // wakelocks, since merely summing Wakelock data will either underestimate (in
-  // the case of wakelock.partial.duration_ms) or overestimate (in the case of
-  // wakelock.partial.total_duration_ms) the total time, due to overlapping
-  // wakelocks. AggregatedWakelock, on the other hand, holds overall per-app
-  // wakelock data.
-  message AggregatedWakelock {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message Wakelock {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // The total duration that the app spent holding partial wakelocks.
-    // It includes both foreground + background use.
-    optional int64 partial_duration_ms = 1;
-    // The total duration that the app spent holding partial wakelocks while the
-    // app was in the background. Subtracting from partial_duration_ms will
-    // yield foreground usage.
-    optional int64 background_partial_duration_ms = 2;
-  };
-  optional AggregatedWakelock aggregated_wakelock = 24;
+        optional string name = 1;
 
-  message Wakelock {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+        // Full wakelocks keep the screen on. Based on
+        // PowerManager.SCREEN_BRIGHT_WAKE_LOCK (deprecated in API 13) and
+        // PowerManager.SCREEN_DIM_WAKE_LOCK (deprecated in API 17). Current, max,
+        // and total durations are not tracked for full wakelocks.
+        optional TimerProto full = 2;
 
-    optional string name = 1;
+        // Partial wakelocks ensure the CPU is running while allowing the screen
+        // to turn off. Based on PowerManager.PARTIAL_WAKE_LOCK.
+        // Partial wakelock metrics are only recorded when the device is unplugged
+        // *and* the screen is off. Current, max, and total durations are tracked
+        // for partial wakelocks.
+        optional TimerProto partial = 3;
 
-    // Full wakelocks keep the screen on. Based on
-    // PowerManager.SCREEN_BRIGHT_WAKE_LOCK (deprecated in API 13) and
-    // PowerManager.SCREEN_DIM_WAKE_LOCK (deprecated in API 17). Current, max,
-    // and total durations are not tracked for full wakelocks.
-    optional TimerProto full = 2;
+        // These fields are for tracking partial wakelocks (see above), but only
+        // the time the wakelock was held while the app was in a background state.
+        // Since all background tracking is 'actual', not 'apportioned',
+        // background_partial.duration_ms is identical to
+        // background_partial.total_duration_ms.
+        optional TimerProto background_partial = 4;
 
-    // Partial wakelocks ensure the CPU is running while allowing the screen
-    // to turn off. Based on PowerManager.PARTIAL_WAKE_LOCK.
-    // Partial wakelock metrics are only recorded when the device is unplugged
-    // *and* the screen is off. Current, max, and total durations are tracked
-    // for partial wakelocks.
-    optional TimerProto partial = 3;
+        // Window wakelocks keep the screen on. Current, max, and total durations
+        // are not tracked for window wakelocks.
+        optional TimerProto window = 5;
+    };
+    repeated Wakelock wakelocks = 25;
 
-    // These fields are for tracking partial wakelocks (see above), but only
-    // the time the wakelock was held while the app was in a background state.
-    // Since all background tracking is 'actual', not 'apportioned',
-    // background_partial.duration_ms is identical to
-    // background_partial.total_duration_ms.
-    optional TimerProto background_partial = 4;
+    message WakeupAlarm {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Window wakelocks keep the screen on. Current, max, and total durations
-    // are not tracked for window wakelocks.
-    optional TimerProto window = 5;
-  };
-  repeated Wakelock wakelocks = 25;
+        // Wakeup alarm name.
+        optional string name = 1;
+        // Only includes counts when screen-off (& on battery).
+        optional int32 count = 2;
+    }
+    repeated WakeupAlarm wakeup_alarm = 26;
 
-  message WakeupAlarm {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    message Wifi {
+        option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    // Wakeup alarm name.
-    optional string name = 1;
-    // Only includes counts when screen-off (& on battery).
-    optional int32 count = 2;
-  }
-  repeated WakeupAlarm wakeup_alarm = 26;
+        // Duration holding Wifi-lock. This time is apportioned.
+        optional int64 full_wifi_lock_duration_ms = 1;
+        // Duration running Wifi. This time is apportioned.
+        optional int64 running_duration_ms = 2;
+        // Duration performing Wifi-scan blamed on this App (i.e. apportioned to
+        // this app amongst all apps doing Wifi-scanning; see explanation of
+        // 'apportioned' in App's comment).
+        optional TimerProto apportioned_scan = 3;
+        // Scans performed when app is in background. (Included in
+        // apportioned_scan). This value is not apportioned. Subtracting
+        // background_scan.total_duration_ms from apportioned_scan.total_duration_ms
+        // will yield foreground usage.
+        optional TimerProto background_scan = 4;
+    };
+    optional Wifi wifi = 27;
 
-  message Wifi {
-    option (android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    // Duration holding Wifi-lock. This time is apportioned.
-    optional int64 full_wifi_lock_duration_ms = 1;
-    // Duration running Wifi. This time is apportioned.
-    optional int64 running_duration_ms = 2;
-    // Duration performing Wifi-scan blamed on this App (i.e. apportioned to
-    // this app amongst all apps doing Wifi-scanning; see explanation of
-    // 'apportioned' in App's comment).
-    optional TimerProto apportioned_scan = 3;
-    // Scans performed when app is in background. (Included in
-    // apportioned_scan). This value is not apportioned. Subtracting
-    // background_scan.total_duration_ms from apportioned_scan.total_duration_ms
-    // will yield foreground usage.
-    optional TimerProto background_scan = 4;
-  };
-  optional Wifi wifi = 27;
-
-  // WiFi Multicast Wakelock
-  // This timer tracks the duration and count for the app to request the
-  // wakelock for wifi multicast traffic.
-  // This wakelock disables the filtering of multicast packets to reach the host
-  // processor, and results in a power penalty.
-  // It is useful to monitor the applications resulting in that
-  optional TimerProto wifi_multicast_wakelock = 28;
+    // WiFi Multicast Wakelock
+    // This timer tracks the duration and count for the app to request the
+    // wakelock for wifi multicast traffic.
+    // This wakelock disables the filtering of multicast packets to reach the host
+    // processor, and results in a power penalty.
+    // It is useful to monitor the applications resulting in that
+    optional TimerProto wifi_multicast_wakelock = 28;
 }
diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto
index ab15d4f..503bd21 100644
--- a/core/proto/android/os/incident.proto
+++ b/core/proto/android/os/incident.proto
@@ -228,7 +228,7 @@
     ];
 
     optional android.service.print.PrintServiceDumpProto print = 3010 [
-        (section).type = SECTION_NONE, // Turn off until we get approval for it.
+        (section).type = SECTION_DUMPSYS,
         (section).args = "print --proto"
     ];
 
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 0c617ff..418e15b 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -38,995 +38,995 @@
 option java_multiple_files = true;
 
 message ActivityManagerServiceProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ActivityManagerServiceDumpActivitiesProto activities = 1;
+    optional ActivityManagerServiceDumpActivitiesProto activities = 1;
 
-  optional ActivityManagerServiceDumpBroadcastsProto broadcasts = 2;
+    optional ActivityManagerServiceDumpBroadcastsProto broadcasts = 2;
 
-  optional ActivityManagerServiceDumpServicesProto services = 3;
+    optional ActivityManagerServiceDumpServicesProto services = 3;
 
-  optional ActivityManagerServiceDumpProcessesProto processes = 4;
+    optional ActivityManagerServiceDumpProcessesProto processes = 4;
 }
 
 // "dumpsys activity --proto activities"
 message ActivityManagerServiceDumpActivitiesProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ActivityStackSupervisorProto activity_stack_supervisor = 1;
+    optional ActivityStackSupervisorProto activity_stack_supervisor = 1;
 }
 
 message ActivityStackSupervisorProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
-  repeated ActivityDisplayProto displays = 2;
-  optional KeyguardControllerProto keyguard_controller = 3;
-  optional int32 focused_stack_id = 4;
-  optional .com.android.server.wm.IdentifierProto resumed_activity = 5;
-  // Whether or not the home activity is the recents activity. This is needed for the CTS tests to
-  // know what activity types to check for when invoking splitscreen multi-window.
-  optional bool is_home_recents_component = 6;
+    optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+    repeated ActivityDisplayProto displays = 2;
+    optional KeyguardControllerProto keyguard_controller = 3;
+    optional int32 focused_stack_id = 4;
+    optional .com.android.server.wm.IdentifierProto resumed_activity = 5;
+    // Whether or not the home activity is the recents activity. This is needed for the CTS tests to
+    // know what activity types to check for when invoking splitscreen multi-window.
+    optional bool is_home_recents_component = 6;
 }
 
 /* represents ActivityStackSupervisor.ActivityDisplay */
 message ActivityDisplayProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
-  optional int32 id = 2;
-  repeated ActivityStackProto stacks = 3;
+    optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+    optional int32 id = 2;
+    repeated ActivityStackProto stacks = 3;
 }
 
 message ActivityStackProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
-  optional int32 id = 2;
-  repeated TaskRecordProto tasks = 3;
-  optional .com.android.server.wm.IdentifierProto resumed_activity = 4;
-  optional int32 display_id = 5;
-  optional bool fullscreen = 6;
-  optional .android.graphics.RectProto bounds = 7;
+    optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+    optional int32 id = 2;
+    repeated TaskRecordProto tasks = 3;
+    optional .com.android.server.wm.IdentifierProto resumed_activity = 4;
+    optional int32 display_id = 5;
+    optional bool fullscreen = 6;
+    optional .android.graphics.RectProto bounds = 7;
 }
 
 message TaskRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
-  optional int32 id = 2;
-  repeated ActivityRecordProto activities = 3;
-  optional int32 stack_id = 4;
-  optional .android.graphics.RectProto last_non_fullscreen_bounds = 5;
-  optional string real_activity = 6;
-  optional string orig_activity = 7;
-  optional int32 activity_type = 8;
-  optional int32 resize_mode = 9;
-  optional bool fullscreen = 10;
-  optional .android.graphics.RectProto bounds = 11;
-  optional int32 min_width = 12;
-  optional int32 min_height = 13;
+    optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+    optional int32 id = 2;
+    repeated ActivityRecordProto activities = 3;
+    optional int32 stack_id = 4;
+    optional .android.graphics.RectProto last_non_fullscreen_bounds = 5;
+    optional string real_activity = 6;
+    optional string orig_activity = 7;
+    optional int32 activity_type = 8;
+    optional int32 resize_mode = 9;
+    optional bool fullscreen = 10;
+    optional .android.graphics.RectProto bounds = 11;
+    optional int32 min_width = 12;
+    optional int32 min_height = 13;
 }
 
 message ActivityRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
-  optional .com.android.server.wm.IdentifierProto identifier = 2;
-  optional string state = 3;
-  optional bool visible = 4;
-  optional bool front_of_task = 5;
-  optional int32 proc_id = 6;
+    optional .com.android.server.wm.ConfigurationContainerProto configuration_container = 1;
+    optional .com.android.server.wm.IdentifierProto identifier = 2;
+    optional string state = 3;
+    optional bool visible = 4;
+    optional bool front_of_task = 5;
+    optional int32 proc_id = 6;
 }
 
 message KeyguardControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool keyguard_showing = 1;
-  optional bool keyguard_occluded = 2;
+    optional bool keyguard_showing = 1;
+    optional bool keyguard_occluded = 2;
 }
 
 // "dumpsys activity --proto broadcasts"
 message ActivityManagerServiceDumpBroadcastsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  repeated ReceiverListProto  receiver_list = 1;
-
-  optional .com.android.server.IntentResolverProto receiver_resolver = 2;
-
-  repeated BroadcastQueueProto broadcast_queue = 3;
-
-  repeated StickyBroadcastProto sticky_broadcasts = 4;
-
-  message MainHandler {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string handler = 1;
-    optional .android.os.LooperProto looper = 2;
-  }
-  optional MainHandler handler = 5;
+    repeated ReceiverListProto receiver_list = 1;
+
+    optional .com.android.server.IntentResolverProto receiver_resolver = 2;
+
+    repeated BroadcastQueueProto broadcast_queue = 3;
+
+    repeated StickyBroadcastProto sticky_broadcasts = 4;
+
+    message MainHandler {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string handler = 1;
+        optional .android.os.LooperProto looper = 2;
+    }
+    optional MainHandler handler = 5;
 }
 
 message ReceiverListProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ProcessRecordProto app = 1;
-  optional int32 pid = 2;
-  optional int32 uid = 3;
-  optional int32 user = 4;
-  optional BroadcastRecordProto current = 5;
-  optional bool linked_to_death = 6;
-  repeated BroadcastFilterProto filters = 7;
-  optional string hex_hash = 8; // used to find this ReceiverList object in IntentResolver
+    optional ProcessRecordProto app = 1;
+    optional int32 pid = 2;
+    optional int32 uid = 3;
+    optional int32 user = 4;
+    optional BroadcastRecordProto current = 5;
+    optional bool linked_to_death = 6;
+    repeated BroadcastFilterProto filters = 7;
+    optional string hex_hash = 8; // used to find this ReceiverList object in IntentResolver
 }
 
 message ProcessRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int32 pid = 1;
-  optional string process_name = 2;
-  optional int32 uid = 3;
-  optional int32 user_id = 4;
-  optional int32 app_id = 5;
-  optional int32 isolated_app_id = 6;
-  optional bool persistent = 7;
-}
-
-message BroadcastRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int32 user_id = 1;
-  optional string intent_action = 2;
-}
-
-message BroadcastFilterProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional .android.content.IntentFilterProto intent_filter = 1;
-  optional string required_permission = 2;
-  optional string hex_hash = 3; // used to find the BroadcastFilter object in IntentResolver
-  optional int32 owning_user_id = 4;
-}
-
-message BroadcastQueueProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional string queue_name = 1;
-  repeated BroadcastRecordProto parallel_broadcasts = 2;
-  repeated BroadcastRecordProto ordered_broadcasts = 3;
-  optional BroadcastRecordProto pending_broadcast = 4;
-  repeated BroadcastRecordProto historical_broadcasts = 5;
-
-  message BroadcastSummary {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional .android.content.IntentProto intent = 1;
-    optional int64 enqueue_clock_time_ms = 2;
-    optional int64 dispatch_clock_time_ms = 3;
-    optional int64 finish_clock_time_ms = 4;
-  }
-  repeated BroadcastSummary historical_broadcasts_summary = 6;
-}
-
-message MemInfoDumpProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int64 uptime_duration_ms = 1;
-  optional int64 elapsed_realtime_ms = 2;
-
-  message ProcessMemory {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
     optional int32 pid = 1;
     optional string process_name = 2;
+    optional int32 uid = 3;
+    optional int32 user_id = 4;
+    optional int32 app_id = 5;
+    optional int32 isolated_app_id = 6;
+    optional bool persistent = 7;
+}
 
-    message MemoryInfo {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional string name = 1;
-      // The proportional set size for the heap.
-      optional int32 total_pss_kb = 2;
-      // The proportional set size that is swappable for the heap.
-      optional int32 clean_pss_kb = 3;
-      // The private dirty pages used by the heap.
-      optional int32 shared_dirty_kb = 4;
-      // The shared dirty pages used by the heap.
-      optional int32 private_dirty_kb = 5;
-      // The shared clean pages used by the heap.
-      optional int32 shared_clean_kb = 6;
-      // The private clean pages used by the heap.
-      optional int32 private_clean_kb = 7;
-      oneof dirty_swap {
-        // The dirty the pages that have been swapped out.
-        int32 dirty_swap_kb = 8;
-        // The dirty the pages that have been swapped out, proportional.
-        int32 dirty_swap_pss_kb = 9;
-      }
-    }
-    message HeapInfo {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional MemoryInfo mem_info = 1;
-      optional int32 heap_size_kb = 2;
-      optional int32 heap_alloc_kb = 3;
-      optional int32 heap_free_kb = 4;
-    }
-    optional HeapInfo native_heap = 3;
-    optional HeapInfo dalvik_heap = 4;
-    repeated MemoryInfo other_heaps = 5;
-    optional MemoryInfo unknown_heap = 6;
-    // Summation of native_heap, dalvik_heap, and other_heaps.
-    optional HeapInfo total_heap = 7;
-
-    repeated MemoryInfo dalvik_details = 8;
-
-    message AppSummary {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional int32 java_heap_pss_kb = 1;
-      optional int32 native_heap_pss_kb = 2;
-      optional int32 code_pss_kb = 3;
-      optional int32 stack_pss_kb = 4;
-      optional int32 graphics_pss_kb = 5;
-      optional int32 private_other_pss_kb = 6;
-      optional int32 system_pss_kb = 7;
-
-      oneof total_swap {
-        int32 total_swap_pss = 8;
-        int32 total_swap_kb = 9;
-      }
-    }
-    optional AppSummary app_summary = 9;
-  }
-  repeated ProcessMemory native_processes = 3;
-
-  message AppData {
+message BroadcastRecordProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional ProcessMemory process_memory = 1;
+    optional int32 user_id = 1;
+    optional string intent_action = 2;
+}
 
-    message ObjectStats {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+message BroadcastFilterProto {
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional int32 view_instance_count = 1;
-      optional int32 view_root_instance_count = 2;
-      optional int32 app_context_instance_count = 3;
-      optional int32 activity_instance_count = 4;
-      optional int32 global_asset_count = 5;
-      optional int32 global_asset_manager_count = 6;
-      optional int32 local_binder_object_count = 7;
-      optional int32 proxy_binder_object_count = 8;
-      optional int64 parcel_memory_kb = 9;
-      optional int32 parcel_count = 10;
-      optional int32 binder_object_death_count = 11;
-      optional int32 open_ssl_socket_count = 12;
-      optional int32 webview_instance_count = 13;
-    }
-    optional ObjectStats objects = 2;
+    optional .android.content.IntentFilterProto intent_filter = 1;
+    optional string required_permission = 2;
+    optional string hex_hash = 3; // used to find the BroadcastFilter object in IntentResolver
+    optional int32 owning_user_id = 4;
+}
 
-    message SqlStats {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+message BroadcastQueueProto {
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional int32 memory_used_kb = 1;
-      optional int32 pagecache_overflow_kb = 2;
-      optional int32 malloc_size_kb = 3;
+    optional string queue_name = 1;
+    repeated BroadcastRecordProto parallel_broadcasts = 2;
+    repeated BroadcastRecordProto ordered_broadcasts = 3;
+    optional BroadcastRecordProto pending_broadcast = 4;
+    repeated BroadcastRecordProto historical_broadcasts = 5;
 
-      message Database {
+    message BroadcastSummary {
         option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-        optional string name = 1;
-        optional int32 page_size = 2;
-        optional int32 db_size = 3;
-        // Number of lookaside slots:
-        // http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html
-        optional int32 lookaside_b = 4;
-        // Statement cache stats: hits/misses/cachesize
-        optional string cache = 5;
-      }
-      repeated Database databases = 4;
+        optional .android.content.IntentProto intent = 1;
+        optional int64 enqueue_clock_time_ms = 2;
+        optional int64 dispatch_clock_time_ms = 3;
+        optional int64 finish_clock_time_ms = 4;
     }
-    optional SqlStats sql = 3;
+    repeated BroadcastSummary historical_broadcasts_summary = 6;
+}
 
-    optional string asset_allocations = 4;
-    optional string unreachable_memory = 5;
-  }
-  repeated AppData app_processes = 4;
-
-  message MemItem {
+message MemInfoDumpProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string tag = 1;
-    optional string label = 2;
-    optional int32 id = 3;
-    optional bool is_proc = 4;
-    optional bool has_activities = 5;
-    optional int64 pss_kb = 6;
-    optional int64 swap_pss_kb = 7;
-    repeated MemItem sub_items = 8;
-  }
-  repeated MemItem total_pss_by_process = 5;
-  repeated MemItem total_pss_by_oom_adjustment = 6;
-  repeated MemItem total_pss_by_category = 7;
+    optional int64 uptime_duration_ms = 1;
+    optional int64 elapsed_realtime_ms = 2;
 
-  optional int64 total_ram_kb = 8;
-  optional .com.android.internal.app.procstats.ProcessStatsProto.MemoryFactor status = 9;
-  // Total free RAM = cached_pss_kb + cached_kernel_kb + free_kb.
-  optional int64 cached_pss_kb = 10;
-  optional int64 cached_kernel_kb = 11;
-  optional int64 free_kb = 12;
-  // Total used RAM = used_pss_kb + used_kernel_kb.
-  optional int64 used_pss_kb = 13;
-  optional int64 used_kernel_kb = 14;
+    message ProcessMemory {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int64 lost_ram_kb = 15;
+        optional int32 pid = 1;
+        optional string process_name = 2;
 
-  optional int64 total_zram_kb = 16;
-  optional int64 zram_physical_used_in_swap_kb = 17;
-  optional int64 total_zram_swap_kb = 18;
+        message MemoryInfo {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int64 ksm_sharing_kb = 19;
-  optional int64 ksm_shared_kb = 20;
-  optional int64 ksm_unshared_kb = 21;
-  optional int64 ksm_volatile_kb = 22;
+            optional string name = 1;
+            // The proportional set size for the heap.
+            optional int32 total_pss_kb = 2;
+            // The proportional set size that is swappable for the heap.
+            optional int32 clean_pss_kb = 3;
+            // The private dirty pages used by the heap.
+            optional int32 shared_dirty_kb = 4;
+            // The shared dirty pages used by the heap.
+            optional int32 private_dirty_kb = 5;
+            // The shared clean pages used by the heap.
+            optional int32 shared_clean_kb = 6;
+            // The private clean pages used by the heap.
+            optional int32 private_clean_kb = 7;
+            oneof dirty_swap {
+                // The dirty the pages that have been swapped out.
+                int32 dirty_swap_kb = 8;
+                // The dirty the pages that have been swapped out, proportional.
+                int32 dirty_swap_pss_kb = 9;
+            }
+        }
+        message HeapInfo {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // The approximate per-application memory class of the current device. This
-  // gives developers an idea of how hard a memory limit you should impose on
-  // their application to let the overall system work best. The value is in
-  // megabytes; the baseline Android memory class is 16 (which happens to be the
-  // Java heap limit of those devices); some devices with more memory may have
-  // 24 or even higher numbers.
-  optional int32 tuning_mb = 23;
-  // The approximate per-application memory class of the current device when an
-  // application is running with a large heap. This is the space available for
-  // memory-intensive applications; most applications should not need this
-  // amount of memory, and should instead stay with the tuning_mb limit. The
-  // value is in megabytes. This may be the same size as tuning_mb on memory
-  // constrained devices, or it may be significantly larger on devices with a
-  // large amount of available RAM.
-  // This is the size of the application's Dalvik heap if it has specified
-  // 'android:largeHeap="true"' in its manifest.
-  optional int32 tuning_large_mb = 24;
+            optional MemoryInfo mem_info = 1;
+            optional int32 heap_size_kb = 2;
+            optional int32 heap_alloc_kb = 3;
+            optional int32 heap_free_kb = 4;
+        }
+        optional HeapInfo native_heap = 3;
+        optional HeapInfo dalvik_heap = 4;
+        repeated MemoryInfo other_heaps = 5;
+        optional MemoryInfo unknown_heap = 6;
+        // Summation of native_heap, dalvik_heap, and other_heaps.
+        optional HeapInfo total_heap = 7;
 
-  optional int64 oom_kb = 25;
+        repeated MemoryInfo dalvik_details = 8;
 
-  // The maximum pss size in kb that we consider a process acceptable to restore
-  // from its cached state for running in the background when RAM is low.
-  optional int64 restore_limit_kb = 26;
+        message AppSummary {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool is_low_ram_device = 27;
-  optional bool is_high_end_gfx = 28;
+            optional int32 java_heap_pss_kb = 1;
+            optional int32 native_heap_pss_kb = 2;
+            optional int32 code_pss_kb = 3;
+            optional int32 stack_pss_kb = 4;
+            optional int32 graphics_pss_kb = 5;
+            optional int32 private_other_pss_kb = 6;
+            optional int32 system_pss_kb = 7;
+
+            oneof total_swap {
+                int32 total_swap_pss = 8;
+                int32 total_swap_kb = 9;
+            }
+        }
+        optional AppSummary app_summary = 9;
+    }
+    repeated ProcessMemory native_processes = 3;
+
+    message AppData {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional ProcessMemory process_memory = 1;
+
+        message ObjectStats {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional int32 view_instance_count = 1;
+            optional int32 view_root_instance_count = 2;
+            optional int32 app_context_instance_count = 3;
+            optional int32 activity_instance_count = 4;
+            optional int32 global_asset_count = 5;
+            optional int32 global_asset_manager_count = 6;
+            optional int32 local_binder_object_count = 7;
+            optional int32 proxy_binder_object_count = 8;
+            optional int64 parcel_memory_kb = 9;
+            optional int32 parcel_count = 10;
+            optional int32 binder_object_death_count = 11;
+            optional int32 open_ssl_socket_count = 12;
+            optional int32 webview_instance_count = 13;
+        }
+        optional ObjectStats objects = 2;
+
+        message SqlStats {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional int32 memory_used_kb = 1;
+            optional int32 pagecache_overflow_kb = 2;
+            optional int32 malloc_size_kb = 3;
+
+            message Database {
+                option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+                optional string name = 1;
+                optional int32 page_size = 2;
+                optional int32 db_size = 3;
+                // Number of lookaside slots:
+                // http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html
+                optional int32 lookaside_b = 4;
+                // Statement cache stats: hits/misses/cachesize
+                optional string cache = 5;
+            }
+            repeated Database databases = 4;
+        }
+        optional SqlStats sql = 3;
+
+        optional string asset_allocations = 4;
+        optional string unreachable_memory = 5;
+    }
+    repeated AppData app_processes = 4;
+
+    message MemItem {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string tag = 1;
+        optional string label = 2;
+        optional int32 id = 3;
+        optional bool is_proc = 4;
+        optional bool has_activities = 5;
+        optional int64 pss_kb = 6;
+        optional int64 swap_pss_kb = 7;
+        repeated MemItem sub_items = 8;
+    }
+    repeated MemItem total_pss_by_process = 5;
+    repeated MemItem total_pss_by_oom_adjustment = 6;
+    repeated MemItem total_pss_by_category = 7;
+
+    optional int64 total_ram_kb = 8;
+    optional .com.android.internal.app.procstats.ProcessStatsProto.MemoryFactor status = 9;
+    // Total free RAM = cached_pss_kb + cached_kernel_kb + free_kb.
+    optional int64 cached_pss_kb = 10;
+    optional int64 cached_kernel_kb = 11;
+    optional int64 free_kb = 12;
+    // Total used RAM = used_pss_kb + used_kernel_kb.
+    optional int64 used_pss_kb = 13;
+    optional int64 used_kernel_kb = 14;
+
+    optional int64 lost_ram_kb = 15;
+
+    optional int64 total_zram_kb = 16;
+    optional int64 zram_physical_used_in_swap_kb = 17;
+    optional int64 total_zram_swap_kb = 18;
+
+    optional int64 ksm_sharing_kb = 19;
+    optional int64 ksm_shared_kb = 20;
+    optional int64 ksm_unshared_kb = 21;
+    optional int64 ksm_volatile_kb = 22;
+
+    // The approximate per-application memory class of the current device. This
+    // gives developers an idea of how hard a memory limit you should impose on
+    // their application to let the overall system work best. The value is in
+    // megabytes; the baseline Android memory class is 16 (which happens to be the
+    // Java heap limit of those devices); some devices with more memory may have
+    // 24 or even higher numbers.
+    optional int32 tuning_mb = 23;
+    // The approximate per-application memory class of the current device when an
+    // application is running with a large heap. This is the space available for
+    // memory-intensive applications; most applications should not need this
+    // amount of memory, and should instead stay with the tuning_mb limit. The
+    // value is in megabytes. This may be the same size as tuning_mb on memory
+    // constrained devices, or it may be significantly larger on devices with a
+    // large amount of available RAM.
+    // This is the size of the application's Dalvik heap if it has specified
+    // 'android:largeHeap="true"' in its manifest.
+    optional int32 tuning_large_mb = 24;
+
+    optional int64 oom_kb = 25;
+
+    // The maximum pss size in kb that we consider a process acceptable to restore
+    // from its cached state for running in the background when RAM is low.
+    optional int64 restore_limit_kb = 26;
+
+    optional bool is_low_ram_device = 27;
+    optional bool is_high_end_gfx = 28;
 }
 
 message StickyBroadcastProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int32 user = 1;
-
-  message StickyAction {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string name = 1;
-    repeated .android.content.IntentProto intents = 2;
-  }
-  repeated StickyAction actions = 2;
+    optional int32 user = 1;
+
+    message StickyAction {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string name = 1;
+        repeated .android.content.IntentProto intents = 2;
+    }
+    repeated StickyAction actions = 2;
 }
 
 // "dumpsys activity --proto service"
 message ActivityManagerServiceDumpServicesProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ActiveServicesProto active_services = 1;
+    optional ActiveServicesProto active_services = 1;
 }
 
 message ActiveServicesProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  message ServicesByUser {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 user_id = 1;
-    repeated ServiceRecordProto service_records = 2;
-  }
-  repeated ServicesByUser services_by_users = 1;
+    message ServicesByUser {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 user_id = 1;
+        repeated ServiceRecordProto service_records = 2;
+    }
+    repeated ServicesByUser services_by_users = 1;
 }
 
 // corresponds to ActivityManagerService.GrantUri Java class
 message GrantUriProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 source_user_id = 1;
-  optional string uri = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional int32 source_user_id = 1;
+    optional string uri = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
 }
 
 message NeededUriGrantsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string target_package = 1;
-  optional int32 target_uid = 2;
-  optional int32 flags = 3;
+    optional string target_package = 1;
+    optional int32 target_uid = 2;
+    optional int32 flags = 3;
 
-  repeated GrantUriProto grants = 4;
+    repeated GrantUriProto grants = 4;
 }
 
 message UriPermissionOwnerProto {
-  option (.android.msg_privacy).dest = DEST_EXPLICIT;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
-  optional string owner = 1;
-  repeated GrantUriProto read_perms = 2;
-  repeated GrantUriProto write_perms = 3;
+    optional string owner = 1;
+    repeated GrantUriProto read_perms = 2;
+    repeated GrantUriProto write_perms = 3;
 }
 
 message ServiceRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional string short_name = 1;
-  optional bool is_running = 2; // false if the application service is null
-  optional int32 pid = 3;
-  optional .android.content.IntentProto intent = 4;
-  optional string package_name = 5;
-  optional string process_name = 6;
-  optional string permission = 7;
-
-  message AppInfo {
-    option (.android.msg_privacy).dest = DEST_EXPLICIT;
-
-    optional string base_dir = 1;
-    optional string res_dir = 2;
-    optional string data_dir = 3;
-  }
-  optional AppInfo appinfo = 8;
-  optional ProcessRecordProto app = 9;
-  optional ProcessRecordProto isolated_proc = 10;
-  optional bool whitelist_manager = 11;
-  optional bool delayed = 12;
-
-  message Foreground {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 id = 1;
-    optional .android.app.NotificationProto notification = 2;
-  }
-  optional Foreground foreground = 13;
+    optional string short_name = 1;
+    optional bool is_running = 2; // false if the application service is null
+    optional int32 pid = 3;
+    optional .android.content.IntentProto intent = 4;
+    optional string package_name = 5;
+    optional string process_name = 6;
+    optional string permission = 7;
 
-  optional .android.util.Duration create_real_time = 14;
-  optional .android.util.Duration starting_bg_timeout = 15;
-  optional .android.util.Duration last_activity_time = 16;
-  optional .android.util.Duration restart_time = 17;
-  optional bool created_from_fg = 18;
+    message AppInfo {
+        option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
-  // variables used to track states related to service start
-  message Start {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional string base_dir = 1;
+        optional string res_dir = 2;
+        optional string data_dir = 3;
+    }
+    optional AppInfo appinfo = 8;
+    optional ProcessRecordProto app = 9;
+    optional ProcessRecordProto isolated_proc = 10;
+    optional bool whitelist_manager = 11;
+    optional bool delayed = 12;
 
-    optional bool start_requested = 1;
-    optional bool delayed_stop = 2;
-    optional bool stop_if_killed = 3;
-    optional bool call_start = 4;
-    optional int32 last_start_id = 5;
-  }
-  optional Start start = 19;
+    message Foreground {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message ExecuteNesting {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional int32 id = 1;
+        optional .android.app.NotificationProto notification = 2;
+    }
+    optional Foreground foreground = 13;
 
-    optional int32 execute_nesting = 1;
-    optional bool execute_fg = 2;
-    optional .android.util.Duration executing_start = 3;
-  }
-  optional ExecuteNesting execute = 20;
+    optional .android.util.Duration create_real_time = 14;
+    optional .android.util.Duration starting_bg_timeout = 15;
+    optional .android.util.Duration last_activity_time = 16;
+    optional .android.util.Duration restart_time = 17;
+    optional bool created_from_fg = 18;
 
-  optional .android.util.Duration destory_time = 21;
+    // variables used to track states related to service start
+    message Start {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message Crash {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional bool start_requested = 1;
+        optional bool delayed_stop = 2;
+        optional bool stop_if_killed = 3;
+        optional bool call_start = 4;
+        optional int32 last_start_id = 5;
+    }
+    optional Start start = 19;
 
-    optional int32 restart_count = 1;
-    optional .android.util.Duration restart_delay = 2;
-    optional .android.util.Duration next_restart_time = 3;
-    optional int32 crash_count = 4;
-  }
-  optional Crash crash = 22;
+    message ExecuteNesting {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message StartItem {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional int32 execute_nesting = 1;
+        optional bool execute_fg = 2;
+        optional .android.util.Duration executing_start = 3;
+    }
+    optional ExecuteNesting execute = 20;
 
-    optional int32 id = 1;
-    optional .android.util.Duration duration = 2;
-    optional int32 delivery_count = 3;
-    optional int32 done_executing_count = 4;
-    optional .android.content.IntentProto intent = 5;
-    optional NeededUriGrantsProto needed_grants = 6;
-    optional UriPermissionOwnerProto uri_permissions = 7;
-  }
-  repeated StartItem delivered_starts = 23;
-  repeated StartItem pending_starts = 24;
+    optional .android.util.Duration destory_time = 21;
 
-  repeated IntentBindRecordProto bindings = 25;
-  repeated ConnectionRecordProto connections = 26;
+    message Crash {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // Next Tag: 27
+        optional int32 restart_count = 1;
+        optional .android.util.Duration restart_delay = 2;
+        optional .android.util.Duration next_restart_time = 3;
+        optional int32 crash_count = 4;
+    }
+    optional Crash crash = 22;
+
+    message StartItem {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 id = 1;
+        optional .android.util.Duration duration = 2;
+        optional int32 delivery_count = 3;
+        optional int32 done_executing_count = 4;
+        optional .android.content.IntentProto intent = 5;
+        optional NeededUriGrantsProto needed_grants = 6;
+        optional UriPermissionOwnerProto uri_permissions = 7;
+    }
+    repeated StartItem delivered_starts = 23;
+    repeated StartItem pending_starts = 24;
+
+    repeated IntentBindRecordProto bindings = 25;
+    repeated ConnectionRecordProto connections = 26;
+
+    // Next Tag: 27
 }
 
 message ConnectionRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // used to find same record, e.g. AppBindRecord has the hex_hash
-  optional string hex_hash = 1; // cross reference the object and avoid double logging.
-  optional int32 user_id = 2;
+    // used to find same record, e.g. AppBindRecord has the hex_hash
+    optional string hex_hash = 1; // cross reference the object and avoid double logging.
+    optional int32 user_id = 2;
 
-  enum Flag {
-    AUTO_CREATE = 0;
-    DEBUG_UNBIND = 1;
-    NOT_FG = 2;
-    IMPORTANT_BG = 3;
-    ABOVE_CLIENT = 4;
-    ALLOW_OOM_MANAGEMENT = 5;
-    WAIVE_PRIORITY = 6;
-    IMPORTANT = 7;
-    ADJUST_WITH_ACTIVITY = 8;
-    FG_SERVICE_WHILE_AWAKE = 9;
-    FG_SERVICE = 10;
-    TREAT_LIKE_ACTIVITY = 11;
-    VISIBLE = 12;
-    SHOWING_UI = 13;
-    NOT_VISIBLE = 14;
-    DEAD = 15;
-  }
-  repeated Flag flags = 3;
-  optional string service_name = 4;
+    enum Flag {
+        AUTO_CREATE = 0;
+        DEBUG_UNBIND = 1;
+        NOT_FG = 2;
+        IMPORTANT_BG = 3;
+        ABOVE_CLIENT = 4;
+        ALLOW_OOM_MANAGEMENT = 5;
+        WAIVE_PRIORITY = 6;
+        IMPORTANT = 7;
+        ADJUST_WITH_ACTIVITY = 8;
+        FG_SERVICE_WHILE_AWAKE = 9;
+        FG_SERVICE = 10;
+        TREAT_LIKE_ACTIVITY = 11;
+        VISIBLE = 12;
+        SHOWING_UI = 13;
+        NOT_VISIBLE = 14;
+        DEAD = 15;
+    }
+    repeated Flag flags = 3;
+    optional string service_name = 4;
 }
 
 message AppBindRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string service_name = 1;
-  optional string client_proc_name = 2;
-  repeated string connections = 3; // hex_hash of ConnectionRecordProto
+    optional string service_name = 1;
+    optional string client_proc_name = 2;
+    repeated string connections = 3; // hex_hash of ConnectionRecordProto
 }
 
 message IntentBindRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.content.IntentProto intent = 1;
-  optional string binder = 2;
-  optional bool auto_create = 3; // value of BIND_AUTO_CREATE flag.
-  optional bool requested = 4;
-  optional bool received = 5;
-  optional bool has_bound = 6;
-  optional bool do_rebind = 7;
+    optional .android.content.IntentProto intent = 1;
+    optional string binder = 2;
+    optional bool auto_create = 3; // value of BIND_AUTO_CREATE flag.
+    optional bool requested = 4;
+    optional bool received = 5;
+    optional bool has_bound = 6;
+    optional bool do_rebind = 7;
 
-  repeated AppBindRecordProto apps = 8;
+    repeated AppBindRecordProto apps = 8;
 }
 
 // TODO: "dumpsys activity --proto processes"
 message ActivityManagerServiceDumpProcessesProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  repeated ProcessRecordProto procs = 1;
-  repeated ProcessRecordProto isolated_procs = 2;
-  repeated ActiveInstrumentationProto active_instrumentations = 3;
-  repeated UidRecordProto active_uids = 4;
-  repeated UidRecordProto validate_uids = 5;
-
-  // Process LRU list (sorted by oom_adj)
-  message LruProcesses {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 size = 1;
-    optional int32 non_act_at = 2;
-    optional int32 non_svc_at = 3;
-    repeated ProcessOomProto list = 4;
-  }
-  optional LruProcesses lru_procs = 6;
-  repeated ProcessRecordProto pids_self_locked = 7;
-  // Foreground Processes
-  repeated ImportanceTokenProto important_procs = 8;
-  // Persisent processes that are starting
-  repeated ProcessRecordProto persistent_starting_procs = 9;
-  // Processes that are being removed
-  repeated ProcessRecordProto removed_procs = 10;
-  // Processes that are on old until the system is ready
-  repeated ProcessRecordProto on_hold_procs = 11;
-  // Processes that are waiting to GC
-  repeated ProcessToGcProto gc_procs = 12;
-  optional AppErrorsProto app_errors = 13;
-  optional UserControllerProto user_controller = 14;
-  optional ProcessRecordProto home_proc = 15;
-  optional ProcessRecordProto previous_proc = 16;
-  optional int64 previous_proc_visible_time_ms = 17;
-  optional ProcessRecordProto heavy_weight_proc = 18;
-  optional .android.content.ConfigurationProto global_configuration = 19;
-  // ActivityStackSupervisorProto dumps these values as well, still here?
-  // repeated ActivityDisplayProto displays = 20;
+    repeated ProcessRecordProto procs = 1;
+    repeated ProcessRecordProto isolated_procs = 2;
+    repeated ActiveInstrumentationProto active_instrumentations = 3;
+    repeated UidRecordProto active_uids = 4;
+    repeated UidRecordProto validate_uids = 5;
 
-  optional bool config_will_change = 21;
+    // Process LRU list (sorted by oom_adj)
+    message LruProcesses {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message ScreenCompatPackage {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional string package = 1;
-    optional int32 mode = 2;
-  }
-  repeated ScreenCompatPackage screen_compat_packages = 22;
-
-  message UidObserverRegistrationProto {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional int32 uid = 1;
-    optional string package = 2;
-    repeated .android.app.UidObserverFlag flags = 3;
-    optional int32 cut_point = 4; // only available when UID_OBSERVER_PROCSTATE is on
-
-    message ProcState {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional int32 uid = 1;
-      optional int32 state = 2;
+        optional int32 size = 1;
+        optional int32 non_act_at = 2;
+        optional int32 non_svc_at = 3;
+        repeated ProcessOomProto list = 4;
     }
-    repeated ProcState last_proc_states = 5;
-  }
-  repeated UidObserverRegistrationProto uid_observers = 23;
-  repeated int32 device_idle_whitelist = 24;
-  repeated int32 device_idle_temp_whitelist = 25;
+    optional LruProcesses lru_procs = 6;
+    repeated ProcessRecordProto pids_self_locked = 7;
+    // Foreground Processes
+    repeated ImportanceTokenProto important_procs = 8;
+    // Persisent processes that are starting
+    repeated ProcessRecordProto persistent_starting_procs = 9;
+    // Processes that are being removed
+    repeated ProcessRecordProto removed_procs = 10;
+    // Processes that are on old until the system is ready
+    repeated ProcessRecordProto on_hold_procs = 11;
+    // Processes that are waiting to GC
+    repeated ProcessToGcProto gc_procs = 12;
+    optional AppErrorsProto app_errors = 13;
+    optional UserControllerProto user_controller = 14;
+    optional ProcessRecordProto home_proc = 15;
+    optional ProcessRecordProto previous_proc = 16;
+    optional int64 previous_proc_visible_time_ms = 17;
+    optional ProcessRecordProto heavy_weight_proc = 18;
+    optional .android.content.ConfigurationProto global_configuration = 19;
+    // ActivityStackSupervisorProto dumps these values as well, still here?
+    // repeated ActivityDisplayProto displays = 20;
 
-  message PendingTempWhitelist {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    optional bool config_will_change = 21;
 
-    optional int32 target_uid = 1;
-    optional int64 duration_ms = 2;
-    optional string tag = 3;
-  }
-  repeated PendingTempWhitelist pending_temp_whitelist = 26;
+    message ScreenCompatPackage {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message SleepStatus {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional string package = 1;
+        optional int32 mode = 2;
+    }
+    repeated ScreenCompatPackage screen_compat_packages = 22;
 
-    optional .android.os.PowerManagerInternalProto.Wakefulness wakefulness = 1;
-    repeated string sleep_tokens = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
-    optional bool sleeping = 3;
-    optional bool shutting_down = 4;
-    optional bool test_pss_mode = 5;
-  }
-  optional SleepStatus sleep_status = 27;
-
-  message Voice {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional string session = 1;
-    optional .android.os.PowerManagerProto.WakeLock wakelock = 2;
-  }
-  optional Voice running_voice = 28;
-
-  optional VrControllerProto vr_controller = 29;
-
-  message DebugApp {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    optional string debug_app = 1;
-    optional string orig_debug_app = 2;
-    optional bool debug_transient = 3;
-    optional bool orig_wait_for_debugger = 4;
-  }
-  optional DebugApp debug = 30;
-  optional AppTimeTrackerProto current_tracker = 31;
-
-  message MemWatchProcess {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-    message Process {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional string name = 1;
-
-      message MemStats {
+    message UidObserverRegistrationProto {
         option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
         optional int32 uid = 1;
-        optional string size = 2;
-        optional string report_to = 3;
-      }
-      repeated MemStats mem_stats = 2;
+        optional string package = 2;
+        repeated .android.app.UidObserverFlag flags = 3;
+        optional int32 cut_point = 4; // only available when UID_OBSERVER_PROCSTATE is on
+
+        message ProcState {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional int32 uid = 1;
+            optional int32 state = 2;
+        }
+        repeated ProcState last_proc_states = 5;
     }
-    repeated Process procs = 1;
+    repeated UidObserverRegistrationProto uid_observers = 23;
+    repeated int32 device_idle_whitelist = 24;
+    repeated int32 device_idle_temp_whitelist = 25;
 
-    message Dump {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message PendingTempWhitelist {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional string proc_name = 1;
-      optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
-      optional int32 pid = 3;
-      optional int32 uid = 4;
+        optional int32 target_uid = 1;
+        optional int64 duration_ms = 2;
+        optional string tag = 3;
     }
-    optional Dump dump = 2;
-  }
-  optional MemWatchProcess mem_watch_processes = 32;
-  optional string track_allocation_app = 33;
+    repeated PendingTempWhitelist pending_temp_whitelist = 26;
 
-  message Profile {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message SleepStatus {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string app_name = 1;
-    optional ProcessRecordProto proc = 2;
-    optional .android.app.ProfilerInfoProto info = 3;
-    optional int32 type = 4;
-  }
-  optional Profile profile = 34;
-  optional string native_debugging_app = 35;
-  optional bool always_finish_activities = 36;
+        optional .android.os.PowerManagerInternalProto.Wakefulness wakefulness = 1;
+        repeated string sleep_tokens = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+        optional bool sleeping = 3;
+        optional bool shutting_down = 4;
+        optional bool test_pss_mode = 5;
+    }
+    optional SleepStatus sleep_status = 27;
 
-  message Controller {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message Voice {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string controller = 1;
-    optional bool is_a_monkey = 2;
-  }
-  optional Controller controller = 37;
+        optional string session = 1;
+        optional .android.os.PowerManagerProto.WakeLock wakelock = 2;
+    }
+    optional Voice running_voice = 28;
 
-  optional int32 total_persistent_procs = 38;
-  optional bool processes_ready = 39;
-  optional bool system_ready = 40;
-  optional bool booted = 41;
-  optional int32 factory_test = 42;
-  optional bool booting = 43;
-  optional bool call_finish_booting = 44;
-  optional bool boot_animation_complete = 45;
-  optional int64 last_power_check_uptime_ms = 46;
-  optional .android.os.PowerManagerProto.WakeLock going_to_sleep = 47;
-  optional .android.os.PowerManagerProto.WakeLock launching_activity = 48;
-  optional int32 adj_seq = 49;
-  optional int32 lru_seq = 50;
-  optional int32 num_non_cached_procs = 51;
-  optional int32 num_cached_hidden_procs = 52;
-  optional int32 num_service_procs = 53;
-  optional int32 new_num_service_procs = 54;
-  optional bool allow_lower_mem_level = 55;
-  optional int32 last_memory_level = 56;
-  optional int32 last_num_processes = 57;
-  optional .android.util.Duration last_idle_time = 58;
-  optional int64 low_ram_since_last_idle_ms = 59;
+    optional VrControllerProto vr_controller = 29;
+
+    message DebugApp {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string debug_app = 1;
+        optional string orig_debug_app = 2;
+        optional bool debug_transient = 3;
+        optional bool orig_wait_for_debugger = 4;
+    }
+    optional DebugApp debug = 30;
+    optional AppTimeTrackerProto current_tracker = 31;
+
+    message MemWatchProcess {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        message Process {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional string name = 1;
+
+            message MemStats {
+                option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+                optional int32 uid = 1;
+                optional string size = 2;
+                optional string report_to = 3;
+            }
+            repeated MemStats mem_stats = 2;
+        }
+        repeated Process procs = 1;
+
+        message Dump {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional string proc_name = 1;
+            optional string file = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+            optional int32 pid = 3;
+            optional int32 uid = 4;
+        }
+        optional Dump dump = 2;
+    }
+    optional MemWatchProcess mem_watch_processes = 32;
+    optional string track_allocation_app = 33;
+
+    message Profile {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string app_name = 1;
+        optional ProcessRecordProto proc = 2;
+        optional .android.app.ProfilerInfoProto info = 3;
+        optional int32 type = 4;
+    }
+    optional Profile profile = 34;
+    optional string native_debugging_app = 35;
+    optional bool always_finish_activities = 36;
+
+    message Controller {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string controller = 1;
+        optional bool is_a_monkey = 2;
+    }
+    optional Controller controller = 37;
+
+    optional int32 total_persistent_procs = 38;
+    optional bool processes_ready = 39;
+    optional bool system_ready = 40;
+    optional bool booted = 41;
+    optional int32 factory_test = 42;
+    optional bool booting = 43;
+    optional bool call_finish_booting = 44;
+    optional bool boot_animation_complete = 45;
+    optional int64 last_power_check_uptime_ms = 46;
+    optional .android.os.PowerManagerProto.WakeLock going_to_sleep = 47;
+    optional .android.os.PowerManagerProto.WakeLock launching_activity = 48;
+    optional int32 adj_seq = 49;
+    optional int32 lru_seq = 50;
+    optional int32 num_non_cached_procs = 51;
+    optional int32 num_cached_hidden_procs = 52;
+    optional int32 num_service_procs = 53;
+    optional int32 new_num_service_procs = 54;
+    optional bool allow_lower_mem_level = 55;
+    optional int32 last_memory_level = 56;
+    optional int32 last_num_processes = 57;
+    optional .android.util.Duration last_idle_time = 58;
+    optional int64 low_ram_since_last_idle_ms = 59;
 }
 
 message ActiveInstrumentationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.content.ComponentNameProto class = 1;
-  optional bool finished = 2;
-  repeated ProcessRecordProto running_processes = 3;
-  repeated string target_processes = 4;
-  optional .android.content.pm.ApplicationInfoProto target_info = 5;
-  optional string profile_file = 6;
-  optional string watcher = 7;
-  optional string ui_automation_connection = 8;
-  optional string arguments = 9  [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional .android.content.ComponentNameProto class = 1;
+    optional bool finished = 2;
+    repeated ProcessRecordProto running_processes = 3;
+    repeated string target_processes = 4;
+    optional .android.content.pm.ApplicationInfoProto target_info = 5;
+    optional string profile_file = 6;
+    optional string watcher = 7;
+    optional string ui_automation_connection = 8;
+    optional string arguments = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
 }
 
 // Proto definition of com.android.server.am.UidRecord.java
 message UidRecordProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int32 uid = 1;
-  optional .android.app.ProcessStateEnum current = 2;
-  optional bool ephemeral = 3;
-  optional bool fg_services = 4;
-  optional bool whilelist = 5;
-  optional .android.util.Duration last_background_time = 6;
-  optional bool idle = 7;
-
-  enum Change {
-    CHANGE_GONE = 0;
-    CHANGE_IDLE = 1;
-    CHANGE_ACTIVE = 2;
-    CHANGE_CACHED = 3;
-    CHANGE_UNCACHED = 4;
-  }
-  repeated Change last_reported_changes = 8;
-  optional int32 num_procs = 9;
-
-  message ProcStateSequence {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int64 cururent = 1;
-    optional int64 last_network_updated = 2;
-    optional int64 last_dispatched = 3;
-  }
-  optional ProcStateSequence network_state_update = 10;
+    optional int32 uid = 1;
+    optional .android.app.ProcessStateEnum current = 2;
+    optional bool ephemeral = 3;
+    optional bool fg_services = 4;
+    optional bool whilelist = 5;
+    optional .android.util.Duration last_background_time = 6;
+    optional bool idle = 7;
 
-  // Next Tag: 11
+    enum Change {
+        CHANGE_GONE = 0;
+        CHANGE_IDLE = 1;
+        CHANGE_ACTIVE = 2;
+        CHANGE_CACHED = 3;
+        CHANGE_UNCACHED = 4;
+    }
+    repeated Change last_reported_changes = 8;
+    optional int32 num_procs = 9;
+
+    message ProcStateSequence {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int64 cururent = 1;
+        optional int64 last_network_updated = 2;
+        optional int64 last_dispatched = 3;
+    }
+    optional ProcStateSequence network_state_update = 10;
+
+    // Next Tag: 11
 }
 
 // proto of class ImportanceToken in ActivityManagerService
 message ImportanceTokenProto {
-  option (.android.msg_privacy).dest = DEST_EXPLICIT;
+    option (.android.msg_privacy).dest = DEST_EXPLICIT;
 
-  optional int32 pid = 1;
-  optional string token = 2;
-  optional string reason = 3;
+    optional int32 pid = 1;
+    optional string token = 2;
+    optional string reason = 3;
 }
 
 // proto of class VrController.java
 message VrControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  enum VrMode {
-    FLAG_NON_VR_MODE = 0;
-    FLAG_VR_MODE = 1;
-    FLAG_PERSISTENT_VR_MODE = 2;
-  }
-  repeated VrMode vr_mode = 1;
-  optional int32 render_thread_id = 2;
+    enum VrMode {
+        FLAG_NON_VR_MODE = 0;
+        FLAG_VR_MODE = 1;
+        FLAG_PERSISTENT_VR_MODE = 2;
+    }
+    repeated VrMode vr_mode = 1;
+    optional int32 render_thread_id = 2;
 }
 
 message ProcessOomProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional bool persistent = 1;
-  optional int32 num = 2;
-  optional string oom_adj = 3;
-
-  // Activity manager's version of Process enum, see ProcessList.java
-  enum SchedGroup {
-    SCHED_GROUP_UNKNOWN = -1;
-    SCHED_GROUP_BACKGROUND = 0;
-    SCHED_GROUP_DEFAULT = 1;
-    SCHED_GROUP_TOP_APP = 2;
-    SCHED_GROUP_TOP_APP_BOUND = 3;
-  }
-  optional SchedGroup sched_group = 4 [ default = SCHED_GROUP_UNKNOWN];
-
-  oneof Foreground {
-    bool activities = 5;
-    bool services = 6;
-  }
-
-  optional .android.app.ProcessStateEnum state = 7;
-  optional int32 trim_memory_level = 8;
-  optional ProcessRecordProto proc = 9;
-  optional string adj_type = 10;
-
-  oneof AdjTarget {
-    .android.content.ComponentNameProto adj_target_component_name = 11;
-    string adj_target_object = 12;
-  }
-
-  oneof AdjSource {
-    ProcessRecordProto adj_source_proc = 13;
-    string adj_source_object = 14;
-  }
-
-  message Detail {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 max_adj = 1;
-    optional int32 cur_raw_adj = 2;
-    optional int32 set_raw_adj = 3;
-    optional int32 cur_adj = 4;
-    optional int32 set_adj = 5;
-    optional .android.app.ProcessStateEnum current_state = 7;
-    optional .android.app.ProcessStateEnum set_state = 8;
-    optional string last_pss = 9;
-    optional string last_swap_pss = 10;
-    optional string last_cached_pss = 11;
-    optional bool cached = 12;
-    optional bool empty = 13;
-    optional bool has_above_client = 14;
+    optional bool persistent = 1;
+    optional int32 num = 2;
+    optional string oom_adj = 3;
 
-    // only make sense if process is a service
-    message CpuRunTime {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-      optional int64 over_ms = 1;
-      optional int64 used_ms = 2;
-      optional float ultilization = 3; // ratio of cpu time usage
+    // Activity manager's version of Process enum, see ProcessList.java
+    enum SchedGroup {
+        SCHED_GROUP_UNKNOWN = -1;
+        SCHED_GROUP_BACKGROUND = 0;
+        SCHED_GROUP_DEFAULT = 1;
+        SCHED_GROUP_TOP_APP = 2;
+        SCHED_GROUP_TOP_APP_BOUND = 3;
     }
-    optional CpuRunTime service_run_time = 15;
-  }
-  optional Detail detail = 15;
+    optional SchedGroup sched_group = 4 [ default = SCHED_GROUP_UNKNOWN];
+
+    oneof Foreground {
+        bool activities = 5;
+        bool services = 6;
+    }
+
+    optional .android.app.ProcessStateEnum state = 7;
+    optional int32 trim_memory_level = 8;
+    optional ProcessRecordProto proc = 9;
+    optional string adj_type = 10;
+
+    oneof AdjTarget {
+        .android.content.ComponentNameProto adj_target_component_name = 11;
+        string adj_target_object = 12;
+    }
+
+    oneof AdjSource {
+        ProcessRecordProto adj_source_proc = 13;
+        string adj_source_object = 14;
+    }
+
+    message Detail {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 max_adj = 1;
+        optional int32 cur_raw_adj = 2;
+        optional int32 set_raw_adj = 3;
+        optional int32 cur_adj = 4;
+        optional int32 set_adj = 5;
+        optional .android.app.ProcessStateEnum current_state = 7;
+        optional .android.app.ProcessStateEnum set_state = 8;
+        optional string last_pss = 9;
+        optional string last_swap_pss = 10;
+        optional string last_cached_pss = 11;
+        optional bool cached = 12;
+        optional bool empty = 13;
+        optional bool has_above_client = 14;
+
+        // only make sense if process is a service
+        message CpuRunTime {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional int64 over_ms = 1;
+            optional int64 used_ms = 2;
+            optional float ultilization = 3; // ratio of cpu time usage
+        }
+        optional CpuRunTime service_run_time = 15;
+    }
+    optional Detail detail = 15;
 }
 
 message ProcessToGcProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ProcessRecordProto proc = 1;
-  optional bool report_low_memory = 2;
-  optional int64 now_uptime_ms = 3;
-  optional int64 last_gced_ms = 4;
-  optional int64 last_low_memory_ms = 5;
+    optional ProcessRecordProto proc = 1;
+    optional bool report_low_memory = 2;
+    optional int64 now_uptime_ms = 3;
+    optional int64 last_gced_ms = 4;
+    optional int64 last_low_memory_ms = 5;
 }
 
 // sync with com.android.server.am.AppErrors.java
 message AppErrorsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int64 now_uptime_ms = 1;
-
-  message ProcessCrashTime {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string process_name = 1;
+    optional int64 now_uptime_ms = 1;
 
-    message Entry {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message ProcessCrashTime {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional int32 uid = 1;
-      optional int64 last_crashed_at_ms = 2;
+        optional string process_name = 1;
+
+        message Entry {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+            optional int32 uid = 1;
+            optional int64 last_crashed_at_ms = 2;
+        }
+        repeated Entry entries = 2;
     }
-    repeated Entry entries = 2;
-  }
-  repeated ProcessCrashTime process_crash_times = 2;
+    repeated ProcessCrashTime process_crash_times = 2;
 
-  message BadProcess {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message BadProcess {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string process_name = 1;
+        optional string process_name = 1;
 
-    message Entry {
-      option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        message Entry {
+            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-      optional int32 uid = 1;
-      optional int64 crashed_at_ms = 2;
-      optional string short_msg = 3;
-      optional string long_msg = 4  [ (.android.privacy).dest = DEST_EXPLICIT ];
-      optional string stack = 5  [ (.android.privacy).dest = DEST_EXPLICIT ];
+            optional int32 uid = 1;
+            optional int64 crashed_at_ms = 2;
+            optional string short_msg = 3;
+            optional string long_msg = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
+            optional string stack = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+        }
+        repeated Entry entries = 2;
     }
-    repeated Entry entries = 2;
-  }
-  repeated BadProcess bad_processes = 3;
+    repeated BadProcess bad_processes = 3;
 }
 
 // sync with com.android.server.am.UserState.java
 message UserStateProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  enum State {
-    STATE_BOOTING = 0;
-    STATE_RUNNING_LOCKED = 1;
-    STATE_RUNNING_UNLOCKING = 2;
-    STATE_RUNNING_UNLOCKED = 3;
-    STATE_STOPPING = 4;
-    STATE_SHUTDOWN = 5;
-  }
-  optional State state = 1;
-  optional bool switching = 2;
+    enum State {
+        STATE_BOOTING = 0;
+        STATE_RUNNING_LOCKED = 1;
+        STATE_RUNNING_UNLOCKING = 2;
+        STATE_RUNNING_UNLOCKED = 3;
+        STATE_STOPPING = 4;
+        STATE_SHUTDOWN = 5;
+    }
+    optional State state = 1;
+    optional bool switching = 2;
 }
 
 // sync with com.android.server.am.UserController.java
 message UserControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  message User {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 id = 1;
-    optional UserStateProto state = 2;
-  }
-  repeated User started_users = 1;
-  repeated int32 started_user_array = 2;
-  repeated int32 user_lru = 3;
+    message User {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  message UserProfile {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+        optional int32 id = 1;
+        optional UserStateProto state = 2;
+    }
+    repeated User started_users = 1;
+    repeated int32 started_user_array = 2;
+    repeated int32 user_lru = 3;
 
-    optional int32 user = 1;
-    optional int32 profile = 2;
-  }
-  repeated UserProfile user_profile_group_ids = 4;
+    message UserProfile {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 user = 1;
+        optional int32 profile = 2;
+    }
+    repeated UserProfile user_profile_group_ids = 4;
 }
 
 // sync with com.android.server.am.AppTimeTracker.java
 message AppTimeTrackerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional string receiver = 1;
-  optional int64 total_duration_ms = 2;
-
-  message PackageTime {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional string package = 1;
-    optional int64 duration_ms = 2;
-  }
-  repeated PackageTime package_times = 3;
+    optional string receiver = 1;
+    optional int64 total_duration_ms = 2;
 
-  optional .android.util.Duration started_time = 4;
-  optional string started_package = 5;
+    message PackageTime {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional string package = 1;
+        optional int64 duration_ms = 2;
+    }
+    repeated PackageTime package_times = 3;
+
+    optional .android.util.Duration started_time = 4;
+    optional string started_package = 5;
 }
diff --git a/core/proto/android/server/alarmmanagerservice.proto b/core/proto/android/server/alarmmanagerservice.proto
index 53e3ba9..eef78d1 100644
--- a/core/proto/android/server/alarmmanagerservice.proto
+++ b/core/proto/android/server/alarmmanagerservice.proto
@@ -29,254 +29,254 @@
 
 // next ID: 43
 message AlarmManagerServiceDumpProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  optional int64 current_time = 1;
-  optional int64 elapsed_realtime = 2;
-  optional int64 last_time_change_clock_time = 3;
-  optional int64 last_time_change_realtime = 4;
-  // Current settings
-  optional ConstantsProto settings = 5;
-
-  // Dump from ForceAppStandbyTracker.
-  optional ForceAppStandbyTrackerProto force_app_standby_tracker = 6;
-
-  optional bool is_interactive = 7;
-  // Only valid if is_interactive is false.
-  optional int64 time_since_non_interactive_ms = 8;
-  // Only valid if is_interactive is false.
-  optional int64 max_wakeup_delay_ms = 9;
-  // Only valid if is_interactive is false.
-  optional int64 time_since_last_dispatch_ms = 10;
-  // Only valid if is_interactive is false.
-  optional int64 time_until_next_non_wakeup_delivery_ms = 11;
-
-  // Can be negative if the non-wakeup alarm time is in the past (non-wakeup
-  // alarms aren't delivered unil the next time the device wakes up).
-  optional int64 time_until_next_non_wakeup_alarm_ms = 12;
-  optional int64 time_until_next_wakeup_ms = 13;
-  optional int64 time_since_last_wakeup_ms = 14;
-  // Time since the last wakeup was set.
-  optional int64 time_since_last_wakeup_set_ms = 15;
-  optional int64 time_change_event_count = 16;
-  // The current set of user whitelisted apps for device idle mode, meaning
-  // these are allowed to freely schedule alarms. These are app IDs, not UIDs.
-  repeated int32 device_idle_user_whitelist_app_ids = 17;
-
-  repeated AlarmClockMetadataProto next_alarm_clock_metadata = 18;
-
-  repeated BatchProto pending_alarm_batches = 19;
-
-  // List of alarms per uid deferred due to user applied background restrictions
-  // on the source app.
-  repeated AlarmProto pending_user_blocked_background_alarms = 20;
-
-  // When idling mode will end. Will be empty if the device is not currently
-  // idling.
-  optional AlarmProto pending_idle_until = 21;
-
-  // Any alarms that we don't want to run during idle mode. Will be empty if the
-  // device is not currently idling.
-  repeated AlarmProto pending_while_idle_alarms = 22;
-
-  // This is a special alarm that will put the system into idle until it goes
-  // off. The caller has given the time they want this to happen at.
-  optional AlarmProto next_wake_from_idle = 23;
-
-  repeated AlarmProto past_due_non_wakeup_alarms = 24;
-
-  // Number of delayed alarms.
-  optional int32 delayed_alarm_count = 25;
-  // The total amount of time alarms had been delayed. Overlapping alarms are
-  // only counted once (ie. If two alarms were meant to trigger at the same time
-  // but were delayed by 5 seconds, the total time would be 5 seconds).
-  optional int64 total_delay_time_ms = 26;
-  optional int64 max_delay_duration_ms = 27;
-  optional int64 max_non_interactive_duration_ms = 28;
-
-  optional int32 broadcast_ref_count = 29;
-  // Canonical count of (operation.send() - onSendFinished()) and listener
-  // send/complete/timeout invocations.
-  optional int32 pending_intent_send_count = 30;
-  optional int32 pending_intent_finish_count = 31;
-  optional int32 listener_send_count = 32;
-  optional int32 listener_finish_count = 33;
-
-  repeated InFlightProto outstanding_deliveries = 34;
-
-  message LastAllowWhileIdleDispatch {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 uid = 1;
-    // In the 'elapsed' timebase.
-    optional int64 time_ms = 2;
+    optional int64 current_time = 1;
+    optional int64 elapsed_realtime = 2;
+    optional int64 last_time_change_clock_time = 3;
+    optional int64 last_time_change_realtime = 4;
+    // Current settings
+    optional ConstantsProto settings = 5;
 
-    // Time when the next while-idle is allowed, in the 'elapsed' timebase.
-    optional int64 next_allowed_ms = 3;
-  }
+    // Dump from ForceAppStandbyTracker.
+    optional ForceAppStandbyTrackerProto force_app_standby_tracker = 6;
 
-  // Whether the short or long while-idle timeout should be used for each UID.
-  repeated int32 use_allow_while_idle_short_time = 35;
+    optional bool is_interactive = 7;
+    // Only valid if is_interactive is false.
+    optional int64 time_since_non_interactive_ms = 8;
+    // Only valid if is_interactive is false.
+    optional int64 max_wakeup_delay_ms = 9;
+    // Only valid if is_interactive is false.
+    optional int64 time_since_last_dispatch_ms = 10;
+    // Only valid if is_interactive is false.
+    optional int64 time_until_next_non_wakeup_delivery_ms = 11;
 
-  // For each uid, this is the last time we dispatched an "allow while idle"
-  // alarm, used to determine the earliest we can dispatch the next such alarm.
-  repeated LastAllowWhileIdleDispatch last_allow_while_idle_dispatch_times = 36;
+    // Can be negative if the non-wakeup alarm time is in the past (non-wakeup
+    // alarms aren't delivered unil the next time the device wakes up).
+    optional int64 time_until_next_non_wakeup_alarm_ms = 12;
+    optional int64 time_until_next_wakeup_ms = 13;
+    optional int64 time_since_last_wakeup_ms = 14;
+    // Time since the last wakeup was set.
+    optional int64 time_since_last_wakeup_set_ms = 15;
+    optional int64 time_change_event_count = 16;
+    // The current set of user whitelisted apps for device idle mode, meaning
+    // these are allowed to freely schedule alarms. These are app IDs, not UIDs.
+    repeated int32 device_idle_user_whitelist_app_ids = 17;
 
-  optional com.android.internal.util.LocalLogProto recent_problems = 37;
+    repeated AlarmClockMetadataProto next_alarm_clock_metadata = 18;
 
-  message TopAlarm {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    repeated BatchProto pending_alarm_batches = 19;
 
-    optional int32 uid = 1;
-    optional string package_name = 2;
-    optional FilterStatsProto filter = 3;
-  }
-  repeated TopAlarm top_alarms = 38;
+    // List of alarms per uid deferred due to user applied background restrictions
+    // on the source app.
+    repeated AlarmProto pending_user_blocked_background_alarms = 20;
 
-  message AlarmStat {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    // When idling mode will end. Will be empty if the device is not currently
+    // idling.
+    optional AlarmProto pending_idle_until = 21;
 
-    optional BroadcastStatsProto broadcast = 1;
-    repeated FilterStatsProto filters = 2;
-  }
-  repeated AlarmStat alarm_stats = 39;
+    // Any alarms that we don't want to run during idle mode. Will be empty if the
+    // device is not currently idling.
+    repeated AlarmProto pending_while_idle_alarms = 22;
 
-  repeated IdleDispatchEntryProto allow_while_idle_dispatches = 40;
-  repeated WakeupEventProto recent_wakeup_history = 41;
+    // This is a special alarm that will put the system into idle until it goes
+    // off. The caller has given the time they want this to happen at.
+    optional AlarmProto next_wake_from_idle = 23;
+
+    repeated AlarmProto past_due_non_wakeup_alarms = 24;
+
+    // Number of delayed alarms.
+    optional int32 delayed_alarm_count = 25;
+    // The total amount of time alarms had been delayed. Overlapping alarms are
+    // only counted once (ie. If two alarms were meant to trigger at the same time
+    // but were delayed by 5 seconds, the total time would be 5 seconds).
+    optional int64 total_delay_time_ms = 26;
+    optional int64 max_delay_duration_ms = 27;
+    optional int64 max_non_interactive_duration_ms = 28;
+
+    optional int32 broadcast_ref_count = 29;
+    // Canonical count of (operation.send() - onSendFinished()) and listener
+    // send/complete/timeout invocations.
+    optional int32 pending_intent_send_count = 30;
+    optional int32 pending_intent_finish_count = 31;
+    optional int32 listener_send_count = 32;
+    optional int32 listener_finish_count = 33;
+
+    repeated InFlightProto outstanding_deliveries = 34;
+
+    message LastAllowWhileIdleDispatch {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 uid = 1;
+        // In the 'elapsed' timebase.
+        optional int64 time_ms = 2;
+
+        // Time when the next while-idle is allowed, in the 'elapsed' timebase.
+        optional int64 next_allowed_ms = 3;
+    }
+
+    // Whether the short or long while-idle timeout should be used for each UID.
+    repeated int32 use_allow_while_idle_short_time = 35;
+
+    // For each uid, this is the last time we dispatched an "allow while idle"
+    // alarm, used to determine the earliest we can dispatch the next such alarm.
+    repeated LastAllowWhileIdleDispatch last_allow_while_idle_dispatch_times = 36;
+
+    optional com.android.internal.util.LocalLogProto recent_problems = 37;
+
+    message TopAlarm {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 uid = 1;
+        optional string package_name = 2;
+        optional FilterStatsProto filter = 3;
+    }
+    repeated TopAlarm top_alarms = 38;
+
+    message AlarmStat {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional BroadcastStatsProto broadcast = 1;
+        repeated FilterStatsProto filters = 2;
+    }
+    repeated AlarmStat alarm_stats = 39;
+
+    repeated IdleDispatchEntryProto allow_while_idle_dispatches = 40;
+    repeated WakeupEventProto recent_wakeup_history = 41;
 }
 
 // This is a soft wrapper for alarm clock information. It is not representative
 // of an android.app.AlarmManager.AlarmClockInfo object.
 message AlarmClockMetadataProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 user = 1;
-  optional bool is_pending_send = 2;
-  // This value is UTC wall clock time in milliseconds, as returned by
-  // System#currentTimeMillis() for example.
-  optional int64 trigger_time_ms = 3;
+    optional int32 user = 1;
+    optional bool is_pending_send = 2;
+    // This value is UTC wall clock time in milliseconds, as returned by
+    // System#currentTimeMillis() for example.
+    optional int64 trigger_time_ms = 3;
 }
 
 // A com.android.server.AlarmManagerService.Alarm object.
 message AlarmProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  optional .android.app.AlarmManagerProto.AlarmType type = 2;
-  // How long until the alarm goes off, in the 'elapsed' timebase. Can be
-  // negative if 'when' is in the past.
-  optional int64 time_until_when_elapsed_ms = 3;
-  optional int64 window_length_ms = 4;
-  optional int64 repeat_interval_ms = 5;
-  optional int32 count = 6;
-  optional int32 flags = 7;
-  optional .android.app.AlarmClockInfoProto alarm_clock = 8;
-  optional .android.app.PendingIntentProto operation = 9;
-  optional string listener = 10 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional .android.app.AlarmManagerProto.AlarmType type = 2;
+    // How long until the alarm goes off, in the 'elapsed' timebase. Can be
+    // negative if 'when' is in the past.
+    optional int64 time_until_when_elapsed_ms = 3;
+    optional int64 window_length_ms = 4;
+    optional int64 repeat_interval_ms = 5;
+    optional int32 count = 6;
+    optional int32 flags = 7;
+    optional .android.app.AlarmClockInfoProto alarm_clock = 8;
+    optional .android.app.PendingIntentProto operation = 9;
+    optional string listener = 10 [ (.android.privacy).dest = DEST_EXPLICIT ];
 }
 
 // A com.android.server.AlarmManagerService.Batch object.
 message BatchProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // Start time in terms of elapsed realtime.
-  optional int64 start_realtime = 1;
-  // End time in terms of elapsed realtime.
-  optional int64 end_realtime = 2;
-  optional int32 flags = 3;
-  repeated AlarmProto alarms = 4;
+    // Start time in terms of elapsed realtime.
+    optional int64 start_realtime = 1;
+    // End time in terms of elapsed realtime.
+    optional int64 end_realtime = 2;
+    optional int32 flags = 3;
+    repeated AlarmProto alarms = 4;
 }
 
 // A com.android.server.AlarmManagerService.BroadcastStats object.
 message BroadcastStatsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 uid = 1;
-  optional string package_name = 2;
-  // The total amount of time this broadcast was in flight.
-  optional int64 total_flight_duration_ms = 3;
-  optional int32 count = 4;
-  optional int32 wakeup_count = 5;
-  // The last time this first became active (when nesting changed from 0 to 1)
-  // in terms of elapsed realtime.
-  optional int64 start_time_realtime = 6;
-  // The broadcast is active if nesting > 0.
-  optional int32 nesting = 7;
+    optional int32 uid = 1;
+    optional string package_name = 2;
+    // The total amount of time this broadcast was in flight.
+    optional int64 total_flight_duration_ms = 3;
+    optional int32 count = 4;
+    optional int32 wakeup_count = 5;
+    // The last time this first became active (when nesting changed from 0 to 1)
+    // in terms of elapsed realtime.
+    optional int64 start_time_realtime = 6;
+    // The broadcast is active if nesting > 0.
+    optional int32 nesting = 7;
 }
 
 // A com.android.server.AlarmManagerService.Constants object.
 message ConstantsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  // Minimum futurity of a new alarm.
-  optional int64 min_futurity_duration_ms = 1;
-  // Minimum alarm recurrence interval.
-  optional int64 min_interval_duration_ms = 2;
-  // Direct alarm listener callback timeout.
-  optional int64 listener_timeout_duration_ms = 3;
-  // Minimum time between ALLOW_WHILE_IDLE alarms when system is not idle.
-  optional int64 allow_while_idle_short_duration_ms = 4;
-  // Minimum time between ALLOW_WHILE_IDLE alarms when system is idling.
-  optional int64 allow_while_idle_long_duration_ms = 5;
-  // BroadcastOptions.setTemporaryAppWhitelistDuration() to use for FLAG_ALLOW_WHILE_IDLE.
-  optional int64 allow_while_idle_whitelist_duration_ms = 6;
-  // Maximum alarm recurrence interval.
-  optional int64 max_interval_duration_ms = 7;
+    // Minimum futurity of a new alarm.
+    optional int64 min_futurity_duration_ms = 1;
+    // Minimum alarm recurrence interval.
+    optional int64 min_interval_duration_ms = 2;
+    // Direct alarm listener callback timeout.
+    optional int64 listener_timeout_duration_ms = 3;
+    // Minimum time between ALLOW_WHILE_IDLE alarms when system is not idle.
+    optional int64 allow_while_idle_short_duration_ms = 4;
+    // Minimum time between ALLOW_WHILE_IDLE alarms when system is idling.
+    optional int64 allow_while_idle_long_duration_ms = 5;
+    // BroadcastOptions.setTemporaryAppWhitelistDuration() to use for FLAG_ALLOW_WHILE_IDLE.
+    optional int64 allow_while_idle_whitelist_duration_ms = 6;
+    // Maximum alarm recurrence interval.
+    optional int64 max_interval_duration_ms = 7;
 }
 
 // A com.android.server.AlarmManagerService.FilterStats object.
 message FilterStatsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  // The last time this filter when in flight, in terms of elapsed realtime.
-  optional int64 last_flight_time_realtime = 2;
-  // The total amount of time this filter was in flight.
-  optional int64 total_flight_duration_ms = 3;
-  optional int32 count = 4;
-  optional int32 wakeup_count = 5;
-  // The last time this first became active (when nesting changed from 0 to 1)
-  // in terms of elapsed realtime.
-  optional int64 start_time_realtime = 6;
-  // The filter is active if nesting > 0.
-  optional int32 nesting = 7;
+    optional string tag = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    // The last time this filter when in flight, in terms of elapsed realtime.
+    optional int64 last_flight_time_realtime = 2;
+    // The total amount of time this filter was in flight.
+    optional int64 total_flight_duration_ms = 3;
+    optional int32 count = 4;
+    optional int32 wakeup_count = 5;
+    // The last time this first became active (when nesting changed from 0 to 1)
+    // in terms of elapsed realtime.
+    optional int64 start_time_realtime = 6;
+    // The filter is active if nesting > 0.
+    optional int32 nesting = 7;
 }
 
 // A com.android.server.AlarmManagerService.IdleDispatchEntry object.
 message IdleDispatchEntryProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 uid = 1;
-  optional string pkg = 2;
-  optional string tag = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  optional string op = 4;
-  // Time when this entry was created, in terms of elapsed realtime.
-  optional int64 entry_creation_realtime = 5;
-  // For a RESCHEDULED op, this is the last time we dispatched an "allow while
-  // idle" alarm for the UID. For a SET op, this is when the alarm was
-  // triggered. Times are in the 'elapsed' timebase.
-  optional int64 arg_realtime = 6;
+    optional int32 uid = 1;
+    optional string pkg = 2;
+    optional string tag = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional string op = 4;
+    // Time when this entry was created, in terms of elapsed realtime.
+    optional int64 entry_creation_realtime = 5;
+    // For a RESCHEDULED op, this is the last time we dispatched an "allow while
+    // idle" alarm for the UID. For a SET op, this is when the alarm was
+    // triggered. Times are in the 'elapsed' timebase.
+    optional int64 arg_realtime = 6;
 }
 
 // A com.android.server.AlarmManagerService.InFlight object.
 message InFlightProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 uid = 1;
-  optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  optional int64 when_elapsed_ms = 3;
-  optional .android.app.AlarmManagerProto.AlarmType alarm_type = 4;
-  optional .android.app.PendingIntentProto pending_intent = 5;
-  optional BroadcastStatsProto broadcast_stats = 6;
-  optional FilterStatsProto filter_stats = 7;
-  optional .android.os.WorkSourceProto work_source = 8;
+    optional int32 uid = 1;
+    optional string tag = 2 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional int64 when_elapsed_ms = 3;
+    optional .android.app.AlarmManagerProto.AlarmType alarm_type = 4;
+    optional .android.app.PendingIntentProto pending_intent = 5;
+    optional BroadcastStatsProto broadcast_stats = 6;
+    optional FilterStatsProto filter_stats = 7;
+    optional .android.os.WorkSourceProto work_source = 8;
 }
 
 // A com.android.server.AlarmManagerService.WakeupEvent object.
 message WakeupEventProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 uid = 1;
-  optional string action = 2;
-  optional int64 when = 3;
+    optional int32 uid = 1;
+    optional string action = 2;
+    optional int64 when = 3;
 }
diff --git a/core/proto/android/server/animationadapter.proto b/core/proto/android/server/animationadapter.proto
index 9bfa794..0bcc488 100644
--- a/core/proto/android/server/animationadapter.proto
+++ b/core/proto/android/server/animationadapter.proto
@@ -24,55 +24,55 @@
 option java_multiple_files = true;
 
 message AnimationAdapterProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional LocalAnimationAdapterProto local = 1;
-  optional RemoteAnimationAdapterWrapperProto remote = 2;
+    optional LocalAnimationAdapterProto local = 1;
+    optional RemoteAnimationAdapterWrapperProto remote = 2;
 }
 
 /* represents RemoteAnimationAdapterWrapper */
 message RemoteAnimationAdapterWrapperProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.view.RemoteAnimationTargetProto target = 1;
+    optional .android.view.RemoteAnimationTargetProto target = 1;
 }
 
 /* represents LocalAnimationAdapter */
 message LocalAnimationAdapterProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional AnimationSpecProto animation_spec = 1;
+    optional AnimationSpecProto animation_spec = 1;
 }
 
 message AnimationSpecProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowAnimationSpecProto window = 1;
-  optional MoveAnimationSpecProto move = 2;
-  optional AlphaAnimationSpecProto alpha = 3;
+    optional WindowAnimationSpecProto window = 1;
+    optional MoveAnimationSpecProto move = 2;
+    optional AlphaAnimationSpecProto alpha = 3;
 }
 
 /* represents WindowAnimationSpec */
 message WindowAnimationSpecProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional string animation = 1;
+    optional string animation = 1;
 }
 
 /* represents MoveAnimationSpec*/
 message MoveAnimationSpecProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.PointProto from = 1;
-  optional .android.graphics.PointProto to = 2;
-  optional int64 duration = 3;
+    optional .android.graphics.PointProto from = 1;
+    optional .android.graphics.PointProto to = 2;
+    optional int64 duration_ms = 3;
 }
 
 /* represents AlphaAnimationSpec */
 message AlphaAnimationSpecProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional float from = 1;
-  optional float to = 2;
-  optional int64 duration = 3;
-}
\ No newline at end of file
+    optional float from = 1;
+    optional float to = 2;
+    optional int64 duration_ms = 3;
+}
diff --git a/core/proto/android/server/appwindowthumbnail.proto b/core/proto/android/server/appwindowthumbnail.proto
index 54ad193..a1be721 100644
--- a/core/proto/android/server/appwindowthumbnail.proto
+++ b/core/proto/android/server/appwindowthumbnail.proto
@@ -26,9 +26,9 @@
  * Represents a {@link com.android.server.wm.AppWindowThumbnail} object.
  */
 message AppWindowThumbnailProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 width = 1;
-  optional int32 height = 2;
-  optional SurfaceAnimatorProto surface_animator = 3;
-}
\ No newline at end of file
+    optional int32 width = 1;
+    optional int32 height = 2;
+    optional SurfaceAnimatorProto surface_animator = 3;
+}
diff --git a/core/proto/android/server/forceappstandbytracker.proto b/core/proto/android/server/forceappstandbytracker.proto
index 5296e47..1113d6a 100644
--- a/core/proto/android/server/forceappstandbytracker.proto
+++ b/core/proto/android/server/forceappstandbytracker.proto
@@ -27,51 +27,51 @@
 //
 // Next ID: 12
 message ForceAppStandbyTrackerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  // Whether all apps are forced standby or not.
-  optional bool force_all_apps_standby = 1;
-
-  // UIDs currently active.
-  repeated int32 active_uids = 2;
-
-  // UIDs currently in the foreground.
-  repeated int32 foreground_uids = 11;
-
-  // App ids that are in power-save whitelist.
-  repeated int32 power_save_whitelist_app_ids = 3;
-
-  // App ids that are in temporary power-save whitelist.
-  repeated int32 temp_power_save_whitelist_app_ids = 4;
-
-  message RunAnyInBackgroundRestrictedPackages {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 uid = 1;
-    optional string package_name = 2;
-  }
-  // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
-  repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5;
+    // Whether all apps are forced standby or not.
+    optional bool force_all_apps_standby = 1;
 
-  // Whether device is a small battery device
-  optional bool is_small_battery_device = 6;
+    // UIDs currently active.
+    repeated int32 active_uids = 2;
 
-  // Whether force app standby for small battery device setting is enabled
-  optional bool force_all_apps_standby_for_small_battery = 7;
+    // UIDs currently in the foreground.
+    repeated int32 foreground_uids = 11;
 
-  // Whether device is plugged in to the charger
-  optional bool is_plugged_in = 8;
+    // App ids that are in power-save whitelist.
+    repeated int32 power_save_whitelist_app_ids = 3;
 
-  // Performance stats.
-  optional StatLoggerProto stats = 9;
+    // App ids that are in temporary power-save whitelist.
+    repeated int32 temp_power_save_whitelist_app_ids = 4;
 
-  message ExemptedPackage {
-    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    message RunAnyInBackgroundRestrictedPackages {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 userId = 1;
-    optional string package_name = 2;
-  }
+        optional int32 uid = 1;
+        optional string package_name = 2;
+    }
+    // Packages that are disallowed OP_RUN_ANY_IN_BACKGROUND.
+    repeated RunAnyInBackgroundRestrictedPackages run_any_in_background_restricted_packages = 5;
 
-  // Packages that are in the EXEMPT bucket.
-  repeated ExemptedPackage exempted_packages = 10;
+    // Whether device is a small battery device
+    optional bool is_small_battery_device = 6;
+
+    // Whether force app standby for small battery device setting is enabled
+    optional bool force_all_apps_standby_for_small_battery = 7;
+
+    // Whether device is plugged in to the charger
+    optional bool is_plugged_in = 8;
+
+    // Performance stats.
+    optional StatLoggerProto stats = 9;
+
+    message ExemptedPackage {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+        optional int32 userId = 1;
+        optional string package_name = 2;
+    }
+
+    // Packages that are in the EXEMPT bucket.
+    repeated ExemptedPackage exempted_packages = 10;
 }
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 4df3b63..0a10cec 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -219,23 +219,6 @@
 message StateControllerProto {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    message AppIdleController {
-        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-        optional bool is_parole_on = 1;
-
-        message TrackedJob {
-            option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-            optional JobStatusShortInfoProto info = 1;
-            optional int32 source_uid = 2;
-            optional string source_package_name = 3;
-            // If the constraints are satisfied, then the controller will mark
-            // the job as RUNNABLE, otherwise, it will be WAITING.
-            optional bool are_constraints_satisfied = 4;
-        }
-        repeated TrackedJob tracked_jobs = 2;
-    }
     message BackgroundJobsController {
         option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
@@ -413,15 +396,14 @@
         repeated TrackedJob tracked_jobs = 4;
     }
     oneof controller {
-        AppIdleController app_idle = 1;
-        BackgroundJobsController background = 2;
-        BatteryController battery = 3;
-        ConnectivityController connectivity = 4;
-        ContentObserverController content_observer = 5;
-        DeviceIdleJobsController device_idle = 6;
-        IdleController idle = 7;
-        StorageController storage = 8;
-        TimeController time = 9;
+        BackgroundJobsController background = 1;
+        BatteryController battery = 2;
+        ConnectivityController connectivity = 3;
+        ContentObserverController content_observer = 4;
+        DeviceIdleJobsController device_idle = 5;
+        IdleController idle = 6;
+        StorageController storage = 7;
+        TimeController time = 8;
     }
 }
 
@@ -618,8 +600,8 @@
         CONSTRAINT_DEADLINE = 5;
         CONSTRAINT_IDLE = 6;
         CONSTRAINT_CONNECTIVITY = 7;
-        CONSTRAINT_CONTENT_TRIGGER = 9;
-        CONSTRAINT_DEVICE_NOT_DOZING = 10;
+        CONSTRAINT_CONTENT_TRIGGER = 8;
+        CONSTRAINT_DEVICE_NOT_DOZING = 9;
     }
     repeated Constraint required_constraints = 7;
     repeated Constraint satisfied_constraints = 8;
diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto
index eb60942..cee556a 100644
--- a/core/proto/android/server/powermanagerservice.proto
+++ b/core/proto/android/server/powermanagerservice.proto
@@ -313,36 +313,41 @@
 }
 
 message BatterySaverStateMachineProto {
-   // Whether battery saver is enabled.
-   optional bool enabled = 1;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-   // Whether system has booted.
-   optional bool boot_completed = 2;
+    // Whether battery saver is enabled.
+    optional bool enabled = 1;
 
-   // Whether settings have been loaded already.
-   optional bool settings_loaded = 3;
+    // Whether system has booted.
+    optional bool boot_completed = 2;
 
-   // Whether battery status has been set at least once.
-   optional bool battery_status_set = 4;
+    // Whether settings have been loaded already.
+    optional bool settings_loaded = 3;
 
-   // Whether automatic battery saver has been canceled by the user.
-   optional bool battery_saver_snoozing = 5;
+    // Whether battery status has been set at least once.
+    optional bool battery_status_set = 4;
 
-   // Whether the device is connected to any power source.
-   optional bool is_powered = 6;
+    // Whether automatic battery saver has been canceled by the user.
+    optional bool battery_saver_snoozing = 5;
 
-   // Current battery level in %, 0-100.
-   optional int32 battery_level = 7;
+    // Whether the device is connected to any power source.
+    optional bool is_powered = 6;
 
-   // Whether battery level is low or not.
-   optional bool is_battery_level_low = 8;
+    // Current battery level in %, 0-100.
+    optional int32 battery_level = 7;
 
-   // The value of Global.LOW_POWER_MODE.
-   optional bool setting_battery_saver_enabled = 9;
+    // Whether battery level is low or not.
+    optional bool is_battery_level_low = 8;
 
-   // The value of Global.LOW_POWER_MODE_STICKY.
-   optional bool setting_battery_saver_enabled_sticky = 10;
+    // The value of Global.LOW_POWER_MODE. This is a cached value, so it could
+    // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+    optional bool setting_battery_saver_enabled = 9;
 
-   // The value of Global.LOW_POWER_MODE_TRIGGER_LEVEL.
-   optional int32 setting_battery_saver_trigger_threshold = 11;
-}
\ No newline at end of file
+    // The value of Global.LOW_POWER_MODE_STICKY. This is a cached value, so it could
+    // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+    optional bool setting_battery_saver_enabled_sticky = 10;
+
+    // The value of Global.LOW_POWER_MODE_TRIGGER_LEVEL. This is a cached value, so it could
+    // be slightly different from what's in GlobalSettingsProto.LowPowerMode.
+    optional int32 setting_battery_saver_trigger_threshold = 11;
+}
diff --git a/core/proto/android/server/statlogger.proto b/core/proto/android/server/statlogger.proto
index 2b7daea..46badc4 100644
--- a/core/proto/android/server/statlogger.proto
+++ b/core/proto/android/server/statlogger.proto
@@ -24,17 +24,17 @@
 
 // Dump from StatLogger.
 message StatLoggerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
-
-  message Event {
     option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-    optional int32 eventId = 1;
-    // Labels are hard-coded in Android framework code.
-    optional string label = 2;
-    optional int32 count = 3;
-    optional int64 total_duration_micros = 4;
-  }
+    message Event {
+        option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  repeated Event events = 1;
+        optional int32 eventId = 1;
+        // Labels are hard-coded in Android framework code.
+        optional string label = 2;
+        optional int32 count = 3;
+        optional int64 total_duration_micros = 4;
+    }
+
+    repeated Event events = 1;
 }
diff --git a/core/proto/android/server/surfaceanimator.proto b/core/proto/android/server/surfaceanimator.proto
index 84560bc..e3e8baa 100644
--- a/core/proto/android/server/surfaceanimator.proto
+++ b/core/proto/android/server/surfaceanimator.proto
@@ -27,10 +27,9 @@
  * Represents a {@link com.android.server.wm.SurfaceAnimator} object.
  */
 message SurfaceAnimatorProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  reserved 1; // Was string animation_adapter = 1
-  optional .android.view.SurfaceControlProto leash = 2;
-  optional bool animation_start_delayed = 3;
-  optional AnimationAdapterProto animation_adapter = 4;
-}
\ No newline at end of file
+    optional .android.view.SurfaceControlProto leash = 1;
+    optional bool animation_start_delayed = 2;
+    optional AnimationAdapterProto animation_adapter = 3;
+}
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index ee371c1..7467d8f 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -33,350 +33,350 @@
 option java_multiple_files = true;
 
 message WindowManagerServiceDumpProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowManagerPolicyProto policy = 1;
-  /* window hierarchy root */
-  optional RootWindowContainerProto root_window_container = 2;
-  optional IdentifierProto focused_window = 3;
-  optional string focused_app = 4;
-  optional IdentifierProto input_method_window = 5;
-  optional bool display_frozen = 6;
-  optional int32 rotation = 7;
-  optional int32 last_orientation = 8;
-  optional AppTransitionProto app_transition = 9;
+    optional WindowManagerPolicyProto policy = 1;
+    /* window hierarchy root */
+    optional RootWindowContainerProto root_window_container = 2;
+    optional IdentifierProto focused_window = 3;
+    optional string focused_app = 4;
+    optional IdentifierProto input_method_window = 5;
+    optional bool display_frozen = 6;
+    optional int32 rotation = 7;
+    optional int32 last_orientation = 8;
+    optional AppTransitionProto app_transition = 9;
 }
 
 /* represents DisplayContent */
 message RootWindowContainerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  repeated DisplayProto displays = 2;
-  /* window references in top down z order */
-  repeated IdentifierProto windows = 3;
+    optional WindowContainerProto window_container = 1;
+    repeated DisplayProto displays = 2;
+    /* window references in top down z order */
+    repeated IdentifierProto windows = 3;
 }
 
 message BarControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.app.StatusBarManagerProto.WindowState state = 1;
-  optional .android.app.StatusBarManagerProto.TransientWindowState transient_state = 2;
+    optional .android.app.StatusBarManagerProto.WindowState state = 1;
+    optional .android.app.StatusBarManagerProto.TransientWindowState transient_state = 2;
 }
 
 message WindowOrientationListenerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool enabled = 1;
-  optional .android.view.SurfaceProto.Rotation rotation = 2;
+    optional bool enabled = 1;
+    optional .android.view.SurfaceProto.Rotation rotation = 2;
 }
 
 message KeyguardServiceDelegateProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool showing = 1;
-  optional bool occluded = 2;
-  optional bool secure = 3;
-  enum ScreenState {
-    SCREEN_STATE_OFF = 0;
-    SCREEN_STATE_TURNING_ON = 1;
-    SCREEN_STATE_ON = 2;
-    SCREEN_STATE_TURNING_OFF = 3;
-  }
-  optional ScreenState screen_state = 4;
-  enum InteractiveState {
-    INTERACTIVE_STATE_SLEEP = 0;
-    INTERACTIVE_STATE_WAKING = 1;
-    INTERACTIVE_STATE_AWAKE = 2;
-    INTERACTIVE_STATE_GOING_TO_SLEEP = 3;
-  }
-  optional InteractiveState interactive_state = 5;
+    optional bool showing = 1;
+    optional bool occluded = 2;
+    optional bool secure = 3;
+    enum ScreenState {
+        SCREEN_STATE_OFF = 0;
+        SCREEN_STATE_TURNING_ON = 1;
+        SCREEN_STATE_ON = 2;
+        SCREEN_STATE_TURNING_OFF = 3;
+    }
+    optional ScreenState screen_state = 4;
+    enum InteractiveState {
+        INTERACTIVE_STATE_SLEEP = 0;
+        INTERACTIVE_STATE_WAKING = 1;
+        INTERACTIVE_STATE_AWAKE = 2;
+        INTERACTIVE_STATE_GOING_TO_SLEEP = 3;
+    }
+    optional InteractiveState interactive_state = 5;
 }
 
 /* represents PhoneWindowManager */
 message WindowManagerPolicyProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 last_system_ui_flags = 1;
-  enum UserRotationMode {
-    USER_ROTATION_FREE = 0;
-    USER_ROTATION_LOCKED = 1;
-  }
-  optional UserRotationMode rotation_mode = 2;
-  optional .android.view.SurfaceProto.Rotation rotation = 3;
-  optional .android.content.ActivityInfoProto.ScreenOrientation orientation = 4;
-  optional bool screen_on_fully = 5;
-  optional bool keyguard_draw_complete = 6;
-  optional bool window_manager_draw_complete = 7;
-  optional string focused_app_token = 8;
-  optional IdentifierProto focused_window = 9;
-  optional IdentifierProto top_fullscreen_opaque_window = 10;
-  optional IdentifierProto top_fullscreen_opaque_or_dimming_window = 11;
-  optional bool keyguard_occluded = 12;
-  optional bool keyguard_occluded_changed = 13;
-  optional bool keyguard_occluded_pending = 14;
-  optional bool force_status_bar = 15;
-  optional bool force_status_bar_from_keyguard = 16;
-  optional BarControllerProto status_bar = 17;
-  optional BarControllerProto navigation_bar = 18;
-  optional WindowOrientationListenerProto orientation_listener = 19;
-  optional KeyguardServiceDelegateProto keyguard_delegate = 20;
+    optional int32 last_system_ui_flags = 1;
+    enum UserRotationMode {
+        USER_ROTATION_FREE = 0;
+        USER_ROTATION_LOCKED = 1;
+    }
+    optional UserRotationMode rotation_mode = 2;
+    optional .android.view.SurfaceProto.Rotation rotation = 3;
+    optional .android.content.ActivityInfoProto.ScreenOrientation orientation = 4;
+    optional bool screen_on_fully = 5;
+    optional bool keyguard_draw_complete = 6;
+    optional bool window_manager_draw_complete = 7;
+    optional string focused_app_token = 8;
+    optional IdentifierProto focused_window = 9;
+    optional IdentifierProto top_fullscreen_opaque_window = 10;
+    optional IdentifierProto top_fullscreen_opaque_or_dimming_window = 11;
+    optional bool keyguard_occluded = 12;
+    optional bool keyguard_occluded_changed = 13;
+    optional bool keyguard_occluded_pending = 14;
+    optional bool force_status_bar = 15;
+    optional bool force_status_bar_from_keyguard = 16;
+    optional BarControllerProto status_bar = 17;
+    optional BarControllerProto navigation_bar = 18;
+    optional WindowOrientationListenerProto orientation_listener = 19;
+    optional KeyguardServiceDelegateProto keyguard_delegate = 20;
 }
 
 /* represents AppTransition */
 message AppTransitionProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  enum AppState {
-    APP_STATE_IDLE = 0;
-    APP_STATE_READY = 1;
-    APP_STATE_RUNNING = 2;
-    APP_STATE_TIMEOUT = 3;
-  }
-  optional AppState app_transition_state = 1;
-  /* definitions for constants found in {@link com.android.server.wm.AppTransition} */
-  enum TransitionType {
-    TRANSIT_NONE = 0;
-    TRANSIT_UNSET = -1;
-    TRANSIT_ACTIVITY_OPEN = 6;
-    TRANSIT_ACTIVITY_CLOSE = 7;
-    TRANSIT_TASK_OPEN = 8;
-    TRANSIT_TASK_CLOSE = 9;
-    TRANSIT_TASK_TO_FRONT = 10;
-    TRANSIT_TASK_TO_BACK = 11;
-    TRANSIT_WALLPAPER_CLOSE = 12;
-    TRANSIT_WALLPAPER_OPEN = 13;
-    TRANSIT_WALLPAPER_INTRA_OPEN = 14;
-    TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
-    TRANSIT_TASK_OPEN_BEHIND = 16;
-    TRANSIT_TASK_IN_PLACE = 17;
-    TRANSIT_ACTIVITY_RELAUNCH = 18;
-    TRANSIT_DOCK_TASK_FROM_RECENTS = 19;
-    TRANSIT_KEYGUARD_GOING_AWAY = 20;
-    TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
-    TRANSIT_KEYGUARD_OCCLUDE = 22;
-    TRANSIT_KEYGUARD_UNOCCLUDE = 23;
-    TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
-    TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
-  }
-  optional TransitionType last_used_app_transition = 2;
+    enum AppState {
+        APP_STATE_IDLE = 0;
+        APP_STATE_READY = 1;
+        APP_STATE_RUNNING = 2;
+        APP_STATE_TIMEOUT = 3;
+    }
+    optional AppState app_transition_state = 1;
+    /* definitions for constants found in {@link com.android.server.wm.AppTransition} */
+    enum TransitionType {
+        TRANSIT_NONE = 0;
+        TRANSIT_UNSET = -1;
+        TRANSIT_ACTIVITY_OPEN = 6;
+        TRANSIT_ACTIVITY_CLOSE = 7;
+        TRANSIT_TASK_OPEN = 8;
+        TRANSIT_TASK_CLOSE = 9;
+        TRANSIT_TASK_TO_FRONT = 10;
+        TRANSIT_TASK_TO_BACK = 11;
+        TRANSIT_WALLPAPER_CLOSE = 12;
+        TRANSIT_WALLPAPER_OPEN = 13;
+        TRANSIT_WALLPAPER_INTRA_OPEN = 14;
+        TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
+        TRANSIT_TASK_OPEN_BEHIND = 16;
+        TRANSIT_TASK_IN_PLACE = 17;
+        TRANSIT_ACTIVITY_RELAUNCH = 18;
+        TRANSIT_DOCK_TASK_FROM_RECENTS = 19;
+        TRANSIT_KEYGUARD_GOING_AWAY = 20;
+        TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
+        TRANSIT_KEYGUARD_OCCLUDE = 22;
+        TRANSIT_KEYGUARD_UNOCCLUDE = 23;
+        TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
+        TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
+    }
+    optional TransitionType last_used_app_transition = 2;
 }
 
 /* represents DisplayContent */
 message DisplayProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  optional int32 id = 2;
-  repeated StackProto stacks = 3;
-  optional DockedStackDividerControllerProto docked_stack_divider_controller = 4;
-  optional PinnedStackControllerProto pinned_stack_controller = 5;
-  /* non app windows */
-  repeated WindowTokenProto above_app_windows = 6;
-  repeated WindowTokenProto below_app_windows = 7;
-  repeated WindowTokenProto ime_windows = 8;
-  optional int32 dpi = 9;
-  optional .android.view.DisplayInfoProto display_info = 10;
-  optional int32 rotation = 11;
-  optional ScreenRotationAnimationProto screen_rotation_animation = 12;
-  optional DisplayFramesProto display_frames = 13;
+    optional WindowContainerProto window_container = 1;
+    optional int32 id = 2;
+    repeated StackProto stacks = 3;
+    optional DockedStackDividerControllerProto docked_stack_divider_controller = 4;
+    optional PinnedStackControllerProto pinned_stack_controller = 5;
+    /* non app windows */
+    repeated WindowTokenProto above_app_windows = 6;
+    repeated WindowTokenProto below_app_windows = 7;
+    repeated WindowTokenProto ime_windows = 8;
+    optional int32 dpi = 9;
+    optional .android.view.DisplayInfoProto display_info = 10;
+    optional int32 rotation = 11;
+    optional ScreenRotationAnimationProto screen_rotation_animation = 12;
+    optional DisplayFramesProto display_frames = 13;
 }
 
 /* represents DisplayFrames */
 message DisplayFramesProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.RectProto stable_bounds = 1;
+    optional .android.graphics.RectProto stable_bounds = 1;
 }
 
 /* represents DockedStackDividerController */
 message DockedStackDividerControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool minimized_dock = 1;
+    optional bool minimized_dock = 1;
 }
 
 /* represents PinnedStackController */
 message PinnedStackControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.RectProto default_bounds = 1;
-  optional .android.graphics.RectProto movement_bounds = 2;
+    optional .android.graphics.RectProto default_bounds = 1;
+    optional .android.graphics.RectProto movement_bounds = 2;
 }
 
 /* represents TaskStack */
 message StackProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  optional int32 id = 2;
-  repeated TaskProto tasks = 3;
-  optional bool fills_parent = 4;
-  optional .android.graphics.RectProto bounds = 5;
-  optional bool animation_background_surface_is_dimming = 6;
-  optional bool defer_removal = 7;
-  optional float minimize_amount = 8;
-  optional bool adjusted_for_ime = 9;
-  optional float adjust_ime_amount = 10;
-  optional float adjust_divider_amount = 11;
-  optional .android.graphics.RectProto adjusted_bounds = 12;
-  optional bool animating_bounds = 13;
+    optional WindowContainerProto window_container = 1;
+    optional int32 id = 2;
+    repeated TaskProto tasks = 3;
+    optional bool fills_parent = 4;
+    optional .android.graphics.RectProto bounds = 5;
+    optional bool animation_background_surface_is_dimming = 6;
+    optional bool defer_removal = 7;
+    optional float minimize_amount = 8;
+    optional bool adjusted_for_ime = 9;
+    optional float adjust_ime_amount = 10;
+    optional float adjust_divider_amount = 11;
+    optional .android.graphics.RectProto adjusted_bounds = 12;
+    optional bool animating_bounds = 13;
 }
 
 /* represents Task */
 message TaskProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  optional int32 id = 2;
-  repeated AppWindowTokenProto app_window_tokens = 3;
-  optional bool fills_parent = 4;
-  optional .android.graphics.RectProto bounds = 5;
-  optional .android.graphics.RectProto temp_inset_bounds = 6;
-  optional bool defer_removal = 7;
+    optional WindowContainerProto window_container = 1;
+    optional int32 id = 2;
+    repeated AppWindowTokenProto app_window_tokens = 3;
+    optional bool fills_parent = 4;
+    optional .android.graphics.RectProto bounds = 5;
+    optional .android.graphics.RectProto temp_inset_bounds = 6;
+    optional bool defer_removal = 7;
 }
 
 /* represents AppWindowToken */
 message AppWindowTokenProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  /* obtained from ActivityRecord */
-  optional string name = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
-  optional WindowTokenProto window_token = 2;
-  optional bool last_surface_showing = 3;
-  optional bool is_waiting_for_transition_start =  4;
-  optional bool is_really_animating = 5;
-  optional AppWindowThumbnailProto thumbnail = 6;
-  optional bool fills_parent = 7;
-  optional bool app_stopped = 8;
-  optional bool hidden_requested = 9;
-  optional bool client_hidden = 10;
-  optional bool defer_hiding_client = 11;
-  optional bool reported_drawn = 12;
-  optional bool reported_visible = 13;
-  optional int32 num_interesting_windows = 14;
-  optional int32 num_drawn_windows = 15;
-  optional bool all_drawn = 16;
-  optional bool last_all_drawn = 17;
-  optional bool removed = 18;
-  optional IdentifierProto starting_window = 19;
-  optional bool starting_displayed = 20;
-  optional bool starting_moved = 21;
-  optional bool hidden_set_from_transferred_starting_window = 22;
-  repeated .android.graphics.RectProto frozen_bounds = 23;
+    /* obtained from ActivityRecord */
+    optional string name = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional WindowTokenProto window_token = 2;
+    optional bool last_surface_showing = 3;
+    optional bool is_waiting_for_transition_start = 4;
+    optional bool is_really_animating = 5;
+    optional AppWindowThumbnailProto thumbnail = 6;
+    optional bool fills_parent = 7;
+    optional bool app_stopped = 8;
+    optional bool hidden_requested = 9;
+    optional bool client_hidden = 10;
+    optional bool defer_hiding_client = 11;
+    optional bool reported_drawn = 12;
+    optional bool reported_visible = 13;
+    optional int32 num_interesting_windows = 14;
+    optional int32 num_drawn_windows = 15;
+    optional bool all_drawn = 16;
+    optional bool last_all_drawn = 17;
+    optional bool removed = 18;
+    optional IdentifierProto starting_window = 19;
+    optional bool starting_displayed = 20;
+    optional bool starting_moved = 21;
+    optional bool hidden_set_from_transferred_starting_window = 22;
+    repeated .android.graphics.RectProto frozen_bounds = 23;
 }
 
 /* represents WindowToken */
 message WindowTokenProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  optional int32 hash_code = 2;
-  repeated WindowStateProto windows = 3;
-  optional bool hidden = 4;
-  optional bool waiting_to_show = 5;
-  optional bool paused = 6;
+    optional WindowContainerProto window_container = 1;
+    optional int32 hash_code = 2;
+    repeated WindowStateProto windows = 3;
+    optional bool hidden = 4;
+    optional bool waiting_to_show = 5;
+    optional bool paused = 6;
 }
 
 /* represents WindowState */
 message WindowStateProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional WindowContainerProto window_container = 1;
-  optional IdentifierProto identifier = 2;
-  optional int32 display_id = 3;
-  optional int32 stack_id = 4;
-  optional .android.view.WindowLayoutParamsProto attributes = 5;
-  optional .android.graphics.RectProto given_content_insets = 6;
-  optional .android.graphics.RectProto frame = 7;
-  optional .android.graphics.RectProto containing_frame = 8;
-  optional .android.graphics.RectProto parent_frame = 9;
-  optional .android.graphics.RectProto content_frame = 10;
-  optional .android.graphics.RectProto content_insets = 11;
-  optional .android.graphics.RectProto surface_insets = 12;
-  optional WindowStateAnimatorProto animator = 13;
-  optional bool animating_exit = 14;
-  repeated WindowStateProto child_windows = 15;
-  optional .android.graphics.RectProto surface_position = 16;
-  optional int32 requested_width = 18;
-  optional int32 requested_height = 19;
-  optional int32 view_visibility = 20;
-  optional int32 system_ui_visibility = 21;
-  optional bool has_surface = 22;
-  optional bool is_ready_for_display = 23;
-  optional .android.graphics.RectProto display_frame = 24;
-  optional .android.graphics.RectProto overscan_frame = 25;
-  optional .android.graphics.RectProto visible_frame = 26;
-  optional .android.graphics.RectProto decor_frame = 27;
-  optional .android.graphics.RectProto outset_frame = 28;
-  optional .android.graphics.RectProto overscan_insets = 29;
-  optional .android.graphics.RectProto visible_insets = 30;
-  optional .android.graphics.RectProto stable_insets = 31;
-  optional .android.graphics.RectProto outsets = 32;
-  optional .android.view.DisplayCutoutProto cutout = 33;
-  optional bool remove_on_exit = 34;
-  optional bool destroying = 35;
-  optional bool removed = 36;
-  optional bool is_on_screen = 37;
-  optional bool is_visible = 38;
+    optional WindowContainerProto window_container = 1;
+    optional IdentifierProto identifier = 2;
+    optional int32 display_id = 3;
+    optional int32 stack_id = 4;
+    optional .android.view.WindowLayoutParamsProto attributes = 5;
+    optional .android.graphics.RectProto given_content_insets = 6;
+    optional .android.graphics.RectProto frame = 7;
+    optional .android.graphics.RectProto containing_frame = 8;
+    optional .android.graphics.RectProto parent_frame = 9;
+    optional .android.graphics.RectProto content_frame = 10;
+    optional .android.graphics.RectProto content_insets = 11;
+    optional .android.graphics.RectProto surface_insets = 12;
+    optional WindowStateAnimatorProto animator = 13;
+    optional bool animating_exit = 14;
+    repeated WindowStateProto child_windows = 15;
+    optional .android.graphics.RectProto surface_position = 16;
+    optional int32 requested_width = 18;
+    optional int32 requested_height = 19;
+    optional int32 view_visibility = 20;
+    optional int32 system_ui_visibility = 21;
+    optional bool has_surface = 22;
+    optional bool is_ready_for_display = 23;
+    optional .android.graphics.RectProto display_frame = 24;
+    optional .android.graphics.RectProto overscan_frame = 25;
+    optional .android.graphics.RectProto visible_frame = 26;
+    optional .android.graphics.RectProto decor_frame = 27;
+    optional .android.graphics.RectProto outset_frame = 28;
+    optional .android.graphics.RectProto overscan_insets = 29;
+    optional .android.graphics.RectProto visible_insets = 30;
+    optional .android.graphics.RectProto stable_insets = 31;
+    optional .android.graphics.RectProto outsets = 32;
+    optional .android.view.DisplayCutoutProto cutout = 33;
+    optional bool remove_on_exit = 34;
+    optional bool destroying = 35;
+    optional bool removed = 36;
+    optional bool is_on_screen = 37;
+    optional bool is_visible = 38;
 }
 
 message IdentifierProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 hash_code = 1;
-  optional int32 user_id = 2;
-  optional string title = 3  [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional int32 hash_code = 1;
+    optional int32 user_id = 2;
+    optional string title = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
 }
 
 /* represents WindowStateAnimator */
 message WindowStateAnimatorProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.RectProto last_clip_rect = 1;
-  optional WindowSurfaceControllerProto surface = 2;
-  enum DrawState {
-    NO_SURFACE = 0;
-    DRAW_PENDING = 1;
-    COMMIT_DRAW_PENDING = 2;
-    READY_TO_SHOW = 3;
-    HAS_DRAWN = 4;
-  }
-  optional DrawState draw_state = 3;
-  optional .android.graphics.RectProto system_decor_rect = 4;
+    optional .android.graphics.RectProto last_clip_rect = 1;
+    optional WindowSurfaceControllerProto surface = 2;
+    enum DrawState {
+        NO_SURFACE = 0;
+        DRAW_PENDING = 1;
+        COMMIT_DRAW_PENDING = 2;
+        READY_TO_SHOW = 3;
+        HAS_DRAWN = 4;
+    }
+    optional DrawState draw_state = 3;
+    optional .android.graphics.RectProto system_decor_rect = 4;
 }
 
 /* represents WindowSurfaceController */
 message WindowSurfaceControllerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool shown = 1;
-  optional int32 layer = 2;
+    optional bool shown = 1;
+    optional int32 layer = 2;
 }
 
 /* represents ScreenRotationAnimation */
 message ScreenRotationAnimationProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional bool started = 1;
-  optional bool animation_running = 2;
+    optional bool started = 1;
+    optional bool animation_running = 2;
 }
 
 /* represents WindowContainer */
 message WindowContainerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional ConfigurationContainerProto configuration_container = 1;
-  optional int32 orientation = 2;
-  optional bool visible = 3;
-  optional SurfaceAnimatorProto surface_animator = 4;
+    optional ConfigurationContainerProto configuration_container = 1;
+    optional int32 orientation = 2;
+    optional bool visible = 3;
+    optional SurfaceAnimatorProto surface_animator = 4;
 }
 
 /* represents ConfigurationContainer */
 message ConfigurationContainerProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.content.ConfigurationProto override_configuration = 1;
-  optional .android.content.ConfigurationProto full_configuration = 2;
-  optional .android.content.ConfigurationProto merged_override_configuration = 3;
+    optional .android.content.ConfigurationProto override_configuration = 1;
+    optional .android.content.ConfigurationProto full_configuration = 2;
+    optional .android.content.ConfigurationProto merged_override_configuration = 3;
 }
diff --git a/core/proto/android/service/appwidget.proto b/core/proto/android/service/appwidget.proto
index 3f46d2b..cd7173a 100644
--- a/core/proto/android/service/appwidget.proto
+++ b/core/proto/android/service/appwidget.proto
@@ -22,18 +22,18 @@
 
 // represents the object holding the dump info of the app widget service
 message AppWidgetServiceDumpProto {
-  repeated WidgetProto widgets = 1; // the array of bound widgets
+    repeated WidgetProto widgets = 1; // the array of bound widgets
 }
 
 // represents a bound widget
 message WidgetProto {
-  optional bool isCrossProfile = 1; // true if host and provider belong to diff users
-  optional bool isHostStopped = 2; // true if host has not called startListening yet
-  optional string hostPackage = 3;
-  optional string providerPackage = 4;
-  optional string providerClass = 5;
-  optional int32 minWidth = 6;
-  optional int32 minHeight = 7;
-  optional int32 maxWidth = 8;
-  optional int32 maxHeight = 9;
+    optional bool isCrossProfile = 1; // true if host and provider belong to diff users
+    optional bool isHostStopped = 2; // true if host has not called startListening yet
+    optional string hostPackage = 3;
+    optional string providerPackage = 4;
+    optional string providerClass = 5;
+    optional int32 minWidth = 6;
+    optional int32 minHeight = 7;
+    optional int32 maxWidth = 8;
+    optional int32 maxHeight = 9;
 }
diff --git a/core/proto/android/service/batterystats.proto b/core/proto/android/service/batterystats.proto
index e31e7f3..5586263 100644
--- a/core/proto/android/service/batterystats.proto
+++ b/core/proto/android/service/batterystats.proto
@@ -24,7 +24,7 @@
 import "frameworks/base/libs/incident/proto/android/privacy.proto";
 
 message BatteryStatsServiceDumpProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional android.os.BatteryStatsProto batterystats = 1;
+    optional android.os.BatteryStatsProto batterystats = 1;
 }
diff --git a/core/proto/android/service/network_watchlist.proto b/core/proto/android/service/network_watchlist.proto
index fb03b93..66d79bdb 100644
--- a/core/proto/android/service/network_watchlist.proto
+++ b/core/proto/android/service/network_watchlist.proto
@@ -23,14 +23,14 @@
 // generate network watchlist report.
 message NetworkWatchlistReportProto {
 
-  optional int32 report_version = 1;
+    optional int32 report_version = 1;
 
-  optional string watchlist_config_hash = 2;
+    optional string watchlist_config_hash = 2;
 
-  repeated NetworkWatchlistAppResultProto app_result = 3;
+    repeated NetworkWatchlistAppResultProto app_result = 3;
 }
 
 message NetworkWatchlistAppResultProto {
-  optional string app_digest = 1;
-  optional bool encoded_result = 2;
+    optional string app_digest = 1;
+    optional bool encoded_result = 2;
 }
diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto
index 8240d8a..c363710 100644
--- a/core/proto/android/service/usb.proto
+++ b/core/proto/android/service/usb.proto
@@ -88,7 +88,7 @@
     option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
     optional bool connected_to_adb = 1;
-    optional string last_key_recevied = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+    optional string last_key_received = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
     optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ];
     optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ];
 }
@@ -342,4 +342,4 @@
     optional string manufacturer = 1;
     optional string model = 2;
     optional string version = 3;
-}
\ No newline at end of file
+}
diff --git a/core/proto/android/view/displaycutout.proto b/core/proto/android/view/displaycutout.proto
index ee258b7..f4744da 100644
--- a/core/proto/android/view/displaycutout.proto
+++ b/core/proto/android/view/displaycutout.proto
@@ -23,8 +23,8 @@
 option java_multiple_files = true;
 
 message DisplayCutoutProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional .android.graphics.RectProto insets = 1;
-  optional .android.graphics.RectProto bounds = 2;
+    optional .android.graphics.RectProto insets = 1;
+    optional .android.graphics.RectProto bounds = 2;
 }
diff --git a/core/proto/android/view/displayinfo.proto b/core/proto/android/view/displayinfo.proto
index 2a03050..8583955 100644
--- a/core/proto/android/view/displayinfo.proto
+++ b/core/proto/android/view/displayinfo.proto
@@ -23,11 +23,11 @@
 
 /* represents DisplayInfo */
 message DisplayInfoProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 logical_width = 1;
-  optional int32 logical_height = 2;
-  optional int32 app_width = 3;
-  optional int32 app_height = 4;
-  optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
+    optional int32 logical_width = 1;
+    optional int32 logical_height = 2;
+    optional int32 app_width = 3;
+    optional int32 app_height = 4;
+    optional string name = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
 }
diff --git a/core/proto/android/view/remote_animation_target.proto b/core/proto/android/view/remote_animation_target.proto
index d5da0a9..9139f25 100644
--- a/core/proto/android/view/remote_animation_target.proto
+++ b/core/proto/android/view/remote_animation_target.proto
@@ -28,16 +28,16 @@
 
 /** Proto representation for RemoteAnimationTarget.java class. */
 message RemoteAnimationTargetProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 task_id = 1;
-  optional int32 mode = 2;
-  optional .android.view.SurfaceControlProto leash = 3;
-  optional bool is_translucent = 4;
-  optional .android.graphics.RectProto clip_rect = 5;
-  optional .android.graphics.RectProto contentInsets = 6;
-  optional int32 prefix_order_index = 7;
-  optional .android.graphics.PointProto position = 8;
-  optional .android.graphics.RectProto source_container_bounds = 9;
-  optional .android.app.WindowConfigurationProto window_configuration = 10;
+    optional int32 task_id = 1;
+    optional int32 mode = 2;
+    optional .android.view.SurfaceControlProto leash = 3;
+    optional bool is_translucent = 4;
+    optional .android.graphics.RectProto clip_rect = 5;
+    optional .android.graphics.RectProto contentInsets = 6;
+    optional int32 prefix_order_index = 7;
+    optional .android.graphics.PointProto position = 8;
+    optional .android.graphics.RectProto source_container_bounds = 9;
+    optional .android.app.WindowConfigurationProto window_configuration = 10;
 }
diff --git a/core/proto/android/view/surface.proto b/core/proto/android/view/surface.proto
index 8f5f695..e20b094 100644
--- a/core/proto/android/view/surface.proto
+++ b/core/proto/android/view/surface.proto
@@ -19,10 +19,10 @@
 option java_multiple_files = true;
 
 message SurfaceProto {
-  enum Rotation {
-    ROTATION_0 = 0;
-    ROTATION_90 = 1;
-    ROTATION_180 = 2;
-    ROTATION_270 = 3;
-  }
+    enum Rotation {
+        ROTATION_0 = 0;
+        ROTATION_90 = 1;
+        ROTATION_180 = 2;
+        ROTATION_270 = 3;
+    }
 }
diff --git a/core/proto/android/view/surfacecontrol.proto b/core/proto/android/view/surfacecontrol.proto
index 665d688..8a252be 100644
--- a/core/proto/android/view/surfacecontrol.proto
+++ b/core/proto/android/view/surfacecontrol.proto
@@ -25,8 +25,8 @@
  * Represents a {@link android.view.SurfaceControl} object.
  */
 message SurfaceControlProto {
-  option (android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 hash_code = 1;
-  optional string name = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
+    optional int32 hash_code = 1;
+    optional string name = 2 [ (android.privacy).dest = DEST_EXPLICIT ];
 }
diff --git a/core/proto/android/view/windowlayoutparams.proto b/core/proto/android/view/windowlayoutparams.proto
index 0362ab1..586321d 100644
--- a/core/proto/android/view/windowlayoutparams.proto
+++ b/core/proto/android/view/windowlayoutparams.proto
@@ -25,43 +25,47 @@
 
 /* represents WindowManager.LayoutParams */
 message WindowLayoutParamsProto {
-  option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+    option (.android.msg_privacy).dest = DEST_AUTOMATIC;
 
-  optional int32 type = 1;
-  optional int32 x = 2;
-  optional int32 y = 3;
-  optional int32 width = 4;
-  optional int32 height = 5;
-  optional float horizontal_margin = 6;
-  optional float vertical_margin = 7;
-  optional int32 gravity = 8;
-  optional int32 soft_input_mode = 9;
-  optional .android.graphics.PixelFormatProto.Format format = 10;
-  optional int32 window_animations = 11;
-  optional float alpha = 12;
-  optional float screen_brightness = 13;
-  optional float button_brightness = 14;
-  enum RotationAnimation {
-    ROTATION_ANIMATION_UNSPECIFIED = -1;
-    ROTATION_ANIMATION_CROSSFADE = 1;
-    ROTATION_ANIMATION_JUMPCUT = 2;
-    ROTATION_ANIMATION_SEAMLESS = 3;
-  }
-  optional RotationAnimation rotation_animation = 15;
-  optional float preferred_refresh_rate = 16;
-  optional int32 preferred_display_mode_id = 17;
-  optional bool has_system_ui_listeners = 18;
-  optional uint32 input_feature_flags = 19;
-  optional int64 user_activity_timeout = 20;
-  enum NeedsMenuState {
-    NEEDS_MENU_UNSET = 0;
-    NEEDS_MENU_SET_TRUE = 1;
-    NEEDS_MENU_SET_FALSE = 2;
-  }
-  optional NeedsMenuState needs_menu_key = 22;
-  optional .android.view.DisplayProto.ColorMode color_mode = 23;
-  optional uint32 flags = 24;
-  optional uint32 private_flags = 26;
-  optional uint32 system_ui_visibility_flags = 27;
-  optional uint32 subtree_system_ui_visibility_flags = 28;
+    optional int32 type = 1;
+    optional int32 x = 2;
+    optional int32 y = 3;
+    optional int32 width = 4;
+    optional int32 height = 5;
+    optional float horizontal_margin = 6;
+    optional float vertical_margin = 7;
+    optional int32 gravity = 8;
+    optional int32 soft_input_mode = 9;
+    optional .android.graphics.PixelFormatProto.Format format = 10;
+    optional int32 window_animations = 11;
+    optional float alpha = 12;
+    optional float screen_brightness = 13;
+    optional float button_brightness = 14;
+
+    enum RotationAnimation {
+        ROTATION_ANIMATION_UNSPECIFIED = -1;
+        ROTATION_ANIMATION_CROSSFADE = 1;
+        ROTATION_ANIMATION_JUMPCUT = 2;
+        ROTATION_ANIMATION_SEAMLESS = 3;
+    }
+    optional RotationAnimation rotation_animation = 15;
+
+    optional float preferred_refresh_rate = 16;
+    optional int32 preferred_display_mode_id = 17;
+    optional bool has_system_ui_listeners = 18;
+    optional uint32 input_feature_flags = 19;
+    optional int64 user_activity_timeout = 20;
+
+    enum NeedsMenuState {
+        NEEDS_MENU_UNSET = 0;
+        NEEDS_MENU_SET_TRUE = 1;
+        NEEDS_MENU_SET_FALSE = 2;
+    }
+    optional NeedsMenuState needs_menu_key = 22;
+
+    optional .android.view.DisplayProto.ColorMode color_mode = 23;
+    optional uint32 flags = 24;
+    optional uint32 private_flags = 26;
+    optional uint32 system_ui_visibility_flags = 27;
+    optional uint32 subtree_system_ui_visibility_flags = 28;
 }
diff --git a/core/res/res/layout/language_picker_section_header.xml b/core/res/res/layout/language_picker_section_header.xml
index 6cbd7c3..4fa4d9b 100644
--- a/core/res/res/layout/language_picker_section_header.xml
+++ b/core/res/res/layout/language_picker_section_header.xml
@@ -20,8 +20,8 @@
           android:layout_width="match_parent"
           android:layout_height="36dp"
           android:gravity="center_vertical"
-          android:paddingStart="18dp"
-          android:paddingEnd="18dp"
+          android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+          android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
           android:textColor="?android:attr/colorAccent"
           android:textStyle="bold"
           tools:text="@string/language_picker_section_all"/>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fe34d98..21c10ce 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3089,6 +3089,9 @@
              See {@link android.view.View#setAccessibilityPaneTitle(CharSequence)} -->
         <attr name="accessibilityPaneTitle" format="string" />
 
+        <!-- Whether or not this view is a heading for accessibility purposes. -->
+        <attr name="accessibilityHeading" format="boolean"/>
+
         <!-- Sets the color of the spot shadow that is drawn when the view has a positive Z or
              elevation value.
              <p>
@@ -4956,8 +4959,6 @@
             <!-- Justification by stretching word spacing. -->
             <enum name="inter_word" value = "1" />
         </attr>
-        <!-- Whether or not this view is a heading for accessibility purposes. -->
-        <attr name="accessibilityHeading" format="boolean"/>
     </declare-styleable>
     <declare-styleable name="TextViewAppearance">
         <!-- Base text color, typeface, size, and style. -->
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index bd824de..04f4d6e 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4704,11 +4704,13 @@
     <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>
+    <string name="app_suspended_title">Can\u2019t open app</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>
+    <string name="app_suspended_default_message">
+        The app <xliff:g id="app_name" example="Gmail">%1$s</xliff:g> isn\u2019t available right now. This is managed by <xliff:g id="app_name" example="Settings">%2$s</xliff:g>.
+    </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>
+    <string name="app_suspended_more_details">Learn more</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>
diff --git a/core/res/res/xml/default_zen_mode_config.xml b/core/res/res/xml/default_zen_mode_config.xml
index f1b61a7..dce8a65 100644
--- a/core/res/res/xml/default_zen_mode_config.xml
+++ b/core/res/res/xml/default_zen_mode_config.xml
@@ -18,7 +18,7 @@
 -->
 
 <!-- Default configuration for zen mode.  See android.service.notification.ZenModeConfig. -->
-<zen version="6">
+<zen version="7">
     <allow alarms="true" media="true" system="false" calls="false" messages="false" reminders="false"
            events="false" />
     <!-- all visual effects that exist as of P -->
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index a5941b2..558e576 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -246,6 +246,7 @@
                     Settings.Global.HDMI_CONTROL_ENABLED,
                     Settings.Global.HDMI_SYSTEM_AUDIO_CONTROL_ENABLED,
                     Settings.Global.HEADS_UP_NOTIFICATIONS_ENABLED,
+                    Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE,
                     Settings.Global.HIDDEN_API_POLICY_P_APPS,
                     Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS,
                     Settings.Global.HIDE_ERROR_DIALOGS,
diff --git a/core/tests/coretests/src/android/view/DisplayCutoutTest.java b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
index 6e9401d..6ee74cb 100644
--- a/core/tests/coretests/src/android/view/DisplayCutoutTest.java
+++ b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
@@ -208,6 +208,12 @@
     }
 
     @Test
+    public void fromSpec_wontCacheIfScreenHeightChanges() {
+        DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 4000, 1f);
+        assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 400, 1f), not(sameInstance(cached)));
+    }
+
+    @Test
     public void fromSpec_wontCacheIfDensityChanges() {
         DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 400, 2f);
         assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 400, 1f), not(sameInstance(cached)));
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 22867df..72d9bce 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -111,6 +111,8 @@
     <family lang="und-Ethi">
         <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifEthiopic-Regular.otf</font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifEthiopic-Bold.otf</font>
     </family>
     <family lang="und-Hebr">
         <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font>
@@ -167,6 +169,8 @@
     <family lang="und-Guru" variant="elegant">
         <font weight="400" style="normal">NotoSansGurmukhi-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansGurmukhi-Bold.ttf</font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Regular.otf</font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifGurmukhi-Bold.otf</font>
     </family>
     <family lang="und-Guru" variant="compact">
         <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font>
@@ -231,9 +235,15 @@
         <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font>
     </family>
 
-    <family lang="und-Sinh">
+    <family lang="und-Sinh" variant="elegant">
         <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifSinhala-Regular.otf</font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifSinhala-Bold.otf</font>
+    </family>
+    <family lang="und-Sinh" variant="compact">
+        <font weight="400" style="normal">NotoSansSinhalaUI-Regular.otf</font>
+        <font weight="700" style="normal">NotoSansSinhalaUI-Bold.otf</font>
     </family>
     <family lang="und-Khmr" variant="elegant">
         <font weight="100" style="normal">NotoSansKhmer-VF.ttf
@@ -272,7 +282,9 @@
             <axis tag="wdth" stylevalue="100.0" />
             <axis tag="wght" stylevalue="190.0" />
         </font>
-    </family>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifKhmer-Regular.otf</font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifKhmer-Bold.otf</font>
+      </family>
     <family lang="und-Khmr" variant="compact">
         <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font>
@@ -290,6 +302,8 @@
     <family lang="und-Mymr" variant="elegant">
         <font weight="400" style="normal">NotoSansMyanmar-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansMyanmar-Bold.ttf</font>
+        <font weight="400" style="normal" fallbackFor="serif">NotoSerifMyanmar-Regular.otf</font>
+        <font weight="700" style="normal" fallbackFor="serif">NotoSerifMyanmar-Bold.otf</font>
     </family>
     <family lang="und-Mymr" variant="compact">
         <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font>
@@ -303,6 +317,9 @@
         <font weight="400" style="normal">NotoSansCham-Regular.ttf</font>
         <font weight="700" style="normal">NotoSansCham-Bold.ttf</font>
     </family>
+    <family lang="und-Ahom">
+        <font weight="400" style="normal">NotoSansAhom-Regular.otf</font>
+    </family>
     <family lang="und-Adlm">
         <font weight="400" style="normal">NotoSansAdlam-Regular.ttf</font>
     </family>
@@ -354,6 +371,9 @@
     <family lang="und-Egyp">
         <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.ttf</font>
     </family>
+    <family lang="und-Elba">
+        <font weight="400" style="normal">NotoSansElbasan-Regular.otf</font>
+    </family>
     <family lang="und-Glag">
         <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font>
     </family>
@@ -538,4 +558,64 @@
     <family lang="und-Phag">
         <font weight="400" style="normal">NotoSansPhagsPa-Regular.ttf</font>
     </family>
+    <family lang="und-Hluw">
+        <font weight="400" style="normal">NotoSansAnatolianHieroglyphs-Regular.otf</font>
+    </family>
+    <family lang="und-Bass">
+        <font weight="400" style="normal">NotoSansBassaVah-Regular.otf</font>
+    </family>
+    <family lang="und-Bhks">
+        <font weight="400" style="normal">NotoSansBhaiksuki-Regular.otf</font>
+    </family>
+    <family lang="und-Hatr">
+        <font weight="400" style="normal">NotoSansHatran-Regular.otf</font>
+    </family>
+    <family lang="und-Lina">
+        <font weight="400" style="normal">NotoSansLinearA-Regular.otf</font>
+    </family>
+    <family lang="und-Mani">
+        <font weight="400" style="normal">NotoSansManichaean-Regular.otf</font>
+    </family>
+    <family lang="und-Marc">
+        <font weight="400" style="normal">NotoSansMarchen-Regular.otf</font>
+    </family>
+    <family lang="und-Merc">
+        <font weight="400" style="normal">NotoSansMeroitic-Regular.otf</font>
+    </family>
+    <family lang="und-Plrd">
+        <font weight="400" style="normal">NotoSansMiao-Regular.otf</font>
+    </family>
+    <family lang="und-Mroo">
+        <font weight="400" style="normal">NotoSansMro-Regular.otf</font>
+    </family>
+    <family lang="und-Mult">
+        <font weight="400" style="normal">NotoSansMultani-Regular.otf</font>
+    </family>
+    <family lang="und-Nbat">
+        <font weight="400" style="normal">NotoSansNabataean-Regular.otf</font>
+    </family>
+    <family lang="und-Newa">
+        <font weight="400" style="normal">NotoSansNewa-Regular.otf</font>
+    </family>
+    <family lang="und-Narb">
+        <font weight="400" style="normal">NotoSansOldNorthArabian-Regular.otf</font>
+    </family>
+    <family lang="und-Perm">
+        <font weight="400" style="normal">NotoSansOldPermic-Regular.otf</font>
+    </family>
+    <family lang="und-Hmng">
+        <font weight="400" style="normal">NotoSansPahawhHmong-Regular.otf</font>
+    </family>
+    <family lang="und-Palm">
+        <font weight="400" style="normal">NotoSansPalmyrene-Regular.otf</font>
+    </family>
+    <family lang="und-Pauc">
+        <font weight="400" style="normal">NotoSansPauCinHau-Regular.otf</font>
+    </family>
+    <family lang="und-Shrd">
+        <font weight="400" style="normal">NotoSansSharada-Regular.otf</font>
+    </family>
+    <family lang="und-Sora">
+        <font weight="400" style="normal">NotoSansSoraSompeng-Regular.otf</font>
+    </family>
 </familyset>
diff --git a/keystore/java/android/security/KeyStoreException.java b/keystore/java/android/security/KeyStoreException.java
index 88e768c..30389a29d 100644
--- a/keystore/java/android/security/KeyStoreException.java
+++ b/keystore/java/android/security/KeyStoreException.java
@@ -16,12 +16,15 @@
 
 package android.security;
 
+import android.annotation.TestApi;
+
 /**
  * KeyStore/keymaster exception with positive error codes coming from the KeyStore and negative
  * ones from keymaster.
  *
  * @hide
  */
+@TestApi
 public class KeyStoreException extends Exception {
 
     private final int mErrorCode;
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index d95feb0..b2e0f67 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -19,6 +19,7 @@
 import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.app.KeyguardManager;
 import android.hardware.fingerprint.FingerprintManager;
 import android.security.GateKeeper;
@@ -594,6 +595,14 @@
     /**
      * 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. A test for user presence is tangential to authentication. The test can be part
+     * of an authentication step as long as this step can be validated by the hardware protecting
+     * the key and cannot be spoofed. For example, a physical button press can be used as a test of
+     * user presence if the other pins connected to the button are not able to simulate a button
+     * press. There must be no way for the primary processor to fake a button press, or that
+     * button must not be used as a test of user presence.
      */
     public boolean isUserPresenceRequired() {
         return mUserPresenceRequired;
@@ -1180,6 +1189,14 @@
         /**
          * Sets whether a test of user presence is required to be performed between the
          * {@code Signature.initSign()} and {@code Signature.sign()} method 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. A test for user presence is tangential to authentication. The
+         * test can be part of an authentication step as long as this step can be validated by the
+         * hardware protecting the key and cannot be spoofed. For example, a physical button press
+         * can be used as a test of user presence if the other pins connected to the button are not
+         * able to simulate a button press.There must be no way for the primary processor to fake a
+         * button press, or that button must not be used as a test of user presence.
          */
         @NonNull
         public Builder setUserPresenceRequired(boolean required) {
@@ -1227,6 +1244,7 @@
          *
          * Sets whether to include a temporary unique ID field in the attestation certificate.
          */
+        @TestApi
         @NonNull
         public Builder setUniqueIdIncluded(boolean uniqueIdIncluded) {
             mUniqueIdIncluded = uniqueIdIncluded;
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 92bee8d..fdcad85 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -448,7 +448,12 @@
      * 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.
+     * in hardware. A test for user presence is tangential to authentication. The test can be part
+     * of an authentication step as long as this step can be validated by the hardware protecting
+     * the key and cannot be spoofed. For example, a physical button press can be used as a test of
+     * user presence if the other pins connected to the button are not able to simulate a button
+     * press. There must be no way for the primary processor to fake a button press, or that
+     * button must not be used as a test of user presence.
      */
     public boolean isUserPresenceRequired() {
         return mUserPresenceRequred;
@@ -845,7 +850,15 @@
 
         /**
          * Sets whether a test of user presence is required to be performed between the
-         * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
+         * {@code Signature.initSign()} and {@code Signature.sign()} method 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. A test for user presence is tangential to authentication. The test can be part
+         * of an authentication step as long as this step can be validated by the hardware
+         * protecting the key and cannot be spoofed. For example, a physical button press can be
+         * used as a test of user presence if the other pins connected to the button are not able
+         * to simulate a button press. There must be no way for the primary processor to fake a
+         * button press, or that button must not be used as a test of user presence.
          */
         @NonNull
         public Builder setUserPresenceRequired(boolean required) {
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index aeef215..fdb7499 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -63,6 +63,7 @@
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -4786,6 +4787,21 @@
     }
 
     /**
+     * Add {@link MicrophoneInfo} by device information while filtering certain types.
+     */
+    private void addMicrophonesFromAudioDeviceInfo(ArrayList<MicrophoneInfo> microphones,
+                    HashSet<Integer> filterTypes) {
+        AudioDeviceInfo[] devices = getDevicesStatic(GET_DEVICES_INPUTS);
+        for (AudioDeviceInfo device : devices) {
+            if (filterTypes.contains(device.getType())) {
+                continue;
+            }
+            MicrophoneInfo microphone = microphoneInfoFromAudioDeviceInfo(device);
+            microphones.add(microphone);
+        }
+    }
+
+    /**
      * Returns a list of {@link MicrophoneInfo} that corresponds to the characteristics
      * of all available microphones. The list is empty when no microphones are available
      * on the device. An error during the query will result in an IOException being thrown.
@@ -4796,21 +4812,17 @@
     public List<MicrophoneInfo> getMicrophones() throws IOException {
         ArrayList<MicrophoneInfo> microphones = new ArrayList<MicrophoneInfo>();
         int status = AudioSystem.getMicrophones(microphones);
+        HashSet<Integer> filterTypes = new HashSet<>();
+        filterTypes.add(AudioDeviceInfo.TYPE_TELEPHONY);
         if (status != AudioManager.SUCCESS) {
-            // fail and bail!
+            // fail and populate microphones with unknown characteristics by device information.
             Log.e(TAG, "getMicrophones failed:" + status);
-            return new ArrayList<MicrophoneInfo>(); // Always return a list.
+            addMicrophonesFromAudioDeviceInfo(microphones, filterTypes);
+            return microphones;
         }
         setPortIdForMicrophones(microphones);
-        AudioDeviceInfo[] devices = getDevicesStatic(GET_DEVICES_INPUTS);
-        for (AudioDeviceInfo device : devices) {
-            if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_MIC ||
-                    device.getType() == AudioDeviceInfo.TYPE_TELEPHONY) {
-                continue;
-            }
-            MicrophoneInfo microphone = microphoneInfoFromAudioDeviceInfo(device);
-            microphones.add(microphone);
-        }
+        filterTypes.add(AudioDeviceInfo.TYPE_BUILTIN_MIC);
+        addMicrophonesFromAudioDeviceInfo(microphones, filterTypes);
         return microphones;
     }
 
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 8a36f91..7dfdb20 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -43,6 +43,8 @@
     /** @hide */
     public static final int PLAYER_PIID_INVALID = -1;
     /** @hide */
+    public static final int PLAYER_PIID_UNASSIGNED = 0;
+    /** @hide */
     public static final int PLAYER_UPID_INVALID = -1;
 
     // information about the implementation
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 4f0dccb..6b35dd4 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -1628,7 +1628,6 @@
         int status = native_get_active_microphones(activeMicrophones);
         if (status != AudioManager.SUCCESS) {
             Log.e(TAG, "getActiveMicrophones failed:" + status);
-            return new ArrayList<MicrophoneInfo>();
         }
         AudioManager.setPortIdForMicrophones(activeMicrophones);
 
diff --git a/media/java/android/media/BufferingParams.java b/media/java/android/media/BufferingParams.java
index 521e897..aaae5e7b 100644
--- a/media/java/android/media/BufferingParams.java
+++ b/media/java/android/media/BufferingParams.java
@@ -17,6 +17,7 @@
 package android.media;
 
 import android.annotation.IntDef;
+import android.annotation.TestApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -63,6 +64,7 @@
  * <p>Users should use {@link Builder} to change {@link BufferingParams}.
  * @hide
  */
+@TestApi
 public final class BufferingParams implements Parcelable {
     private static final int BUFFERING_NO_MARK = -1;
 
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index c29300d..2cb58d0 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -909,7 +909,8 @@
             if (mMime.toLowerCase().startsWith("audio/")) {
                 mAudioCaps = AudioCapabilities.create(info, this);
                 mAudioCaps.getDefaultFormat(mDefaultFormat);
-            } else if (mMime.toLowerCase().startsWith("video/")) {
+            } else if (mMime.toLowerCase().startsWith("video/")
+                    || mMime.equalsIgnoreCase(MediaFormat.MIMETYPE_IMAGE_ANDROID_HEIC)) {
                 mVideoCaps = VideoCapabilities.create(info, this);
             }
             if (encoder) {
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index f9a1f8b..392a1eb 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.TestApi;
 import android.app.ActivityThread;
 import android.content.ContentProvider;
 import android.content.ContentResolver;
@@ -1680,6 +1681,7 @@
      * @hide
      */
     @NonNull
+    @TestApi
     public native BufferingParams getBufferingParams();
 
     /**
@@ -1696,6 +1698,7 @@
      * @throws IllegalArgumentException if params is invalid or not supported.
      * @hide
      */
+    @TestApi
     public native void setBufferingParams(@NonNull BufferingParams params);
 
     /**
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 90b6bff..82d64f3 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -1434,7 +1434,6 @@
         int status = native_getActiveMicrophones(activeMicrophones);
         if (status != AudioManager.SUCCESS) {
             Log.e(TAG, "getActiveMicrophones failed:" + status);
-            return new ArrayList<MicrophoneInfo>();
         }
         AudioManager.setPortIdForMicrophones(activeMicrophones);
 
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index 80049ba5..7c6367e 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -31,6 +31,7 @@
 import android.os.ServiceManager;
 import android.util.Log;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.app.IAppOpsCallback;
 import com.android.internal.app.IAppOpsService;
 
@@ -58,20 +59,29 @@
     protected float mRightVolume = 1.0f;
     protected float mAuxEffectSendLevel = 0.0f;
 
-    // for AppOps
-    private IAppOpsService mAppOps; // may be null
-    private IAppOpsCallback mAppOpsCallback;
-    private boolean mHasAppOpsPlayAudio = true; // sync'd on mLock
+    // NEVER call into AudioService (see getService()) with mLock held: PlayerBase can run in
+    // the same process as AudioService, which can synchronously call back into this class,
+    // causing deadlocks between the two
     private final Object mLock = new Object();
 
+    // for AppOps
+    private @Nullable IAppOpsService mAppOps;
+    private IAppOpsCallback mAppOpsCallback;
+    @GuardedBy("mLock")
+    private boolean mHasAppOpsPlayAudio = true;
+
     private final int mImplType;
     // uniquely identifies the Player Interface throughout the system (P I Id)
-    private int mPlayerIId;
+    private int mPlayerIId = AudioPlaybackConfiguration.PLAYER_PIID_UNASSIGNED;
 
-    private int mState; // sync'd on mLock
-    private int mStartDelayMs = 0; // sync'd on mLock
-    private float mPanMultiplierL = 1.0f; // sync'd on mLock
-    private float mPanMultiplierR = 1.0f; // sync'd on mLock
+    @GuardedBy("mLock")
+    private int mState;
+    @GuardedBy("mLock")
+    private int mStartDelayMs = 0;
+    @GuardedBy("mLock")
+    private float mPanMultiplierL = 1.0f;
+    @GuardedBy("mLock")
+    private float mPanMultiplierR = 1.0f;
 
     /**
      * Constructor. Must be given audio attributes, as they are required for AppOps.
@@ -134,16 +144,24 @@
         }
     }
 
+    private void updateState(int state) {
+        final int piid;
+        synchronized (mLock) {
+            mState = state;
+            piid = mPlayerIId;
+        }
+        try {
+            getService().playerEvent(piid, state);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Error talking to audio service, "
+                    + AudioPlaybackConfiguration.toLogFriendlyPlayerState(state)
+                    + " state will not be tracked for piid=" + piid, e);
+        }
+    }
+
     void baseStart() {
         if (DEBUG) { Log.v(TAG, "baseStart() piid=" + mPlayerIId); }
-        try {
-            synchronized (mLock) {
-                mState = AudioPlaybackConfiguration.PLAYER_STATE_STARTED;
-                getService().playerEvent(mPlayerIId, mState);
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error talking to audio service, STARTED state will not be tracked", e);
-        }
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STARTED);
         synchronized (mLock) {
             if (isRestricted_sync()) {
                 playerSetVolume(true/*muting*/,0, 0);
@@ -165,26 +183,12 @@
 
     void basePause() {
         if (DEBUG) { Log.v(TAG, "basePause() piid=" + mPlayerIId); }
-        try {
-            synchronized (mLock) {
-                mState = AudioPlaybackConfiguration.PLAYER_STATE_PAUSED;
-                getService().playerEvent(mPlayerIId, mState);
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error talking to audio service, PAUSED state will not be tracked", e);
-        }
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_PAUSED);
     }
 
     void baseStop() {
         if (DEBUG) { Log.v(TAG, "baseStop() piid=" + mPlayerIId); }
-        try {
-            synchronized (mLock) {
-                mState = AudioPlaybackConfiguration.PLAYER_STATE_STOPPED;
-                getService().playerEvent(mPlayerIId, mState);
-            }
-        } catch (RemoteException e) {
-            Log.e(TAG, "Error talking to audio service, STOPPED state will not be tracked", e);
-        }
+        updateState(AudioPlaybackConfiguration.PLAYER_STATE_STOPPED);
     }
 
     void baseSetPan(float pan) {
@@ -228,12 +232,16 @@
      */
     void baseRelease() {
         if (DEBUG) { Log.v(TAG, "baseRelease() piid=" + mPlayerIId + " state=" + mState); }
+        boolean releasePlayer = false;
+        synchronized (mLock) {
+            if (mState != AudioPlaybackConfiguration.PLAYER_STATE_RELEASED) {
+                releasePlayer = true;
+                mState = AudioPlaybackConfiguration.PLAYER_STATE_RELEASED;
+            }
+        }
         try {
-            synchronized (mLock) {
-                if (mState != AudioPlaybackConfiguration.PLAYER_STATE_RELEASED) {
-                    getService().releasePlayer(mPlayerIId);
-                    mState = AudioPlaybackConfiguration.PLAYER_STATE_RELEASED;
-                }
+            if (releasePlayer) {
+                getService().releasePlayer(mPlayerIId);
             }
         } catch (RemoteException e) {
             Log.e(TAG, "Error talking to audio service, the player will still be tracked", e);
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index fbc1438..f358103 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -354,7 +354,10 @@
      * @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) {
+    public boolean isTrustedForMediaControl(@NonNull RemoteUserInfo userInfo) {
+        if (userInfo == null) {
+            throw new IllegalArgumentException("userInfo may not be null");
+        }
         if (userInfo.getPackageName() == null) {
             return false;
         }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
index 4a6df50..bab59f1 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothCallback.java
@@ -29,5 +29,5 @@
     void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState);
     void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state);
     void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile);
-    void onProfileAudioStateChanged(int bluetoothProfile, int state);
+    void onAudioModeChanged();
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index b74b2cd..06fe4de 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -27,6 +27,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 
 import com.android.settingslib.R;
@@ -119,6 +120,12 @@
         addHandler(BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED,
                    new ActiveDeviceChangedHandler());
 
+        // Headset state changed broadcasts
+        addHandler(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED,
+                new AudioModeChangedHandler());
+        addHandler(TelephonyManager.ACTION_PHONE_STATE_CHANGED,
+                new AudioModeChangedHandler());
+
         mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
         mContext.registerReceiver(mProfileBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
     }
@@ -456,4 +463,25 @@
             }
         }
     }
+
+    private class AudioModeChangedHandler implements Handler {
+
+        @Override
+        public void onReceive(Context context, Intent intent, BluetoothDevice device) {
+            final String action = intent.getAction();
+            if (action == null) {
+                Log.w(TAG, "AudioModeChangedHandler() action is null");
+                return;
+            }
+            dispatchAudioModeChanged();
+        }
+    }
+
+    private void dispatchAudioModeChanged() {
+        synchronized (mCallbacks) {
+            for (BluetoothCallback callback : mCallbacks) {
+                callback.onAudioModeChanged();
+            }
+        }
+    }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
index c4ca339..113256f 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/UserManagerHelper.java
@@ -41,6 +41,7 @@
     private static final String TAG = "UserManagerHelper";
     private final Context mContext;
     private final UserManager mUserManager;
+    private final ActivityManager mActivityManager;
     private OnUsersUpdateListener mUpdateListener;
     private final BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
         @Override
@@ -52,6 +53,7 @@
     public UserManagerHelper(Context context) {
         mContext = context;
         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
     }
 
     /**
@@ -72,30 +74,64 @@
     }
 
     /**
-     * Gets {@link UserInfo} for the current user.
+     * Gets UserInfo for the foreground user.
      *
-     * @return {@link UserInfo} for the current user.
+     * Concept of foreground user is relevant for the multi-user deployment. Foreground user
+     * corresponds to the currently "logged in" user.
+     *
+     * @return {@link UserInfo} for the foreground user.
      */
-    public UserInfo getCurrentUserInfo() {
-        return mUserManager.getUserInfo(UserHandle.myUserId());
+    public UserInfo getForegroundUserInfo() {
+        return mUserManager.getUserInfo(getForegroundUserId());
     }
 
     /**
-     * Gets all the other users on the system that are not the current user.
-     *
-     * @return List of {@code UserInfo} for each user that is not the current user.
+     * @return Id of the foreground user.
      */
-    public List<UserInfo> getAllUsersExcludesCurrentUser() {
-        List<UserInfo> others = getAllUsers();
+    public int getForegroundUserId() {
+        return mActivityManager.getCurrentUser();
+    }
 
-        for (Iterator<UserInfo> iterator = others.iterator(); iterator.hasNext(); ) {
-            UserInfo userInfo = iterator.next();
-            if (userInfo.id == UserHandle.myUserId()) {
-                // Remove current user from the list.
-                iterator.remove();
-            }
-        }
-        return others;
+    /**
+     * Gets UserInfo for the user running the caller process.
+     *
+     * Differentiation between foreground user and current process user is relevant for multi-user
+     * deployments.
+     *
+     * Some multi-user aware components (like SystemUI) might run as a singleton - one component
+     * for all users. Current process user is then always the same for that component, even when
+     * the foreground user changes.
+     *
+     * @return {@link UserInfo} for the user running the current process.
+     */
+    public UserInfo getCurrentProcessUserInfo() {
+        return mUserManager.getUserInfo(getCurrentProcessUserId());
+    }
+
+    /**
+     * @return Id for the user running the current process.
+     */
+    public int getCurrentProcessUserId() {
+        return UserHandle.myUserId();
+    }
+
+    /**
+     * Gets all the other users on the system that are not the user running the current process.
+     *
+     * @return List of {@code UserInfo} for each user that is not the user running the process.
+     */
+    public List<UserInfo> getAllUsersExcludesCurrentProcessUser() {
+        return getAllUsersExceptUser(getCurrentProcessUserId());
+    }
+
+    /**
+     * Gets all the existing users on the system that are not the currently running as the
+     * foreground user.
+     *
+     * @return List of {@code UserInfo} for each user that is not the foreground user.
+     */
+    public List<UserInfo> getAllUsersExcludesForegroundUser() {
+        return getAllUsersExceptUser(getForegroundUserId());
     }
 
     /**
@@ -104,12 +140,22 @@
      * @return List of {@code UserInfo} for each user that is not the system user.
      */
     public List<UserInfo> getAllUsersExcludesSystemUser() {
+        return getAllUsersExceptUser(UserHandle.USER_SYSTEM);
+    }
+
+    /**
+     * Get all the users except the one with userId passed in.
+     *
+     * @param userId of the user not to be returned.
+     * @return All users other than user with userId.
+     */
+    public List<UserInfo> getAllUsersExceptUser(int userId) {
         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.
+            if (userInfo.id == userId) {
+                // Remove user with userId from the list.
                 iterator.remove();
             }
         }
@@ -146,78 +192,115 @@
     }
 
     /**
-     * Checks whether passed in user is the user that's currently logged in.
+     * Checks whether passed in user is the foreground user.
      *
      * @param userInfo User to check.
-     * @return {@code true} if current user, {@code false} otherwise.
+     * @return {@code true} if foreground user, {@code false} otherwise.
      */
-    public boolean userIsCurrentUser(UserInfo userInfo) {
-        return getCurrentUserInfo().id == userInfo.id;
+    public boolean userIsForegroundUser(UserInfo userInfo) {
+        return getForegroundUserId() == userInfo.id;
     }
 
-    // Current user information accessors
+    /**
+     * Checks whether passed in user is the user that's running the current process.
+     *
+     * @param userInfo User to check.
+     * @return {@code true} if user running the process, {@code false} otherwise.
+     */
+    public boolean userIsRunningCurrentProcess(UserInfo userInfo) {
+        return getCurrentProcessUserId() == userInfo.id;
+    }
+
+    // Foreground user information accessors.
 
     /**
-     * Checks if the current user is a demo user.
+     * Checks if the foreground user is a guest user.
      */
-    public boolean isDemoUser() {
+    public boolean foregroundUserIsGuestUser() {
+      return getForegroundUserInfo().isGuest();
+    }
+
+    /**
+     * Return whether the foreground user has a restriction.
+     *
+     * @param restriction Restriction to check. Should be a UserManager.* restriction.
+     * @return Whether that restriction exists for the foreground user.
+     */
+    public boolean foregroundUserHasUserRestriction(String restriction) {
+        return mUserManager.hasUserRestriction(restriction, getForegroundUserInfo().getUserHandle());
+    }
+
+    /**
+     * Checks if the foreground user can add new users.
+     */
+    public boolean foregroundUserCanAddUsers() {
+        return !foregroundUserHasUserRestriction(UserManager.DISALLOW_ADD_USER);
+    }
+
+    // Current process user information accessors
+
+    /**
+     * Checks if the calling app is running in a demo user.
+     */
+    public boolean currentProcessRunningAsDemoUser() {
         return mUserManager.isDemoUser();
     }
 
     /**
-     * Checks if the current user is a guest user.
+     * Checks if the calling app is running as a guest user.
      */
-    public boolean isGuestUser() {
+    public boolean currentProcessRunningAsGuestUser() {
         return mUserManager.isGuestUser();
     }
 
     /**
-     * Checks if the current user is the system user (User 0).
+     * Checks whether this process is running under the system user.
      */
-    public boolean isSystemUser() {
+    public boolean currentProcessRunningAsSystemUser() {
         return mUserManager.isSystemUser();
     }
 
-    // Current user restriction accessors
+    // Current process user restriction accessors
 
     /**
-     * Return whether the current user has a restriction.
+     * Return whether the user running the current process has a restriction.
      *
      * @param restriction Restriction to check. Should be a UserManager.* restriction.
-     * @return Whether that restriction exists for the current user.
+     * @return Whether that restriction exists for the user running the process.
      */
-    public boolean hasUserRestriction(String restriction) {
+    public boolean currentProcessHasUserRestriction(String restriction) {
         return mUserManager.hasUserRestriction(restriction);
     }
 
     /**
-     * Checks if the current user can add new users.
+     * Checks if the user running the current process can add new users.
      */
-    public boolean canAddUsers() {
-        return !hasUserRestriction(UserManager.DISALLOW_ADD_USER);
+    public boolean currentProcessCanAddUsers() {
+        return !currentProcessHasUserRestriction(UserManager.DISALLOW_ADD_USER);
     }
 
     /**
-     * Checks if the current user can remove users.
+     * Checks if the user running the current process can remove users.
      */
-    public boolean canRemoveUsers() {
-        return !hasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
+    public boolean currentProcessCanRemoveUsers() {
+        return !currentProcessHasUserRestriction(UserManager.DISALLOW_REMOVE_USER);
     }
 
     /**
-     * Checks if the current user is allowed to switch to another user.
+     * Checks if the user running the current process is allowed to switch to another user.
      */
-    public boolean canSwitchUsers() {
-        return !hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
+    public boolean currentProcessCanSwitchUsers() {
+        return !currentProcessHasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
     }
 
     /**
-     * Checks if the current user can modify accounts. Demo and Guest users cannot modify accounts
-     * even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
+     * Checks if the current process user can modify accounts. Demo and Guest users cannot modify
+     * accounts even if the DISALLOW_MODIFY_ACCOUNTS restriction is not applied.
      */
-    public boolean canModifyAccounts() {
-        return !hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS) && !isDemoUser()
-                && !isGuestUser();
+    public boolean currentProcessCanModifyAccounts() {
+        return !currentProcessHasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)
+                && !currentProcessRunningAsDemoUser()
+                && !currentProcessRunningAsGuestUser();
     }
 
     // User actions
@@ -242,8 +325,8 @@
 
     /**
      * Tries to remove the user that's passed in. System user cannot be removed.
-     * If the user to be removed is current user, it switches to the system user first, and then
-     * removes the user.
+     * If the user to be removed is user currently running the process,
+     * it switches to the system user first, and then removes the user.
      *
      * @param userInfo User to be removed
      * @return {@code true} if user is successfully removed, {@code false} otherwise.
@@ -254,7 +337,7 @@
             return false;
         }
 
-        if (userInfo.id == getCurrentUserInfo().id) {
+        if (userInfo.id == getCurrentProcessUserId()) {
             switchToUserId(UserHandle.USER_SYSTEM);
         }
 
@@ -267,7 +350,7 @@
      * @param userInfo User to switch to.
      */
     public void switchToUser(UserInfo userInfo) {
-        if (userInfo.id == getCurrentUserInfo().id) {
+        if (userInfo.id == getForegroundUserId()) {
             return;
         }
 
@@ -276,15 +359,6 @@
             return;
         }
 
-        if (UserManager.isGuestUserEphemeral()) {
-            // If switching from guest, we want to bring up the guest exit dialog instead of
-            // switching
-            UserInfo currUserInfo = getCurrentUserInfo();
-            if (currUserInfo != null && currUserInfo.isGuest()) {
-                return;
-            }
-        }
-
         switchToUserId(userInfo.id);
     }
 
@@ -348,6 +422,9 @@
         filter.addAction(Intent.ACTION_USER_REMOVED);
         filter.addAction(Intent.ACTION_USER_ADDED);
         filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+        filter.addAction(Intent.ACTION_USER_SWITCHED);
+        filter.addAction(Intent.ACTION_USER_STOPPED);
+        filter.addAction(Intent.ACTION_USER_UNLOCKED);
         mContext.registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null, null);
     }
 
@@ -366,9 +443,7 @@
 
     private void switchToUserId(int id) {
         try {
-            final ActivityManager am = (ActivityManager)
-                    mContext.getSystemService(Context.ACTIVITY_SERVICE);
-            am.switchUser(id);
+            mActivityManager.switchUser(id);
         } catch (Exception e) {
             Log.e(TAG, "Couldn't switch user.", e);
         }
@@ -389,4 +464,3 @@
         void onUsersUpdate();
     }
 }
-
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 3f1fcbb..15f7770 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
@@ -58,7 +58,7 @@
     private UserManagerHelper.OnUsersUpdateListener mTestListener;
 
     private UserManagerHelper mHelper;
-    private UserInfo mCurrentUser;
+    private UserInfo mCurrentProcessUser;
     private UserInfo mSystemUser;
 
     @Before
@@ -70,13 +70,13 @@
                 .thenReturn(InstrumentationRegistry.getTargetContext().getResources());
         mHelper = new UserManagerHelper(mContext);
 
-        mCurrentUser = createUserInfoForId(UserHandle.myUserId());
+        mCurrentProcessUser = createUserInfoForId(UserHandle.myUserId());
         mSystemUser = createUserInfoForId(UserHandle.USER_SYSTEM);
-        when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentUser);
+        when(mUserManager.getUserInfo(UserHandle.myUserId())).thenReturn(mCurrentProcessUser);
     }
 
     @Test
-    public void testUserIsSystemUser() {
+    public void userIsSystemUser() {
         UserInfo testInfo = new UserInfo();
 
         testInfo.id = UserHandle.USER_SYSTEM;
@@ -87,33 +87,7 @@
     }
 
     @Test
-    public void testGetAllUsersExcludesCurrentUser() {
-        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.getAllUsersExcludesCurrentUser().size()).isEqualTo(3);
-        // Should not contain current user.
-        assertThat(mHelper.getAllUsersExcludesCurrentUser()).doesNotContain(mCurrentUser);
-        // Should contain non-current users.
-        assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser1);
-        assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser2);
-        assertThat(mHelper.getAllUsersExcludesCurrentUser()).contains(otherUser3);
-    }
-
-    @Test
-    public void testGetAllUsersExcludesSystemUser() {
+    public void getAllUsersExcludesSystemUser() {
         UserInfo otherUser1 = createUserInfoForId(10);
         UserInfo otherUser2 = createUserInfoForId(11);
         UserInfo otherUser3 = createUserInfoForId(12);
@@ -127,17 +101,41 @@
         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);
+        assertThat(mHelper.getAllUsersExcludesSystemUser()).hasSize(3);
+        assertThat(mHelper.getAllUsersExcludesSystemUser())
+                .containsExactly(otherUser1, otherUser2, otherUser3);
     }
 
     @Test
-    public void testGetAllUsers() {
+    public void getAllUsersExceptUser() {
+        UserInfo user1 = createUserInfoForId(10);
+        UserInfo user2 = createUserInfoForId(10);
+        UserInfo user3 = createUserInfoForId(12);
+
+        List<UserInfo> testUsers = new ArrayList<>();
+        testUsers.add(user1);
+        testUsers.add(user2);
+        testUsers.add(user3);
+
+        when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
+
+        // Should return all 3 users.
+        assertThat(mHelper.getAllUsersExceptUser(9).size()).isEqualTo(3);
+
+        // Should return only user 12.
+        assertThat(mHelper.getAllUsersExceptUser(10).size()).isEqualTo(1);
+        assertThat(mHelper.getAllUsersExceptUser(10)).contains(user3);
+
+        when(mUserManager.getUsers(true)).thenReturn(new ArrayList<>(testUsers));
+
+        // Should drop user 12.
+        assertThat(mHelper.getAllUsersExceptUser(12).size()).isEqualTo(2);
+        assertThat(mHelper.getAllUsersExceptUser(12)).contains(user1);
+        assertThat(mHelper.getAllUsersExceptUser(12)).contains(user2);
+    }
+
+    @Test
+    public void getAllUsers() {
         int currentUser = UserHandle.myUserId();
 
         UserInfo otherUser1 = createUserInfoForId(currentUser + 1);
@@ -147,21 +145,18 @@
         List<UserInfo> testUsers = new ArrayList<>();
         testUsers.add(otherUser1);
         testUsers.add(otherUser2);
-        testUsers.add(mCurrentUser);
+        testUsers.add(mCurrentProcessUser);
         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);
+        assertThat(mHelper.getAllUsers())
+                .containsExactly(mCurrentProcessUser, otherUser1, otherUser2, otherUser3);
     }
 
     @Test
-    public void testUserCanBeRemoved() {
+    public void userCanBeRemoved() {
         UserInfo testInfo = new UserInfo();
 
         // System user cannot be removed.
@@ -173,71 +168,59 @@
     }
 
     @Test
-    public void testUserIsCurrentUser() {
-        UserInfo testInfo = new UserInfo();
-
-        // System user cannot be removed.
-        testInfo.id = UserHandle.myUserId();
-        assertThat(mHelper.userIsCurrentUser(testInfo)).isTrue();
-
-        testInfo.id = UserHandle.myUserId() + 2;
-        assertThat(mHelper.userIsCurrentUser(testInfo)).isFalse();
-    }
-
-    @Test
-    public void testCanAddUsers() {
+    public void currentProcessCanAddUsers() {
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(false);
-        assertThat(mHelper.canAddUsers()).isTrue();
+        assertThat(mHelper.currentProcessCanAddUsers()).isTrue();
 
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_ADD_USER)).thenReturn(true);
-        assertThat(mHelper.canAddUsers()).isFalse();
+        assertThat(mHelper.currentProcessCanAddUsers()).isFalse();
     }
 
     @Test
-    public void testCanRemoveUsers() {
+    public void currentProcessCanRemoveUsers() {
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(false);
-        assertThat(mHelper.canRemoveUsers()).isTrue();
+        assertThat(mHelper.currentProcessCanRemoveUsers()).isTrue();
 
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_REMOVE_USER)).thenReturn(true);
-        assertThat(mHelper.canRemoveUsers()).isFalse();
+        assertThat(mHelper.currentProcessCanRemoveUsers()).isFalse();
     }
 
     @Test
-    public void testCanSwitchUsers() {
+    public void currentProcessCanSwitchUsers() {
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(false);
-        assertThat(mHelper.canSwitchUsers()).isTrue();
+        assertThat(mHelper.currentProcessCanSwitchUsers()).isTrue();
 
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)).thenReturn(true);
-        assertThat(mHelper.canSwitchUsers()).isFalse();
+        assertThat(mHelper.currentProcessCanSwitchUsers()).isFalse();
     }
 
     @Test
-    public void testGuestCannotModifyAccounts() {
-        assertThat(mHelper.canModifyAccounts()).isTrue();
+    public void currentProcessRunningAsGuestCannotModifyAccounts() {
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
 
         when(mUserManager.isGuestUser()).thenReturn(true);
-        assertThat(mHelper.canModifyAccounts()).isFalse();
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
     }
 
     @Test
-    public void testDemoUserCannotModifyAccounts() {
-        assertThat(mHelper.canModifyAccounts()).isTrue();
+    public void currentProcessRunningAsDemoUserCannotModifyAccounts() {
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
 
         when(mUserManager.isDemoUser()).thenReturn(true);
-        assertThat(mHelper.canModifyAccounts()).isFalse();
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
     }
 
     @Test
-    public void testUserWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
-        assertThat(mHelper.canModifyAccounts()).isTrue();
+    public void currentProcessWithDisallowModifyAccountsRestrictionCannotModifyAccounts() {
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isTrue();
 
         when(mUserManager.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS))
                 .thenReturn(true);
-        assertThat(mHelper.canModifyAccounts()).isFalse();
+        assertThat(mHelper.currentProcessCanModifyAccounts()).isFalse();
     }
 
     @Test
-    public void testCreateNewUser() {
+    public void createNewUser() {
         // Verify createUser on UserManager gets called.
         mHelper.createNewUser("Test User");
         verify(mUserManager).createUser("Test User", 0);
@@ -252,52 +235,36 @@
     }
 
     @Test
-    public void testRemoveUser() {
+    public void removeUser() {
         // Cannot remove system user.
         assertThat(mHelper.removeUser(mSystemUser)).isFalse();
 
         // Removing non-current, non-system user, simply calls removeUser.
-        UserInfo userToRemove = createUserInfoForId(mCurrentUser.id + 2);
+        UserInfo userToRemove = createUserInfoForId(mCurrentProcessUser.id + 2);
+
         mHelper.removeUser(userToRemove);
-        verify(mUserManager).removeUser(mCurrentUser.id + 2);
+        verify(mUserManager).removeUser(mCurrentProcessUser.id + 2);
     }
 
     @Test
-    public void testSwitchToUser() {
-        // Switching to current user doesn't do anything.
-        mHelper.switchToUser(mCurrentUser);
-        verify(mActivityManager, never()).switchUser(mCurrentUser.id);
-
-        // Switching to Guest calls createGuest.
-        UserInfo guestInfo = new UserInfo(mCurrentUser.id + 1, "Test Guest", UserInfo.FLAG_GUEST);
-        mHelper.switchToUser(guestInfo);
-        verify(mUserManager).createGuest(mContext, "Test Guest");
-
-        // Switching to non-current, non-guest user, simply calls switchUser.
-        UserInfo userToSwitchTo = new UserInfo(mCurrentUser.id + 5, "Test User", 0);
-        mHelper.switchToUser(userToSwitchTo);
-        verify(mActivityManager).switchUser(mCurrentUser.id + 5);
-    }
-
-    @Test
-    public void testSwitchToGuest() {
+    public void switchToGuest() {
         mHelper.switchToGuest("Test Guest");
         verify(mUserManager).createGuest(mContext, "Test Guest");
 
-        UserInfo guestInfo = new UserInfo(mCurrentUser.id + 2, "Test Guest", UserInfo.FLAG_GUEST);
+        UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST);
         when(mUserManager.createGuest(mContext, "Test Guest")).thenReturn(guestInfo);
         mHelper.switchToGuest("Test Guest");
-        verify(mActivityManager).switchUser(mCurrentUser.id + 2);
+        verify(mActivityManager).switchUser(21);
     }
 
     @Test
-    public void testGetUserIcon() {
-        mHelper.getUserIcon(mCurrentUser);
-        verify(mUserManager).getUserIcon(mCurrentUser.id);
+    public void getUserIcon() {
+        mHelper.getUserIcon(mCurrentProcessUser);
+        verify(mUserManager).getUserIcon(mCurrentProcessUser.id);
     }
 
     @Test
-    public void testScaleUserIcon() {
+    public void scaleUserIcon() {
         Bitmap fakeIcon = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
         Drawable scaledIcon = mHelper.scaleUserIcon(fakeIcon, 300);
         assertThat(scaledIcon.getIntrinsicWidth()).isEqualTo(300);
@@ -305,14 +272,14 @@
     }
 
     @Test
-    public void testSetUserName() {
-        UserInfo testInfo = createUserInfoForId(mCurrentUser.id + 3);
+    public void setUserName() {
+        UserInfo testInfo = createUserInfoForId(mCurrentProcessUser.id + 3);
         mHelper.setUserName(testInfo, "New Test Name");
-        verify(mUserManager).setUserName(mCurrentUser.id + 3, "New Test Name");
+        verify(mUserManager).setUserName(mCurrentProcessUser.id + 3, "New Test Name");
     }
 
     @Test
-    public void testRegisterUserChangeReceiver() {
+    public void registerUserChangeReceiver() {
         mHelper.registerOnUsersUpdateListener(mTestListener);
 
         ArgumentCaptor<BroadcastReceiver> receiverCaptor =
@@ -335,10 +302,14 @@
         // Verify the presence of each intent in the filter.
         // Verify the exact number of filters. Every time a new intent is added, this test should
         // get updated.
-        assertThat(filterCaptor.getValue().countActions()).isEqualTo(3);
+        assertThat(filterCaptor.getValue().countActions()).isEqualTo(6);
         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_REMOVED)).isTrue();
         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_ADDED)).isTrue();
         assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_INFO_CHANGED)).isTrue();
+        assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_SWITCHED)).isTrue();
+        assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_STOPPED)).isTrue();
+        assertThat(filterCaptor.getValue().hasAction(Intent.ACTION_USER_UNLOCKED)).isTrue();
+
 
         // Verify that calling the receiver calls the listener.
         receiverCaptor.getValue().onReceive(mContext, new Intent());
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
new file mode 100644
index 0000000..d1e37f6
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothEventManagerTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.settingslib.bluetooth;
+
+import static org.mockito.Mockito.verify;
+
+import android.bluetooth.BluetoothHeadset;
+import android.content.Context;
+import android.content.Intent;
+
+import android.telephony.TelephonyManager;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class BluetoothEventManagerTest {
+
+    @Mock
+    private LocalBluetoothAdapter mLocalAdapter;
+    @Mock
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
+    @Mock
+    private BluetoothCallback mBluetoothCallback;
+
+    private Context mContext;
+    private Intent mIntent;
+    private BluetoothEventManager mBluetoothEventManager;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+
+        mBluetoothEventManager = new BluetoothEventManager(mLocalAdapter,
+                mCachedDeviceManager, mContext);
+    }
+
+    /**
+     * Intent ACTION_AUDIO_STATE_CHANGED should dispatch to callback.
+     */
+    @Test
+    public void intentWithExtraState_audioStateChangedShouldDispatchToRegisterCallback() {
+        mBluetoothEventManager.registerCallback(mBluetoothCallback);
+        mIntent = new Intent(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
+
+        mContext.sendBroadcast(mIntent);
+
+        verify(mBluetoothCallback).onAudioModeChanged();
+    }
+
+    /**
+     * Intent ACTION_PHONE_STATE_CHANGED should dispatch to callback.
+     */
+    @Test
+    public void intentWithExtraState_phoneStateChangedShouldDispatchToRegisterCallback() {
+        mBluetoothEventManager.registerCallback(mBluetoothCallback);
+        mIntent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
+
+        mContext.sendBroadcast(mIntent);
+
+        verify(mBluetoothCallback).onAudioModeChanged();
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.java
new file mode 100644
index 0000000..4a8ef1e
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/testutils/shadow/ShadowActivityManager.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 com.android.settingslib.testutils.shadow;
+
+import android.app.ActivityManager;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+import org.robolectric.shadow.api.Shadow;
+
+@Implements(ActivityManager.class)
+public class ShadowActivityManager {
+    private static int sCurrentUserId = 0;
+    private int mUserSwitchedTo = -1;
+
+    @Resetter
+    public void reset() {
+        sCurrentUserId = 0;
+        mUserSwitchedTo = 0;
+    }
+
+    @Implementation
+    public static int getCurrentUser() {
+        return sCurrentUserId;
+    }
+
+    @Implementation
+    public boolean switchUser(int userId) {
+        mUserSwitchedTo = userId;
+        return true;
+    }
+
+    public boolean getSwitchUserCalled() {
+        return mUserSwitchedTo != -1;
+    }
+
+    public int getUserSwitchedTo() {
+        return mUserSwitchedTo;
+    }
+
+    public static void setCurrentUser(int userId) {
+        sCurrentUserId = userId;
+    }
+
+    public static ShadowActivityManager getShadow() {
+        return (ShadowActivityManager) Shadow.extract(
+                RuntimeEnvironment.application.getSystemService(ActivityManager.class));
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java
new file mode 100644
index 0000000..f2ea3a4
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/users/UserManagerHelperRoboTest.java
@@ -0,0 +1,224 @@
+/*
+ * 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.settingslib.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManager;
+
+import android.content.Context;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.settingslib.testutils.shadow.ShadowActivityManager;
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+@Config(shadows = { ShadowActivityManager.class, UserManagerHelperRoboTest.ShadowUserHandle.class})
+public class UserManagerHelperRoboTest {
+    @Mock
+    private Context mContext;
+    @Mock
+    private UserManager mUserManager;
+
+    private UserManagerHelper mHelper;
+
+    @Before
+    public void setUpMocksAndUserManagerHelper() {
+        MockitoAnnotations.initMocks(this);
+        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(
+                RuntimeEnvironment.application.getSystemService(ActivityManager.class));
+        mHelper = new UserManagerHelper(mContext);
+    }
+
+    @After
+    public void tearDown() {
+        ShadowActivityManager.getShadow().reset();
+    }
+
+    @Test
+    public void getForegroundUserId() {
+        ShadowActivityManager.setCurrentUser(15);
+        assertThat(mHelper.getForegroundUserId()).isEqualTo(15);
+    }
+
+    @Test
+    public void getForegroundUserInfo() {
+        ShadowActivityManager.setCurrentUser(17);
+        when(mUserManager.getUserInfo(ShadowActivityManager.getCurrentUser()))
+                .thenReturn(createUserInfoForId(ShadowActivityManager.getCurrentUser()));
+        assertThat(mHelper.getForegroundUserInfo().id).isEqualTo(17);
+    }
+
+    @Test
+    public void getCurrentProcessUserId() {
+        ShadowUserHandle.setUid(11);
+        assertThat(mHelper.getCurrentProcessUserId()).isEqualTo(11);
+    }
+
+    @Test
+    public void getCurrentProcessUserInfo() {
+        ShadowUserHandle.setUid(12);
+        when(mUserManager.getUserInfo(UserHandle.myUserId()))
+                .thenReturn(createUserInfoForId(UserHandle.myUserId()));
+        assertThat(mHelper.getCurrentProcessUserInfo().id).isEqualTo(12);
+    }
+
+    @Test
+    public void getAllUsersExcludesCurrentProcessUser() {
+        ShadowUserHandle.setUid(12);
+        UserInfo currentProcessUser = createUserInfoForId(12);
+
+        UserInfo otherUser1 = createUserInfoForId(13);
+        UserInfo otherUser2 = createUserInfoForId(11);
+        UserInfo otherUser3 = createUserInfoForId(14);
+
+        List<UserInfo> testUsers = new ArrayList<>();
+        testUsers.add(otherUser1);
+        testUsers.add(otherUser2);
+        testUsers.add(currentProcessUser);
+        testUsers.add(otherUser3);
+
+        when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+        // Should return 3 users that don't have currentProcessUser id.
+        assertThat(mHelper.getAllUsersExcludesCurrentProcessUser()).hasSize(3);
+        assertThat(mHelper.getAllUsersExcludesCurrentProcessUser())
+                .containsExactly(otherUser1, otherUser2, otherUser3);
+    }
+
+    @Test
+    public void getAllUsersExcludesForegroundUser() {
+        ShadowActivityManager.setCurrentUser(17);
+        UserInfo foregroundUser = createUserInfoForId(17);
+
+        UserInfo otherUser1 = createUserInfoForId(11);
+        UserInfo otherUser2 = createUserInfoForId(18);
+        UserInfo otherUser3 = createUserInfoForId(16);
+
+        List<UserInfo> testUsers = new ArrayList<>();
+        testUsers.add(otherUser1);
+        testUsers.add(otherUser2);
+        testUsers.add(foregroundUser);
+        testUsers.add(otherUser3);
+
+        when(mUserManager.getUsers(true)).thenReturn(testUsers);
+
+        // Should return 3 users that don't have foregroundUser id.
+        assertThat(mHelper.getAllUsersExcludesForegroundUser()).hasSize(3);
+        assertThat(mHelper.getAllUsersExcludesForegroundUser())
+                .containsExactly(otherUser1, otherUser2, otherUser3);
+    }
+
+    @Test
+    public void userIsForegroundUser() {
+        ShadowActivityManager.setCurrentUser(10);
+        assertThat(mHelper.userIsForegroundUser(createUserInfoForId(10))).isTrue();
+        assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isFalse();
+
+        ShadowActivityManager.setCurrentUser(11);
+        assertThat(mHelper.userIsForegroundUser(createUserInfoForId(11))).isTrue();
+    }
+
+    @Test
+    public void userIsRunningCurrentProcess() {
+        ShadowUserHandle.setUid(10);
+        assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(10))).isTrue();
+        assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isFalse();
+
+        ShadowUserHandle.setUid(11);
+        assertThat(mHelper.userIsRunningCurrentProcess(createUserInfoForId(11))).isTrue();
+    }
+
+    @Test
+    public void removingCurrentProcessUserSwitchesToSystemUser() {
+        // Set currentProcess user to be user 10.
+        ShadowUserHandle.setUid(10);
+
+        // Removing a currentProcess user, calls "switch" to system user
+        mHelper.removeUser(createUserInfoForId(10));
+        assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue();
+        assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(0);
+
+        verify(mUserManager).removeUser(10);
+    }
+
+    @Test
+    public void switchToUser() {
+        ShadowActivityManager.setCurrentUser(20);
+
+        // Switching to foreground user doesn't do anything.
+        mHelper.switchToUser(createUserInfoForId(20));
+        assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isFalse();
+
+        // Switching to Guest calls createGuest.
+        UserInfo guestInfo = new UserInfo(21, "Test Guest", UserInfo.FLAG_GUEST);
+        mHelper.switchToUser(guestInfo);
+        verify(mUserManager).createGuest(mContext, "Test Guest");
+
+        // Switching to non-current, non-guest user, simply calls switchUser.
+        UserInfo userToSwitchTo = new UserInfo(22, "Test User", 0);
+        mHelper.switchToUser(userToSwitchTo);
+        assertThat(ShadowActivityManager.getShadow().getSwitchUserCalled()).isTrue();
+        assertThat(ShadowActivityManager.getShadow().getUserSwitchedTo()).isEqualTo(22);
+    }
+
+    private UserInfo createUserInfoForId(int id) {
+        UserInfo userInfo = new UserInfo();
+        userInfo.id = id;
+        return userInfo;
+    }
+
+    @Implements(UserHandle.class)
+    public static class ShadowUserHandle {
+        private static int sUid = 0; // SYSTEM by default
+
+        public static void setUid(int uid) {
+            sUid = uid;
+        }
+
+        @Implementation
+        public static int myUserId() {
+            return sUid;
+        }
+
+        @Resetter
+        public static void reset() {
+            sUid = 0;
+        }
+    }
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 313f73f..f728684 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -253,6 +253,7 @@
                     && !RESTORE_FROM_HIGHER_SDK_INT_SUPPORTED_KEYS.contains(key)) {
                 Log.w(TAG, "Not restoring unrecognized key '"
                         + key + "' from future version " + appVersionCode);
+                data.skipEntityData();
                 continue;
             }
 
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index a6d6250..022e306 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -2935,7 +2935,7 @@
         }
 
         private final class UpgradeController {
-            private static final int SETTINGS_VERSION = 162;
+            private static final int SETTINGS_VERSION = 163;
 
             private final int mUserId;
 
@@ -3709,6 +3709,21 @@
                     currentVersion = 162;
                 }
 
+                if (currentVersion == 162) {
+                    // Version 162: Add a gesture for silencing phones
+                    final SettingsState settings = getGlobalSettingsLocked();
+                    final Setting currentSetting = settings.getSettingLocked(
+                            Global.SHOW_ZEN_UPGRADE_NOTIFICATION);
+                    if (!currentSetting.isNull()
+                            && TextUtils.equals("0", currentSetting.getValue())) {
+                        settings.insertSettingLocked(
+                                Global.SHOW_ZEN_UPGRADE_NOTIFICATION, "1",
+                                null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+                    }
+
+                    currentVersion = 163;
+                }
+
                 // vXXX: Add new settings above this point.
 
                 if (currentVersion != newVersion) {
diff --git a/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml b/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
similarity index 97%
rename from packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml
rename to packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
index 85896e8..5add2a8 100644
--- a/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded_24px.xml
+++ b/packages/SimAppDialog/res/drawable/ic_signal_cellular_alt_rounded.xml
@@ -15,8 +15,8 @@
     limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="21dp"
-        android:height="22dp"
+        android:width="32dp"
+        android:height="32dp"
         android:viewportWidth="21"
         android:viewportHeight="22">
 
diff --git a/packages/SimAppDialog/res/drawable/placeholder.xml b/packages/SimAppDialog/res/drawable/placeholder.xml
deleted file mode 100644
index 53eee74..0000000
--- a/packages/SimAppDialog/res/drawable/placeholder.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Copyright (C) 2018 The Android Open Source Project
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<!-- TODO(b/72511181): replace when illustration is finished -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="270dp"
-        android:height="270dp"
-        android:viewportHeight="270.0"
-        android:viewportWidth="270.0">
-    <path android:fillColor="#E8EAED"
-          android:pathData="M183.54,265H84.88c-7.63,0 -13.81,-6.18 -13.81,-13.81V18.81C71.07,11.18 77.25,5 84.88,5h98.66c7.63,0 13.81,6.18 13.81,13.81v232.38C197.35,258.82 191.17,265 183.54,265z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M183.54,6.63c6.72,0 12.18,5.46 12.18,12.18v232.38c0,6.72 -5.46,12.18 -12.18,12.18H84.88c-6.72,0 -12.18,-5.46 -12.18,-12.18V18.81c0,-6.72 5.46,-12.18 12.18,-12.18H183.54M183.54,5H84.88c-7.63,0 -13.81,6.18 -13.81,13.81v232.38c0,7.63 6.18,13.81 13.81,13.81h98.66c7.63,0 13.81,-6.18 13.81,-13.81V18.81C197.35,11.18 191.17,5 183.54,5L183.54,5z"/>
-    <path android:fillColor="#FFFFFF"
-          android:pathData="M186.34,243.74H82.08c-2.41,0 -4.36,-1.95 -4.36,-4.36V30.61c0,-2.41 1.95,-4.36 4.36,-4.36h104.26c2.41,0 4.36,1.95 4.36,4.36v208.78C190.7,241.79 188.75,243.74 186.34,243.74z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M156.07,254.78h-43.72c-0.65,0 -1.18,-0.53 -1.18,-1.18v-0.08c0,-0.65 0.53,-1.18 1.18,-1.18h43.72c0.65,0 1.18,0.53 1.18,1.18v0.08C157.25,254.25 156.72,254.78 156.07,254.78z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M156.07,17.67h-43.72c-0.65,0 -1.18,-0.53 -1.18,-1.18V16.4c0,-0.65 0.53,-1.18 1.18,-1.18l43.72,0c0.65,0 1.18,0.53 1.18,1.18v0.08C157.25,17.14 156.72,17.67 156.07,17.67z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M197.85,84.16h-0.5V67.51h0.5c0.6,0 1.08,0.48 1.08,1.08v14.5C198.93,83.68 198.45,84.16 197.85,84.16z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M197.41,136.45h-0.06v-32.87h0.06c0.84,0 1.52,0.68 1.52,1.52v29.84C198.93,135.77 198.25,136.45 197.41,136.45z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M119.3,74.73l2.71,2.71c6.74,-6.74 17.67,-6.74 24.4,0l2.71,-2.71C140.89,66.49 127.54,66.49 119.3,74.73zM130.15,85.57l4.07,4.07l4.07,-4.07C136.04,83.33 132.39,83.33 130.15,85.57zM124.72,80.15l2.71,2.71c3.74,-3.74 9.82,-3.74 13.56,0l2.71,-2.71C138.46,74.91 129.96,74.91 124.72,80.15z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M143.7,179h-1.36v-2.71h-2.71V179h-10.85v-2.71h-2.71V179h-1.36c-1.5,0 -2.7,1.21 -2.7,2.71l-0.01,18.98c0,1.5 1.21,2.71 2.71,2.71h18.98c1.5,0 2.71,-1.21 2.71,-2.71v-18.98C146.41,180.22 145.2,179 143.7,179zM143.7,200.7h-18.98v-14.91h18.98V200.7zM127.43,188.49h6.78v6.78h-6.78V188.49z"/>
-    <path android:fillColor="#BDC1C6"
-          android:pathData="M146.41,144.49v-18.98c0,-1.5 -1.21,-2.71 -2.71,-2.71h-18.98c-1.5,0 -2.71,1.21 -2.71,2.71v18.98c0,1.5 1.21,2.71 2.71,2.71h18.98C145.2,147.2 146.41,145.99 146.41,144.49zM129.47,137.03l3.39,4.07l4.75,-6.11l6.1,8.13h-18.98L129.47,137.03z"/>
-</vector>
diff --git a/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml b/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
index 0462a93..5bcce4d 100644
--- a/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
+++ b/packages/SimAppDialog/res/layout/install_carrier_app_activity.xml
@@ -20,7 +20,7 @@
     android:id="@+id/setup_wizard_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:icon="@drawable/ic_signal_cellular_alt_rounded_24px"
+    android:icon="@drawable/ic_signal_cellular_alt_rounded"
     app:suwHeaderText="@string/install_carrier_app_title"
     app:suwFooter="@layout/install_carrier_app_footer">
 
@@ -37,21 +37,6 @@
             android:text="@string/install_carrier_app_description_default"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"/>
-
-        <com.android.setupwizardlib.view.FillContentLayout
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1">
-
-            <!-- TODO(b/72511181): final illo and content description update -->
-            <ImageView
-                android:src="@drawable/placeholder"
-                style="@style/SuwContentIllustration"
-                android:contentDescription="@null"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"/>
-
-        </com.android.setupwizardlib.view.FillContentLayout>
     </LinearLayout>
 
 </com.android.setupwizardlib.GlifLayout>
diff --git a/packages/SimAppDialog/res/values/strings.xml b/packages/SimAppDialog/res/values/strings.xml
index 0c3930d..87941cb 100644
--- a/packages/SimAppDialog/res/values/strings.xml
+++ b/packages/SimAppDialog/res/values/strings.xml
@@ -15,22 +15,21 @@
     limitations under the License.
 -->
 <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- TODO character limits -->
-    <!-- The name of this application -->
+    <!-- The name of this application [CHAR LIMIT=NONE] -->
     <string name="app_name">Sim App Dialog</string>
     <!-- Install Carrier App Activity -->
-    <!-- Title of screen asking user to download the carrier app to match the inserted SIM card -->
+    <!-- Title of screen asking user to download the carrier app to match the inserted SIM card [CHAR LIMIT=30] -->
     <string name="install_carrier_app_title">Activate mobile service</string>
-    <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we know the name of the carrier-->
+    <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we know the name of the carrier [CHAR LIMIT=90] -->
     <string name="install_carrier_app_description">To get your new SIM working properly, you\'ll
         need to install the <xliff:g name="carrier_name" example="Project Fi">%1$s</xliff:g> app
     </string>
-    <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we don't know the name of the carrier-->
+    <!-- Description of screen asking user to download the carrier app to match the inserted SIM card if we don't know the name of the carrier  [CHAR LIMIT=100] -->
     <string name="install_carrier_app_description_default">To get your new SIM working properly,
         you\'ll need to install the carrier app
     </string>
-    <!-- Name of the button used to defer downloading the carrier app -->
+    <!-- Name of the button used to defer downloading the carrier app  [CHAR LIMIT=25]-->
     <string name="install_carrier_app_defer_action">Not now</string>
-    <!-- Name of the button for downloading the carrier app -->
+    <!-- Name of the button for downloading the carrier app [CHAR LIMIT=25] -->
     <string name="install_carrier_app_download_action">Download app</string>
 </resources>
\ No newline at end of file
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index d6fab4c..285b89f 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -206,7 +206,7 @@
     <uses-permission android:name="android.permission.WATCH_APPOPS" />
 
     <!-- to read and change hvac values in a car -->
-    <uses-permission android:name="android.car.permission.ADJUST_CAR_CLIMATE" />
+    <uses-permission android:name="android.car.permission.CONTROL_CAR_CLIMATE" />
 
     <application
         android:name=".SystemUIApplication"
diff --git a/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml b/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml
new file mode 100644
index 0000000..05db3a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/recents_onboarding_toast_rounded_background.xml
@@ -0,0 +1,19 @@
+<!--
+    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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <solid android:color="?android:attr/colorAccent" />
+    <corners android:radius="8dp" />
+</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index ef18725..f424171 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -38,9 +38,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_marginTop="1dp"
-        android:layout_marginStart="8dp"
-        android:layout_marginEnd="8dp"
+        android:layout_marginStart="16dp"
         android:layout_gravity="center_vertical"
         android:gravity="end" >
 
@@ -48,18 +46,17 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical|start"
-            android:layout_margin="15dp"
+            android:layout_marginEnd="8dp"
             android:visibility="gone"
             layout="@layout/mobile_signal_group" />
 
         <com.android.keyguard.CarrierText
             android:id="@+id/qs_carrier_text"
             android:layout_width="0dp"
-            android:layout_height="match_parent"
+            android:layout_height="wrap_content"
             android:layout_weight="1"
-            android:layout_marginStart="8dp"
+            android:layout_gravity="center_vertical|start"
             android:layout_marginEnd="32dp"
-            android:gravity="center_vertical|start"
             android:ellipsize="marquee"
             android:textAppearance="@style/TextAppearance.QS.TileLabel"
             android:textColor="?android:attr/textColorPrimary"
diff --git a/packages/SystemUI/res/layout/recents_onboarding.xml b/packages/SystemUI/res/layout/recents_onboarding.xml
index 12f278a..6764eee 100644
--- a/packages/SystemUI/res/layout/recents_onboarding.xml
+++ b/packages/SystemUI/res/layout/recents_onboarding.xml
@@ -14,32 +14,48 @@
      limitations under the License.
 -->
 
-<FrameLayout
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_height="48dp"
-    android:layout_width="match_parent"
-    android:background="@android:color/black"
-    android:layout_gravity="center">
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:background="?android:attr/listDivider"
-        android:gravity="top"/>
-    <TextView
-        android:id="@+id/onboarding_text"
+    android:layout_height="wrap_content"
+    android:layout_width="wrap_content"
+    android:paddingBottom="13dp"
+    android:orientation="vertical">
+
+    <LinearLayout
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
-        android:textColor="@android:color/white"
-        android:textSize="16sp"
-        android:drawableBottom="@drawable/ic_chevron_up"/>
-    <ImageView
-        android:id="@+id/dismiss"
-        android:layout_width="48dp"
-        android:layout_height="48dp"
-        android:padding="12dp"
-        android:layout_marginEnd="6dp"
-        android:src="@drawable/ic_close_white"
-        android:background="?android:attr/selectableItemBackgroundBorderless"
-        android:layout_gravity="center_vertical|end"/>
-</FrameLayout>
\ No newline at end of file
+        android:layout_height="40dp"
+        android:paddingStart="24dp"
+        android:paddingEnd="4dp"
+        android:background="@drawable/recents_onboarding_toast_rounded_background"
+        android:layout_gravity="center_horizontal"
+        android:elevation="2dp"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/onboarding_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:textColor="@android:color/white"
+            android:textSize="16sp"/>
+        <ImageView
+            android:id="@+id/dismiss"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:layout_gravity="center_vertical"
+            android:padding="10dp"
+            android:layout_marginStart="2dp"
+            android:layout_marginEnd="2dp"
+            android:alpha="0.7"
+            android:src="@drawable/ic_close_white"
+            android:background="?android:attr/selectableItemBackgroundBorderless"/>
+    </LinearLayout>
+
+    <View
+        android:id="@+id/arrow"
+        android:elevation="2dp"
+        android:layout_width="10dp"
+        android:layout_height="8dp"
+        android:layout_marginTop="-2dp"
+        android:layout_gravity="center_horizontal"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values/attrs_car.xml b/packages/SystemUI/res/values/attrs_car.xml
index 335ae44..99d2425 100644
--- a/packages/SystemUI/res/values/attrs_car.xml
+++ b/packages/SystemUI/res/values/attrs_car.xml
@@ -29,6 +29,8 @@
         <attr name="categories" format="string"/>
         <!-- package names that will be added as extras to the fired intents -->
         <attr name="packages" format="string" />
+        <!-- componentName names that will be used for detecting selected state -->
+        <attr name="componentNames" format="string" />
         <!-- 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  -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 105d173..b99e35b 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -378,7 +378,7 @@
     <dimen name="qs_header_alarm_icon_size">18dp</dimen>
     <dimen name="qs_header_alarm_text_margin_start">6dp</dimen>
     <dimen name="qs_footer_padding_start">16dp</dimen>
-    <dimen name="qs_footer_padding_end">24dp</dimen>
+    <dimen name="qs_footer_padding_end">16dp</dimen>
     <dimen name="qs_footer_icon_size">16dp</dimen>
 
     <dimen name="qs_notif_collapsed_space">64dp</dimen>
@@ -848,6 +848,9 @@
     <!-- The size of the drag hint text. -->
     <dimen name="recents_drag_hint_text_size">14sp</dimen>
 
+    <!-- The size of corner radius of the arrow in the onboarding toast. -->
+    <dimen name="recents_onboarding_toast_arrow_corner_radius">2dp</dimen>
+
     <!-- The min alpha to apply to a task affiliation group color. -->
     <item name="recents_task_affiliation_color_min_alpha_percentage" format="float" type="dimen">0.6</item>
 
@@ -933,6 +936,11 @@
     <dimen name="smart_reply_button_font_size">14sp</dimen>
     <dimen name="smart_reply_button_line_spacing_extra">6sp</dimen> <!-- Total line height 20sp. -->
 
+    <!-- A reasonable upper bound for the height of the smart reply button. The measuring code
+            needs to start with a guess for the maximum size. Currently two-line smart reply buttons
+            add about 88dp of height to the notifications. -->
+    <dimen name="smart_reply_button_max_height">100dp</dimen>
+
     <!-- Fingerprint Dialog values -->
     <dimen name="fingerprint_dialog_fp_icon_size">64dp</dimen>
     <dimen name="fingerprint_dialog_animation_translation_offset">350dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c1e1873..29f1335 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -405,7 +405,10 @@
     <string name="accessibility_cell_data_on">Mobile Data On</string>
 
     <!-- Content description of the cell data being disabled. [CHAR LIMIT=NONE] -->
-    <string name="cell_data_off">Mobile data off</string>
+    <string name="cell_data_off_content_description">Mobile data off</string>
+
+    <!-- Content description of the cell data being disabled but shortened. [CHAR LIMIT=20] -->
+    <string name="cell_data_off">Off</string>
 
     <!-- Content description of the bluetooth tethering icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
     <string name="accessibility_bluetooth_tether">Bluetooth tethering.</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
index 36d8423..b2b140e 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/WindowCallbacksCompat.java
@@ -60,6 +60,12 @@
         }
     };
 
+    private final View mView;
+
+    public WindowCallbacksCompat(View view) {
+        mView = view;
+    }
+
     public void onWindowSizeIsChanging(Rect newBounds, boolean fullscreen, Rect systemInsets,
             Rect stableInsets) { }
 
@@ -72,12 +78,20 @@
         return false;
     }
 
-    public void onRequestDraw(boolean reportNextDraw) { }
+    public void onRequestDraw(boolean reportNextDraw) {
+        if (reportNextDraw) {
+            reportDrawFinish();
+        }
+    }
 
     public void onPostDraw(Canvas canvas) { }
 
-    public final boolean addToView(View view) {
-        ViewRootImpl root = view.getViewRootImpl();
+    public void reportDrawFinish() {
+        mView.getViewRootImpl().reportDrawFinish();
+    }
+
+    public boolean attach() {
+        ViewRootImpl root = mView.getViewRootImpl();
         if (root != null) {
             root.addWindowCallbacks(mWindowCallbacks);
             root.requestInvalidateRootRenderNode();
@@ -86,8 +100,8 @@
         return false;
     }
 
-    public final void removeFromView(View view) {
-        ViewRootImpl root = view.getViewRootImpl();
+    public void detach() {
+        ViewRootImpl root = mView.getViewRootImpl();
         if (root != null) {
             root.removeWindowCallbacks(mWindowCallbacks);
         }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 1bab36b..c826aaa 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1850,6 +1850,7 @@
         final TelephonyManager tele = TelephonyManager.from(mContext);
         ArrayList<Integer> changedSubscriptionIds = new ArrayList<>();
         HashSet<Integer> activeSubIds = new HashSet<>();
+        HashSet<Integer> activeSlotIds = new HashSet<>();
 
         for (SubscriptionInfo info : activeSubscriptionInfos) {
             int subId = info.getSubscriptionId();
@@ -1878,11 +1879,15 @@
             }
 
             activeSubIds.add(subId);
+            activeSlotIds.add(slotId);
         }
 
         for (SimData data : mSimDatas.values()) {
-            if (!activeSubIds.contains(data.subId) && data.simState != State.ABSENT) {
+            if (!activeSubIds.contains(data.subId)
+                && !activeSlotIds.contains(data.slotId)
+                && data.simState != State.ABSENT) {
                 // for the inactive subscriptions, reset state to ABSENT
+                if (DEBUG_SIM_STATES) Log.d(TAG, "reset state to ABSENT for subId:" + data.subId);
                 data.simState = State.ABSENT;
                 changedSubscriptionIds.add(data.subId);
             }
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index a0fa69e..7042d22 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -14,6 +14,10 @@
 
 package com.android.systemui;
 
+import static android.view.Surface.ROTATION_0;
+import static android.view.Surface.ROTATION_180;
+import static android.view.Surface.ROTATION_270;
+import static android.view.Surface.ROTATION_90;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
@@ -21,12 +25,14 @@
 import static com.android.systemui.tuner.TunablePadding.FLAG_START;
 import static com.android.systemui.tuner.TunablePadding.FLAG_END;
 
+import android.annotation.Dimension;
 import android.app.Fragment;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.graphics.Canvas;
 import android.graphics.Color;
+import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.PixelFormat;
@@ -41,6 +47,7 @@
 import android.view.DisplayInfo;
 import android.view.Gravity;
 import android.view.LayoutInflater;
+import android.view.Surface;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
 import android.view.ViewGroup;
@@ -207,7 +214,11 @@
     }
 
     private boolean shouldDrawCutout() {
-        return mContext.getResources().getBoolean(
+        return shouldDrawCutout(mContext);
+    }
+
+    static boolean shouldDrawCutout(Context context) {
+        return context.getResources().getBoolean(
                 com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout);
     }
 
@@ -359,6 +370,7 @@
             if (!mBoundingPath.isEmpty()) {
                 mPaint.setColor(Color.BLACK);
                 mPaint.setStyle(Paint.Style.FILL);
+                mPaint.setAntiAlias(true);
                 canvas.drawPath(mBoundingPath, mPaint);
             }
         }
@@ -385,10 +397,10 @@
             mBoundingRect.setEmpty();
             mBoundingPath.reset();
             int newVisible;
-            if (hasCutout()) {
+            if (shouldDrawCutout(getContext()) && hasCutout()) {
                 mBounds.set(mInfo.displayCutout.getBounds());
                 localBounds(mBoundingRect);
-                mInfo.displayCutout.getBounds().getBoundaryPath(mBoundingPath);
+                updateBoundingPath();
                 invalidate();
                 newVisible = VISIBLE;
             } else {
@@ -400,6 +412,44 @@
             }
         }
 
+        private void updateBoundingPath() {
+            int lw = mInfo.logicalWidth;
+            int lh = mInfo.logicalHeight;
+
+            boolean flipped = mInfo.rotation == ROTATION_90 || mInfo.rotation == ROTATION_270;
+
+            int dw = flipped ? lh : lw;
+            int dh = flipped ? lw : lh;
+
+            mBoundingPath.set(DisplayCutout.pathFromResources(getResources(), lw, lh));
+            Matrix m = new Matrix();
+            transformPhysicalToLogicalCoordinates(mInfo.rotation, dw, dh, m);
+            mBoundingPath.transform(m);
+        }
+
+        private static void transformPhysicalToLogicalCoordinates(@Surface.Rotation int rotation,
+                @Dimension int physicalWidth, @Dimension int physicalHeight, Matrix out) {
+            switch (rotation) {
+                case ROTATION_0:
+                    out.reset();
+                    break;
+                case ROTATION_90:
+                    out.setRotate(270);
+                    out.postTranslate(0, physicalWidth);
+                    break;
+                case ROTATION_180:
+                    out.setRotate(180);
+                    out.postTranslate(physicalWidth, physicalHeight);
+                    break;
+                case ROTATION_270:
+                    out.setRotate(90);
+                    out.postTranslate(physicalHeight, 0);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Unknown rotation: " + rotation);
+            }
+        }
+
         private boolean hasCutout() {
             final DisplayCutout displayCutout = mInfo.displayCutout;
             if (displayCutout == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
index c238e54..a81043e 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
@@ -134,8 +134,11 @@
     }
 
     private void handleShowDialog(SomeArgs args) {
-        if (DEBUG) Log.d(TAG, "handleShowDialog");
-        if (mDialogShowing) {
+        if (DEBUG) Log.d(TAG, "handleShowDialog, isAnimatingAway: "
+                + mDialogView.isAnimatingAway());
+        if (mDialogView.isAnimatingAway()) {
+            mDialogView.forceRemove();
+        } else if (mDialogShowing) {
             Log.w(TAG, "Dialog already showing");
             return;
         }
@@ -168,7 +171,7 @@
     }
 
     private void handleHideDialog(boolean userCanceled) {
-        if (DEBUG) Log.d(TAG, "handleHideDialog");
+        if (DEBUG) Log.d(TAG, "handleHideDialog, userCanceled: " + userCanceled);
         if (!mDialogShowing) {
             // This can happen if there's a race and we get called from both
             // onAuthenticated and onError, etc.
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
index d1d6609..8013a9e 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
@@ -19,7 +19,6 @@
 import android.content.Context;
 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.BiometricPrompt;
@@ -76,9 +75,29 @@
     private Bundle mBundle;
     private final LinearLayout mDialog;
     private int mLastState;
+    private boolean mAnimatingAway;
+    private boolean mWasForceRemoved;
 
     private final float mDisplayWidth;
 
+    private final Runnable mShowAnimationRunnable = new Runnable() {
+        @Override
+        public void run() {
+            mLayout.animate()
+                    .alpha(1f)
+                    .setDuration(ANIMATION_DURATION_SHOW)
+                    .setInterpolator(mLinearOutSlowIn)
+                    .withLayer()
+                    .start();
+            mDialog.animate()
+                    .translationY(0)
+                    .setDuration(ANIMATION_DURATION_SHOW)
+                    .setInterpolator(mLinearOutSlowIn)
+                    .withLayer()
+                    .start();
+        }
+    };
+
     public FingerprintDialogView(Context context, Handler handler) {
         super(context);
         mHandler = handler;
@@ -192,26 +211,20 @@
             positive.setVisibility(View.GONE);
         }
 
-        // Dim the background and slide the dialog up
-        mDialog.setTranslationY(mAnimationTranslationOffset);
-        mLayout.setAlpha(0f);
-        postOnAnimation(new Runnable() {
-            @Override
-            public void run() {
-                mLayout.animate()
-                        .alpha(1f)
-                        .setDuration(ANIMATION_DURATION_SHOW)
-                        .setInterpolator(mLinearOutSlowIn)
-                        .withLayer()
-                        .start();
-                mDialog.animate()
-                        .translationY(0)
-                        .setDuration(ANIMATION_DURATION_SHOW)
-                        .setInterpolator(mLinearOutSlowIn)
-                        .withLayer()
-                        .start();
-            }
-        });
+        if (!mWasForceRemoved) {
+            // Dim the background and slide the dialog up
+            mDialog.setTranslationY(mAnimationTranslationOffset);
+            mLayout.setAlpha(0f);
+            postOnAnimation(mShowAnimationRunnable);
+        } else {
+            // Show the dialog immediately
+            mLayout.animate().cancel();
+            mDialog.animate().cancel();
+            mDialog.setAlpha(1.0f);
+            mDialog.setTranslationY(0);
+            mLayout.setAlpha(1.0f);
+        }
+        mWasForceRemoved = false;
     }
 
     private void setDismissesDialog(View v) {
@@ -224,10 +237,13 @@
     }
 
     public void startDismiss() {
+        mAnimatingAway = true;
+
         final Runnable endActionRunnable = new Runnable() {
             @Override
             public void run() {
                 mWindowManager.removeView(FingerprintDialogView.this);
+                mAnimatingAway = false;
             }
         };
 
@@ -251,6 +267,23 @@
         });
     }
 
+    /**
+     * Force remove the window, cancelling any animation that's happening. This should only be
+     * called if we want to quickly show the dialog again (e.g. on rotation). Calling this method
+     * will cause the dialog to show without an animation the next time it's attached.
+     */
+    public void forceRemove() {
+        mLayout.animate().cancel();
+        mDialog.animate().cancel();
+        mWindowManager.removeView(FingerprintDialogView.this);
+        mAnimatingAway = false;
+        mWasForceRemoved = true;
+    }
+
+    public boolean isAnimatingAway() {
+        return mAnimatingAway;
+    }
+
     public void setBundle(Bundle bundle) {
         mBundle = bundle;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
index 9464105..ebd15f5 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java
@@ -613,7 +613,7 @@
                                           int bluetoothProfile) { }
 
         @Override
-        public void onProfileAudioStateChanged(int bluetoothProfile, int state) { }
+        public void onAudioModeChanged() { }
     }
 
     private final class BluetoothErrorListener implements Utils.ErrorListener {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 426f714..5993c39 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -145,6 +145,8 @@
     private static final String DELAYED_LOCK_PROFILE_ACTION =
             "com.android.internal.policy.impl.PhoneWindowManager.DELAYED_LOCK";
 
+    private static final String SYSTEMUI_PERMISSION = "com.android.systemui.permission.SELF";
+
     // used for handler messages
     private static final int SHOW = 1;
     private static final int HIDE = 2;
@@ -357,7 +359,12 @@
             // ActivityManagerService) will not reconstruct the keyguard if it is already showing.
             synchronized (KeyguardViewMediator.this) {
                 resetKeyguardDonePendingLocked();
-                resetStateLocked();
+                if (mLockPatternUtils.isLockScreenDisabled(userId)) {
+                    // If we switching to a user that has keyguard disabled, dismiss keyguard.
+                    dismiss(null /* callback */, null /* message */);
+                } else {
+                    resetStateLocked();
+                }
                 adjustStatusBarLocked();
             }
         }
@@ -688,11 +695,15 @@
         mShowKeyguardWakeLock.setReferenceCounted(false);
 
         IntentFilter filter = new IntentFilter();
-        filter.addAction(DELAYED_KEYGUARD_ACTION);
-        filter.addAction(DELAYED_LOCK_PROFILE_ACTION);
         filter.addAction(Intent.ACTION_SHUTDOWN);
         mContext.registerReceiver(mBroadcastReceiver, filter);
 
+        final IntentFilter delayedActionFilter = new IntentFilter();
+        delayedActionFilter.addAction(DELAYED_KEYGUARD_ACTION);
+        delayedActionFilter.addAction(DELAYED_LOCK_PROFILE_ACTION);
+        mContext.registerReceiver(mDelayedLockBroadcastReceiver, delayedActionFilter,
+                SYSTEMUI_PERMISSION, null /* scheduler */);
+
         mKeyguardDisplayManager = new KeyguardDisplayManager(mContext, mViewMediatorCallback);
 
         mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
@@ -1460,7 +1471,10 @@
         }
     }
 
-    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+    /**
+     * This broadcast receiver should be registered with the SystemUI permission.
+     */
+    private final BroadcastReceiver mDelayedLockBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (DELAYED_KEYGUARD_ACTION.equals(intent.getAction())) {
@@ -1482,7 +1496,14 @@
                         }
                     }
                 }
-            } else if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) {
+            }
+        }
+    };
+
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) {
                 synchronized (KeyguardViewMediator.this){
                     mShuttingDown = true;
                 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index cf549fa..28dd26f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -383,7 +383,7 @@
             if (TextUtils.equals(mInfo.typeContentDescription,
                     mContext.getString(R.string.data_connection_no_internet))
                 || TextUtils.equals(mInfo.typeContentDescription,
-                    mContext.getString(R.string.cell_data_off))) {
+                    mContext.getString(R.string.cell_data_off_content_description))) {
                 contentDescription.append(mInfo.typeContentDescription);
             }
             mMobileSignal.setContentDescription(contentDescription);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 2abe9d9..d6182c4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -108,20 +108,21 @@
         }
         if (mDataController.isMobileDataEnabled()) {
             if (mKeyguardMonitor.isSecure() && !mKeyguardMonitor.canSkipBouncer()) {
-                mActivityStarter.postQSRunnableDismissingKeyguard(this::showDisableDialog);
+                mActivityStarter.postQSRunnableDismissingKeyguard(this::maybeShowDisableDialog);
             } else {
-                if (Prefs.getBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA, false)) {
-                    mDataController.setMobileDataEnabled(false);
-                } else {
-                    mUiHandler.post(this::showDisableDialog);
-                }
+                mUiHandler.post(this::maybeShowDisableDialog);
             }
         } else {
             mDataController.setMobileDataEnabled(true);
         }
     }
 
-    private void showDisableDialog() {
+    private void maybeShowDisableDialog() {
+        if (Prefs.getBoolean(mContext, QS_HAS_TURNED_OFF_MOBILE_DATA, false)) {
+            // Directly turn off mobile data if the user has seen the dialog before.
+            mDataController.setMobileDataEnabled(false);
+            return;
+        }
         mHost.collapsePanels();
         String carrierName = mController.getMobileDataNetworkName();
         if (TextUtils.isEmpty(carrierName)) {
@@ -194,7 +195,18 @@
             state.state = Tile.STATE_INACTIVE;
             state.secondaryLabel = r.getString(R.string.cell_data_off);
         }
-        state.contentDescription = state.label + ", " + state.secondaryLabel;
+
+
+        // TODO(b/77881974): Instead of switching out the description via a string check for
+        // we need to have two strings provided by the MobileIconGroup.
+        final CharSequence contentDescriptionSuffix;
+        if (state.state == Tile.STATE_INACTIVE) {
+            contentDescriptionSuffix = r.getString(R.string.cell_data_off_content_description);
+        } else {
+            contentDescriptionSuffix = state.secondaryLabel;
+        }
+
+        state.contentDescription = state.label + ", " + contentDescriptionSuffix;
     }
 
     private CharSequence getMobileDataDescription(CallbackInfo cb) {
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 4b312f5..16c2a75 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -143,26 +143,41 @@
     public void showDetail(boolean show) {
         int zenDuration = Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.ZEN_DURATION, 0);
-        switch (zenDuration) {
-            case Settings.Global.ZEN_DURATION_PROMPT:
-                mUiHandler.post(() -> {
-                    Dialog mDialog = new EnableZenModeDialog(mContext).createDialog();
-                    mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
-                    SystemUIDialog.setShowForAllUsers(mDialog, true);
-                    SystemUIDialog.registerDismissListener(mDialog);
-                    SystemUIDialog.setWindowOnTop(mDialog);
-                    mUiHandler.post(() -> mDialog.show());
-                    mHost.collapsePanels();
-                });
-                break;
-            case Settings.Global.ZEN_DURATION_FOREVER:
-                mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
-                break;
-            default:
-                Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
-                        ActivityManager.getCurrentUser(), true).id;
-                mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
-                        conditionId, TAG);
+        boolean showOnboarding = Settings.Global.getInt(mContext.getContentResolver(),
+                Settings.Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0;
+        if (showOnboarding) {
+            // don't show on-boarding again or notification ever
+            Settings.Global.putInt(mContext.getContentResolver(),
+                    Global.SHOW_ZEN_UPGRADE_NOTIFICATION, 0);
+            // turn on DND
+            mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
+            // show on-boarding screen
+            Intent intent = new Intent(Settings.ZEN_MODE_ONBOARDING);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(intent, 0);
+        } else {
+            switch (zenDuration) {
+                case Settings.Global.ZEN_DURATION_PROMPT:
+                    mUiHandler.post(() -> {
+                        Dialog mDialog = new EnableZenModeDialog(mContext).createDialog();
+                        mDialog.getWindow().setType(
+                                WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
+                        SystemUIDialog.setShowForAllUsers(mDialog, true);
+                        SystemUIDialog.registerDismissListener(mDialog);
+                        SystemUIDialog.setWindowOnTop(mDialog);
+                        mUiHandler.post(() -> mDialog.show());
+                        mHost.collapsePanels();
+                    });
+                    break;
+                case Settings.Global.ZEN_DURATION_FOREVER:
+                    mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG);
+                    break;
+                default:
+                    Uri conditionId = ZenModeConfig.toTimeCondition(mContext, zenDuration,
+                            ActivityManager.getCurrentUser(), true).id;
+                    mController.setZen(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS,
+                            conditionId, TAG);
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 30e9afd8..0d8aed4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -24,15 +24,16 @@
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.graphics.CornerPathEffect;
+import android.graphics.Paint;
 import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.RippleDrawable;
+import android.graphics.drawable.ShapeDrawable;
 import android.os.Build;
 import android.os.SystemProperties;
 import android.os.UserManager;
 import android.text.TextUtils;
 import android.util.Log;
+import android.util.TypedValue;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -76,17 +77,13 @@
     private final View mLayout;
     private final TextView mTextView;
     private final ImageView mDismissView;
-    private final ColorDrawable mBackgroundDrawable;
-    private final int mDarkBackgroundColor;
-    private final int mLightBackgroundColor;
-    private final int mDarkContentColor;
-    private final int mLightContentColor;
-    private final RippleDrawable mDarkRipple;
-    private final RippleDrawable mLightRipple;
+    private final View mArrowView;
+    private final int mOnboardingToastColor;
+    private final int mOnboardingToastArrowRadius;
+    private int mNavBarHeight;
 
     private boolean mTaskListenerRegistered;
     private boolean mLayoutAttachedToWindow;
-    private boolean mBackgroundIsLight;
     private int mLastTaskId;
     private boolean mHasDismissed;
     private int mNumAppsLaunchedSinceDismiss;
@@ -159,24 +156,30 @@
         mLayout = LayoutInflater.from(mContext).inflate(R.layout.recents_onboarding, null);
         mTextView = mLayout.findViewById(R.id.onboarding_text);
         mDismissView = mLayout.findViewById(R.id.dismiss);
-        mDarkBackgroundColor = res.getColor(android.R.color.background_dark);
-        mLightBackgroundColor = res.getColor(android.R.color.background_light);
-        mDarkContentColor = res.getColor(R.color.primary_text_default_material_light);
-        mLightContentColor = res.getColor(R.color.primary_text_default_material_dark);
-        mDarkRipple = new RippleDrawable(res.getColorStateList(R.color.ripple_material_light),
-                null, null);
-        mLightRipple = new RippleDrawable(res.getColorStateList(R.color.ripple_material_dark),
-                null, null);
-        mBackgroundDrawable = new ColorDrawable(mDarkBackgroundColor);
+        mArrowView = mLayout.findViewById(R.id.arrow);
+
+        TypedValue typedValue = new TypedValue();
+        context.getTheme().resolveAttribute(android.R.attr.colorAccent, typedValue, true);
+        mOnboardingToastColor = res.getColor(typedValue.resourceId);
+        mOnboardingToastArrowRadius = res.getDimensionPixelSize(
+                R.dimen.recents_onboarding_toast_arrow_corner_radius);
 
         mLayout.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
-        mLayout.setBackground(mBackgroundDrawable);
         mDismissView.setOnClickListener(v -> {
             hide(true);
             mHasDismissed = true;
             mNumAppsLaunchedSinceDismiss = 0;
         });
 
+        ViewGroup.LayoutParams arrowLp = mArrowView.getLayoutParams();
+        ShapeDrawable arrowDrawable = new ShapeDrawable(TriangleShape.create(
+                arrowLp.width, arrowLp.height, false));
+        Paint arrowPaint = arrowDrawable.getPaint();
+        arrowPaint.setColor(mOnboardingToastColor);
+        // The corner path effect won't be reflected in the shadow, but shouldn't be noticeable.
+        arrowPaint.setPathEffect(new CornerPathEffect(mOnboardingToastArrowRadius));
+        mArrowView.setBackground(arrowDrawable);
+
         if (RESET_PREFS_FOR_DEBUG) {
             Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_RECENTS_ONBOARDING, false);
             Prefs.putInt(mContext, Prefs.Key.NUM_APPS_LAUNCHED, 0);
@@ -234,6 +237,7 @@
         int orientation = mContext.getResources().getConfiguration().orientation;
         if (!mLayoutAttachedToWindow && orientation == Configuration.ORIENTATION_PORTRAIT) {
             mLayout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+
             mWindowManager.addView(mLayout, getWindowLayoutParams());
             int layoutHeight = mLayout.getHeight();
             if (layoutHeight == 0) {
@@ -281,29 +285,18 @@
         }
     }
 
-    public void setContentDarkIntensity(float contentDarkIntensity) {
-        boolean backgroundIsLight = contentDarkIntensity > 0.5f;
-        if (backgroundIsLight != mBackgroundIsLight) {
-            mBackgroundIsLight = backgroundIsLight;
-            mBackgroundDrawable.setColor(mBackgroundIsLight
-                    ? mLightBackgroundColor : mDarkBackgroundColor);
-            int contentColor = mBackgroundIsLight ? mDarkContentColor : mLightContentColor;
-            mTextView.setTextColor(contentColor);
-            mTextView.getCompoundDrawables()[3].setColorFilter(contentColor,
-                    PorterDuff.Mode.SRC_IN);
-            mDismissView.setColorFilter(contentColor);
-            mDismissView.setBackground(mBackgroundIsLight ? mDarkRipple : mLightRipple);
-        }
+    public void setNavBarHeight(int navBarHeight) {
+        mNavBarHeight = navBarHeight;
     }
 
     private WindowManager.LayoutParams getWindowLayoutParams() {
-        int flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
-                | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
+        int flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                 | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
         final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                 ViewGroup.LayoutParams.MATCH_PARENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT,
-                WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG,
+                0, -mNavBarHeight / 2,
+                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                 flags,
                 PixelFormat.TRANSLUCENT);
         lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
new file mode 100644
index 0000000..de85c0f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/TriangleShape.java
@@ -0,0 +1,56 @@
+/*
+ * 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.recents;
+
+import android.graphics.Outline;
+import android.graphics.Path;
+import android.graphics.drawable.shapes.PathShape;
+import android.support.annotation.NonNull;
+
+/**
+ * Wrapper around {@link android.graphics.drawable.shapes.PathShape}
+ * that creates a shape with a triangular path (pointing up or down).
+ */
+public class TriangleShape extends PathShape {
+    private Path mTriangularPath;
+
+    public TriangleShape(Path path, float stdWidth, float stdHeight) {
+        super(path, stdWidth, stdHeight);
+        mTriangularPath = path;
+    }
+
+    public static TriangleShape create(float width, float height, boolean isPointingUp) {
+        Path triangularPath = new Path();
+        if (isPointingUp) {
+            triangularPath.moveTo(0, height);
+            triangularPath.lineTo(width, height);
+            triangularPath.lineTo(width / 2, 0);
+            triangularPath.close();
+        } else {
+            triangularPath.moveTo(0, 0);
+            triangularPath.lineTo(width / 2, height);
+            triangularPath.lineTo(width, 0);
+            triangularPath.close();
+        }
+        return new TriangleShape(triangularPath, width, height);
+    }
+
+    @Override
+    public void getOutline(@NonNull Outline outline) {
+        outline.setConvexPath(mTriangularPath);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 4256cd6..8030bde 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -80,6 +80,7 @@
     private RemoteInputView mHeadsUpRemoteInput;
 
     private SmartReplyConstants mSmartReplyConstants;
+    private SmartReplyView mExpandedSmartReplyView;
     private SmartReplyLogger mSmartReplyLogger;
 
     private NotificationViewWrapper mContractedWrapper;
@@ -184,7 +185,11 @@
         }
         int maxChildHeight = 0;
         if (mExpandedChild != null) {
-            int size = Math.min(maxSize, mNotificationMaxHeight);
+            int notificationMaxHeight = mNotificationMaxHeight;
+            if (mExpandedSmartReplyView != null) {
+                notificationMaxHeight += mExpandedSmartReplyView.getHeightUpperLimit();
+            }
+            int size = Math.min(maxSize, notificationMaxHeight);
             ViewGroup.LayoutParams layoutParams = mExpandedChild.getLayoutParams();
             boolean useExactly = false;
             if (layoutParams.height >= 0) {
@@ -1348,10 +1353,10 @@
     private void applySmartReplyView(RemoteInput remoteInput, PendingIntent pendingIntent,
             NotificationData.Entry entry) {
         if (mExpandedChild != null) {
-            SmartReplyView view =
+            mExpandedSmartReplyView =
                     applySmartReplyView(mExpandedChild, remoteInput, pendingIntent, entry);
-            if (view != null && remoteInput != null && remoteInput.getChoices() != null
-                    && remoteInput.getChoices().length > 0) {
+            if (mExpandedSmartReplyView != null && remoteInput != null
+                    && remoteInput.getChoices() != null && remoteInput.getChoices().length > 0) {
                 mSmartReplyLogger.smartRepliesAdded(entry, remoteInput.getChoices().length);
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 81dd9e8..8062064 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -523,7 +523,7 @@
                 } else {
                     // For notifications with more than one channel, update notification enabled
                     // state. If the importance was lowered, we disable notifications.
-                    mINotificationManager.setNotificationsEnabledForPackage(
+                    mINotificationManager.setNotificationsEnabledWithImportanceLockForPackage(
                             mPackageName, mAppUid, mNewImportance >= mCurrentImportance);
                 }
             } catch (RemoteException e) {
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 7285db6..46f8863 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java
@@ -4,6 +4,7 @@
 import android.content.Intent;
 import android.content.res.TypedArray;
 import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
@@ -37,6 +38,7 @@
     private AlphaOptimizedImageButton mIcon;
     private AlphaOptimizedImageButton mMoreIcon;
     private boolean mSelected = false;
+    private String[] mComponentNames;
     /** App categories that are to be used with this widget */
     private String[] mFacetCategories;
     /** App packages that are allowed to be used with this widget */
@@ -75,6 +77,8 @@
         String longPressIntentString = typedArray.getString(R.styleable.CarFacetButton_longIntent);
         String categoryString = typedArray.getString(R.styleable.CarFacetButton_categories);
         String packageString = typedArray.getString(R.styleable.CarFacetButton_packages);
+        String componentNameString =
+                typedArray.getString(R.styleable.CarFacetButton_componentNames);
         try {
             final Intent intent = Intent.parseUri(intentString, Intent.URI_INTENT_SCHEME);
             intent.putExtra(EXTRA_FACET_ID, Integer.toString(getId()));
@@ -87,17 +91,20 @@
                 mFacetCategories = categoryString.split(FACET_FILTER_DELIMITER);
                 intent.putExtra(EXTRA_FACET_CATEGORIES, mFacetCategories);
             }
+            if (componentNameString != null) {
+                mComponentNames = componentNameString.split(FACET_FILTER_DELIMITER);
+            }
 
             setOnClickListener(v -> {
                 intent.putExtra(EXTRA_FACET_LAUNCH_PICKER, mSelected);
-                mContext.startActivity(intent);
+                mContext.startActivityAsUser(intent, UserHandle.CURRENT);
             });
 
             if (longPressIntentString != null) {
                 final Intent longPressIntent = Intent.parseUri(longPressIntentString,
                         Intent.URI_INTENT_SCHEME);
                 setOnLongClickListener(v -> {
-                    mContext.startActivity(longPressIntent);
+                    mContext.startActivityAsUser(longPressIntent, UserHandle.CURRENT);
                     return true;
                 });
             }
@@ -148,6 +155,13 @@
         return mFacetPackages;
     }
 
+    public String[] getComponentName() {
+        if (mComponentNames == null) {
+            return new String[0];
+        }
+        return mComponentNames;
+    }
+
     /**
      * Updates the alpha of the icons to "selected" and shows the "More icon"
      * @param selected true if the view must be selected, false otherwise
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
index b7d501e..2d30ce1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java
@@ -1,10 +1,12 @@
 package com.android.systemui.statusbar.car;
 
 import android.app.ActivityManager;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.util.Log;
 
 import java.util.HashMap;
 import java.util.List;
@@ -19,6 +21,7 @@
 
     protected HashMap<String, CarFacetButton> mButtonsByCategory = new HashMap<>();
     protected HashMap<String, CarFacetButton> mButtonsByPackage = new HashMap<>();
+    protected HashMap<String, CarFacetButton> mButtonsByComponentName = new HashMap<>();
     protected CarFacetButton mSelectedFacetButton;
     protected Context mContext;
 
@@ -34,28 +37,32 @@
      */
     public void addFacetButton(CarFacetButton facetButton) {
         String[] categories = facetButton.getCategories();
-        for (int j = 0; j < categories.length; j++) {
-            String category = categories[j];
-            mButtonsByCategory.put(category, facetButton);
+        for (int i = 0; i < categories.length; i++) {
+            mButtonsByCategory.put(categories[i], facetButton);
         }
 
         String[] facetPackages = facetButton.getFacetPackages();
-        for (int j = 0; j < facetPackages.length; j++) {
-            String facetPackage = facetPackages[j];
-            mButtonsByPackage.put(facetPackage, facetButton);
+        for (int i = 0; i < facetPackages.length; i++) {
+            mButtonsByPackage.put(facetPackages[i], facetButton);
+        }
+        String[] componentNames = facetButton.getComponentName();
+        for (int i = 0; i < componentNames.length; i++) {
+            mButtonsByComponentName.put(componentNames[i], facetButton);
         }
     }
 
     public void removeAll() {
         mButtonsByCategory.clear();
         mButtonsByPackage.clear();
+        mButtonsByComponentName.clear();
         mSelectedFacetButton = null;
     }
 
     /**
      * This will unselect the currently selected CarFacetButton and determine which one should be
      * selected next. It does this by reading the properties on the CarFacetButton and seeing if
-     * they are a match with the supplied taskino.
+     * they are a match with the supplied taskInfo.
+     * Order of selection detection ComponentName, PackageName, Category
      * @param taskInfo of the currently running application
      */
     public void taskChanged(ActivityManager.RunningTaskInfo taskInfo) {
@@ -69,7 +76,10 @@
         if (mSelectedFacetButton != null) {
             mSelectedFacetButton.setSelected(false);
         }
-        CarFacetButton facetButton = mButtonsByPackage.get(packageName);
+        CarFacetButton facetButton = findFacetButtongByComponentName(taskInfo.topActivity);
+        if (facetButton == null) {
+            facetButton =  mButtonsByPackage.get(packageName);
+        }
         if (facetButton != null) {
             facetButton.setSelected(true);
             mSelectedFacetButton = facetButton;
@@ -83,6 +93,12 @@
         }
     }
 
+    private CarFacetButton findFacetButtongByComponentName(ComponentName componentName) {
+        CarFacetButton button = mButtonsByComponentName.get(componentName.flattenToShortString());
+        return (button != null) ? button :
+                mButtonsByComponentName.get(componentName.flattenToString());
+    }
+
     protected String getPackageCategory(String packageName) {
         PackageManager pm = mContext.getPackageManager();
         Set<String> supportedCategories = mButtonsByCategory.keySet();
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 ec243fe..084c136 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarNavigationButton.java
@@ -3,6 +3,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.TypedArray;
+import android.os.UserHandle;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.ImageView;
@@ -64,10 +65,10 @@
                 setOnClickListener(v -> {
                     try {
                         if (mBroadcastIntent) {
-                            mContext.sendBroadcast(intent);
+                            mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
                             return;
                         }
-                        mContext.startActivity(intent);
+                        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
                     } catch (Exception e) {
                         Log.e(TAG, "Failed to launch intent", e);
                     }
@@ -82,7 +83,7 @@
                 final Intent intent = Intent.parseUri(mLongIntent, Intent.URI_INTENT_SCHEME);
                 setOnLongClickListener(v -> {
                     try {
-                        mContext.startActivity(intent);
+                        mContext.startActivityAsUser(intent, UserHandle.CURRENT);
                     } catch (Exception e) {
                         Log.e(TAG, "Failed to launch intent", e);
                     }
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 fb525f7..5a02d18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -37,19 +37,20 @@
     private final UserGridRecyclerView mUserGridView;
     private final ProgressBar mSwitchingUsers;
     private final int mShortAnimDuration;
+    private final StatusBar mStatusBar;
 
     private boolean mShowing;
 
     public FullscreenUserSwitcher(StatusBar statusBar, ViewStub containerStub, Context context) {
+        mStatusBar = statusBar;
         mParent = containerStub.inflate();
         mContainer = mParent.findViewById(R.id.container);
         mUserGridView = mContainer.findViewById(R.id.user_grid);
-        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));
+        mUserGridView.setUserSelectionListener(this::onUserSelected);
 
         mShortAnimDuration = mContainer.getResources()
             .getInteger(android.R.integer.config_shortAnimTime);
@@ -57,8 +58,35 @@
         mSwitchingUsers = mParent.findViewById(R.id.switching_users);
     }
 
+    public void show() {
+        if (mShowing) {
+            return;
+        }
+        mShowing = true;
+        mParent.setVisibility(View.VISIBLE);
+    }
+
+    public void hide() {
+        mShowing = false;
+        toggleSwitchInProgress(false);
+        mParent.setVisibility(View.GONE);
+    }
+
     public void onUserSwitched(int newUserId) {
-        mUserGridView.onUserSwitched(newUserId);
+        mParent.post(this::showOfflineAuthUi);
+    }
+
+    private void onUserSelected(UserGridRecyclerView.UserRecord record) {
+        if (record.mIsForeground) {
+            showOfflineAuthUi();
+            return;
+        }
+        toggleSwitchInProgress(true);
+    }
+
+    private void showOfflineAuthUi() {
+        mStatusBar.executeRunnableDismissingKeyguard(null/* runnable */, null /* cancelAction */,
+                true /* dismissShade */, true /* afterKeyguardGone */, true /* deferred */);
     }
 
     private void toggleSwitchInProgress(boolean inProgress) {
@@ -91,18 +119,4 @@
                 }
             });
     }
-
-    public void show() {
-        if (mShowing) {
-            return;
-        }
-        mShowing = true;
-        mParent.setVisibility(View.VISIBLE);
-    }
-
-    public void hide() {
-        mShowing = false;
-        toggleSwitchInProgress(false);
-        mParent.setVisibility(View.GONE);
-    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
index e09a360..5ad08ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridRecyclerView.java
@@ -38,8 +38,6 @@
 
 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;
@@ -50,8 +48,6 @@
  */
 public class UserGridRecyclerView extends RecyclerView implements
         UserManagerHelper.OnUsersUpdateListener {
-
-    private StatusBar mStatusBar;
     private UserSelectionListener mUserSelectionListener;
     private UserAdapter mAdapter;
     private UserManagerHelper mUserManagerHelper;
@@ -92,29 +88,22 @@
         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;
-            }
+            boolean isForeground = mUserManagerHelper.getForegroundUserId() == userInfo.id;
             UserRecord record = new UserRecord(userInfo, false /* isGuest */,
-                    false /* isAddUser */, isCurrent);
+                    false /* isAddUser */, isForeground);
             userRecords.add(record);
         }
 
-        // Add guest user record if the current user is not a guest
-        if (!mUserManagerHelper.isGuestUser()) {
+        // Add guest user record if the foreground user is not a guest
+        if (!mUserManagerHelper.foregroundUserIsGuestUser()) {
             userRecords.add(addGuestUserRecord());
         }
 
-        // Add add user record if the current user can add users
-        if (mUserManagerHelper.canAddUsers()) {
+        // Add add user record if the foreground user can add users
+        if (mUserManagerHelper.foregroundUserCanAddUsers()) {
             userRecords.add(addUserRecord());
         }
 
@@ -128,7 +117,7 @@
         UserInfo userInfo = new UserInfo();
         userInfo.name = mContext.getString(R.string.car_guest);
         return new UserRecord(userInfo, true /* isGuest */,
-                false /* isAddUser */, false /* isCurrent */);
+                false /* isAddUser */, false /* isForeground */);
     }
 
     /**
@@ -138,26 +127,13 @@
         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);
+                true /* isAddUser */, false /* isForeground */);
     }
 
     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();
@@ -332,21 +308,21 @@
 
     /**
      * Object wrapper class for the userInfo.  Use it to distinguish if a profile is a
-     * guest profile, add user profile, or a current user.
+     * guest profile, add user profile, or the foreground user.
      */
     public static final class UserRecord {
 
         public final UserInfo mInfo;
         public final boolean mIsGuest;
         public final boolean mIsAddUser;
-        public final boolean mIsCurrent;
+        public final boolean mIsForeground;
 
         public UserRecord(UserInfo userInfo, boolean isGuest, boolean isAddUser,
-                boolean isCurrent) {
+                boolean isForeground) {
             mInfo = userInfo;
             mIsGuest = isGuest;
             mIsAddUser = isAddUser;
-            mIsCurrent = isCurrent;
+            mIsForeground = isForeground;
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 58f8baa..ca6d596 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -103,6 +103,7 @@
 import java.io.PrintWriter;
 import java.util.List;
 import java.util.Locale;
+import java.util.Optional;
 
 /**
  * Fragment containing the NavigationBarFragment. Contains logic for what happens
@@ -1109,8 +1110,11 @@
         public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) {
             // Only hide the icon if the top task changes its requestedOrientation
             // Launcher can alter its requestedOrientation while it's not on top, don't hide on this
-            final boolean top = ActivityManagerWrapper.getInstance().getRunningTask().id == taskId;
-            if (top) setRotateSuggestionButtonState(false);
+            Optional.ofNullable(ActivityManagerWrapper.getInstance())
+                    .map(ActivityManagerWrapper::getRunningTask)
+                    .ifPresent(a -> {
+                        if (a.id == taskId) setRotateSuggestionButtonState(false);
+                    });
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index 9894235..91cf8f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -25,6 +25,7 @@
 import android.view.Display.Mode;
 import android.view.Gravity;
 import android.view.LayoutInflater;
+import android.view.Surface;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
@@ -80,6 +81,7 @@
     private static final String WEIGHT_CENTERED_SUFFIX = "WC";
 
     private final List<NavBarButtonProvider> mPlugins = new ArrayList<>();
+    private final Display mDisplay;
 
     protected LayoutInflater mLayoutInflater;
     protected LayoutInflater mLandscapeInflater;
@@ -99,9 +101,9 @@
     public NavigationBarInflaterView(Context context, AttributeSet attrs) {
         super(context, attrs);
         createInflaters();
-        Display display = ((WindowManager)
+        mDisplay = ((WindowManager)
                 context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
-        Mode displayMode = display.getMode();
+        Mode displayMode = mDisplay.getMode();
         isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight();
     }
 
@@ -173,6 +175,17 @@
         }
     }
 
+    public void updateButtonDispatchersCurrentView() {
+        if (mButtonDispatchers != null) {
+            final int rotation = mDisplay.getRotation();
+            final View view = rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180
+                    ? mRot0 : mRot90;
+            for (int i = 0; i < mButtonDispatchers.size(); i++) {
+                mButtonDispatchers.valueAt(i).setCurrentView(view);
+            }
+        }
+    }
+
     public void setAlternativeOrder(boolean alternativeOrder) {
         if (alternativeOrder != mAlternativeOrder) {
             mAlternativeOrder = alternativeOrder;
@@ -239,6 +252,8 @@
 
         inflateButtons(end, mRot0.findViewById(R.id.ends_group), isRot0Landscape, false);
         inflateButtons(end, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, false);
+
+        updateButtonDispatchersCurrentView();
     }
 
     private void addGravitySpacer(LinearLayout layout) {
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 db2139d..d79f308 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -812,9 +812,6 @@
         if (mGestureHelper != null) {
             mGestureHelper.onDarkIntensityChange(intensity);
         }
-        if (mRecentsOnboarding != null) {
-            mRecentsOnboarding.setContentDarkIntensity(intensity);
-        }
     }
 
     @Override
@@ -831,6 +828,7 @@
         updateButtonLocationOnScreen(getHomeButton(), mHomeButtonBounds);
         updateButtonLocationOnScreen(getRecentsButton(), mRecentsButtonBounds);
         mGestureHelper.onLayout(changed, left, top, right, bottom);
+        mRecentsOnboarding.setNavBarHeight(getMeasuredHeight());
     }
 
     private void updateButtonLocationOnScreen(ButtonDispatcher button, Rect buttonBounds) {
@@ -873,9 +871,7 @@
         mCurrentView = mRotatedViews[rot];
         mCurrentView.setVisibility(View.VISIBLE);
         mNavigationInflaterView.setAlternativeOrder(rot == Surface.ROTATION_90);
-        for (int i = 0; i < mButtonDispatchers.size(); i++) {
-            mButtonDispatchers.valueAt(i).setCurrentView(mCurrentView);
-        }
+        mNavigationInflaterView.updateButtonDispatchersCurrentView();
         updateLayoutTransitionsEnabled();
         mCurrentRotation = rot;
     }
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 4b2bc45..a3da807 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1193,12 +1193,10 @@
 
     public void manageNotifications() {
         Intent intent = new Intent(Settings.ACTION_ALL_APPS_NOTIFICATION_SETTINGS);
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        startActivity(intent, true, true);
+        startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP);
     }
 
     public void clearAllNotifications() {
-
         // animate-swipe all dismissable notifications, then animate the shade closed
         int numChildren = mStackScroller.getChildCount();
 
@@ -1838,6 +1836,11 @@
         return new StatusBar.H();
     }
 
+    private void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade,
+            int flags) {
+        startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, flags);
+    }
+
     @Override
     public void startActivity(Intent intent, boolean dismissShade) {
         startActivityDismissingKeyguard(intent, false, dismissShade);
@@ -1851,7 +1854,7 @@
     @Override
     public void startActivity(Intent intent, boolean dismissShade, Callback callback) {
         startActivityDismissingKeyguard(intent, false, dismissShade,
-                false /* disallowEnterPictureInPictureWhileLaunching */, callback);
+                false /* disallowEnterPictureInPictureWhileLaunching */, callback, 0);
     }
 
     public void setQsExpanded(boolean expanded) {
@@ -2874,14 +2877,20 @@
     }
 
     public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
-            boolean dismissShade) {
+            boolean dismissShade, int flags) {
         startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade,
-                false /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */);
+                false /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */,
+                flags);
+    }
+
+    public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
+            boolean dismissShade) {
+        startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, 0);
     }
 
     public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned,
             final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching,
-            final Callback callback) {
+            final Callback callback, int flags) {
         if (onlyProvisioned && !isDeviceProvisioned()) return;
 
         final boolean afterKeyguardGone = PreviewInflater.wouldLaunchResolverActivity(
@@ -2890,6 +2899,7 @@
             mAssistManager.hideAssist();
             intent.setFlags(
                     Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            intent.addFlags(flags);
             int result = ActivityManager.START_CANCELED;
             ActivityOptions options = new ActivityOptions(getActivityOptions(
                     null /* remoteAnimation */));
@@ -4575,7 +4585,7 @@
         if (!mStatusBarKeyguardViewManager.isShowing()) {
             startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT,
                     false /* onlyProvisioned */, true /* dismissShade */,
-                    true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */);
+                    true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0);
         } else {
             if (!mDeviceInteractive) {
                 // Avoid flickering of the scrim when we instant launch the camera and the bouncer
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
index 94db95a..cd17cfc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java
@@ -280,7 +280,7 @@
     public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {}
 
     @Override
-    public void onProfileAudioStateChanged(int bluetoothProfile, int state) {}
+    public void onAudioModeChanged() {}
 
     private ActuallyCachedState getCachedState(CachedBluetoothDevice device) {
         ActuallyCachedState state = mCachedState.get(device);
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 4c79ee3..6d2f5ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -25,6 +25,7 @@
 import com.android.systemui.R;
 import com.android.systemui.statusbar.NotificationData;
 import com.android.systemui.statusbar.SmartReplyLogger;
+import com.android.systemui.statusbar.notification.NotificationUtils;
 import com.android.systemui.statusbar.phone.KeyguardDismissUtil;
 
 import java.text.BreakIterator;
@@ -48,6 +49,12 @@
     private final SmartReplyConstants mConstants;
     private final KeyguardDismissUtil mKeyguardDismissUtil;
 
+    /**
+     * The upper bound for the height of this view in pixels. Notifications are automatically
+     * recreated on density or font size changes so caching this should be fine.
+     */
+    private final int mHeightUpperLimit;
+
     /** Spacing to be applied between views. */
     private final int mSpacing;
 
@@ -69,6 +76,9 @@
         mConstants = Dependency.get(SmartReplyConstants.class);
         mKeyguardDismissUtil = Dependency.get(KeyguardDismissUtil.class);
 
+        mHeightUpperLimit = NotificationUtils.getFontScaledHeight(mContext,
+            R.dimen.smart_reply_button_max_height);
+
         int spacing = 0;
         int singleLineButtonPaddingHorizontal = 0;
         int doubleLineButtonPaddingHorizontal = 0;
@@ -98,10 +108,19 @@
         mSingleToDoubleLineButtonWidthIncrease =
                 2 * (doubleLineButtonPaddingHorizontal - singleLineButtonPaddingHorizontal);
 
+
         mBreakIterator = BreakIterator.getLineInstance();
         reallocateCandidateButtonQueueForSqueezing();
     }
 
+    /**
+     * Returns an upper bound for the height of this view in pixels. This method is intended to be
+     * invoked before onMeasure, so it doesn't do any analysis on the contents of the buttons.
+     */
+    public int getHeightUpperLimit() {
+       return mHeightUpperLimit;
+    }
+
     private void reallocateCandidateButtonQueueForSqueezing() {
         // Instead of clearing the priority queue, we re-allocate so that it would fit all buttons
         // exactly. This avoids (1) wasting memory because PriorityQueue never shrinks and
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 7e6fe02..bd76820 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -208,7 +208,7 @@
             0,
             0,
             AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
-            R.string.cell_data_off,
+            R.string.cell_data_off_content_description,
             0,
             false);
 }
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java
index 2c85bb6..ca55e1f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Events.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java
@@ -52,26 +52,28 @@
     public static final int EVENT_MUTE_CHANGED = 15;  // (stream|int) (muted|bool)
     public static final int EVENT_TOUCH_LEVEL_DONE = 16;  // (stream|int) (level|bool)
     public static final int EVENT_ZEN_CONFIG_CHANGED = 17; // (allow/disallow|string)
+    public static final int EVENT_RINGER_TOGGLE = 18; // (ringer_mode)
 
     private static final String[] EVENT_TAGS = {
-        "show_dialog",
-        "dismiss_dialog",
-        "active_stream_changed",
-        "expand",
-        "key",
-        "collection_started",
-        "collection_stopped",
-        "icon_click",
-        "settings_click",
-        "touch_level_changed",
-        "level_changed",
-        "internal_ringer_mode_changed",
-        "external_ringer_mode_changed",
-        "zen_mode_changed",
-        "suppressor_changed",
-        "mute_changed",
-        "touch_level_done",
-        "zen_mode_config_changed",
+            "show_dialog",
+            "dismiss_dialog",
+            "active_stream_changed",
+            "expand",
+            "key",
+            "collection_started",
+            "collection_stopped",
+            "icon_click",
+            "settings_click",
+            "touch_level_changed",
+            "level_changed",
+            "internal_ringer_mode_changed",
+            "external_ringer_mode_changed",
+            "zen_mode_changed",
+            "suppressor_changed",
+            "mute_changed",
+            "touch_level_done",
+            "zen_mode_config_changed",
+            "ringer_toggle"
     };
 
     public static final int DISMISS_REASON_UNKNOWN = 0;
@@ -112,6 +114,7 @@
     public static Callback sCallback;
 
     public static void writeEvent(Context context, int tag, Object... list) {
+        MetricsLogger logger = new MetricsLogger();
         final long time = System.currentTimeMillis();
         final StringBuilder sb = new StringBuilder("writeEvent ").append(EVENT_TAGS[tag]);
         if (list != null && list.length > 0) {
@@ -139,7 +142,7 @@
                     break;
                 case EVENT_ICON_CLICK:
                     MetricsLogger.action(context, MetricsEvent.ACTION_VOLUME_ICON,
-                            (Integer) list[1]);
+                            (Integer) list[0]);
                     sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ')
                             .append(iconStateToString((Integer) list[1]));
                     break;
@@ -155,10 +158,16 @@
                     break;
                 case EVENT_KEY:
                     MetricsLogger.action(context, MetricsEvent.ACTION_VOLUME_KEY,
-                            (Integer) list[1]);
+                            (Integer) list[0]);
                     sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ')
                             .append(list[1]);
                     break;
+                case EVENT_RINGER_TOGGLE:
+                    logger.action(MetricsEvent.ACTION_VOLUME_RINGER_TOGGLE, (Integer) list[0]);
+                    break;
+                case EVENT_SETTINGS_CLICK:
+                    logger.action(MetricsEvent.ACTION_VOLUME_SETTINGS);
+                    break;
                 case EVENT_EXTERNAL_RINGER_MODE_CHANGED:
                     MetricsLogger.action(context, MetricsEvent.ACTION_RINGER_MODE,
                             (Integer) list[0]);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 9036a8a..00874e3 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -415,6 +415,7 @@
         mSettingsView.setVisibility(
                 mDeviceProvisionedController.isDeviceProvisioned() ? VISIBLE : GONE);
         mSettingsIcon.setOnClickListener(v -> {
+            Events.writeEvent(mContext, Events.EVENT_SETTINGS_CLICK);
             Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             dismissH(DISMISS_REASON_SETTINGS_CLICKED);
@@ -424,8 +425,6 @@
 
     public void initRingerH() {
         mRingerIcon.setOnClickListener(v -> {
-            Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, AudioManager.STREAM_RING,
-                    mRingerIcon.getTag());
             Prefs.putBoolean(mContext, Prefs.Key.TOUCHED_RINGER_TOGGLE, true);
             final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
             if (ss == null) {
@@ -449,6 +448,7 @@
                     mController.setStreamVolume(AudioManager.STREAM_RING, 1);
                 }
             }
+            Events.writeEvent(mContext, Events.EVENT_RINGER_TOGGLE, newRingerMode);
             updateRingerH();
             provideTouchFeedbackH(newRingerMode);
             mController.setRingerMode(newRingerMode, false);
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 3cbe274..b0530c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -421,6 +421,66 @@
     }
 
     @Test
+    public void testHandleCloseControls_setsNotificationsDisabledForMultipleChannelNotifications()
+            throws Exception {
+        mNotificationChannel.setImportance(IMPORTANCE_LOW);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+                10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                false /* isNonblockable */);
+
+        mNotificationInfo.findViewById(R.id.block).performClick();
+        waitForUndoButton();
+        mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
+        verify(mMockINotificationManager, times(1))
+                .setNotificationsEnabledWithImportanceLockForPackage(
+                        anyString(), eq(TEST_UID), eq(false));
+    }
+
+
+    @Test
+    public void testHandleCloseControls_keepsNotificationsEnabledForMultipleChannelNotifications()
+            throws Exception {
+        mNotificationChannel.setImportance(IMPORTANCE_LOW);
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+                10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                false /* isNonblockable */);
+
+        mNotificationInfo.findViewById(R.id.block).performClick();
+        waitForUndoButton();
+        mNotificationInfo.handleCloseControls(true, false);
+
+        mTestableLooper.processAllMessages();
+        verify(mMockINotificationManager, times(1))
+                .setNotificationsEnabledWithImportanceLockForPackage(
+                        anyString(), eq(TEST_UID), eq(false));
+    }
+
+    @Test
+    public void testCloseControls_blockingHelperSavesImportanceForMultipleChannelNotifications()
+            throws Exception {
+        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+                TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
+                10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */,
+                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
+                false /* isNonblockable */, true /* isForBlockingHelper */,
+                true /* isUserSentimentNegative */);
+
+        mNotificationInfo.findViewById(R.id.keep).performClick();
+
+        verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
+        mTestableLooper.processAllMessages();
+        verify(mMockINotificationManager, times(1))
+                .setNotificationsEnabledWithImportanceLockForPackage(
+                        anyString(), eq(TEST_UID), eq(true));
+    }
+
+    @Test
     public void testCloseControls_blockingHelperDismissedIfShown() throws Exception {
         mNotificationInfo.bindNotification(
                 mMockPackageManager,
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 9722408..72496d2 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5636,6 +5636,29 @@
     // OS: P
     NOTIFICATION_SMART_REPLY_COUNT = 1384;
 
+    // Volume dialog > ringer toggle
+    // OS: P
+    ACTION_VOLUME_RINGER_TOGGLE = 1385;
+
+    // Volume dialog > settings button
+    // OS: P
+    ACTION_VOLUME_SETTINGS = 1386;
+
+    // ACTION: Settings > Anomaly receiver > Anomaly ignored, don't show up in battery settings
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_ANOMALY_IGNORED = 1387;
+
+    // ACTION: Settings > Battery settings > Battery tip > Open battery saver page
+    // CATEGORY: SETTINGS
+    // OS: P
+    ACTION_TIP_OPEN_BATTERY_SAVER_PAGE = 1388;
+
+    // FIELD: the version code of an app
+    // CATEGORY: SETTINGS
+    // OS: P
+    FIELD_APP_VERSION_CODE = 1389;
+
     // ---- End P Constants, all P constants go above this line ----
     // Add new aosp constants above this line.
     // END OF AOSP CONSTANTS
diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
index a2de8e7..fbec5cb 100644
--- a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
+++ b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java
@@ -64,8 +64,7 @@
         try {
             File restoreData = prepareRestoreData(mInfo, mInFD);
 
-            // TODO: version ?
-            invokeAgentForAdbRestore(mAgent, mInfo, restoreData, 0);
+            invokeAgentForAdbRestore(mAgent, mInfo, restoreData);
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -83,8 +82,8 @@
         return sortedDataName;
     }
 
-    private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData,
-            int versionCode) throws IOException {
+    private void invokeAgentForAdbRestore(IBackupAgent agent, FileMetadata info, File restoreData)
+            throws IOException {
         String pkg = info.packageName;
         File newStateName = new File(mDataDir, pkg + ".new");
         try {
@@ -95,9 +94,9 @@
 
             if (DEBUG) {
                 Slog.i(TAG, "Starting restore of package " + pkg + " for version code "
-                        + versionCode);
+                        + info.version);
             }
-            agent.doRestore(backupData, versionCode, newState, mToken,
+            agent.doRestore(backupData, info.version, newState, mToken,
                     mBackupManagerService.getBackupManagerBinder());
         } catch (IOException e) {
             Slog.e(TAG, "Exception opening file. " + e);
diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
index dc28cd1..e4ce62d 100644
--- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
+++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java
@@ -27,6 +27,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.util.Slog;
@@ -240,12 +241,13 @@
                         PackageManager.GET_SIGNING_CERTIFICATES);
                 homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName());
                 homeVersion = homeInfo.getLongVersionCode();
-                Signature[][] signingHistory = homeInfo.signingCertificateHistory;
-                if (signingHistory == null || signingHistory.length == 0) {
-                    Slog.e(TAG, "Home app has no signing history");
+                SigningInfo signingInfo = homeInfo.signingInfo;
+                if (signingInfo == null) {
+                    Slog.e(TAG, "Home app has no signing information");
                 } else {
                     // retrieve the newest sigs to back up
-                    Signature[] homeInfoSignatures = signingHistory[signingHistory.length - 1];
+                    // TODO (b/73988180) use entire signing history in case of rollbacks
+                    Signature[] homeInfoSignatures = signingInfo.getApkContentsSigners();
                     homeSigHashes = BackupUtils.hashSignatureArray(homeInfoSignatures);
                 }
             } catch (NameNotFoundException e) {
@@ -334,8 +336,8 @@
                         }
                     }
 
-                    Signature[][] signingHistory = info.signingCertificateHistory;
-                    if (signingHistory == null || signingHistory.length == 0) {
+                    SigningInfo signingInfo = info.signingInfo;
+                    if (signingInfo == null) {
                         Slog.w(TAG, "Not backing up package " + packName
                                 + " since it appears to have no signatures.");
                         continue;
@@ -358,7 +360,7 @@
                         outputBufferStream.writeInt(info.versionCode);
                     }
                     // retrieve the newest sigs to back up
-                    Signature[] infoSignatures = signingHistory[signingHistory.length - 1];
+                    Signature[] infoSignatures = signingInfo.getApkContentsSigners();
                     writeSignatureHashArray(outputBufferStream,
                             BackupUtils.hashSignatureArray(infoSignatures));
 
diff --git a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
index ac605b1..90baea0 100644
--- a/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
+++ b/services/backup/java/com/android/server/backup/internal/PerformBackupTask.java
@@ -528,7 +528,7 @@
                     // we're otherwise fine.  Just drop it and go on to the next as usual.
                     mStatus = BackupTransport.TRANSPORT_OK;
                     BackupObserverUtils
-                            .sendBackupOnPackageResult(mObserver, mCurrentPackage.packageName,
+                            .sendBackupOnPackageResult(mObserver, request.packageName,
                                     BackupManager.ERROR_PACKAGE_NOT_FOUND);
                 } else {
                     // Transport-level failure means we reenqueue everything
diff --git a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
index 77163d3..0c99b44 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformAdbRestoreTask.java
@@ -99,6 +99,7 @@
     private FullBackupObbConnection mObbConnection = null;
     private ParcelFileDescriptor[] mPipes = null;
     private byte[] mWidgetData = null;
+    private long mAppVersion;
 
     private long mBytes;
     private final BackupAgentTimeoutParameters mAgentTimeoutParameters;
@@ -476,6 +477,9 @@
                 if (info.path.equals(BACKUP_MANIFEST_FILENAME)) {
                     Signature[] signatures = tarBackupReader.readAppManifestAndReturnSignatures(
                             info);
+                    // readAppManifestAndReturnSignatures() will have extracted the version from
+                    // the manifest, so we save it to use in key-value restore later.
+                    mAppVersion = info.version;
                     PackageManagerInternal pmi = LocalServices.getService(
                             PackageManagerInternal.class);
                     RestorePolicy restorePolicy = tarBackupReader.chooseRestorePolicy(
@@ -667,6 +671,8 @@
                                     Slog.d(TAG, "Restoring key-value file for " + pkg
                                             + " : " + info.path);
                                 }
+                                // Set the version saved from manifest entry.
+                                info.version = mAppVersion;
                                 KeyValueAdbRestoreEngine restoreEngine =
                                         new KeyValueAdbRestoreEngine(
                                                 mBackupManagerService,
diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
index 5518374..c39cceb 100644
--- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java
@@ -27,6 +27,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.os.Process;
 import android.util.Slog;
 
@@ -203,15 +204,16 @@
             return false;
         }
 
-        Signature[][] deviceHistorySigs = target.signingCertificateHistory;
-        if (ArrayUtils.isEmpty(deviceHistorySigs)) {
-            Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
+        SigningInfo signingInfo = target.signingInfo;
+        if (signingInfo == null) {
+            Slog.w(TAG, "signingInfo is empty, app was either unsigned or the flag" +
                     " PackageManager#GET_SIGNING_CERTIFICATES was not specified");
             return false;
         }
 
         if (DEBUG) {
-            Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceHistorySigs);
+            Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device="
+                    + signingInfo.getApkContentsSigners());
         }
 
         final int nStored = storedSigs.length;
@@ -225,8 +227,8 @@
         } else {
             // the app couldn't have rotated keys, since it was signed with multiple sigs - do
             // a check to see if we find a match for all stored sigs
-            // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
-            Signature[] deviceSigs = deviceHistorySigs[0];
+            // since app hasn't rotated key, we only need to check with its current signers
+            Signature[] deviceSigs = signingInfo.getApkContentsSigners();
             int nDevice = deviceSigs.length;
 
             // ensure that each stored sig matches an on-device sig
diff --git a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
index 994d5a9..a3d5601 100644
--- a/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
+++ b/services/backup/java/com/android/server/backup/utils/FullBackupUtils.java
@@ -22,6 +22,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.util.Slog;
@@ -106,12 +107,13 @@
         printer.println(withApk ? "1" : "0");
 
         // write the signature block
-        Signature[][] signingHistory = pkg.signingCertificateHistory;
-        if (signingHistory == null) {
+        SigningInfo signingInfo = pkg.signingInfo;
+        if (signingInfo == null) {
             printer.println("0");
         } else {
             // retrieve the newest sigs to write
-            Signature[] signatures = signingHistory[signingHistory.length - 1];
+            // TODO (b/73988180) use entire signing history in case of rollbacks
+            Signature[] signatures = signingInfo.getApkContentsSigners();
             printer.println(Integer.toString(signatures.length));
             for (Signature sig : signatures) {
                 printer.println(sig.toCharsString());
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 8ce4e64..6f4ae15 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -88,6 +88,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.LocalLog;
+import com.android.internal.util.StatLogger;
 import com.android.server.AppStateTracker.Listener;
 
 import java.io.ByteArrayOutputStream;
diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java
index cec4f1a..23c5779 100644
--- a/services/core/java/com/android/server/AppStateTracker.java
+++ b/services/core/java/com/android/server/AppStateTracker.java
@@ -55,6 +55,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
 import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage;
 import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages;
 
diff --git a/services/core/java/com/android/server/StatLogger.java b/services/core/java/com/android/server/StatLogger.java
deleted file mode 100644
index d85810d..0000000
--- a/services/core/java/com/android/server/StatLogger.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server;
-
-import android.os.SystemClock;
-import android.util.Slog;
-import android.util.proto.ProtoOutputStream;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.StatLoggerProto.Event;
-
-import java.io.PrintWriter;
-
-/**
- * Simple class to keep track of the number of times certain events happened and their durations for
- * benchmarking.
- *
- * TODO Update shortcut service to switch to it.
- *
- * @hide
- */
-public class StatLogger {
-    private static final String TAG = "StatLogger";
-
-    private final Object mLock = new Object();
-
-    private final int SIZE;
-
-    @GuardedBy("mLock")
-    private final int[] mCountStats;
-
-    @GuardedBy("mLock")
-    private final long[] mDurationStats;
-
-    private final String[] mLabels;
-
-    public StatLogger(String[] eventLabels) {
-        SIZE = eventLabels.length;
-        mCountStats = new int[SIZE];
-        mDurationStats = new long[SIZE];
-        mLabels = eventLabels;
-    }
-
-    /**
-     * Return the current time in the internal time unit.
-     * Call it before an event happens, and
-     * give it back to the {@link #logDurationStat(int, long)}} after the event.
-     */
-    public long getTime() {
-        return SystemClock.elapsedRealtimeNanos() / 1000;
-    }
-
-    /**
-     * @see {@link #getTime()}
-     */
-    public void logDurationStat(int eventId, long start) {
-        synchronized (mLock) {
-            if (eventId >= 0 && eventId < SIZE) {
-                mCountStats[eventId]++;
-                mDurationStats[eventId] += (getTime() - start);
-            } else {
-                Slog.wtf(TAG, "Invalid event ID: " + eventId);
-            }
-        }
-    }
-
-    @Deprecated
-    public void dump(PrintWriter pw, String prefix) {
-        dump(new IndentingPrintWriter(pw, "  ").setIndent(prefix));
-    }
-
-    public void dump(IndentingPrintWriter pw) {
-        synchronized (mLock) {
-            pw.println("Stats:");
-            pw.increaseIndent();
-            for (int i = 0; i < SIZE; i++) {
-                final int count = mCountStats[i];
-                final double durationMs = mDurationStats[i] / 1000.0;
-                pw.println(String.format("%s: count=%d, total=%.1fms, avg=%.3fms",
-                        mLabels[i], count, durationMs,
-                        (count == 0 ? 0 : ((double) durationMs) / count)));
-            }
-            pw.decreaseIndent();
-        }
-    }
-
-    public void dumpProto(ProtoOutputStream proto, long fieldId) {
-        synchronized (mLock) {
-            final long outer = proto.start(fieldId);
-
-            for (int i = 0; i < mLabels.length; i++) {
-                final long inner = proto.start(StatLoggerProto.EVENTS);
-
-                proto.write(Event.EVENT_ID, i);
-                proto.write(Event.LABEL, mLabels[i]);
-                proto.write(Event.COUNT, mCountStats[i]);
-                proto.write(Event.TOTAL_DURATION_MICROS, mDurationStats[i]);
-
-                proto.end(inner);
-            }
-
-            proto.end(outer);
-        }
-    }
-}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 6531476..47284cb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2902,6 +2902,7 @@
         private boolean mBlacklistDisabled;
         private String mExemptionsStr;
         private List<String> mExemptions = Collections.emptyList();
+        private int mLogSampleRate = -1;
         @HiddenApiEnforcementPolicy private int mPolicyPreP = HIDDEN_API_ENFORCEMENT_DEFAULT;
         @HiddenApiEnforcementPolicy private int mPolicyP = HIDDEN_API_ENFORCEMENT_DEFAULT;
 
@@ -2916,6 +2917,10 @@
                     false,
                     this);
             mContext.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE),
+                    false,
+                    this);
+            mContext.getContentResolver().registerContentObserver(
                     Settings.Global.getUriFor(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS),
                     false,
                     this);
@@ -2942,6 +2947,15 @@
                 }
                 zygoteProcess.setApiBlacklistExemptions(mExemptions);
             }
+            int logSampleRate = Settings.Global.getInt(mContext.getContentResolver(),
+                    Settings.Global.HIDDEN_API_ACCESS_LOG_SAMPLING_RATE, -1);
+            if (logSampleRate < 0 || logSampleRate > 0x10000) {
+                logSampleRate = -1;
+            }
+            if (logSampleRate != -1 && logSampleRate != mLogSampleRate) {
+                mLogSampleRate = logSampleRate;
+                zygoteProcess.setHiddenApiAccessLogSampleRate(mLogSampleRate);
+            }
             mPolicyPreP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_PRE_P_APPS);
             mPolicyP = getValidEnforcementPolicy(Settings.Global.HIDDEN_API_POLICY_P_APPS);
         }
@@ -7684,7 +7698,7 @@
             // target APIs higher than O MR1. Since access to the serial
             // is now behind a permission we push down the value.
             final String buildSerial = (appInfo.targetSandboxVersion < 2
-                    && appInfo.targetSdkVersion <= Build.VERSION_CODES.O_MR1)
+                    && appInfo.targetSdkVersion < Build.VERSION_CODES.P)
                             ? sTheRealBuildSerial : Build.UNKNOWN;
 
             // Check if this is a secondary process that should be incorporated into some
@@ -17042,6 +17056,11 @@
                     pw.println("ms");
                 }
                 mUidObservers.finishBroadcast();
+
+                pw.println();
+                pw.println("  ServiceManager statistics:");
+                ServiceManager.sStatLogger.dump(pw, "    ");
+                pw.println();
             }
         }
         pw.println("  mForceBackgroundCheck=" + mForceBackgroundCheck);
@@ -26667,7 +26686,7 @@
                 record.waitingForNetwork = false;
                 final long totalTime = SystemClock.uptimeMillis() - startTime;
                 if (totalTime >= mWaitForNetworkTimeoutMs || DEBUG_NETWORK) {
-                    Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: "
+                    Slog.w(TAG_NETWORK, "Total time waited for network rules to get updated: "
                             + totalTime + ". Uid: " + callingUid + " procStateSeq: "
                             + procStateSeq + " UidRec: " + record
                             + " validateUidRec: " + mValidateUids.get(callingUid));
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 4ce157f..f32717a 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -779,11 +779,13 @@
      * @param task The new parent {@link TaskRecord}.
      */
     void setTask(TaskRecord task) {
-        setTask(task, false /*reparenting*/);
+        setTask(task /* task */, false /* reparenting */);
     }
 
     /**
      * This method should only be called by {@link TaskRecord#removeActivity(ActivityRecord)}.
+     * @param task          The new parent task.
+     * @param reparenting   Whether we're in the middle of reparenting.
      */
     void setTask(TaskRecord task, boolean reparenting) {
         // Do nothing if the {@link TaskRecord} is the same as the current {@link getTask}.
@@ -791,12 +793,19 @@
             return;
         }
 
-        final ActivityStack stack = getStack();
+        final ActivityStack oldStack = getStack();
+        final ActivityStack newStack = task != null ? task.getStack() : null;
 
-        // If the new {@link TaskRecord} is from a different {@link ActivityStack}, remove this
-        // {@link ActivityRecord} from its current {@link ActivityStack}.
-        if (!reparenting && stack != null && (task == null || stack != task.getStack())) {
-            stack.onActivityRemovedFromStack(this);
+        // Inform old stack (if present) of activity removal and new stack (if set) of activity
+        // addition.
+        if (oldStack != newStack) {
+            if (!reparenting && oldStack != null) {
+                oldStack.onActivityRemovedFromStack(this);
+            }
+
+            if (newStack != null) {
+                newStack.onActivityAddedToStack(this);
+            }
         }
 
         this.task = task;
@@ -1073,8 +1082,15 @@
         // Must reparent first in window manager
         mWindowContainerController.reparent(newTask.getWindowContainerController(), position);
 
+        // Reparenting prevents informing the parent stack of activity removal in the case that
+        // the new stack has the same parent. we must manually signal here if this is not the case.
+        final ActivityStack prevStack = prevTask.getStack();
+
+        if (prevStack != newTask.getStack()) {
+            prevStack.onActivityRemovedFromStack(this);
+        }
         // Remove the activity from the old task and add it to the new task.
-        prevTask.removeActivity(this, true /*reparenting*/);
+        prevTask.removeActivity(this, true /* reparenting */);
 
         newTask.addActivityAtIndex(position, this);
     }
@@ -1198,10 +1214,7 @@
     }
 
     boolean isFocusable() {
-        if (inSplitScreenPrimaryWindowingMode() && mStackSupervisor.mIsDockMinimized) {
-            return false;
-        }
-        return getWindowConfiguration().canReceiveKeys() || isAlwaysFocusable();
+        return mStackSupervisor.isFocusable(this, isAlwaysFocusable());
     }
 
     boolean isResizeable() {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 1e9edd9..eb482c1 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -489,13 +489,13 @@
      */
     void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
         if (record == mResumedActivity && state != RESUMED) {
-            clearResumedActivity(reason + " - onActivityStateChanged");
+            setResumedActivity(null, reason + " - onActivityStateChanged");
         }
 
         if (state == RESUMED) {
             if (DEBUG_STACK) Slog.v(TAG_STACK, "set resumed activity to:" + record + " reason:"
                     + reason);
-            mResumedActivity = record;
+            setResumedActivity(record, reason + " - onActivityStateChanged");
             mService.setResumedActivityUncheckLocked(record, reason);
             mStackSupervisor.mRecentTasks.add(record.getTask());
         }
@@ -1077,13 +1077,8 @@
     }
 
     boolean isFocusable() {
-        if (getWindowConfiguration().canReceiveKeys()) {
-            return true;
-        }
-        // The stack isn't focusable. See if its top activity is focusable to force focus on the
-        // stack.
         final ActivityRecord r = topRunningActivityLocked();
-        return r != null && r.isFocusable();
+        return mStackSupervisor.isFocusable(this, r != null && r.isFocusable());
     }
 
     final boolean isAttached() {
@@ -2314,14 +2309,14 @@
         return mResumedActivity;
     }
 
-    /**
-     * Clears reference to currently resumed activity.
-     */
-    private void clearResumedActivity(String reason) {
-        if (DEBUG_STACK) Slog.d(TAG_STACK, "clearResumedActivity: " + mResumedActivity + " reason:"
-                + reason);
+    private void setResumedActivity(ActivityRecord r, String reason) {
+        if (mResumedActivity == r) {
+            return;
+        }
 
-        mResumedActivity = null;
+        if (DEBUG_STACK) Slog.d(TAG_STACK, "setResumedActivity stack:" + this + " + from: "
+                + mResumedActivity + " to:" + r + " reason:" + reason);
+        mResumedActivity = r;
     }
 
     @GuardedBy("mService")
@@ -4027,14 +4022,20 @@
      * an activity moves away from the stack.
      */
     void onActivityRemovedFromStack(ActivityRecord r) {
-        if (mResumedActivity == r) {
-            clearResumedActivity("onActivityRemovedFromStack");
+        removeTimeoutsForActivityLocked(r);
+
+        if (mResumedActivity != null && mResumedActivity == r) {
+            setResumedActivity(null, "onActivityRemovedFromStack");
         }
-        if (mPausingActivity == r) {
+        if (mPausingActivity != null && mPausingActivity == r) {
             mPausingActivity = null;
         }
+    }
 
-        removeTimeoutsForActivityLocked(r);
+    void onActivityAddedToStack(ActivityRecord r) {
+        if(r.getState() == RESUMED) {
+            setResumedActivity(r, "onActivityAddedToStack");
+        }
     }
 
     /**
@@ -4752,30 +4753,32 @@
         mTmpBounds.clear();
         mTmpInsetBounds.clear();
 
-        for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
-            final TaskRecord task = mTaskHistory.get(i);
-            if (task.isResizeable()) {
-                if (inFreeformWindowingMode()) {
-                    // TODO: Can be removed now since each freeform task is in its own stack.
-                    // For freeform stack we don't adjust the size of the tasks to match that
-                    // of the stack, but we do try to make sure the tasks are still contained
-                    // with the bounds of the stack.
-                    mTmpRect2.set(task.getOverrideBounds());
-                    fitWithinBounds(mTmpRect2, bounds);
-                    task.updateOverrideConfiguration(mTmpRect2);
-                } else {
-                    task.updateOverrideConfiguration(taskBounds, insetBounds);
+        synchronized (mWindowManager.getWindowManagerLock()) {
+            for (int i = mTaskHistory.size() - 1; i >= 0; i--) {
+                final TaskRecord task = mTaskHistory.get(i);
+                if (task.isResizeable()) {
+                    if (inFreeformWindowingMode()) {
+                        // TODO: Can be removed now since each freeform task is in its own stack.
+                        // For freeform stack we don't adjust the size of the tasks to match that
+                        // of the stack, but we do try to make sure the tasks are still contained
+                        // with the bounds of the stack.
+                        mTmpRect2.set(task.getOverrideBounds());
+                        fitWithinBounds(mTmpRect2, bounds);
+                        task.updateOverrideConfiguration(mTmpRect2);
+                    } else {
+                        task.updateOverrideConfiguration(taskBounds, insetBounds);
+                    }
+                }
+
+                mTmpBounds.put(task.taskId, task.getOverrideBounds());
+                if (tempTaskInsetBounds != null) {
+                    mTmpInsetBounds.put(task.taskId, tempTaskInsetBounds);
                 }
             }
 
-            mTmpBounds.put(task.taskId, task.getOverrideBounds());
-            if (tempTaskInsetBounds != null) {
-                mTmpInsetBounds.put(task.taskId, tempTaskInsetBounds);
-            }
+            mWindowContainerController.resize(bounds, mTmpBounds, mTmpInsetBounds);
+            setBounds(bounds);
         }
-
-        mWindowContainerController.resize(bounds, mTmpBounds, mTmpInsetBounds);
-        setBounds(bounds);
     }
 
 
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 731a44d..cbf30bd 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -667,6 +667,14 @@
         return mFocusedStack;
     }
 
+    boolean isFocusable(ConfigurationContainer container, boolean alwaysFocusable) {
+        if (container.inSplitScreenPrimaryWindowingMode() && mIsDockMinimized) {
+            return false;
+        }
+
+        return container.getWindowConfiguration().canReceiveKeys() || alwaysFocusable;
+    }
+
     ActivityStack getLastStack() {
         return mLastFocusedStack;
     }
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
index 6ca8a92..5b6b508 100644
--- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -234,8 +234,9 @@
     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_SUSPENDED_PACKAGE, suspendedPackage)
                 .putExtra(SuspendedAppActivity.EXTRA_DIALOG_MESSAGE, dialogMessage)
+                .putExtra(SuspendedAppActivity.EXTRA_SUSPENDING_PACKAGE, suspendingPackage)
                 .putExtra(Intent.EXTRA_USER_ID, userId)
                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 737105d..0e418ad 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -927,7 +927,26 @@
         if (stack != null && !stack.isInStackLocked(this)) {
             throw new IllegalStateException("Task must be added as a Stack child first.");
         }
+        final ActivityStack oldStack = mStack;
         mStack = stack;
+
+        // If the new {@link TaskRecord} is from a different {@link ActivityStack}, remove this
+        // {@link ActivityRecord} from its current {@link ActivityStack}.
+
+        if (oldStack != mStack) {
+            for (int i = getChildCount() - 1; i >= 0; --i) {
+                final ActivityRecord activity = getChildAt(i);
+
+                if (oldStack != null) {
+                    oldStack.onActivityRemovedFromStack(activity);
+                }
+
+                if (mStack != null) {
+                    stack.onActivityAddedToStack(activity);
+                }
+            }
+        }
+
         onParentChanged();
     }
 
@@ -1232,6 +1251,7 @@
 
         index = Math.min(size, index);
         mActivities.add(index, r);
+
         updateEffectiveIntent();
         if (r.isPersistable()) {
             mService.notifyTaskPersisterLocked(this, false);
@@ -1257,7 +1277,7 @@
      * @return true if this was the last activity in the task.
      */
     boolean removeActivity(ActivityRecord r) {
-        return removeActivity(r, false /*reparenting*/);
+        return removeActivity(r, false /* reparenting */);
     }
 
     boolean removeActivity(ActivityRecord r, boolean reparenting) {
@@ -1266,7 +1286,7 @@
                     "Activity=" + r + " does not belong to task=" + this);
         }
 
-        r.setTask(null /*task*/, reparenting);
+        r.setTask(null /* task */, reparenting /* reparenting */);
 
         if (mActivities.remove(r) && r.fullscreen) {
             // Was previously in list.
diff --git a/services/core/java/com/android/server/backup/BackupUtils.java b/services/core/java/com/android/server/backup/BackupUtils.java
index d817534..96c5621 100644
--- a/services/core/java/com/android/server/backup/BackupUtils.java
+++ b/services/core/java/com/android/server/backup/BackupUtils.java
@@ -20,6 +20,7 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.util.Slog;
 
 import com.android.internal.util.ArrayUtils;
@@ -55,16 +56,16 @@
             return false;
         }
 
-        Signature[][] deviceHistorySigs = target.signingCertificateHistory;
-        if (ArrayUtils.isEmpty(deviceHistorySigs)) {
-            Slog.w(TAG, "signingCertificateHistory is empty, app was either unsigned or the flag" +
+        SigningInfo signingInfo = target.signingInfo;
+        if (signingInfo == null) {
+            Slog.w(TAG, "signingInfo is empty, app was either unsigned or the flag" +
                     " PackageManager#GET_SIGNING_CERTIFICATES was not specified");
             return false;
         }
 
         if (DEBUG) {
             Slog.v(TAG, "signaturesMatch(): stored=" + storedSigHashes
-                    + " device=" + deviceHistorySigs);
+                    + " device=" + signingInfo.getApkContentsSigners());
         }
 
         final int nStored = storedSigHashes.size();
@@ -78,8 +79,9 @@
         } else {
             // the app couldn't have rotated keys, since it was signed with multiple sigs - do
             // a check to see if we find a match for all stored sigs
-            // since app hasn't rotated key, we only need to check with deviceHistorySigs[0]
-            ArrayList<byte[]> deviceHashes = hashSignatureArray(deviceHistorySigs[0]);
+            // since app hasn't rotated key, we only need to check with current signers
+            ArrayList<byte[]> deviceHashes =
+                    hashSignatureArray(signingInfo.getApkContentsSigners());
             int nDevice = deviceHashes.size();
             // ensure that each stored sig matches an on-device sig
             for (int i = 0; i < nStored; i++) {
diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
index f74daf2..f7439b9 100644
--- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
+++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java
@@ -42,7 +42,7 @@
  */
 public abstract class BrightnessMappingStrategy {
     private static final String TAG = "BrightnessMappingStrategy";
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = true;
 
     private static final float LUX_GRAD_SMOOTHING = 0.25f;
     private static final float MAX_GRAD = 1.0f;
@@ -352,9 +352,9 @@
             // 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);
+            adjustment = -MathUtils.log(gamma) / MathUtils.log(maxGamma);
         }
+        adjustment = MathUtils.constrain(adjustment, -1, +1);
         if (DEBUG) {
             Slog.d(TAG, "inferAutoBrightnessAdjustment: " + maxGamma + "^" + -adjustment + "=" +
                     MathUtils.pow(maxGamma, -adjustment) + " == " + gamma);
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 4e95bdf..4a1beb1 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -230,10 +230,11 @@
                 }
                 List<ActivityManager.RunningTaskInfo> runningTasks = mActivityManager.getTasks(1);
                 if (!runningTasks.isEmpty()) {
-                    if (runningTasks.get(0).topActivity.getPackageName()
-                            != mCurrentClient.getOwnerString()) {
+                    final String topPackage = runningTasks.get(0).topActivity.getPackageName();
+                    if (!topPackage.contentEquals(mCurrentClient.getOwnerString())) {
                         mCurrentClient.stop(false /* initiatedByClient */);
-                        Slog.e(TAG, "Stopping background authentication");
+                        Slog.e(TAG, "Stopping background authentication, top: " + topPackage
+                                + " currentClient: " + mCurrentClient.getOwnerString());
                     }
                 }
             } catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 8e77373..a85960a 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -80,6 +80,9 @@
 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;
+import static android.telephony.CarrierConfigManager.KEY_DATA_LIMIT_NOTIFICATION_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_DATA_RAPID_NOTIFICATION_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_NOTIFICATION_BOOL;
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
 import static com.android.internal.util.ArrayUtils.appendInt;
@@ -217,6 +220,7 @@
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.IndentingPrintWriter;
 import com.android.internal.util.Preconditions;
+import com.android.internal.util.StatLogger;
 import com.android.server.EventLogTags;
 import com.android.server.LocalServices;
 import com.android.server.ServiceThread;
@@ -545,6 +549,19 @@
 
     // TODO: migrate notifications to SystemUI
 
+
+    interface Stats {
+        int UPDATE_NETWORK_ENABLED = 0;
+        int IS_UID_NETWORKING_BLOCKED = 1;
+
+        int COUNT = IS_UID_NETWORKING_BLOCKED + 1;
+    }
+
+    public final StatLogger mStatLogger = new StatLogger(new String[] {
+            "updateNetworkEnabledNL()",
+            "isUidNetworkingBlocked()",
+    });
+
     public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
             INetworkManagementService networkManagement) {
         this(context, activityManager, networkManagement, AppGlobals.getPackageManager(),
@@ -1093,8 +1110,10 @@
         final long now = mClock.millis();
         for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
             final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
+            final int subId = findRelevantSubId(policy.template);
+
             // ignore policies that aren't relevant to user
-            if (!isTemplateRelevant(policy.template)) continue;
+            if (subId == INVALID_SUBSCRIPTION_ID) continue;
             if (!policy.hasCycle()) continue;
 
             final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager
@@ -1103,28 +1122,43 @@
             final long cycleEnd = cycle.second.toInstant().toEpochMilli();
             final long totalBytes = getTotalBytes(policy.template, cycleStart, cycleEnd);
 
-            // Notify when data usage is over warning/limit
-            if (policy.isOverLimit(totalBytes)) {
-                final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart;
-                if (snoozedThisCycle) {
-                    enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null);
-                } else {
-                    enqueueNotification(policy, TYPE_LIMIT, totalBytes, null);
-                    notifyOverLimitNL(policy.template);
+            // Carrier might want to manage notifications themselves
+            final PersistableBundle config = mCarrierConfigManager.getConfigForSubId(subId);
+            final boolean notifyWarning = getBooleanDefeatingNullable(config,
+                    KEY_DATA_WARNING_NOTIFICATION_BOOL, true);
+            final boolean notifyLimit = getBooleanDefeatingNullable(config,
+                    KEY_DATA_LIMIT_NOTIFICATION_BOOL, true);
+            final boolean notifyRapid = getBooleanDefeatingNullable(config,
+                    KEY_DATA_RAPID_NOTIFICATION_BOOL, true);
+
+            // Notify when data usage is over warning
+            if (notifyWarning) {
+                if (policy.isOverWarning(totalBytes) && !policy.isOverLimit(totalBytes)) {
+                    final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart;
+                    if (!snoozedThisCycle) {
+                        enqueueNotification(policy, TYPE_WARNING, totalBytes, null);
+                    }
                 }
+            }
 
-            } else {
-                notifyUnderLimitNL(policy.template);
-
-                final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart;
-                if (policy.isOverWarning(totalBytes) && !snoozedThisCycle) {
-                    enqueueNotification(policy, TYPE_WARNING, totalBytes, null);
+            // Notify when data usage is over limit
+            if (notifyLimit) {
+                if (policy.isOverLimit(totalBytes)) {
+                    final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart;
+                    if (snoozedThisCycle) {
+                        enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null);
+                    } else {
+                        enqueueNotification(policy, TYPE_LIMIT, totalBytes, null);
+                        notifyOverLimitNL(policy.template);
+                    }
+                } else {
+                    notifyUnderLimitNL(policy.template);
                 }
             }
 
             // Warn if average usage over last 4 days is on track to blow pretty
             // far past the plan limits.
-            if (policy.limitBytes != LIMIT_DISABLED) {
+            if (notifyRapid && policy.limitBytes != LIMIT_DISABLED) {
                 final long recentDuration = TimeUnit.DAYS.toMillis(4);
                 final long recentStart = now - recentDuration;
                 final long recentEnd = now;
@@ -1201,27 +1235,26 @@
      * current device state, such as when
      * {@link TelephonyManager#getSubscriberId()} matches. This is regardless of
      * data connection status.
+     *
+     * @return relevant subId, or {@link #INVALID_SUBSCRIPTION_ID} when no
+     *         matching subId found.
      */
-    private boolean isTemplateRelevant(NetworkTemplate template) {
-        if (template.isMatchRuleMobile()) {
-            final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
-            final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class);
+    private int findRelevantSubId(NetworkTemplate template) {
+        final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
+        final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class);
 
-            // Mobile template is relevant when any active subscriber matches
-            final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList());
-            for (int subId : subIds) {
-                final String subscriberId = tele.getSubscriberId(subId);
-                final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
-                        TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true,
-                        true);
-                if (template.matches(probeIdent)) {
-                    return true;
-                }
+        // Mobile template is relevant when any active subscriber matches
+        final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList());
+        for (int subId : subIds) {
+            final String subscriberId = tele.getSubscriberId(subId);
+            final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE,
+                    TelephonyManager.NETWORK_TYPE_UNKNOWN, subscriberId, null, false, true,
+                    true);
+            if (template.matches(probeIdent)) {
+                return subId;
             }
-            return false;
-        } else {
-            return true;
         }
+        return INVALID_SUBSCRIPTION_ID;
     }
 
     /**
@@ -1572,6 +1605,8 @@
         // TODO: reset any policy-disabled networks when any policy is removed
         // completely, which is currently rare case.
 
+        final long startTime = mStatLogger.getTime();
+
         for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
             final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
             // shortcut when policy has no limit
@@ -1593,6 +1628,8 @@
 
             setNetworkTemplateEnabled(policy.template, networkEnabled);
         }
+
+        mStatLogger.logDurationStat(Stats.UPDATE_NETWORK_ENABLED, startTime);
     }
 
     /**
@@ -3086,9 +3123,11 @@
 
         // We can only override when carrier told us about plans
         synchronized (mNetworkPoliciesSecondLock) {
-            if (ArrayUtils.isEmpty(mSubscriptionPlans.get(subId))) {
+            final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId);
+            if (plan == null
+                    || plan.getDataLimitBehavior() == SubscriptionPlan.LIMIT_BEHAVIOR_UNKNOWN) {
                 throw new IllegalStateException(
-                        "Must provide SubscriptionPlan information before overriding");
+                        "Must provide valid SubscriptionPlan to enable overriding");
             }
         }
 
@@ -3280,6 +3319,9 @@
                 }
                 fout.decreaseIndent();
 
+                fout.println();
+                mStatLogger.dump(fout);
+
                 mLogger.dumpLogs(fout);
             }
         }
@@ -4639,8 +4681,14 @@
 
     @Override
     public boolean isUidNetworkingBlocked(int uid, boolean isNetworkMetered) {
+        final long startTime = mStatLogger.getTime();
+
         mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
-        return isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+        final boolean ret = isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+
+        mStatLogger.logDurationStat(Stats.IS_UID_NETWORKING_BLOCKED, startTime);
+
+        return ret;
     }
 
     private boolean isUidNetworkingBlockedInternal(int uid, boolean isNetworkMetered) {
@@ -4715,11 +4763,17 @@
          */
         @Override
         public boolean isUidNetworkingBlocked(int uid, String ifname) {
+            final long startTime = mStatLogger.getTime();
+
             final boolean isNetworkMetered;
             synchronized (mNetworkPoliciesSecondLock) {
                 isNetworkMetered = mMeteredIfaces.contains(ifname);
             }
-            return isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+            final boolean ret = isUidNetworkingBlockedInternal(uid, isNetworkMetered);
+
+            mStatLogger.logDurationStat(Stats.IS_UID_NETWORKING_BLOCKED, startTime);
+
+            return ret;
         }
 
         @Override
@@ -4831,7 +4885,21 @@
     @GuardedBy("mNetworkPoliciesSecondLock")
     private SubscriptionPlan getPrimarySubscriptionPlanLocked(int subId) {
         final SubscriptionPlan[] plans = mSubscriptionPlans.get(subId);
-        return ArrayUtils.isEmpty(plans) ? null : plans[0];
+        if (!ArrayUtils.isEmpty(plans)) {
+            for (SubscriptionPlan plan : plans) {
+                if (plan.getCycleRule().isRecurring()) {
+                    // Recurring plans will always have an active cycle
+                    return plan;
+                } else {
+                    // Non-recurring plans need manual test for active cycle
+                    final Range<ZonedDateTime> cycle = plan.cycleIterator().next();
+                    if (cycle.contains(ZonedDateTime.now(mClock))) {
+                        return plan;
+                    }
+                }
+            }
+        }
+        return null;
     }
 
     /**
@@ -4878,6 +4946,11 @@
         return (val != null) ? val : new NetworkState[0];
     }
 
+    private static boolean getBooleanDefeatingNullable(@Nullable PersistableBundle bundle,
+            String key, boolean defaultValue) {
+        return (bundle != null) ? bundle.getBoolean(key, defaultValue) : defaultValue;
+    }
+
     private class NotificationId {
         private final String mTag;
         private final int mId;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 30776e5..2c0f469 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1872,7 +1872,7 @@
         };
 
         int newSuppressedVisualEffects = incomingPolicy.suppressedVisualEffects;
-        if (targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+        if (targetSdkVersion < Build.VERSION_CODES.P) {
             // unset higher order bits introduced in P, maintain the user's higher order bits
             for (int i = 0; i < effectsIntroducedInP.length ; i++) {
                 newSuppressedVisualEffects &= ~effectsIntroducedInP[i];
@@ -2131,6 +2131,26 @@
         }
 
         /**
+         * Updates the enabled state for notifications for the given package (and uid).
+         * Additionally, this method marks the app importance as locked by the user, which means
+         * that notifications from the app will <b>not</b> be considered for showing a
+         * blocking helper.
+         *
+         * @param pkg package that owns the notifications to update
+         * @param uid uid of the app providing notifications
+         * @param enabled whether notifications should be enabled for the app
+         *
+         * @see #setNotificationsEnabledForPackage(String, int, boolean)
+         */
+        @Override
+        public void setNotificationsEnabledWithImportanceLockForPackage(
+                String pkg, int uid, boolean enabled) {
+            setNotificationsEnabledForPackage(pkg, uid, enabled);
+
+            mRankingHelper.setAppImportanceLocked(pkg, uid);
+        }
+
+        /**
          * Use this when you just want to know if notifications are OK for this package.
          */
         @Override
@@ -3229,7 +3249,7 @@
                         0, UserHandle.getUserId(MY_UID));
                 Policy currPolicy = mZenModeHelper.getNotificationPolicy();
 
-                if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
+                if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.P) {
                     int priorityCategories = policy.priorityCategories;
                     // ignore alarm and media values from new policy
                     priorityCategories &= ~Policy.PRIORITY_CATEGORY_ALARMS;
@@ -3616,6 +3636,8 @@
                                 System.currentTimeMillis());
                 summaryRecord = new NotificationRecord(getContext(), summarySbn,
                         notificationRecord.getChannel());
+                summaryRecord.setIsAppImportanceLocked(
+                        notificationRecord.getIsAppImportanceLocked());
                 summaries.put(pkg, summarySbn.getKey());
             }
         }
@@ -3997,9 +4019,14 @@
                     + ", notificationUid=" + notificationUid
                     + ", notification=" + notification;
             Log.e(TAG, noChannelStr);
-            doChannelWarningToast("Developer warning for package \"" + pkg + "\"\n" +
-                    "Failed to post notification on channel \"" + channelId + "\"\n" +
-                    "See log for more details");
+            boolean appNotificationsOff = mRankingHelper.getImportance(pkg, notificationUid)
+                    == NotificationManager.IMPORTANCE_NONE;
+
+            if (!appNotificationsOff) {
+                doChannelWarningToast("Developer warning for package \"" + pkg + "\"\n" +
+                        "Failed to post notification on channel \"" + channelId + "\"\n" +
+                        "See log for more details");
+            }
             return;
         }
 
@@ -4007,6 +4034,7 @@
                 pkg, opPkg, id, tag, notificationUid, callingPid, notification,
                 user, null, System.currentTimeMillis());
         final NotificationRecord r = new NotificationRecord(getContext(), n, channel);
+        r.setIsAppImportanceLocked(mRankingHelper.getIsAppImportanceLocked(pkg, callingUid));
 
         if ((notification.flags & Notification.FLAG_FOREGROUND_SERVICE) != 0
                 && (channel.getUserLockedFields() & NotificationChannel.USER_LOCKED_IMPORTANCE) == 0
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 9bd3e52..9745be3 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -151,11 +151,14 @@
     private boolean mIsInterruptive;
     private int mNumberOfSmartRepliesAdded;
     private boolean mHasSeenSmartReplies;
+    /**
+     * Whether this notification (and its channels) should be considered user locked. Used in
+     * conjunction with user sentiment calculation.
+     */
+    private boolean mIsAppImportanceLocked;
 
-    @VisibleForTesting
     public NotificationRecord(Context context, StatusBarNotification sbn,
-            NotificationChannel channel)
-    {
+            NotificationChannel channel) {
         this.sbn = sbn;
         mOriginalFlags = sbn.getNotification().flags;
         mRankingTimeMs = calculateRankingTimeMs(0L);
@@ -503,6 +506,7 @@
         pw.println(prefix + "mImportance="
                 + NotificationListenerService.Ranking.importanceToString(mImportance));
         pw.println(prefix + "mImportanceExplanation=" + mImportanceExplanation);
+        pw.println(prefix + "mIsAppImportanceLocked=" + mIsAppImportanceLocked);
         pw.println(prefix + "mIntercept=" + mIntercept);
         pw.println(prefix + "mHidden==" + mHidden);
         pw.println(prefix + "mGlobalSortKey=" + mGlobalSortKey);
@@ -564,11 +568,11 @@
     public final String toString() {
         return String.format(
                 "NotificationRecord(0x%08x: pkg=%s user=%s id=%d tag=%s importance=%d key=%s" +
-                        ": %s)",
+                        "appImportanceLocked=%s: %s)",
                 System.identityHashCode(this),
                 this.sbn.getPackageName(), this.sbn.getUser(), this.sbn.getId(),
                 this.sbn.getTag(), this.mImportance, this.sbn.getKey(),
-                this.sbn.getNotification());
+                mIsAppImportanceLocked, this.sbn.getNotification());
     }
 
     public void addAdjustment(Adjustment adjustment) {
@@ -600,7 +604,8 @@
                 if (signals.containsKey(Adjustment.KEY_USER_SENTIMENT)) {
                     // Only allow user sentiment update from assistant if user hasn't already
                     // expressed a preference for this channel
-                    if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
+                    if (!mIsAppImportanceLocked
+                            && (getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
                         setUserSentiment(adjustment.getSignals().getInt(
                                 Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEUTRAL));
                     }
@@ -609,6 +614,11 @@
         }
     }
 
+    public void setIsAppImportanceLocked(boolean isAppImportanceLocked) {
+        mIsAppImportanceLocked = isAppImportanceLocked;
+        calculateUserSentiment();
+    }
+
     public void setContactAffinity(float contactAffinity) {
         mContactAffinity = contactAffinity;
         if (mImportance < IMPORTANCE_DEFAULT &&
@@ -870,6 +880,13 @@
         return mChannel;
     }
 
+    /**
+     * @see RankingHelper#getIsAppImportanceLocked(String, int)
+     */
+    public boolean getIsAppImportanceLocked() {
+        return mIsAppImportanceLocked;
+    }
+
     protected void updateNotificationChannel(NotificationChannel channel) {
         if (channel != null) {
             mChannel = channel;
@@ -927,7 +944,8 @@
     }
 
     private void calculateUserSentiment() {
-        if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) != 0) {
+        if ((getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) != 0
+                || mIsAppImportanceLocked) {
             mUserSentiment = USER_SENTIMENT_POSITIVE;
         }
     }
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 43d393a..c2ec79b 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -24,6 +24,7 @@
 import com.android.internal.util.Preconditions;
 import com.android.internal.util.XmlUtils;
 
+import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.app.Notification;
 import android.app.NotificationChannel;
@@ -36,7 +37,6 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ParceledListSlice;
 import android.content.pm.Signature;
-import android.content.res.Resources;
 import android.metrics.LogMaker;
 import android.os.Build;
 import android.os.UserHandle;
@@ -89,11 +89,25 @@
     private static final String ATT_VISIBILITY = "visibility";
     private static final String ATT_IMPORTANCE = "importance";
     private static final String ATT_SHOW_BADGE = "show_badge";
+    private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields";
 
     private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT;
     private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE;
     private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;
     private static final boolean DEFAULT_SHOW_BADGE = true;
+    /**
+     * Default value for what fields are user locked. See {@link LockableAppFields} for all lockable
+     * fields.
+     */
+    private static final int DEFAULT_LOCKED_APP_FIELDS = 0;
+
+    /**
+     * All user-lockable fields for a given application.
+     */
+    @IntDef({LockableAppFields.USER_LOCKED_IMPORTANCE})
+    public @interface LockableAppFields {
+        int USER_LOCKED_IMPORTANCE = 0x00000001;
+    }
 
     private final NotificationSignalExtractor[] mSignalExtractors;
     private final NotificationComparator mPreliminaryComparator;
@@ -218,6 +232,8 @@
                                 parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
                         r.showBadge = XmlUtils.readBooleanAttribute(
                                 parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
+                        r.lockedAppFields = XmlUtils.readIntAttribute(parser,
+                                ATT_APP_USER_LOCKED_FIELDS, DEFAULT_LOCKED_APP_FIELDS);
 
                         final int innerDepth = parser.getDepth();
                         while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -388,10 +404,14 @@
                 if (forBackup && UserHandle.getUserId(r.uid) != UserHandle.USER_SYSTEM) {
                     continue;
                 }
-                final boolean hasNonDefaultSettings = r.importance != DEFAULT_IMPORTANCE
-                        || r.priority != DEFAULT_PRIORITY || r.visibility != DEFAULT_VISIBILITY
-                        || r.showBadge != DEFAULT_SHOW_BADGE || r.channels.size() > 0
-                        || r.groups.size() > 0;
+                final boolean hasNonDefaultSettings =
+                        r.importance != DEFAULT_IMPORTANCE
+                            || r.priority != DEFAULT_PRIORITY
+                            || r.visibility != DEFAULT_VISIBILITY
+                            || r.showBadge != DEFAULT_SHOW_BADGE
+                            || r.lockedAppFields != DEFAULT_LOCKED_APP_FIELDS
+                            || r.channels.size() > 0
+                            || r.groups.size() > 0;
                 if (hasNonDefaultSettings) {
                     out.startTag(null, TAG_PACKAGE);
                     out.attribute(null, ATT_NAME, r.pkg);
@@ -405,6 +425,8 @@
                         out.attribute(null, ATT_VISIBILITY, Integer.toString(r.visibility));
                     }
                     out.attribute(null, ATT_SHOW_BADGE, Boolean.toString(r.showBadge));
+                    out.attribute(null, ATT_APP_USER_LOCKED_FIELDS,
+                            Integer.toString(r.lockedAppFields));
 
                     if (!forBackup) {
                         out.attribute(null, ATT_UID, Integer.toString(r.uid));
@@ -511,6 +533,17 @@
         return getOrCreateRecord(packageName, uid).importance;
     }
 
+
+    /**
+     * Returns whether the importance of the corresponding notification is user-locked and shouldn't
+     * be adjusted by an assistant (via means of a blocking helper, for example). For the channel
+     * locking field, see {@link NotificationChannel#USER_LOCKED_IMPORTANCE}.
+     */
+    public boolean getIsAppImportanceLocked(String packageName, int uid) {
+        int userLockedFields = getOrCreateRecord(packageName, uid).lockedAppFields;
+        return (userLockedFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0;
+    }
+
     @Override
     public boolean canShowBadge(String packageName, int uid) {
         return getOrCreateRecord(packageName, uid).showBadge;
@@ -996,6 +1029,21 @@
                 enabled ? DEFAULT_IMPORTANCE : IMPORTANCE_NONE);
     }
 
+    /**
+     * Sets whether any notifications from the app, represented by the given {@code pkgName} and
+     * {@code uid}, have their importance locked by the user. Locked notifications don't get
+     * considered for sentiment adjustments (and thus never show a blocking helper).
+     */
+    public void setAppImportanceLocked(String packageName, int uid) {
+        Record record = getOrCreateRecord(packageName, uid);
+        if ((record.lockedAppFields & LockableAppFields.USER_LOCKED_IMPORTANCE) != 0) {
+            return;
+        }
+
+        record.lockedAppFields = record.lockedAppFields | LockableAppFields.USER_LOCKED_IMPORTANCE;
+        updateConfig();
+    }
+
     @VisibleForTesting
     void lockFieldsForUpdate(NotificationChannel original, NotificationChannel update) {
         if (original.canBypassDnd() != update.canBypassDnd()) {
@@ -1413,6 +1461,7 @@
         int priority = DEFAULT_PRIORITY;
         int visibility = DEFAULT_VISIBILITY;
         boolean showBadge = DEFAULT_SHOW_BADGE;
+        int lockedAppFields = DEFAULT_LOCKED_APP_FIELDS;
 
         ArrayMap<String, NotificationChannel> channels = new ArrayMap<>();
         Map<String, NotificationChannelGroup> groups = new ConcurrentHashMap<>();
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a18fd7f..a047604 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5304,7 +5304,7 @@
         synchronized (mPackages) {
             final String[] packageNames = getPackagesForUid(uid);
             final PackageParser.Package pkg = (packageNames != null && packageNames.length > 0)
-                    ? mSettings.getPackageLPr(packageNames[0]).getPackage()
+                    ? mPackages.get(packageNames[0])
                     : null;
             return mPermissionManager.checkUidPermission(permName, pkg, uid, getCallingUid());
         }
@@ -8070,6 +8070,7 @@
                 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)
@@ -8140,7 +8141,7 @@
     }
 
     private boolean isCallerSameApp(String packageName, int uid) {
-        PackageParser.Package pkg = mSettings.getPackageLPr(packageName).getPackage();
+        PackageParser.Package pkg = mPackages.get(packageName);
         return pkg != null
                 && UserHandle.getAppId(uid) == pkg.applicationInfo.uid;
     }
@@ -9706,7 +9707,7 @@
                     if (expectedCertDigests.length > 1) {
 
                         // For apps targeting O MR1 we require explicit enumeration of all certs.
-                        final String[] libCertDigests = (targetSdk > Build.VERSION_CODES.O)
+                        final String[] libCertDigests = (targetSdk >= Build.VERSION_CODES.O_MR1)
                                 ? PackageUtils.computeSignaturesSha256Digests(
                                 libPkg.mSigningDetails.signatures)
                                 : PackageUtils.computeSignaturesSha256Digests(
@@ -10181,20 +10182,10 @@
                 // The signature has changed, but this package is in the system
                 // image...  let's recover!
                 pkgSetting.signatures.mSigningDetails = pkg.mSigningDetails;
-                // However...  if this package is part of a shared user, but it
-                // doesn't match the signature of the shared user, let's fail.
-                // What this means is that you can't change the signatures
-                // associated with an overall shared user, which doesn't seem all
-                // that unreasonable.
+                // If the system app is part of a shared user we allow that shared user to change
+                // signatures as well in part as part of an OTA.
                 if (signatureCheckPs.sharedUser != null) {
-                    if (compareSignatures(
-                            signatureCheckPs.sharedUser.signatures.mSigningDetails.signatures,
-                            pkg.mSigningDetails.signatures) != PackageManager.SIGNATURE_MATCH) {
-                        throw new PackageManagerException(
-                                INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
-                                "Signature mismatch for shared user: "
-                                        + pkgSetting.sharedUser);
-                    }
+                    signatureCheckPs.sharedUser.signatures.mSigningDetails = pkg.mSigningDetails;
                 }
                 // File a report about this.
                 String msg = "System package " + pkg.packageName
@@ -23607,13 +23598,6 @@
         }
 
         @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();
diff --git a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
index eeaa333..8c7871f 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
@@ -21,6 +21,7 @@
 import android.content.pm.PackageManagerInternal;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.util.Slog;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -164,12 +165,13 @@
             ShortcutService s, String packageName, @UserIdInt int packageUserId) {
         final PackageInfo pi = s.getPackageInfoWithSignatures(packageName, packageUserId);
         // retrieve the newest sigs
-        Signature[][] signingHistory = pi.signingCertificateHistory;
-        if (signingHistory == null || signingHistory.length == 0) {
+        SigningInfo signingInfo = pi.signingInfo;
+        if (signingInfo == null) {
             Slog.e(TAG, "Can't get signatures: package=" + packageName);
             return null;
         }
-        Signature[] signatures = signingHistory[signingHistory.length - 1];
+        // TODO (b/73988180) use entire signing history in case of rollbacks
+        Signature[] signatures = signingInfo.getApkContentsSigners();
         final ShortcutPackageInfo ret = new ShortcutPackageInfo(pi.getLongVersionCode(),
                 pi.lastUpdateTime, BackupUtils.hashSignatureArray(signatures), /* shadow=*/ false);
 
@@ -192,13 +194,14 @@
             return;
         }
         // retrieve the newest sigs
-        Signature[][] signingHistory = pi.signingCertificateHistory;
-        if (signingHistory == null || signingHistory.length == 0) {
+        SigningInfo signingInfo = pi.signingInfo;
+        if (signingInfo == null) {
             Slog.w(TAG, "Not refreshing signature for " + pkg.getPackageName()
-                    + " since it appears to have no signature history.");
+                    + " since it appears to have no signing info.");
             return;
         }
-        Signature[] signatures = signingHistory[signingHistory.length - 1];
+        // TODO (b/73988180) use entire signing history in case of rollbacks
+        Signature[] signatures = signingInfo.getApkContentsSigners();
         mSigHashes = BackupUtils.hashSignatureArray(signatures);
     }
 
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 15b4617..599e5a5 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -48,7 +48,6 @@
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutServiceInternal;
 import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
-import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.graphics.Bitmap;
@@ -100,7 +99,7 @@
 import com.android.internal.util.FastXmlSerializer;
 import com.android.internal.util.Preconditions;
 import com.android.server.LocalServices;
-import com.android.server.StatLogger;
+import com.android.internal.util.StatLogger;
 import com.android.server.SystemService;
 import com.android.server.pm.ShortcutUser.PackageWithUser;
 
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 065133b..f5b52fc 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -212,11 +212,12 @@
             return PackageManager.PERMISSION_DENIED;
         }
 
-        final PackageSetting ps = (PackageSetting) mPackageManagerInt.getPackageSetting(pkgName);
-        if (ps != null && ps.getPackage() != null) {
-            if (mPackageManagerInt.filterAppAccess(ps.getPackage(), callingUid, userId)) {
+        final PackageParser.Package pkg = mPackageManagerInt.getPackage(pkgName);
+        if (pkg != null && pkg.mExtras != null) {
+            if (mPackageManagerInt.filterAppAccess(pkg, 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/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java
index 1f95868..b8431b1 100644
--- a/services/core/java/com/android/server/wm/Dimmer.java
+++ b/services/core/java/com/android/server/wm/Dimmer.java
@@ -16,7 +16,7 @@
 
 package com.android.server.wm;
 
-import static com.android.server.wm.AlphaAnimationSpecProto.DURATION;
+import static com.android.server.wm.AlphaAnimationSpecProto.DURATION_MS;
 import static com.android.server.wm.AlphaAnimationSpecProto.FROM;
 import static com.android.server.wm.AlphaAnimationSpecProto.TO;
 import static com.android.server.wm.AnimationSpecProto.ALPHA;
@@ -35,6 +35,7 @@
  */
 class Dimmer {
     private static final String TAG = "WindowManager";
+    // This is in milliseconds.
     private static final int DEFAULT_DIM_ANIM_DURATION = 200;
 
     private class DimAnimatable implements SurfaceAnimator.Animatable {
@@ -370,7 +371,7 @@
             final long token = proto.start(ALPHA);
             proto.write(FROM, mFromAlpha);
             proto.write(TO, mToAlpha);
-            proto.write(DURATION, mDuration);
+            proto.write(DURATION_MS, mDuration);
             proto.end(token);
         }
     }
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index d71f67f..4003d5a 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -45,7 +45,6 @@
 import android.util.Slog;
 import android.view.Display;
 import android.view.DisplayCutout;
-import android.view.DisplayCutout.ParcelableWrapper;
 import android.view.IWindow;
 import android.view.IWindowId;
 import android.view.IWindowSession;
@@ -195,7 +194,7 @@
             InputChannel outInputChannel) {
         return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
                 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
-                null /* cutout */, outInputChannel);
+                new DisplayCutout.ParcelableWrapper()  /* cutout */, outInputChannel);
     }
 
     @Override
@@ -219,7 +218,7 @@
             int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
         return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
                 new Rect() /* outFrame */, outContentInsets, outStableInsets, null /* outOutsets */,
-                new ParcelableWrapper() /* cutout */, null /* outInputChannel */);
+                new DisplayCutout.ParcelableWrapper() /* cutout */, null /* outInputChannel */);
     }
 
     @Override
@@ -234,16 +233,16 @@
 
     @Override
     public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
-            int requestedWidth, int requestedHeight, int viewFlags,
-            int flags, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
-            Rect outVisibleInsets, Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
-            DisplayCutout.ParcelableWrapper cutout,
-            MergedConfiguration mergedConfiguration, Surface outSurface) {
+            int requestedWidth, int requestedHeight, int viewFlags, int flags, long frameNumber,
+            Rect outFrame, Rect outOverscanInsets, Rect outContentInsets, Rect outVisibleInsets,
+            Rect outStableInsets, Rect outsets, Rect outBackdropFrame,
+            DisplayCutout.ParcelableWrapper cutout, MergedConfiguration mergedConfiguration,
+            Surface outSurface) {
         if (false) Slog.d(TAG_WM, ">>>>>> ENTERED relayout from "
                 + Binder.getCallingPid());
         Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, mRelayoutTag);
         int res = mService.relayoutWindow(this, window, seq, attrs,
-                requestedWidth, requestedHeight, viewFlags, flags,
+                requestedWidth, requestedHeight, viewFlags, flags, frameNumber,
                 outFrame, outOverscanInsets, outContentInsets, outVisibleInsets,
                 outStableInsets, outsets, outBackdropFrame, cutout,
                 mergedConfiguration, outSurface);
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
index 597b39e..5721bd8 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java
@@ -215,8 +215,8 @@
                 currentOrientation);
         window.setOuter(snapshotSurface);
         try {
-            session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, tmpFrame,
-                    tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect,
+            session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, -1,
+                    tmpFrame, tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect,
                     tmpCutout, tmpMergedConfiguration, surface);
         } catch (RemoteException e) {
             // Local call.
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index b6ee713..ae9e8026 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -828,6 +828,14 @@
             }
         }
 
+        if (inSplitScreenSecondaryWindowingMode()) {
+            // When the stack is resized due to entering split screen secondary, offset the
+            // windows to compensate for the new stack position.
+            forAllWindows(w -> {
+                w.mWinAnimator.setOffsetPositionForStackResize(true);
+            }, true);
+        }
+
         updateDisplayInfo(bounds);
         updateSurfaceBounds();
     }
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 768fa5e..407312a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -1835,10 +1835,9 @@
         }
     }
 
-    public int relayoutWindow(Session session, IWindow client, int seq,
-            LayoutParams attrs, int requestedWidth,
-            int requestedHeight, int viewVisibility, int flags,
-            Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
+    public int relayoutWindow(Session session, IWindow client, int seq, LayoutParams attrs,
+            int requestedWidth, int requestedHeight, int viewVisibility, int flags,
+            long frameNumber, Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,
             Rect outVisibleInsets, Rect outStableInsets, Rect outOutsets, Rect outBackdropFrame,
             DisplayCutout.ParcelableWrapper outCutout, MergedConfiguration mergedConfiguration,
             Surface outSurface) {
@@ -1865,6 +1864,7 @@
                 win.setRequestedSize(requestedWidth, requestedHeight);
             }
 
+            win.setFrameNumber(frameNumber);
             int attrChanges = 0;
             int flagChanges = 0;
             if (attrs != null) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index c5269e1..aaf59b9 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -112,7 +112,7 @@
 import static com.android.server.wm.IdentifierProto.TITLE;
 import static com.android.server.wm.IdentifierProto.USER_ID;
 import static com.android.server.wm.AnimationSpecProto.MOVE;
-import static com.android.server.wm.MoveAnimationSpecProto.DURATION;
+import static com.android.server.wm.MoveAnimationSpecProto.DURATION_MS;
 import static com.android.server.wm.MoveAnimationSpecProto.FROM;
 import static com.android.server.wm.MoveAnimationSpecProto.TO;
 import static com.android.server.wm.WindowStateProto.ANIMATING_EXIT;
@@ -636,6 +636,11 @@
     private PowerManagerWrapper mPowerManagerWrapper;
 
     /**
+     * A frame number in which changes requested in this layout will be rendered.
+     */
+    private long mFrameNumber = -1;
+
+    /**
      * Compares two window sub-layers and returns -1 if the first is lesser than the second in terms
      * of z-order and 1 otherwise.
      */
@@ -4101,11 +4106,10 @@
         mDestroying = true;
 
         final boolean hasSurface = mWinAnimator.hasSurface();
-        if (hasSurface) {
-            // Use pendingTransaction here so hide is done the same transaction as the other
-            // animations when exiting
-            mWinAnimator.hide(getPendingTransaction(), "onExitAnimationDone");
-        }
+
+        // Use pendingTransaction here so hide is done the same transaction as the other
+        // animations when exiting
+        mWinAnimator.hide(getPendingTransaction(), "onExitAnimationDone");
 
         // If we have an app token, we ask it to destroy the surface for us, so that it can take
         // care to ensure the activity has actually stopped and the surface is not still in use.
@@ -4655,7 +4659,7 @@
                 mLastSurfaceInsets.set(mAttrs.surfaceInsets);
                 t.deferTransactionUntil(mSurfaceControl,
                         mWinAnimator.mSurfaceController.mSurfaceControl.getHandle(),
-                        mAttrs.frameNumber);
+                        getFrameNumber());
             }
         }
     }
@@ -4771,6 +4775,14 @@
         return mService.mInputMethodTarget == this;
     }
 
+    long getFrameNumber() {
+        return mFrameNumber;
+    }
+
+    void setFrameNumber(long frameNumber) {
+        mFrameNumber = frameNumber;
+    }
+
     private final class MoveAnimationSpec implements AnimationSpec {
 
         private final long mDuration;
@@ -4813,7 +4825,7 @@
             final long token = proto.start(MOVE);
             mFrom.writeToProto(proto, FROM);
             mTo.writeToProto(proto, TO);
-            proto.write(DURATION, mDuration);
+            proto.write(DURATION_MS, mDuration);
             proto.end(token);
         }
     }
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index e92d460..195274a 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -67,7 +67,6 @@
 
 import com.android.server.policy.WindowManagerPolicy;
 
-import java.io.FileDescriptor;
 import java.io.PrintWriter;
 
 /**
@@ -217,6 +216,12 @@
     int mXOffset = 0;
     int mYOffset = 0;
 
+    /**
+     * A flag to determine if the WSA needs to offset its position to compensate for the stack's
+     * position update before the WSA surface has resized.
+     */
+    private boolean mOffsetPositionForStackResize;
+
     private final Rect mTmpSize = new Rect();
 
     private final SurfaceControl.Transaction mReparentTransaction = new SurfaceControl.Transaction();
@@ -230,6 +235,8 @@
     // once per animation.
     boolean mPipAnimationStarted = false;
 
+    private final Point mTmpPos = new Point();
+
     WindowStateAnimator(final WindowState win) {
         final WindowManagerService service = win.mService;
 
@@ -301,6 +308,12 @@
         if (!mLastHidden) {
             //dump();
             mLastHidden = true;
+
+            // We may have a preserved surface which we no longer need. If there was a quick
+            // VISIBLE, GONE, VISIBLE, GONE sequence, the surface may never draw, so we don't mark
+            // it to be destroyed in prepareSurfaceLocked.
+            markPreservedSurfaceForDestroy();
+
             if (mSurfaceController != null) {
                 mSurfaceController.hide(transaction, reason);
             }
@@ -498,6 +511,8 @@
             mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
                     attrs.getTitle().toString(), width, height, format, flags, this,
                     windowType, ownerUid);
+
+            setOffsetPositionForStackResize(false);
             mSurfaceFormat = format;
 
             w.setHasSurface(true);
@@ -859,7 +874,8 @@
         // However, this would be unsafe, as the client may be in the middle
         // of producing a frame at the old size, having just completed layout
         // to find the surface size changed underneath it.
-        if (!w.mRelayoutCalled || w.mInRelayout) {
+        final boolean relayout = !w.mRelayoutCalled || w.mInRelayout;
+        if (relayout) {
             mSurfaceResized = mSurfaceController.setSizeInTransaction(
                     mTmpSize.width(), mTmpSize.height(), recoveringMemory);
         } else {
@@ -996,7 +1012,38 @@
             mPipAnimationStarted = false;
 
             if (!w.mSeamlesslyRotated) {
-                mSurfaceController.setPositionInTransaction(mXOffset, mYOffset, recoveringMemory);
+                // Used to offset the WSA when stack position changes before a resize.
+                int xOffset = mXOffset;
+                int yOffset = mYOffset;
+                if (mOffsetPositionForStackResize) {
+                    if (relayout) {
+                        // Once a relayout is called, reset the offset back to 0 and defer
+                        // setting it until a new frame with the updated size. This ensures that
+                        // the WS position is reset (so the stack position is shown) at the same
+                        // time that the buffer size changes.
+                        setOffsetPositionForStackResize(false);
+                        mSurfaceController.deferTransactionUntil(mSurfaceController.getHandle(),
+                                mWin.getFrameNumber());
+                    } else {
+                        final TaskStack stack = mWin.getStack();
+                        mTmpPos.x = 0;
+                        mTmpPos.y = 0;
+                        if (stack != null) {
+                            stack.getRelativePosition(mTmpPos);
+                        }
+
+                        xOffset = -mTmpPos.x;
+                        yOffset = -mTmpPos.y;
+
+                        // Crop also needs to be extended so the bottom isn't cut off when the WSA
+                        // position is moved.
+                        if (clipRect != null) {
+                            clipRect.right += mTmpPos.x;
+                            clipRect.bottom += mTmpPos.y;
+                        }
+                    }
+                }
+                mSurfaceController.setPositionInTransaction(xOffset, yOffset, recoveringMemory);
             }
         }
 
@@ -1499,4 +1546,8 @@
     int getLayer() {
         return mLastLayer;
     }
+
+    void setOffsetPositionForStackResize(boolean offsetPositionForStackResize) {
+        mOffsetPositionForStackResize = offsetPositionForStackResize;
+    }
 }
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 82d2f3c..e07b89f 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -220,7 +220,7 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.android.server.LocalServices;
 import com.android.server.LockGuard;
-import com.android.server.StatLogger;
+import com.android.internal.util.StatLogger;
 import com.android.server.SystemServerInitThreadPool;
 import com.android.server.SystemService;
 import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index fa41220..949c504 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -492,9 +492,6 @@
         verify(agentMock.agent).onQuotaExceeded(anyLong(), anyLong());
     }
 
-    // TODO: Giving NPE at PerformBackupTask:524 because mCurrentPackage is null (PackageManager
-    // rightfully threw NameNotFoundException). Remove @Ignore when fixed.
-    @Ignore
     @Test
     public void testRunTask_whenAgentUnknown() throws Exception {
         // Not calling setUpAgent()
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index cecc94b..b4dc941 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -1714,6 +1714,8 @@
     }
 
     private void expectNetworkState(boolean roaming) throws Exception {
+        when(mCarrierConfigManager.getConfigForSubId(eq(TEST_SUB_ID)))
+                .thenReturn(CarrierConfigManager.getDefaultConfig());
         when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] {
                 new NetworkState(buildNetworkInfo(),
                         buildLinkProperties(TEST_IFACE),
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 9663a1b..08b8af2 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java
@@ -23,6 +23,9 @@
 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.content.pm.ActivityInfo.FLAG_ALWAYS_FOCUSABLE;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -287,4 +290,43 @@
         // Verify that the stack was removed.
         assertEquals(originalStackCount, defaultDisplay.getChildCount());
     }
+
+    @Test
+    public void testFocusability() throws Exception {
+        final ActivityStack stack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final ActivityRecord activity = new ActivityBuilder(mService).setCreateTask(true)
+                .setStack(stack).build();
+
+        // Under split screen primary we should be focusable when not minimized
+        mService.mStackSupervisor.setDockedStackMinimized(false);
+        assertTrue(stack.isFocusable());
+        assertTrue(activity.isFocusable());
+
+        // Under split screen primary we should not be focusable when minimized
+        mService.mStackSupervisor.setDockedStackMinimized(true);
+        assertFalse(stack.isFocusable());
+        assertFalse(activity.isFocusable());
+
+        final ActivityStack pinnedStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final ActivityRecord pinnedActivity = new ActivityBuilder(mService).setCreateTask(true)
+                .setStack(pinnedStack).build();
+
+        // We should not be focusable when in pinned mode
+        assertFalse(pinnedStack.isFocusable());
+        assertFalse(pinnedActivity.isFocusable());
+
+        // Add flag forcing focusability.
+        pinnedActivity.info.flags |= FLAG_ALWAYS_FOCUSABLE;
+
+        // We should not be focusable when in pinned mode
+        assertTrue(pinnedStack.isFocusable());
+        assertTrue(pinnedActivity.isFocusable());
+
+        // Without the overridding activity, stack should not be focusable.
+        pinnedStack.removeTask(pinnedActivity.getTask(), "testFocusability",
+                REMOVE_TASK_MODE_DESTROYING);
+        assertFalse(pinnedStack.isFocusable());
+    }
 }
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 c78fcd3..4b8dcc1 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -103,7 +103,42 @@
         assertEquals(mStack.getResumedActivity(), r);
         r.setState(PAUSING, "testResumedActivity");
         assertEquals(mStack.getResumedActivity(), null);
+    }
 
+    @Test
+    public void testResumedActivityFromTaskReparenting() {
+        final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
+        // Ensure moving task between two stacks updates resumed activity
+        r.setState(RESUMED, "testResumedActivityFromTaskReparenting");
+        assertEquals(mStack.getResumedActivity(), r);
+
+        final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+        mTask.reparent(destStack, true /* toTop */, TaskRecord.REPARENT_KEEP_STACK_AT_FRONT,
+                false /* animate */, true /* deferResume*/,
+                "testResumedActivityFromTaskReparenting");
+
+        assertEquals(mStack.getResumedActivity(), null);
+        assertEquals(destStack.getResumedActivity(), r);
+    }
+
+    @Test
+    public void testResumedActivityFromActivityReparenting() {
+        final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
+        // Ensure moving task between two stacks updates resumed activity
+        r.setState(RESUMED, "testResumedActivityFromActivityReparenting");
+        assertEquals(mStack.getResumedActivity(), r);
+
+        final ActivityStack destStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
+                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+        final TaskRecord destTask = new TaskBuilder(mSupervisor).setStack(destStack).build();
+
+        mTask.removeActivity(r);
+        destTask.addActivityToTop(r);
+
+        assertEquals(mStack.getResumedActivity(), null);
+        assertEquals(destStack.getResumedActivity(), r);
     }
 
     @Test
@@ -543,5 +578,4 @@
 
         assertEquals(expected, mStack.shouldSleepActivities());
     }
-
 }
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
index d37db20..4f18be7 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java
@@ -26,7 +26,9 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.os.Process;
 import android.platform.test.annotations.Presubmit;
 import android.support.test.filters.SmallTest;
@@ -395,7 +397,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
@@ -409,7 +417,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
@@ -425,7 +439,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[0][0];
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
@@ -440,7 +454,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = null;
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo,
@@ -453,7 +467,7 @@
     public void signaturesMatch_disallowsUnsignedApps_bothSignaturesNull_returnsFalse()
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
-        packageInfo.signingCertificateHistory = null;
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(null, packageInfo,
@@ -467,7 +481,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[0][0];
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo,
@@ -484,9 +498,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(
@@ -503,9 +521,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(
@@ -522,9 +544,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {signature1Copy, signature2Copy}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {signature1Copy, signature2Copy},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(
@@ -541,9 +567,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = AppBackupUtils.signaturesMatch(
@@ -560,7 +590,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy,
@@ -579,7 +615,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2},
+                        new int[] {0, 0}));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         // we know signature1Copy is in history, and we want to assume it has
@@ -601,7 +643,13 @@
 
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2},
+                        new int[] {0, 0}));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         // we know signature1Copy is in history, but we want to assume it does not have
diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
index 5f052ce..2830a74 100644
--- a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java
@@ -41,7 +41,9 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.os.Bundle;
 import android.os.Process;
 import android.platform.test.annotations.Presubmit;
@@ -371,7 +373,13 @@
         packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP;
         packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
         packageInfo.applicationInfo.backupAgentName = null;
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         PackageManagerStub.sPackageInfo = packageInfo;
 
         RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub,
@@ -402,7 +410,13 @@
                 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
         packageInfo.applicationInfo.uid = Process.SYSTEM_UID;
         packageInfo.applicationInfo.backupAgentName = "backup.agent";
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         PackageManagerStub.sPackageInfo = packageInfo;
 
         doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
@@ -434,7 +448,13 @@
                 ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
         packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
         packageInfo.applicationInfo.backupAgentName = null;
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         PackageManagerStub.sPackageInfo = packageInfo;
 
         doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(FAKE_SIGNATURE_1,
@@ -469,7 +489,13 @@
         packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
         packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
         packageInfo.applicationInfo.backupAgentName = null;
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.versionCode = 2;
         PackageManagerStub.sPackageInfo = packageInfo;
 
@@ -507,7 +533,13 @@
         packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
         packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
         packageInfo.applicationInfo.backupAgentName = null;
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.versionCode = 1;
         PackageManagerStub.sPackageInfo = packageInfo;
 
@@ -541,7 +573,13 @@
         packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION;
         packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID;
         packageInfo.applicationInfo.backupAgentName = null;
-        packageInfo.signingCertificateHistory = new Signature[][] {{FAKE_SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {FAKE_SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.versionCode = 1;
         PackageManagerStub.sPackageInfo = packageInfo;
 
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
index fb25cf3..284d443 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessMappingStrategyTest.java
@@ -32,7 +32,9 @@
 import android.os.PowerManager;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.util.MathUtils;
 import android.util.Spline;
+import android.util.Slog;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -91,6 +93,29 @@
     private static final float[] EMPTY_FLOAT_ARRAY = new float[0];
     private static final int[] EMPTY_INT_ARRAY = new int[0];
 
+    private static final float MAXIMUM_GAMMA = 3.0f;
+    private static final int[] GAMMA_CORRECTION_LUX = {
+        0,
+        100,
+        1000,
+        2500,
+        4000,
+        4900,
+        5000
+    };
+    private static final float[] GAMMA_CORRECTION_NITS = {
+        1.0f,
+        10.55f,
+        96.5f,
+        239.75f,
+        383.0f,
+        468.95f,
+        478.5f,
+    };
+    private static final Spline GAMMA_CORRECTION_SPLINE = Spline.createSpline(
+            new float[] { 0.0f, 100.0f, 1000.0f, 2500.0f, 4000.0f, 4900.0f, 5000.0f },
+            new float[] { 0.035f, 0.035f, 0.221f, 0.523f, 0.797f, 0.980f, 1.0f });
+
     @Test
     public void testSimpleStrategyMappingAtControlPoints() {
         Resources res = createResources(LUX_LEVELS, DISPLAY_LEVELS_BACKLIGHT);
@@ -325,7 +350,7 @@
         }
 
         // Now set the middle of the lux range to something just above the minimum.
-        final float minBrightness = strategy.getBrightness(LUX_LEVELS[0]);
+        float minBrightness = strategy.getBrightness(LUX_LEVELS[0]);
         strategy.addUserDataPoint(LUX_LEVELS[idx], minBrightness + 0.01f);
 
         // Then make sure the curve is still monotonic.
@@ -340,7 +365,8 @@
         // And that the lowest lux level still gives the absolute minimum brightness. This should
         // be true assuming that there are more than two lux levels in the curve since we picked a
         // brightness just barely above the minimum for the middle of the curve.
-        assertEquals(minBrightness, strategy.getBrightness(LUX_LEVELS[0]), 0.001 /*tolerance*/);
+        minBrightness = (float) MathUtils.pow(minBrightness, MAXIMUM_GAMMA); // Gamma correction.
+        assertEquals(minBrightness, strategy.getBrightness(LUX_LEVELS[0]), 0.01 /*tolerance*/);
     }
 
     private static float[] toFloatArray(int[] vals) {
@@ -396,6 +422,9 @@
         when(mockResources.getInteger(
                 com.android.internal.R.integer.config_screenBrightnessSettingMaximum))
                 .thenReturn(255);
+        when(mockResources.getFraction(
+                com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, 1, 1))
+                .thenReturn(MAXIMUM_GAMMA);
         return mockResources;
     }
 
@@ -419,4 +448,121 @@
         return mockArray;
     }
 
+    // Gamma correction tests.
+    // x0 = 100   y0 = ~0.01
+    // x1 = 1000  y1 = ~0.20
+    // x2 = 2500  y2 = ~0.50
+    // x3 = 4000  y3 = ~0.80
+    // x4 = 4900  y4 = ~0.99
+
+    @Test
+    public void testGammaCorrectionLowChangeAtCenter() {
+        // If we set a user data point at (x2, y2^0.5), i.e. gamma = 0.5, it should bump the rest
+        // of the spline accordingly.
+        final int x1 = 1000;
+        final int x2 = 2500;
+        final int x3 = 4000;
+        final float y1 = GAMMA_CORRECTION_SPLINE.interpolate(x1);
+        final float y2 = GAMMA_CORRECTION_SPLINE.interpolate(x2);
+        final float y3 = GAMMA_CORRECTION_SPLINE.interpolate(x3);
+        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
+                DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
+        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
+        // Let's start with a sanity check:
+        assertEquals(y1, strategy.getBrightness(x1), 0.01f /* tolerance */);
+        assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(y3, strategy.getBrightness(x3), 0.01f /* tolerance */);
+        // OK, let's roll:
+        float gamma = 0.5f;
+        strategy.addUserDataPoint(x2, (float) MathUtils.pow(y2, gamma));
+        assertEquals(MathUtils.pow(y1, gamma), strategy.getBrightness(x1), 0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y2, gamma), strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y3, gamma), strategy.getBrightness(x3), 0.01f /* tolerance */);
+        // The adjustment should be +0.63 (manual calculation).
+        assertEquals(+0.63f, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+    }
+
+    @Test
+    public void testGammaCorrectionHighChangeAtCenter() {
+        // This time we set a user data point at (x2, y2^0.25), i.e. gamma = 0.3 (the minimum),
+        // which should bump the rest of the spline accordingly, and further correct x2 to hit
+        // y2^0.25 (not y2^0.3).
+        final int x1 = 1000;
+        final int x2 = 2500;
+        final int x3 = 4000;
+        final float y1 = GAMMA_CORRECTION_SPLINE.interpolate(x1);
+        final float y2 = GAMMA_CORRECTION_SPLINE.interpolate(x2);
+        final float y3 = GAMMA_CORRECTION_SPLINE.interpolate(x3);
+        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
+                DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
+        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
+        // Sanity check:
+        assertEquals(y1, strategy.getBrightness(x1), 0.01f /* tolerance */);
+        assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(y3, strategy.getBrightness(x3), 0.01f /* tolerance */);
+        // Let's roll:
+        float gamma = 0.25f;
+        final float minGamma = 1.0f / MAXIMUM_GAMMA;
+        strategy.addUserDataPoint(x2, (float) MathUtils.pow(y2, gamma));
+        assertEquals(MathUtils.pow(y1, minGamma), strategy.getBrightness(x1),
+                0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y2, gamma),    strategy.getBrightness(x2),
+                0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y3, minGamma), strategy.getBrightness(x3),
+                0.01f /* tolerance */);
+        // The adjustment should be +1.0 (maximum adjustment).
+        assertEquals(+1.0f, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+    }
+
+    @Test
+    public void testGammaCorrectionExtremeChangeAtCenter() {
+        // Extreme changes (e.g. setting brightness to 0.0 or 1.0) can't be gamma corrected, so we
+        // just make sure the adjustment reflects the change.
+        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
+                DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
+        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
+        assertEquals(0.0f, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+        strategy.addUserDataPoint(2500, 1.0f);
+        assertEquals(+1.0f, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+        strategy.addUserDataPoint(2500, 0.0f);
+        assertEquals(-1.0f, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+    }
+
+    @Test
+    public void testGammaCorrectionChangeAtEdges() {
+        // The algorithm behaves differently at the edges, because gamma correction there tends to
+        // be extreme. If we add a user data point at (x0, y0+0.3), the adjustment should be
+        // 0.3*2 = 0.6, resulting in a gamma of 3**-0.6 = ~0.52.
+        final int x0 = 100;
+        final int x2 = 2500;
+        final int x4 = 4900;
+        final float y0 = GAMMA_CORRECTION_SPLINE.interpolate(x0);
+        final float y2 = GAMMA_CORRECTION_SPLINE.interpolate(x2);
+        final float y4 = GAMMA_CORRECTION_SPLINE.interpolate(x4);
+        Resources resources = createResources(GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS,
+                DISPLAY_LEVELS_NITS, DISPLAY_LEVELS_BACKLIGHT);
+        BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources);
+        // Sanity, as per tradition:
+        assertEquals(y0, strategy.getBrightness(x0), 0.01f /* tolerance */);
+        assertEquals(y2, strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(y4, strategy.getBrightness(x4), 0.01f /* tolerance */);
+        // Rollin':
+        float increase = 0.3f;
+        float adjustment = increase * 2;
+        float gamma = (float) MathUtils.pow(MAXIMUM_GAMMA, -adjustment);
+        strategy.addUserDataPoint(x0, y0 + increase);
+        assertEquals(y0 + increase, strategy.getBrightness(x0), 0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y2, gamma), strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y4, gamma), strategy.getBrightness(x4), 0.01f /* tolerance */);
+        assertEquals(adjustment, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+        // Similarly, if we set a user data point at (x4, 1.0), the adjustment should be (1-y4)*2.
+        increase = 1.0f - y4;
+        adjustment = increase * 2;
+        gamma = (float) MathUtils.pow(MAXIMUM_GAMMA, -adjustment);
+        strategy.addUserDataPoint(x4, 1.0f);
+        assertEquals(MathUtils.pow(y0, gamma), strategy.getBrightness(x0), 0.01f /* tolerance */);
+        assertEquals(MathUtils.pow(y2, gamma), strategy.getBrightness(x2), 0.01f /* tolerance */);
+        assertEquals(1.0f, strategy.getBrightness(x4), 0.01f /* tolerance */);
+        assertEquals(adjustment, strategy.getAutoBrightnessAdjustment(), 0.01f /* tolerance */);
+    }
 }
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 ee83b62..998ffa0 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -58,11 +58,13 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
 import android.content.pm.ShortcutServiceInternal;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
@@ -102,6 +104,8 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -1039,8 +1043,13 @@
         pi.versionCode = version;
         pi.applicationInfo.setVersionCode(version);
         pi.signatures = null;
-        pi.signingCertificateHistory = new Signature[][] {genSignatures(signatures)};
-
+        pi.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        genSignatures(signatures),
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         return pi;
     }
 
@@ -1128,7 +1137,7 @@
 
         if (getSignatures) {
             ret.signatures = null;
-            ret.signingCertificateHistory = pi.signingCertificateHistory;
+            ret.signingInfo = pi.signingInfo;
         }
 
         return ret;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
index cd7feea..203b2ca 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest5.java
@@ -76,13 +76,13 @@
                 mMyPackage, mMyUserId, /*signature*/ false);
         assertEquals(mMyPackage, pi.packageName);
         assertNull(pi.signatures);
-        assertNull(pi.signingCertificateHistory);
+        assertNull(pi.signingInfo);
 
         pi = mShortcutService.getPackageInfo(
                 mMyPackage, mMyUserId, /*signature*/ true);
         assertEquals(mMyPackage, pi.packageName);
         assertNull(pi.signatures);
-        assertNotNull(pi.signingCertificateHistory);
+        assertNotNull(pi.signingInfo);
 
         pi = mShortcutService.getPackageInfo(
                 "no.such.package", mMyUserId, /*signature*/ 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 c5cd0a3..b8922eb 100644
--- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java
@@ -32,6 +32,7 @@
 import android.content.pm.IPackageManager;
 import android.content.pm.LauncherApps;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.os.BaseBundle;
 import android.os.Bundle;
 import android.os.Handler;
@@ -68,6 +69,7 @@
 @LargeTest
 public class SuspendPackagesTest {
     private static final String TAG = SuspendPackagesTest.class.getSimpleName();
+    private static final String TEST_APP_LABEL = "Suspend Test App";
     private static final String TEST_APP_PACKAGE_NAME = SuspendTestReceiver.PACKAGE_NAME;
     private static final String[] PACKAGES_TO_SUSPEND = new String[]{TEST_APP_PACKAGE_NAME};
 
@@ -446,23 +448,24 @@
         turnScreenOn();
         mAppCommsReceiver.register(mReceiverHandler, ACTION_REPORT_MORE_DETAILS_ACTIVITY_STARTED,
                 ACTION_REPORT_TEST_ACTIVITY_STARTED);
-        final String testMessage = "This is a test message";
+        final String testMessage = "This is a test message to report suspension of %1$s";
         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";
+        assertNotNull("Given dialog message not shown", mUiDevice.wait(
+                Until.findObject(By.text(String.format(testMessage, TEST_APP_LABEL))), 5000));
+        final String buttonText = mContext.getResources().getString(Resources.getSystem()
+                .getIdentifier("app_suspended_more_details", "string", "android"));
         final UiObject2 moreDetailsButton = mUiDevice.findObject(
                 By.clickable(true).text(buttonText));
-        assertNotNull("\"More Details\" button not shown", moreDetailsButton);
+        assertNotNull(buttonText + " button not shown", moreDetailsButton);
         moreDetailsButton.click();
         final Intent intentFromApp = mAppCommsReceiver.receiveIntentFromApp();
-        assertEquals("\"More Details\" activity start not reported",
+        assertEquals(buttonText + " 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",
+        assertEquals("Wrong package name received by " + buttonText + " activity",
                 TEST_APP_PACKAGE_NAME, receivedPackageName);
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
index 1ac7cb8..caa1d02 100644
--- a/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/backup/BackupUtilsTest.java
@@ -27,8 +27,10 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageParser;
 import android.content.pm.PackageParser.Package;
 import android.content.pm.Signature;
+import android.content.pm.SigningInfo;
 import android.test.MoreAsserts;
 import android.platform.test.annotations.Presubmit;
 import android.support.test.filters.SmallTest;
@@ -94,7 +96,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = BackupUtils.signaturesMatch(null, packageInfo,
@@ -108,7 +116,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -125,7 +139,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[0][0];
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -142,7 +156,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = null;
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -158,7 +172,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = null;
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         boolean result = BackupUtils.signaturesMatch(null, packageInfo,
@@ -172,7 +186,7 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[0][0];
+        packageInfo.signingInfo = null;
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -186,9 +200,13 @@
     public void signaturesMatch_equalSignatures_returnsTrue() throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -205,9 +223,13 @@
     public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -223,7 +245,13 @@
     public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1, SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -240,9 +268,13 @@
     public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {
-                {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}
-        };
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2, SIGNATURE_3},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         ArrayList<byte[]> storedSigHashes = new ArrayList<>();
@@ -260,7 +292,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(SIGNATURE_HASH_1,
@@ -279,7 +317,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         // we know SIGNATURE_1 is in history, and we want to assume it has
@@ -301,7 +345,13 @@
             throws Exception {
         PackageInfo packageInfo = new PackageInfo();
         packageInfo.packageName = "test";
-        packageInfo.signingCertificateHistory = new Signature[][] {{SIGNATURE_1}, {SIGNATURE_2}};
+        packageInfo.signingInfo = new SigningInfo(
+                new PackageParser.SigningDetails(
+                        new Signature[] {SIGNATURE_1, SIGNATURE_2},
+                        PackageParser.SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
+                        null,
+                        null,
+                        null));
         packageInfo.applicationInfo = new ApplicationInfo();
 
         // we know SIGNATURE_1 is in history, but we want to assume it does not have
diff --git a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
index ce6a27a..61058e6 100644
--- a/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
+++ b/services/tests/servicestests/test-apps/SuspendTestApp/AndroidManifest.xml
@@ -17,7 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.servicestests.apps.suspendtestapp">
 
-    <application>
+    <application android:label="Suspend Test App">
         <activity android:name=".SuspendTestActivity"
                   android:exported="true" />
         <receiver android:name=".SuspendTestReceiver"
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
index a566327..6303184 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java
@@ -554,6 +554,34 @@
     }
 
     @Test
+    public void testUserSentiment_appImportanceUpdatesSentiment() throws Exception {
+        StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+                true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+                false /* lights */, false /* defaultLights */, groupId /* group */);
+        NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+        assertEquals(USER_SENTIMENT_NEUTRAL, record.getUserSentiment());
+
+        record.setIsAppImportanceLocked(true);
+        assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
+    }
+
+    @Test
+    public void testUserSentiment_appImportanceBlocksNegativeSentimentUpdate() throws Exception {
+        StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+                true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+                false /* lights */, false /* defaultLights */, groupId /* group */);
+        NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+        record.setIsAppImportanceLocked(true);
+
+        Bundle signals = new Bundle();
+        signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE);
+        record.addAdjustment(new Adjustment(pkg, record.getKey(), signals, null, sbn.getUserId()));
+        record.applyAdjustments();
+
+        assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
+    }
+
+    @Test
     public void testUserSentiment_userLocked() throws Exception {
         channel.lockFields(USER_LOCKED_IMPORTANCE);
         StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
@@ -571,4 +599,18 @@
 
         assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment());
     }
+
+    @Test
+    public void testAppImportance_returnsCorrectly() throws Exception {
+        StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
+                true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */,
+                false /* lights */, false /* defaultLights */, groupId /* group */);
+        NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
+
+        record.setIsAppImportanceLocked(true);
+        assertEquals(true, record.getIsAppImportanceLocked());
+
+        record.setIsAppImportanceLocked(false);
+        assertEquals(false, record.getIsAppImportanceLocked());
+    }
 }
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 54ed1e6..78aa965 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -371,6 +371,7 @@
         mHelper.createNotificationChannel(PKG, UID, channel2, false, false);
 
         mHelper.setShowBadge(PKG, UID, true);
+        mHelper.setAppImportanceLocked(PKG, UID);
 
         ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false, channel1.getId(),
                 channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
@@ -379,6 +380,7 @@
         loadStreamXml(baos, false);
 
         assertTrue(mHelper.canShowBadge(PKG, UID));
+        assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
         assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
         compareChannels(channel2,
                 mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
@@ -805,6 +807,7 @@
         assertEquals(Notification.PRIORITY_DEFAULT, mHelper.getPackagePriority(PKG, UID));
         assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,
                 mHelper.getPackageVisibility(PKG, UID));
+        assertFalse(mHelper.getIsAppImportanceLocked(PKG, UID));
 
         NotificationChannel defaultChannel = mHelper.getNotificationChannel(
                 PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -814,6 +817,7 @@
         defaultChannel.setBypassDnd(true);
         defaultChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
 
+        mHelper.setAppImportanceLocked(PKG, UID);
         mHelper.updateNotificationChannel(PKG, UID, defaultChannel, true);
 
         // ensure app level fields are changed
@@ -821,6 +825,7 @@
         assertEquals(Notification.PRIORITY_MAX, mHelper.getPackagePriority(PKG, UID));
         assertEquals(Notification.VISIBILITY_SECRET, mHelper.getPackageVisibility(PKG, UID));
         assertEquals(IMPORTANCE_NONE, mHelper.getImportance(PKG, UID));
+        assertTrue(mHelper.getIsAppImportanceLocked(PKG, UID));
     }
 
     @Test
diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
index 74d8e12..3b08505 100644
--- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java
@@ -461,7 +461,7 @@
         long token = dump.start(idName, id);
 
         dump.write("connected_to_adb", UsbDebuggingManagerProto.CONNECTED_TO_ADB, mThread != null);
-        writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEVIED,
+        writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEIVED,
                 mFingerprints);
 
         try {
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
index 1160943..cd524a5 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java
@@ -926,25 +926,24 @@
                             Slog.w(TAG, mPuuid + ": Dropped operation as too many operations were "
                                     + "run in last 24 hours");
                         }
-                        return;
-                    }
+                    } else {
+                        mNumOps.addOp(currentTime);
 
-                    mNumOps.addOp(currentTime);
+                        // Find a free opID
+                        int opId = mNumTotalOpsPerformed;
+                        do {
+                            mNumTotalOpsPerformed++;
+                        } while (mRunningOpIds.contains(opId));
 
-                    // Find a free opID
-                    int opId = mNumTotalOpsPerformed;
-                    do {
-                        mNumTotalOpsPerformed++;
-                    } while (mRunningOpIds.contains(opId));
+                        // Run OP
+                        try {
+                            if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId);
 
-                    // Run OP
-                    try {
-                        if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId);
-
-                        op.run(opId, mService);
-                        mRunningOpIds.add(opId);
-                    } catch (Exception e) {
-                        Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e);
+                            op.run(opId, mService);
+                            mRunningOpIds.add(opId);
+                        } catch (Exception e) {
+                            Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e);
+                        }
                     }
 
                     // Unbind from service if no operations are left (i.e. if the operation failed)
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index cac9f2b..3b773b3 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -16,8 +16,6 @@
 
 package android.telephony;
 
-import android.annotation.SystemApi;
-
 /**
  * Contains access network related constants.
  */
@@ -39,7 +37,6 @@
      * Wireless transportation type
      * @hide
      */
-    @SystemApi
     public static final class TransportType {
         /** Wireless Wide Area Networks (i.e. Cellular) */
         public static final int WWAN = 1;
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index aa76eab..e244131 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1684,6 +1684,14 @@
             "data_warning_threshold_bytes_long";
 
     /**
+     * Controls if the device should automatically notify the user as they reach
+     * their cellular data warning. When set to {@code false} the carrier is
+     * expected to have implemented their own notification mechanism.
+     */
+    public static final String KEY_DATA_WARNING_NOTIFICATION_BOOL =
+            "data_warning_notification_bool";
+
+    /**
      * Controls the cellular data limit.
      * <p>
      * If the user uses more than this amount of data in their billing cycle, as defined by
@@ -1698,6 +1706,22 @@
             "data_limit_threshold_bytes_long";
 
     /**
+     * Controls if the device should automatically notify the user as they reach
+     * their cellular data limit. When set to {@code false} the carrier is
+     * expected to have implemented their own notification mechanism.
+     */
+    public static final String KEY_DATA_LIMIT_NOTIFICATION_BOOL =
+            "data_limit_notification_bool";
+
+    /**
+     * Controls if the device should automatically notify the user when rapid
+     * cellular data usage is observed. When set to {@code false} the carrier is
+     * expected to have implemented their own notification mechanism.
+     */
+    public static final String KEY_DATA_RAPID_NOTIFICATION_BOOL =
+            "data_rapid_notification_bool";
+
+    /**
      * Offset to be reduced from rsrp threshold while calculating signal strength level.
      * @hide
      */
@@ -2165,7 +2189,10 @@
 
         sDefaults.putInt(KEY_MONTHLY_DATA_CYCLE_DAY_INT, DATA_CYCLE_USE_PLATFORM_DEFAULT);
         sDefaults.putLong(KEY_DATA_WARNING_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT);
+        sDefaults.putBoolean(KEY_DATA_WARNING_NOTIFICATION_BOOL, true);
         sDefaults.putLong(KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT);
+        sDefaults.putBoolean(KEY_DATA_LIMIT_NOTIFICATION_BOOL, true);
+        sDefaults.putBoolean(KEY_DATA_RAPID_NOTIFICATION_BOOL, true);
 
         // Rat families: {GPRS, EDGE}, {EVDO, EVDO_A, EVDO_B}, {UMTS, HSPA, HSDPA, HSUPA, HSPAP},
         // {LTE, LTE_CA}
diff --git a/telephony/java/android/telephony/NetworkRegistrationState.java b/telephony/java/android/telephony/NetworkRegistrationState.java
index bba779d..0e2e0ce 100644
--- a/telephony/java/android/telephony/NetworkRegistrationState.java
+++ b/telephony/java/android/telephony/NetworkRegistrationState.java
@@ -18,7 +18,6 @@
 
 import android.annotation.IntDef;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -31,7 +30,6 @@
  * Description of a mobile network registration state
  * @hide
  */
-@SystemApi
 public class NetworkRegistrationState implements Parcelable {
     /**
      * Network domain
diff --git a/telephony/java/android/telephony/NetworkScan.java b/telephony/java/android/telephony/NetworkScan.java
index 073c313..7c7d7a0 100644
--- a/telephony/java/android/telephony/NetworkScan.java
+++ b/telephony/java/android/telephony/NetworkScan.java
@@ -120,7 +120,10 @@
         }
     }
 
-    /** @deprecated Use {@link #stopScan()} */
+    /**
+     * @deprecated Use {@link #stopScan()}
+     * @removed
+     */
     @Deprecated
     public void stop() throws RemoteException {
         try {
diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java
index f7e6840..b431590 100644
--- a/telephony/java/android/telephony/NetworkService.java
+++ b/telephony/java/android/telephony/NetworkService.java
@@ -17,7 +17,6 @@
 package android.telephony;
 
 import android.annotation.CallSuper;
-import android.annotation.SystemApi;
 import android.app.Service;
 import android.content.Intent;
 import android.os.Handler;
@@ -47,7 +46,6 @@
  * </service>
  * @hide
  */
-@SystemApi
 public abstract class NetworkService extends Service {
 
     private final String TAG = NetworkService.class.getSimpleName();
diff --git a/telephony/java/android/telephony/NetworkServiceCallback.java b/telephony/java/android/telephony/NetworkServiceCallback.java
index dbad02f..ad3b00f 100644
--- a/telephony/java/android/telephony/NetworkServiceCallback.java
+++ b/telephony/java/android/telephony/NetworkServiceCallback.java
@@ -17,7 +17,6 @@
 package android.telephony;
 
 import android.annotation.IntDef;
-import android.annotation.SystemApi;
 import android.os.RemoteException;
 import android.telephony.NetworkService.NetworkServiceProvider;
 
@@ -33,7 +32,6 @@
  *
  * @hide
  */
-@SystemApi
 public class NetworkServiceCallback {
 
     private static final String mTag = NetworkServiceCallback.class.getSimpleName();
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index fa7988d..8ffdb21 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -17,7 +17,6 @@
 package android.telephony;
 
 import android.annotation.IntDef;
-import android.annotation.SystemApi;
 import android.annotation.TestApi;
 import android.os.Bundle;
 import android.os.Parcel;
@@ -1534,7 +1533,6 @@
      * @return List of registration states
      * @hide
      */
-    @SystemApi
     public List<NetworkRegistrationState> getNetworkRegistrationStates() {
         synchronized (mNetworkRegistrationStates) {
             return new ArrayList<>(mNetworkRegistrationStates);
@@ -1548,7 +1546,6 @@
      * @return List of registration states.
      * @hide
      */
-    @SystemApi
     public List<NetworkRegistrationState> getNetworkRegistrationStates(int transportType) {
         List<NetworkRegistrationState> list = new ArrayList<>();
 
@@ -1571,7 +1568,6 @@
      * @return The matching NetworkRegistrationState.
      * @hide
      */
-    @SystemApi
     public NetworkRegistrationState getNetworkRegistrationStates(int transportType, int domain) {
         synchronized (mNetworkRegistrationStates) {
             for (NetworkRegistrationState networkRegistrationState : mNetworkRegistrationStates) {
diff --git a/telephony/java/android/telephony/SubscriptionPlan.java b/telephony/java/android/telephony/SubscriptionPlan.java
index ef2a364..e8bbe42 100644
--- a/telephony/java/android/telephony/SubscriptionPlan.java
+++ b/telephony/java/android/telephony/SubscriptionPlan.java
@@ -254,6 +254,9 @@
          * @param period The period after which the plan automatically recurs.
          */
         public static Builder createRecurring(ZonedDateTime start, Period period) {
+            if (period.isZero() || period.isNegative()) {
+                throw new IllegalArgumentException("Period " + period + " must be positive");
+            }
             return new Builder(start, null, period);
         }
 
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a37c023..e098de9 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -2968,7 +2968,7 @@
             IPhoneSubInfo info = getSubscriberInfo();
             if (info == null)
                 return null;
-            return info.getGroupIdLevel1(mContext.getOpPackageName());
+            return info.getGroupIdLevel1ForSubscriber(getSubId(), mContext.getOpPackageName());
         } catch (RemoteException ex) {
             return null;
         } catch (NullPointerException ex) {
@@ -5523,6 +5523,7 @@
      * @deprecated
      * Use {@link
      * #requestNetworkScan(NetworkScanRequest, Executor, TelephonyScanManager.NetworkScanCallback)}
+     * @removed
      */
     @Deprecated
     @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
diff --git a/telephony/java/android/telephony/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java
index 25f5133..acc2470 100644
--- a/telephony/java/android/telephony/data/DataCallResponse.java
+++ b/telephony/java/android/telephony/data/DataCallResponse.java
@@ -19,7 +19,6 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.net.LinkAddress;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -34,7 +33,6 @@
  *
  * @hide
  */
-@SystemApi
 public final class DataCallResponse implements Parcelable {
     private final int mStatus;
     private final int mSuggestedRetryTime;
diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java
index e8597b2..dd274c5 100644
--- a/telephony/java/android/telephony/data/DataProfile.java
+++ b/telephony/java/android/telephony/data/DataProfile.java
@@ -16,7 +16,6 @@
 
 package android.telephony.data;
 
-import android.annotation.SystemApi;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -30,7 +29,6 @@
  *
  * @hide
  */
-@SystemApi
 public final class DataProfile implements Parcelable {
 
     // The types indicating the data profile is used on GSM (3GPP) or CDMA (3GPP2) network.
diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java
index 4ca5ce3..0835f7d 100644
--- a/telephony/java/android/telephony/data/DataService.java
+++ b/telephony/java/android/telephony/data/DataService.java
@@ -20,7 +20,6 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.annotation.SystemApi;
 import android.app.Service;
 import android.content.Intent;
 import android.net.LinkProperties;
@@ -55,7 +54,6 @@
  * </service>
  * @hide
  */
-@SystemApi
 public abstract class DataService extends Service {
     private static final String TAG = DataService.class.getSimpleName();
 
diff --git a/telephony/java/android/telephony/data/DataServiceCallback.java b/telephony/java/android/telephony/data/DataServiceCallback.java
index 4af31b5..bff8260 100644
--- a/telephony/java/android/telephony/data/DataServiceCallback.java
+++ b/telephony/java/android/telephony/data/DataServiceCallback.java
@@ -17,7 +17,6 @@
 package android.telephony.data;
 
 import android.annotation.IntDef;
-import android.annotation.SystemApi;
 import android.net.LinkProperties;
 import android.os.RemoteException;
 import android.telephony.Rlog;
@@ -35,7 +34,6 @@
  *
  * @hide
  */
-@SystemApi
 public class DataServiceCallback {
 
     private static final String TAG = DataServiceCallback.class.getSimpleName();
@@ -125,7 +123,6 @@
      *
      * @param result The result code. Must be one of the {@link ResultCode}.
      */
-    @SystemApi
     public void onSetDataProfileComplete(@ResultCode int result) {
         IDataServiceCallback callback = mCallback.get();
         if (callback != null) {
diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java
index 602c796..9e3302b 100644
--- a/telephony/java/android/telephony/mbms/DownloadRequest.java
+++ b/telephony/java/android/telephony/mbms/DownloadRequest.java
@@ -18,6 +18,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.annotation.TestApi;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Parcel;
@@ -184,6 +185,7 @@
          * @hide
          */
         @SystemApi
+        @TestApi
         public Builder setServiceId(String serviceId) {
             fileServiceId = serviceId;
             return this;
diff --git a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
index 0ed0820..93964f3 100644
--- a/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
+++ b/telephony/java/com/android/internal/telephony/IPhoneSubInfo.aidl
@@ -68,11 +68,6 @@
     String getSubscriberIdForSubscriber(int subId, String callingPackage);
 
     /**
-     * Retrieves the Group Identifier Level1 for GSM phones.
-     */
-    String getGroupIdLevel1(String callingPackage);
-
-    /**
      * Retrieves the Group Identifier Level1 for GSM phones of a subId.
      */
     String getGroupIdLevel1ForSubscriber(int subId, String callingPackage);
diff --git a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
index 9174014..ae3914e 100644
--- a/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
+++ b/tests/WindowManagerStressTest/src/test/windowmanagerstresstest/MainActivity.java
@@ -102,7 +102,7 @@
                 Thread t = new Thread(() -> {
                     try {
                         WindowManagerGlobal.getWindowSession().relayout(window,
-                                window.mSeq, mLayoutParams, -1, -1, View.VISIBLE, 0, mTmpRect,
+                                window.mSeq, mLayoutParams, -1, -1, View.VISIBLE, 0, -1, mTmpRect,
                                 mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect, mTmpRect,
                                 new DisplayCutout.ParcelableWrapper(), new MergedConfiguration(),
                                 new Surface());
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 26248e5..70a47cf 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -50,6 +50,18 @@
     return "\033[%sm" % (";".join(codes))
 
 
+def ident(raw):
+    """Strips superficial signature changes, giving us a strong key that
+    can be used to identify members across API levels."""
+    raw = raw.replace(" deprecated ", " ")
+    raw = raw.replace(" synchronized ", " ")
+    raw = raw.replace(" final ", " ")
+    raw = re.sub("<.+?>", "", raw)
+    if " throws " in raw:
+        raw = raw[:raw.index(" throws ")]
+    return raw
+
+
 class Field():
     def __init__(self, clazz, line, raw, blame):
         self.clazz = clazz
@@ -69,8 +81,7 @@
             self.value = raw[3].strip(';"')
         else:
             self.value = None
-
-        self.ident = self.raw.replace(" deprecated ", " ")
+        self.ident = ident(self.raw)
 
     def __hash__(self):
         return hash(self.raw)
@@ -105,15 +116,7 @@
         for r in raw[2:]:
             if r == "throws": target = self.throws
             else: target.append(r)
-
-        # identity for compat purposes
-        ident = self.raw
-        ident = ident.replace(" deprecated ", " ")
-        ident = ident.replace(" synchronized ", " ")
-        ident = re.sub("<.+?>", "", ident)
-        if " throws " in ident:
-            ident = ident[:ident.index(" throws ")]
-        self.ident = ident
+        self.ident = ident(self.raw)
 
     def __hash__(self):
         return hash(self.raw)
@@ -1469,6 +1472,40 @@
     return failures
 
 
+def show_deprecations_at_birth(cur, prev):
+    """Show API deprecations at birth."""
+    global failures
+
+    # Remove all existing things so we're left with new
+    for prev_clazz in prev.values():
+        cur_clazz = cur[prev_clazz.fullname]
+
+        sigs = { i.ident: i for i in prev_clazz.ctors }
+        cur_clazz.ctors = [ i for i in cur_clazz.ctors if i.ident not in sigs ]
+        sigs = { i.ident: i for i in prev_clazz.methods }
+        cur_clazz.methods = [ i for i in cur_clazz.methods if i.ident not in sigs ]
+        sigs = { i.ident: i for i in prev_clazz.fields }
+        cur_clazz.fields = [ i for i in cur_clazz.fields if i.ident not in sigs ]
+
+        # Forget about class entirely when nothing new
+        if len(cur_clazz.ctors) == 0 and len(cur_clazz.methods) == 0 and len(cur_clazz.fields) == 0:
+            del cur[prev_clazz.fullname]
+
+    for clazz in cur.values():
+        if " deprecated " in clazz.raw and not clazz.fullname in prev:
+            error(clazz, None, None, "Found API deprecation at birth")
+
+        for i in clazz.ctors + clazz.methods + clazz.fields:
+            if " deprecated " in i.raw:
+                error(clazz, i, None, "Found API deprecation at birth")
+
+    print "%s Deprecated at birth %s\n" % ((format(fg=WHITE, bg=BLUE, bold=True),
+                                            format(reset=True)))
+    for f in sorted(failures):
+        print failures[f]
+        print
+
+
 if __name__ == "__main__":
     parser = argparse.ArgumentParser(description="Enforces common Android public API design \
             patterns. It ignores lint messages from a previous API level, if provided.")
@@ -1481,6 +1518,8 @@
             help="Allow references to Google")
     parser.add_argument("--show-noticed", action='store_const', const=True,
             help="Show API changes noticed")
+    parser.add_argument("--show-deprecations-at-birth", action='store_const', const=True,
+            help="Show API deprecations at birth")
     args = vars(parser.parse_args())
 
     if args['no_color']:
@@ -1492,6 +1531,14 @@
     current_file = args['current.txt']
     previous_file = args['previous.txt']
 
+    if args['show_deprecations_at_birth']:
+        with current_file as f:
+            cur = _parse_stream(f)
+        with previous_file as f:
+            prev = _parse_stream(f)
+        show_deprecations_at_birth(cur, prev)
+        sys.exit()
+
     with current_file as f:
         cur_fail, cur_noticed = examine_stream(f)
     if not previous_file is None: