diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index f117f99..bedd369 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1812,7 +1812,14 @@
     }
 
     private static AudioAttributes audioAttributesForNotification(Notification n) {
-        return new AudioAttributes.Builder().setLegacyStreamType(n.audioStreamType).build();
+        if (n.audioAttributes != null
+                && !Notification.AUDIO_ATTRIBUTES_DEFAULT.equals(n.audioAttributes)) {
+            return n.audioAttributes;
+        }
+        return new AudioAttributes.Builder()
+                .setLegacyStreamType(n.audioStreamType)
+                .setUsage(AudioAttributes.usageForLegacyStreamType(n.audioStreamType))
+                .build();
     }
 
     void showNextToastLocked() {
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 57f3e2d..fefa6f6 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -20,7 +20,9 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.media.AudioAttributes;
 import android.service.notification.StatusBarNotification;
+
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.PrintWriter;
@@ -105,6 +107,8 @@
         pw.println(prefix + String.format("  defaults=0x%08x flags=0x%08x",
                 notification.defaults, notification.flags));
         pw.println(prefix + "  sound=" + notification.sound);
+        pw.println(prefix + "  audioStreamType=" + notification.audioStreamType);
+        pw.println(prefix + "  audioAttributes=" + notification.audioAttributes);
         pw.println(prefix + String.format("  color=0x%08x", notification.color));
         pw.println(prefix + "  vibrate=" + Arrays.toString(notification.vibrate));
         pw.println(prefix + String.format("  led=0x%08x onMs=%d offMs=%d",
@@ -224,7 +228,16 @@
     }
 
     public boolean isCategory(String category) {
-        return Objects.equals(category, getNotification().category);
+        return Objects.equals(getNotification().category, category);
+    }
+
+    public boolean isAudioStream(int stream) {
+        return getNotification().audioStreamType == stream;
+    }
+
+    public boolean isAudioAttributesUsage(int usage) {
+        final AudioAttributes attributes = getNotification().audioAttributes;
+        return attributes != null && attributes.getUsage() == usage;
     }
 
     /**
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index c61ce03..6b55213 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -33,6 +33,7 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.database.ContentObserver;
+import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Handler;
@@ -319,7 +320,9 @@
 
     private boolean isAlarm(NotificationRecord record) {
         return record.isCategory(Notification.CATEGORY_ALARM)
-                || record.isCategory(Notification.CATEGORY_EVENT);
+                || record.isCategory(Notification.CATEGORY_EVENT)
+                || record.isAudioStream(AudioManager.STREAM_ALARM)
+                || record.isAudioAttributesUsage(AudioAttributes.USAGE_ALARM);
     }
 
     private boolean isCall(NotificationRecord record) {
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java
index 322dafe..7123e09 100644
--- a/telecomm/java/android/telecomm/Connection.java
+++ b/telecomm/java/android/telecomm/Connection.java
@@ -237,6 +237,8 @@
      */
     public static String stateToString(int state) {
         switch (state) {
+            case State.INITIALIZING:
+                return "INITIALIZING";
             case State.NEW:
                 return "NEW";
             case State.RINGING:
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 73de099..67ff868 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -168,7 +168,7 @@
      * @hide
      */
     public boolean is5GHz() {
-        return ScanResult.is24GHz(frequency);
+        return ScanResult.is5GHz(frequency);
     }
 
     /**
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index dd30ac7..8e27e2a 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -818,6 +818,17 @@
                 append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN).
                 append(" REALM: ").append(this.naiRealm).append(" PRIO: ").append(this.priority).
                 append('\n');
+        if (this.numConnectionFailures > 0) {
+            sbuf.append(" numConnectFailures ").append(this.numConnectionFailures).append("\n");
+        }
+        if (this.autoJoinStatus > 0) {
+            sbuf.append(" autoJoinStatus ").append(this.numConnectionFailures).append("\n");
+        }
+        if (this.didSelfAdd || this.selfAdded) {
+            if (this.didSelfAdd) sbuf.append(" didSelfAdd ");
+            if (this.selfAdded) sbuf.append(" selfAdded ");
+            sbuf.append("\n");
+        }
         sbuf.append(" KeyMgmt:");
         for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
             if (this.allowedKeyManagement.get(k)) {
