Merge "Made sure that the media section has no background" into rvc-dev
diff --git a/packages/SystemUI/res/layout/keyguard_media_header.xml b/packages/SystemUI/res/layout/keyguard_media_header.xml
index a520719..63a878f 100644
--- a/packages/SystemUI/res/layout/keyguard_media_header.xml
+++ b/packages/SystemUI/res/layout/keyguard_media_header.xml
@@ -24,25 +24,4 @@
     android:paddingEnd="0dp"
     android:focusable="true"
     android:clickable="true"
->
-
-    <!-- Background views required by ActivatableNotificationView. -->
-    <com.android.systemui.statusbar.notification.row.NotificationBackgroundView
-        android:id="@+id/backgroundNormal"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-    />
-
-    <com.android.systemui.statusbar.notification.row.NotificationBackgroundView
-        android:id="@+id/backgroundDimmed"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-    />
-
-    <com.android.systemui.statusbar.notification.FakeShadowView
-        android:id="@+id/fake_shadow"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-    />
-
-</com.android.systemui.statusbar.notification.stack.MediaHeaderView>
+/>
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 92b597b..f1727ec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -123,8 +123,6 @@
     private float mAppearAnimationFraction = -1.0f;
     private float mAppearAnimationTranslation;
     private int mNormalColor;
-    private boolean mLastInSection;
-    private boolean mFirstInSection;
     private boolean mIsBelowSpeedBump;
 
     private float mNormalBackgroundVisibilityAmount;
@@ -430,27 +428,21 @@
         mBackgroundDimmed.setDistanceToTopRoundness(distanceToTopRoundness);
     }
 
-    public boolean isLastInSection() {
-        return mLastInSection;
-    }
-
-    public boolean isFirstInSection() {
-        return mFirstInSection;
-    }
-
     /** Sets whether this view is the last notification in a section. */
+    @Override
     public void setLastInSection(boolean lastInSection) {
         if (lastInSection != mLastInSection) {
-            mLastInSection = lastInSection;
+            super.setLastInSection(lastInSection);
             mBackgroundNormal.setLastInSection(lastInSection);
             mBackgroundDimmed.setLastInSection(lastInSection);
         }
     }
 
     /** Sets whether this view is the first notification in a section. */
+    @Override
     public void setFirstInSection(boolean firstInSection) {
         if (firstInSection != mFirstInSection) {
-            mFirstInSection = firstInSection;
+            super.setFirstInSection(firstInSection);
             mBackgroundNormal.setFirstInSection(firstInSection);
             mBackgroundDimmed.setFirstInSection(firstInSection);
         }
@@ -963,6 +955,7 @@
         return false;
     }
 
+    @Override
     public int getHeadsUpHeightWithoutHeader() {
         return getHeight();
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableOutlineView.java
index 049cafa..26ccd72 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableOutlineView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableOutlineView.java
@@ -262,10 +262,7 @@
         setClipToOutline(mAlwaysRoundBothCorners);
     }
 
