diff --git a/api/current.txt b/api/current.txt
index 8045c83..eb991ad 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -27774,9 +27774,8 @@
   }
 
   public static class AlwaysOnHotwordDetector.EventPayload {
-    field public final android.media.AudioFormat audioFormat;
-    field public final byte[] data;
-    field public final boolean triggerAvailable;
+    method public android.media.AudioFormat getCaptureAudioFormat();
+    method public byte[] getTriggerAudio();
   }
 
   public class VoiceInteractionService extends android.app.Service {
diff --git a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
index 2e96487..0dbde6b 100644
--- a/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
+++ b/core/java/android/hardware/soundtrigger/KeyphraseEnrollmentInfo.java
@@ -33,6 +33,7 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -263,4 +264,11 @@
         Slog.w(TAG, "Enrollment application doesn't support the given keyphrase/locale");
         return null;
     }
+
+    @Override
+    public String toString() {
+        return "KeyphraseEnrollmentInfo [Keyphrases=" + Arrays.toString(mKeyphrases)
+                + ", EnrollmentPackage=" + mEnrollmentPackage + ", ParseError=" + mParseError
+                + "]";
+    }
 }
diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java
index 47cfa7d..8db99a5 100644
--- a/core/java/android/provider/CallLog.java
+++ b/core/java/android/provider/CallLog.java
@@ -510,9 +510,10 @@
                 for (int i = 0; i < count; i++) {
                     final UserInfo user = users.get(i);
                     final UserHandle userHandle = user.getUserHandle();
-                    if (userManager.isUserRunning(userHandle) &&
-                            !userManager.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS,
-                                    userHandle)) {
+                    if (userManager.isUserRunning(userHandle)
+                            && !userManager.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS,
+                                    userHandle)
+                            && !user.isManagedProfile()) {
                         Uri uri = addEntryAndRemoveExpiredEntries(context,
                                 ContentProvider.maybeAddUserId(CONTENT_URI, user.id), values);
                         if (user.id == currentUserId) {
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index f1e1943..15e66a0 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -39,6 +39,8 @@
 
 import com.android.internal.app.IVoiceInteractionManagerService;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -185,48 +187,77 @@
      * Additional payload for {@link Callback#onDetected}.
      */
     public static class EventPayload {
-        /**
-         * Indicates if {@code data} is the audio that triggered the keyphrase.
-         */
-        public final boolean triggerAvailable;
-        /**
-         * Indicates if {@code captureSession} can be used to continue capturing more audio from
-         * the DSP hardware.
-         *
-         * Candidate for public API
-         * @hide
-         */
-        public final boolean captureAvailable;
-        /**
-         * The session to use when attempting to capture more audio from the DSP hardware.
-         *
-         * Candidate for public API
-         * TODO: When unhiding, change javadoc of audioFormat to -
-         * "Format of {@code data} or the audio that may be captured using {@code captureSession}.
-         * May be null if {@code triggerAvailable} and {@code captureAvailable} are false."
-         * @hide
-         */
-        public final int captureSession;
-        /**
-         * Format of {@code data}.
-         * May be null if {@code triggerAvailable} is false.
-         */
-        @Nullable
-        public final AudioFormat audioFormat;
-        /**
-         * Raw data associated with the event.
-         * This is the audio that triggered the keyphrase if {@code isTriggerAudio} is true.
-         */
-        @Nullable
-        public final byte[] data;
+        private final boolean mTriggerAvailable;
+        // Indicates if {@code captureSession} can be used to continue capturing more audio
+        // from the DSP hardware.
+        private final boolean mCaptureAvailable;
+        // The session to use when attempting to capture more audio from the DSP hardware.
+        private final int mCaptureSession;
+        private final AudioFormat mAudioFormat;
+        // Raw data associated with the event.
+        // This is the audio that triggered the keyphrase if {@code isTriggerAudio} is true.
+        private final byte[] mData;
 
-        private EventPayload(boolean _triggerAvailable, boolean _captureAvailable,
-                AudioFormat _audioFormat, int _captureSession, byte[] _data) {
-            triggerAvailable = _triggerAvailable;
-            captureAvailable = _captureAvailable;
-            captureSession = _captureSession;
-            audioFormat = _audioFormat;
-            data = _data;
+        private EventPayload(boolean triggerAvailable, boolean captureAvailable,
+                AudioFormat audioFormat, int captureSession, byte[] data) {
+            mTriggerAvailable = triggerAvailable;
+            mCaptureAvailable = captureAvailable;
+            mCaptureSession = captureSession;
+            mAudioFormat = audioFormat;
+            mData = data;
+        }
+
+        /**
+         * Gets the format of the audio obtained using {@link #getTriggerAudio()}.
+         * May be null if there's no audio present.
+         */
+        @Nullable
+        public AudioFormat getCaptureAudioFormat() {
+            return mAudioFormat;
+        }
+
+        /**
+         * Gets the raw audio that triggered the keyphrase.
+         * This may be null if the trigger audio isn't available.
+         * If non-null, the format of the audio can be obtained by calling
+         * {@link #getCaptureAudioFormat()}.
+         *
+         * @see AlwaysOnHotwordDetector#RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO
+         */
+        @Nullable
+        public byte[] getTriggerAudio() {
+            if (mTriggerAvailable) {
+                return mData;
+            } else {
+                return null;
+            }
+        }
+
+        /**
+         * Gets the session ID to start a capture from the DSP.
+         * This may be null if streaming capture isn't possible.
+         * If non-null, the format of the audio that can be captured can be
+         * obtained using {@link #getCaptureAudioFormat()}.
+         *
+         * TODO: Candidate for Public API when the API to start capture with a session ID
+         * is made public.
+         *
+         * TODO: Add this to {@link #getCaptureAudioFormat()}:
+         * "Gets the format of the audio obtained using {@link #getTriggerAudio()}
+         * or {@link #getCaptureSession()}. May be null if no audio can be obtained
+         * for either the trigger or a streaming session."
+         *
+         * TODO: Should this return a known invalid value instead?
+         *
+         * @hide
+         */
+        @Nullable
+        public Integer getCaptureSession() {
+            if (mCaptureAvailable) {
+                return mCaptureSession;
+            } else {
+                return null;
+            }
         }
     }
 
@@ -490,7 +521,7 @@
                     new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
                             recognitionExtra, null /* additional data */));
         } catch (RemoteException e) {
-            Slog.w(TAG, "RemoteException in startRecognition!");
+            Slog.w(TAG, "RemoteException in startRecognition!", e);
         }
         if (code != STATUS_OK) {
             Slog.w(TAG, "startRecognition() failed with error code " + code);
@@ -504,7 +535,7 @@
             code = mModelManagementService.stopRecognition(
                     mVoiceInteractionService, mKeyphraseMetadata.id, mInternalCallback);
         } catch (RemoteException e) {
-            Slog.w(TAG, "RemoteException in stopRecognition!");
+            Slog.w(TAG, "RemoteException in stopRecognition!", e);
         }
 
         if (code != STATUS_OK) {
@@ -636,7 +667,7 @@
                 dspModuleProperties =
                         mModelManagementService.getDspModuleProperties(mVoiceInteractionService);
             } catch (RemoteException e) {
-                Slog.w(TAG, "RemoteException in getDspProperties!");
+                Slog.w(TAG, "RemoteException in getDspProperties!", e);
             }
             // No DSP available
             if (dspModuleProperties == null) {
@@ -657,9 +688,20 @@
                 return mModelManagementService.isEnrolledForKeyphrase(
                         mVoiceInteractionService, keyphraseId);
             } catch (RemoteException e) {
-                Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!");
+                Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!", e);
             }
             return false;
         }
     }
