Merge changes I30a2fa4f,I1abd1561 into rvc-dev

* changes:
  Fix cliping when the media player is fully clipped off
  Fixed some cases where we were animating Qs even though we shouldn't
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index db45a5f..e2215d5 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -15,6 +15,7 @@
 import com.android.systemui.qs.PageIndicator
 import com.android.systemui.statusbar.notification.VisualStabilityManager
 import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.util.Utils
 import com.android.systemui.util.animation.UniqueObjectHostView
 import com.android.systemui.util.animation.requiresRemeasuring
 import com.android.systemui.util.concurrency.DelayableExecutor
@@ -150,8 +151,15 @@
         mediaManager.addListener(object : MediaDataManager.Listener {
             override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) {
                 oldKey?.let { mediaData.remove(it) }
-                mediaData.put(key, data)
-                addOrUpdatePlayer(key, oldKey, data)
+                if (!data.active && !Utils.useMediaResumption(context)) {
+                    // This view is inactive, let's remove this! This happens e.g when dismissing /
+                    // timing out a view. We still have the data around because resumption could
+                    // be on, but we should save the resources and release this.
+                    onMediaDataRemoved(key)
+                } else {
+                    mediaData.put(key, data)
+                    addOrUpdatePlayer(key, oldKey, data)
+                }
             }
 
             override fun onMediaDataRemoved(key: String) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
index 3266074..c41e610 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt
@@ -140,6 +140,18 @@
         }
 
     /**
+     * Is the shade currently collapsing from the expanded qs? If we're on the lockscreen and in qs,
+     * we wouldn't want to transition in that case.
+     */
+    var collapsingShadeFromQS: Boolean = false
+        set(value) {
+            if (field != value) {
+                field = value
+                updateDesiredLocation(forceNoAnimation = true)
+            }
+        }
+
+    /**
      * Are location changes currently blocked?
      */
     private val blockLocationChanges: Boolean
@@ -161,6 +173,19 @@
         }
 
     /**
+     * Are we currently fullyAwake
+     */
+    private var fullyAwake: Boolean = false
+        set(value) {
+            if (field != value) {
+                field = value
+                if (value) {
+                    updateDesiredLocation(forceNoAnimation = true)
+                }
+            }
+        }
+
+    /**
      * Is the doze animation currently Running
      */
     private var dozeAnimationRunning: Boolean = false
@@ -206,10 +231,12 @@
 
             override fun onStartedGoingToSleep() {
                 goingToSleep = true
+                fullyAwake = false
             }
 
             override fun onFinishedWakingUp() {
                 goingToSleep = false
+                fullyAwake = true
             }
 
             override fun onStartedWakingUp() {
@@ -531,6 +558,18 @@
                 !statusBarStateController.isDozing) {
             return LOCATION_QS
         }
+        if (location == LOCATION_LOCKSCREEN && desiredLocation == LOCATION_QS &&
+                collapsingShadeFromQS) {
+            // When collapsing on the lockscreen, we want to remain in QS
+            return LOCATION_QS
+        }
+        if (location != LOCATION_LOCKSCREEN && desiredLocation == LOCATION_LOCKSCREEN
+                && !fullyAwake) {
+            // When unlocking from dozing / while waking up, the media shouldn't be transitioning
+            // in an animated way. Let's keep it in the lockscreen until we're fully awake and
+            // reattach it without an animation
+            return LOCATION_LOCKSCREEN
+        }
         return location
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 0b664e6..f2eec39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -443,6 +443,7 @@
      */
     private boolean mDelayShowingKeyguardStatusBar;
 
+    private boolean mAnimatingQS;
     private int mOldLayoutDirection;
 
     private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() {
@@ -1860,6 +1861,7 @@
 
             @Override
             public void onAnimationEnd(Animator animation) {
+                mAnimatingQS = false;
                 notifyExpandingFinished();
                 mNotificationStackScroller.resetCheckSnoozeLeavebehind();
                 mQsExpansionAnimator = null;
@@ -1868,6 +1870,9 @@
                 }
             }
         });
+        // Let's note that we're animating QS. Moving the animator here will cancel it immediately,
+        // so we need a separate flag.
+        mAnimatingQS = true;
         animator.start();
         mQsExpansionAnimator = animator;
         mQsAnimatorExpand = expanding;
@@ -2220,6 +2225,9 @@
         mNotificationStackScroller.onExpansionStarted();
         mIsExpanding = true;
         mQsExpandedWhenExpandingStarted = mQsFullyExpanded;
+        mMediaHierarchyManager.setCollapsingShadeFromQS(mQsExpandedWhenExpandingStarted &&
+                /* We also start expanding when flinging closed Qs. Let's exclude that */
+                !mAnimatingQS);
         if (mQsExpanded) {
             onQsExpansionStarted();
         }
@@ -2236,6 +2244,7 @@
         mHeadsUpManager.onExpandingFinished();
         mConversationNotificationManager.onNotificationPanelExpandStateChanged(isFullyCollapsed());
         mIsExpanding = false;
+        mMediaHierarchyManager.setCollapsingShadeFromQS(false);
         if (isFullyCollapsed()) {
             DejankUtils.postAfterTraversal(new Runnable() {
                 @Override
diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt
index e5b126d..3c0a23a 100644
--- a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt
@@ -150,15 +150,10 @@
     }
 
     override fun dispatchDraw(canvas: Canvas?) {
-        val clip = !boundsRect.isEmpty
-        if (clip) {
-            canvas?.save()
-            canvas?.clipRect(boundsRect)
-        }
+        canvas?.save()
+        canvas?.clipRect(boundsRect)
         super.dispatchDraw(canvas)
-        if (clip) {
-            canvas?.restore()
-        }
+        canvas?.restore()
     }
 
     private fun updateBounds() {