-    /**
-     * Set the topRoundness of this view.
-     * @return Whether the roundness was changed.
-     */
+    @Override
     public boolean setTopRoundness(float topRoundness, boolean animate) {
         if (mTopRoundness != topRoundness) {
             mTopRoundness = topRoundness;
@@ -302,10 +299,7 @@
         return mCurrentBottomRoundness * mOutlineRadius;
     }
 
-    /**
-     * Set the bottom roundness of this view.
-     * @return Whether the roundness was changed.
-     */
+    @Override
     public boolean setBottomRoundness(float bottomRoundness, boolean animate) {
         if (mBottomRoundness != bottomRoundness) {
             mBottomRoundness = bottomRoundness;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index 0831c0b..7ed8350 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -67,6 +67,8 @@
     protected int mContentShift;
     private final ExpandableViewState mViewState;
     private float mContentTranslation;
+    protected boolean mLastInSection;
+    protected boolean mFirstInSection;
 
     public ExpandableView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -771,6 +773,44 @@
         return true;
     }
 
+    /** Sets whether this view is the first notification in a section. */
+    public void setFirstInSection(boolean firstInSection) {
+        mFirstInSection = firstInSection;
+    }
+
+    /** Sets whether this view is the last notification in a section. */
+    public void setLastInSection(boolean lastInSection) {
+        mLastInSection = lastInSection;
+    }
+
+    public boolean isLastInSection() {
+        return mLastInSection;
+    }
+
+    public boolean isFirstInSection() {
+        return mFirstInSection;
+    }
+
+    /**
+     * Set the topRoundness of this view.
+     * @return Whether the roundness was changed.
+     */
+    public boolean setTopRoundness(float topRoundness, boolean animate) {
+        return false;
+    }
+
+    /**
+     * Set the bottom roundness of this view.
+     * @return Whether the roundness was changed.
+     */
+    public boolean setBottomRoundness(float bottomRoundness, boolean animate) {
+        return false;
+    }
+
+    public int getHeadsUpHeightWithoutHeader() {
+        return getHeight();
+    }
+
     /**
      * A listener notifying when {@link #getActualHeight} changes.
      */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index ecab188..b4220f1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -64,7 +64,7 @@
     private int mZDistanceBetweenElements;
     private int mBaseZHeight;
     private int mMaxLayoutHeight;
-    private ActivatableNotificationView mLastVisibleBackgroundChild;
+    private ExpandableView mLastVisibleBackgroundChild;
     private float mCurrentScrollVelocity;
     private int mStatusBarState;
     private float mExpandingVelocity;
@@ -346,11 +346,11 @@
      * view in the shade, without the clear all button.
      */
     public void setLastVisibleBackgroundChild(
-            ActivatableNotificationView lastVisibleBackgroundChild) {
+            ExpandableView lastVisibleBackgroundChild) {
         mLastVisibleBackgroundChild = lastVisibleBackgroundChild;
     }
 
-    public ActivatableNotificationView getLastVisibleBackgroundChild() {
+    public ExpandableView getLastVisibleBackgroundChild() {
         return mLastVisibleBackgroundChild;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
index 3ac322f..383f2a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
@@ -16,45 +16,35 @@
 
 package com.android.systemui.statusbar.notification.stack;
 
+import android.animation.AnimatorListenerAdapter;
 import android.content.Context;
 import android.util.AttributeSet;
-import android.view.View;
 import android.view.ViewGroup;
 
-import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
+import com.android.systemui.statusbar.notification.row.ExpandableView;
 
 /**
  * Root view to insert Lock screen media controls into the notification stack.
  */
-public class MediaHeaderView extends ActivatableNotificationView {
-
-    private View mContentView;
+public class MediaHeaderView extends ExpandableView {
 
     public MediaHeaderView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     @Override
-    protected void onFinishInflate() {
-        super.onFinishInflate();
+    public long performRemoveAnimation(long duration, long delay, float translationDirection,
+            boolean isHeadsUpAnimation, float endLocation, Runnable onFinishedRunnable,
+            AnimatorListenerAdapter animationListener) {
+        return 0;
     }
 
     @Override
-    protected View getContentView() {
-        return mContentView;
-    }
-
-    /**
-     * Sets the background color, to be used when album art changes.
-     * @param color background
-     */
-    public void setBackgroundColor(int color) {
-        setTintColor(color);
+    public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
+        // No animation, it doesn't need it, this would be local
     }
 
     public void setContentView(ViewGroup contentView) {
-        mContentView = contentView;
         addView(contentView);
         ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
         layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
index b4f7b59..2c3239a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
@@ -20,7 +20,6 @@
 
 import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
-import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
 import com.android.systemui.statusbar.notification.row.ExpandableView;
 import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -37,10 +36,10 @@
 @Singleton
 public class NotificationRoundnessManager implements OnHeadsUpChangedListener {
 
-    private final ActivatableNotificationView[] mFirstInSectionViews;
-    private final ActivatableNotificationView[] mLastInSectionViews;
-    private final ActivatableNotificationView[] mTmpFirstInSectionViews;
-    private final ActivatableNotificationView[] mTmpLastInSectionViews;
+    private final ExpandableView[] mFirstInSectionViews;
+    private final ExpandableView[] mLastInSectionViews;
+    private final ExpandableView[] mTmpFirstInSectionViews;
+    private final ExpandableView[] mTmpLastInSectionViews;
     private final KeyguardBypassController mBypassController;
     private boolean mExpanded;
     private HashSet<ExpandableView> mAnimatedChildren;
@@ -53,10 +52,10 @@
             KeyguardBypassController keyguardBypassController,
             NotificationSectionsFeatureManager sectionsFeatureManager) {
         int numberOfSections = sectionsFeatureManager.getNumberOfBuckets();
-        mFirstInSectionViews = new ActivatableNotificationView[numberOfSections];
-        mLastInSectionViews = new ActivatableNotificationView[numberOfSections];
-        mTmpFirstInSectionViews = new ActivatableNotificationView[numberOfSections];
-        mTmpLastInSectionViews = new ActivatableNotificationView[numberOfSections];
+        mFirstInSectionViews = new ExpandableView[numberOfSections];
+        mLastInSectionViews = new ExpandableView[numberOfSections];
+        mTmpFirstInSectionViews = new ExpandableView[numberOfSections];
+        mTmpLastInSectionViews = new ExpandableView[numberOfSections];
         mBypassController = keyguardBypassController;
     }
 
@@ -80,14 +79,14 @@
         updateView(entry.getRow(), false /* animate */);
     }
 
-    private void updateView(ActivatableNotificationView view, boolean animate) {
+    private void updateView(ExpandableView view, boolean animate) {
         boolean changed = updateViewWithoutCallback(view, animate);
         if (changed) {
             mRoundingChangedCallback.run();
         }
     }
 
-    private boolean updateViewWithoutCallback(ActivatableNotificationView view,
+    private boolean updateViewWithoutCallback(ExpandableView view,
             boolean animate) {
         float topRoundness = getRoundness(view, true /* top */);
         float bottomRoundness = getRoundness(view, false /* top */);
@@ -100,8 +99,7 @@
         return (firstInSection || lastInSection) && (topChanged || bottomChanged);
     }
 
-    private boolean isFirstInSection(ActivatableNotificationView view,
-            boolean includeFirstSection) {
+    private boolean isFirstInSection(ExpandableView view, boolean includeFirstSection) {
         int numNonEmptySections = 0;
         for (int i = 0; i < mFirstInSectionViews.length; i++) {
             if (view == mFirstInSectionViews[i]) {
@@ -114,7 +112,7 @@
         return false;
     }
 
-    private boolean isLastInSection(ActivatableNotificationView view, boolean includeLastSection) {
+    private boolean isLastInSection(ExpandableView view, boolean includeLastSection) {
         int numNonEmptySections = 0;
         for (int i = mLastInSectionViews.length - 1; i >= 0; i--) {
             if (view == mLastInSectionViews[i]) {
@@ -127,7 +125,7 @@
         return false;
     }
 
-    private float getRoundness(ActivatableNotificationView view, boolean top) {
+    private float getRoundness(ExpandableView view, boolean top) {
         if ((view.isPinned() || view.isHeadsUpAnimatingAway()) && !mExpanded) {
             return 1.0f;
         }
@@ -174,14 +172,14 @@
     }
 
     private boolean handleRemovedOldViews(NotificationSection[] sections,
-            ActivatableNotificationView[] oldViews, boolean first) {
+            ExpandableView[] oldViews, boolean first) {
         boolean anyChanged = false;
-        for (ActivatableNotificationView oldView : oldViews) {
+        for (ExpandableView oldView : oldViews) {
             if (oldView != null) {
                 boolean isStillPresent = false;
                 boolean adjacentSectionChanged = false;
                 for (NotificationSection section : sections) {
-                    ActivatableNotificationView newView =
+                    ExpandableView newView =
                             (first ? section.getFirstVisibleChild()
                                     : section.getLastVisibleChild());
                     if (newView == oldView) {
@@ -207,14 +205,14 @@
     }
 
     private boolean handleAddedNewViews(NotificationSection[] sections,
-            ActivatableNotificationView[] oldViews, boolean first) {
+            ExpandableView[] oldViews, boolean first) {
         boolean anyChanged = false;
         for (NotificationSection section : sections) {
-            ActivatableNotificationView newView =
+            ExpandableView newView =
                     (first ? section.getFirstVisibleChild() : section.getLastVisibleChild());
             if (newView != null) {
                 boolean wasAlreadyPresent = false;
-                for (ActivatableNotificationView oldView : oldViews) {
+                for (ExpandableView oldView : oldViews) {
                     if (oldView == newView) {
                         wasAlreadyPresent = true;
                         break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
index bad36bf..1131a65 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.statusbar.notification.stack;
 
+import static com.android.systemui.statusbar.notification.stack.NotificationSectionsManagerKt.BUCKET_MEDIA_CONTROLS;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
@@ -26,7 +28,7 @@
 
 import com.android.systemui.Interpolators;
 import com.android.systemui.statusbar.notification.ShadeViewRefactor;
-import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
+import com.android.systemui.statusbar.notification.row.ExpandableView;
 
 /**
  * Represents the bounds of a section of the notification shade and handles animation when the
@@ -41,8 +43,8 @@
     private Rect mEndAnimationRect = new Rect();
     private ObjectAnimator mTopAnimator = null;
     private ObjectAnimator mBottomAnimator = null;
-    private ActivatableNotificationView mFirstVisibleChild;
-    private ActivatableNotificationView mLastVisibleChild;
+    private ExpandableView mFirstVisibleChild;
+    private ExpandableView mLastVisibleChild;
 
     NotificationSection(View owningView, @PriorityBucket int bucket) {
         mOwningView = owningView;
@@ -198,21 +200,21 @@
         mOwningView.invalidate();
     }
 
-    public ActivatableNotificationView getFirstVisibleChild() {
+    public ExpandableView getFirstVisibleChild() {
         return mFirstVisibleChild;
     }
 
-    public ActivatableNotificationView getLastVisibleChild() {
+    public ExpandableView getLastVisibleChild() {
         return mLastVisibleChild;
     }
 
-    public boolean setFirstVisibleChild(ActivatableNotificationView child) {
+    public boolean setFirstVisibleChild(ExpandableView child) {
         boolean changed = mFirstVisibleChild != child;
         mFirstVisibleChild = child;
         return changed;
     }
 
-    public boolean setLastVisibleChild(ActivatableNotificationView child) {
+    public boolean setLastVisibleChild(ExpandableView child) {
         boolean changed = mLastVisibleChild != child;
         mLastVisibleChild = child;
         return changed;
@@ -251,7 +253,7 @@
             boolean shiftBackgroundWithFirst) {
         int top = minTopPosition;
         int bottom = minTopPosition;
-        ActivatableNotificationView firstView = getFirstVisibleChild();
+        ExpandableView firstView = getFirstVisibleChild();
         if (firstView != null) {
             // Round Y up to avoid seeing the background during animation
             int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
@@ -276,7 +278,7 @@
             }
         }
         top = Math.max(minTopPosition, top);
-        ActivatableNotificationView lastView = getLastVisibleChild();
+        ExpandableView lastView = getLastVisibleChild();
         if (lastView != null) {
             float finalTranslationY = ViewState.getFinalTranslationY(lastView);
             int finalHeight = ExpandableViewState.getFinalActualHeight(lastView);
@@ -302,4 +304,8 @@
         mBounds.bottom = bottom;
         return bottom;
     }
+
+    public boolean needsBackground() {
+        return mFirstVisibleChild != null && mBucket != BUCKET_MEDIA_CONTROLS;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
index e39a4a0..ba7675f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
@@ -35,7 +35,6 @@
 import com.android.systemui.statusbar.notification.people.PeopleHubViewBoundary
 import com.android.systemui.statusbar.notification.people.PersonViewModel
 import com.android.systemui.statusbar.notification.people.Subscription
-import com.android.systemui.statusbar.notification.row.ActivatableNotificationView
 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
 import com.android.systemui.statusbar.notification.row.ExpandableView
 import com.android.systemui.statusbar.notification.row.StackScrollerDecorView
@@ -456,14 +455,14 @@
     private sealed class SectionBounds {
 
         data class Many(
-            val first: ActivatableNotificationView,
-            val last: ActivatableNotificationView
+            val first: ExpandableView,
+            val last: ExpandableView
         ) : SectionBounds()
 
-        data class One(val lone: ActivatableNotificationView) : SectionBounds()
+        data class One(val lone: ExpandableView) : SectionBounds()
         object None : SectionBounds()
 
-        fun addNotif(notif: ActivatableNotificationView): SectionBounds = when (this) {
+        fun addNotif(notif: ExpandableView): SectionBounds = when (this) {
             is None -> One(notif)
             is One -> Many(lone, notif)
             is Many -> copy(last = notif)
@@ -476,8 +475,8 @@
         }
 
         private fun NotificationSection.setFirstAndLastVisibleChildren(
-            first: ActivatableNotificationView?,
-            last: ActivatableNotificationView?
+            first: ExpandableView?,
+            last: ExpandableView?
         ): Boolean {
             val firstChanged = setFirstVisibleChild(first)
             val lastChanged = setLastVisibleChild(last)
@@ -492,7 +491,7 @@
      */
     fun updateFirstAndLastViewsForAllSections(
         sections: Array<NotificationSection>,
-        children: List<ActivatableNotificationView>
+        children: List<ExpandableView>
     ): Boolean {
         // Create mapping of bucket to section
         val sectionBounds = children.asSequence()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index e33cc60..bcafd0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -701,7 +701,7 @@
      * @return the height at which we will wake up when pulsing
      */
     public float getWakeUpHeight() {
-        ActivatableNotificationView firstChild = getFirstChildWithBackground();
+        ExpandableView firstChild = getFirstChildWithBackground();
         if (firstChild != null) {
             if (mKeyguardBypassController.getBypassEnabled()) {
                 return firstChild.getHeadsUpHeightWithoutHeader();
@@ -907,7 +907,7 @@
         // TODO(kprevas): this may not be necessary any more since we don't display the shelf in AOD
         boolean anySectionHasVisibleChild = false;
         for (NotificationSection section : mSections) {
-            if (section.getFirstVisibleChild() != null) {
+            if (section.needsBackground()) {
                 anySectionHasVisibleChild = true;
                 break;
             }
@@ -950,7 +950,7 @@
         int currentRight = right;
         boolean first = true;
         for (NotificationSection section : mSections) {
-            if (section.getFirstVisibleChild() == null) {
+            if (!section.needsBackground()) {
                 continue;
             }
             int sectionTop = section.getCurrentBounds().top + animationYOffset;
@@ -2685,40 +2685,40 @@
     }
 
     @ShadeViewRefactor(RefactorComponent.COORDINATOR)
-    private ActivatableNotificationView getLastChildWithBackground() {
+    private ExpandableView getLastChildWithBackground() {
         int childCount = getChildCount();
         for (int i = childCount - 1; i >= 0; i--) {
-            View child = getChildAt(i);
-            if (child.getVisibility() != View.GONE && child instanceof ActivatableNotificationView
+            ExpandableView child = (ExpandableView) getChildAt(i);
+            if (child.getVisibility() != View.GONE && !(child instanceof StackScrollerDecorView)
                     && child != mShelf) {
-                return (ActivatableNotificationView) child;
+                return child;
             }
         }
         return null;
     }
 
     @ShadeViewRefactor(RefactorComponent.COORDINATOR)
-    private ActivatableNotificationView getFirstChildWithBackground() {
+    private ExpandableView getFirstChildWithBackground() {
         int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
-            View child = getChildAt(i);
-            if (child.getVisibility() != View.GONE && child instanceof ActivatableNotificationView
+            ExpandableView child = (ExpandableView) getChildAt(i);
+            if (child.getVisibility() != View.GONE && !(child instanceof StackScrollerDecorView)
                     && child != mShelf) {
-                return (ActivatableNotificationView) child;
+                return child;
             }
         }
         return null;
     }
 
     //TODO: We shouldn't have to generate this list every time
-    private List<ActivatableNotificationView> getChildrenWithBackground() {
-        ArrayList<ActivatableNotificationView> children = new ArrayList<>();
+    private List<ExpandableView> getChildrenWithBackground() {
+        ArrayList<ExpandableView> children = new ArrayList<>();
         int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
-            View child = getChildAt(i);
-            if (child.getVisibility() != View.GONE && child instanceof ActivatableNotificationView
+            ExpandableView child = (ExpandableView) getChildAt(i);
+            if (child.getVisibility() != View.GONE && !(child instanceof StackScrollerDecorView)
                     && child != mShelf) {
-                children.add((ActivatableNotificationView) child);
+                children.add(child);
             }
         }
 
@@ -3283,13 +3283,13 @@
     private void updateFirstAndLastBackgroundViews() {
         NotificationSection firstSection = getFirstVisibleSection();
         NotificationSection lastSection = getLastVisibleSection();
-        ActivatableNotificationView previousFirstChild =
+        ExpandableView previousFirstChild =
                 firstSection == null ? null : firstSection.getFirstVisibleChild();
-        ActivatableNotificationView previousLastChild =
+        ExpandableView previousLastChild =
                 lastSection == null ? null : lastSection.getLastVisibleChild();
 
-        ActivatableNotificationView firstChild = getFirstChildWithBackground();
-        ActivatableNotificationView lastChild = getLastChildWithBackground();
+        ExpandableView firstChild = getFirstChildWithBackground();
+        ExpandableView lastChild = getLastChildWithBackground();
         boolean sectionViewsChanged = mSectionsManager.updateFirstAndLastViewsForAllSections(
                 mSections, getChildrenWithBackground());
 
@@ -4575,7 +4575,7 @@
                 ? (ExpandableNotificationRow) view
                 : null;
         NotificationSection firstSection = getFirstVisibleSection();
-        ActivatableNotificationView firstVisibleChild =
+        ExpandableView firstVisibleChild =
                 firstSection == null ? null : firstSection.getFirstVisibleChild();
         if (row != null) {
             if (row == firstVisibleChild
@@ -4611,7 +4611,7 @@
                 }
                 int layoutEnd = mMaxLayoutHeight + (int) mStackTranslation;
                 NotificationSection lastSection = getLastVisibleSection();
-                ActivatableNotificationView lastVisibleChild =
+                ExpandableView lastVisibleChild =
                         lastSection == null ? null : lastSection.getLastVisibleChild();
                 if (row != lastVisibleChild && mShelf.getVisibility() != GONE) {
                     layoutEnd -= mShelf.getIntrinsicHeight() + mPaddingBetweenElements;