+
+    /** @hide */
+    public void dump(String prefix, PrintWriter pw) {
+        synchronized (mLock) {
+            pw.print(prefix); pw.print("Text="); pw.println(mText);
+            pw.print(prefix); pw.print("Locale="); pw.println(mLocale);
+            pw.print(prefix); pw.print("Availability="); pw.println(mAvailability);
+            pw.print(prefix); pw.print("KeyphraseMetadata="); pw.println(mKeyphraseMetadata);
+            pw.print(prefix); pw.print("EnrollmentInfo="); pw.println(mKeyphraseEnrollmentInfo);
+        }
+    }
 }
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 5189404..770d66c 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -33,6 +33,9 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.IVoiceInteractionManagerService;
 
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
 
 /**
  * Top-level service of the current global voice interactor, which is providing
@@ -244,4 +247,17 @@
             // Ignore.
         }
     }
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("VOICE INTERACTION");
+        synchronized (mLock) {
+            pw.println("  AlwaysOnHotwordDetector");
+            if (mHotwordDetector == null) {
+                pw.println("    NULL");
+            } else {
+                mHotwordDetector.dump("    ", pw);
+            }
+        }
+    }
 }
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index c3ea8f8..cd73527 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -83,7 +83,7 @@
     <color name="notification_material_background_dimmed_color">#d4ffffff</color>
 
     <!-- The color of the material notification background when low priority -->
-    <color name="notification_material_background_low_priority_color">#ffdcdcdc</color>
+    <color name="notification_material_background_low_priority_color">#ffe0e0e0</color>
 
     <!-- The color of the ripples on the untinted notifications -->
     <color name="notification_ripple_untinted_color">#20000000</color>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 1cd18a0..6ac0bef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -660,6 +660,7 @@
     }
 
     public void reset() {
+        super.reset();
         setTintColor(0);
         setShowingLegacyBackground(false);
         setBelowSpeedBump(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 0960c00..a275572 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -59,6 +59,7 @@
     private boolean mClearable;
     private ExpansionLogger mLogger;
     private String mLoggingKey;
+    private boolean mWasReset;
 
     public interface ExpansionLogger {
         public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
@@ -88,6 +89,7 @@
         mPublicLayout.reset();
         mPrivateLayout.reset();
         mMaxExpandHeight = 0;
+        mWasReset = true;
         logExpansionEvent(false, wasExpanded);
     }
 
@@ -246,11 +248,12 @@
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
-        boolean updateExpandHeight = mMaxExpandHeight == 0;
+        boolean updateExpandHeight = mMaxExpandHeight == 0 && !mWasReset;
         mMaxExpandHeight = mPrivateLayout.getMaxHeight();
         if (updateExpandHeight) {
             applyExpansionToLayout();
         }
+        mWasReset = false;
     }
 
     public void setSensitive(boolean sensitive) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 46d4a9a..df64edf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -255,6 +255,10 @@
     public void setBelowSpeedBump(boolean below) {
     }
 
+    public void reset() {
+        mOnHeightChangedListener.onReset(this);
+    }
+
     /**
      * A listener notifying when {@link #getActualHeight} changes.
      */
@@ -265,5 +269,12 @@
          *             padding or the padding between the elements changed
          */
         void onHeightChanged(ExpandableView view);
+
+        /**
+         * Called when the view is reset and therefore the height will change abruptly
+         *
+         * @param view The view which was reset.
+         */
+        void onReset(ExpandableView view);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index a07bc5c..1d08658 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -1469,6 +1469,10 @@
     }
 
     @Override
+    public void onReset(ExpandableView view) {
+    }
+
+    @Override
     public void onScrollChanged() {
         if (mQsExpanded) {
             requestScrollerTopPaddingUpdate(false /* animate */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index fec5e74..d2b97d1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -163,6 +163,8 @@
     private int mNotificationTopPadding;
     private float mTopPaddingOverflow;
     private boolean mDontReportNextOverScroll;
+    private boolean mRequestViewResizeAnimationOnLayout;
+    private boolean mNeedViewResizeAnimation;
 
     /**
      * The maximum scrollPosition which we are allowed to reach when a notification was expanded.
@@ -319,9 +321,18 @@
         setMaxLayoutHeight(getHeight());
         updateContentHeight();
         clampScrollPosition();
+        requestAnimationOnViewResize();
         requestChildrenUpdate();
     }
 
+    private void requestAnimationOnViewResize() {
+        if (mRequestViewResizeAnimationOnLayout && mIsExpanded && mAnimationsEnabled) {
+            mNeedViewResizeAnimation = true;
+            mNeedsAnimation = true;
+        }
+        mRequestViewResizeAnimationOnLayout = false;
+    }
+
     public void updateSpeedBumpIndex(int newIndex) {
         int currentIndex = indexOfChild(mSpeedBumpView);
 
@@ -1598,9 +1609,18 @@
         generateHideSensitiveEvent();
         generateDarkEvent();
         generateGoToFullShadeEvent();
+        generateViewResizeEvent();
         mNeedsAnimation = false;
     }
 
+    private void generateViewResizeEvent() {
+        if (mNeedViewResizeAnimation) {
+            mAnimationEvents.add(
+                    new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_VIEW_RESIZE));
+        }
+        mNeedViewResizeAnimation = false;
+    }
+
     private void generateSnapBackEvents() {
         for (View child : mSnappedBackChildren) {
             mAnimationEvents.add(new AnimationEvent(child,
@@ -1892,6 +1912,11 @@
         requestChildrenUpdate();
     }
 
+    @Override
+    public void onReset(ExpandableView view) {
+        mRequestViewResizeAnimationOnLayout = true;
+    }
+
     private void updateScrollPositionOnExpandInBottom(ExpandableView view) {
         if (view instanceof ExpandableNotificationRow) {
             ExpandableNotificationRow row = (ExpandableNotificationRow) view;
@@ -2258,6 +2283,14 @@
                 // ANIMATION_TYPE_HIDE_SENSITIVE
                 new AnimationFilter()
                         .animateHideSensitive(),
+
+                // ANIMATION_TYPE_VIEW_RESIZE
+                new AnimationFilter()
+                        .animateAlpha()
+                        .animateHeight()
+                        .animateTopInset()
+                        .animateY()
+                        .animateZ(),
         };
 
         static int[] LENGTHS = new int[] {
@@ -2297,6 +2330,9 @@
 
                 // ANIMATION_TYPE_HIDE_SENSITIVE
                 StackStateAnimator.ANIMATION_DURATION_STANDARD,
+
+                // ANIMATION_TYPE_VIEW_RESIZE
+                StackStateAnimator.ANIMATION_DURATION_STANDARD,
         };
 
         static final int ANIMATION_TYPE_ADD = 0;
@@ -2311,6 +2347,7 @@
         static final int ANIMATION_TYPE_DARK = 9;
         static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 10;
         static final int ANIMATION_TYPE_HIDE_SENSITIVE = 11;
+        static final int ANIMATION_TYPE_VIEW_RESIZE = 12;
 
         final long eventStartTime;
         final View changingView;
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
index 994f758..3a64984 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
@@ -159,7 +159,7 @@
                 try {
                     mActiveListener.onError(STATUS_ERROR);
                 } catch (RemoteException e) {
-                    Slog.w(TAG, "RemoteException in onDetectionStopped");
+                    Slog.w(TAG, "RemoteException in onDetectionStopped", e);
                 }
                 mActiveListener = null;
             }
