Merge "Fixed several bugs where the dismissview was not reachable." into lmp-dev
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index acb83cb..dfcc408 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -276,13 +276,21 @@
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
         boolean updateExpandHeight = mMaxExpandHeight == 0 && !mWasReset;
-        mMaxExpandHeight = mPrivateLayout.getMaxHeight();
+        updateMaxExpandHeight();
         if (updateExpandHeight) {
             applyExpansionToLayout();
         }
         mWasReset = false;
     }
 
+    private void updateMaxExpandHeight() {
+        int intrinsicBefore = getIntrinsicHeight();
+        mMaxExpandHeight = mPrivateLayout.getMaxHeight();
+        if (intrinsicBefore != getIntrinsicHeight()) {
+            notifyHeightChanged();
+        }
+    }
+
     public void setSensitive(boolean sensitive) {
         mSensitive = sensitive;
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 5c66660..2838747 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -96,7 +96,10 @@
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         super.onLayout(changed, left, top, right, bottom);
         if (!mActualHeightInitialized && mActualHeight == 0) {
-            setActualHeight(getInitialHeight());
+            int initialHeight = getInitialHeight();
+            if (initialHeight != 0) {
+                setActualHeight(initialHeight);
+            }
         }
     }
 
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 0aa1114..302763e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -2094,15 +2094,16 @@
         int oldVisibility = mEmptyShadeView.willBeGone() ? GONE : mEmptyShadeView.getVisibility();
         int newVisibility = visible ? VISIBLE : GONE;
         if (oldVisibility != newVisibility) {
-            if (oldVisibility == GONE) {
+            if (newVisibility != GONE) {
                 if (mEmptyShadeView.willBeGone()) {
                     mEmptyShadeView.cancelAnimation();
                 } else {
                     mEmptyShadeView.setInvisible();
-                    mEmptyShadeView.setVisibility(newVisibility);
                 }
+                mEmptyShadeView.setVisibility(newVisibility);
                 mEmptyShadeView.setWillBeGone(false);
                 updateContentHeight();
+                notifyHeightChangeListener(mDismissView);
             } else {
                 mEmptyShadeView.setWillBeGone(true);
                 mEmptyShadeView.performVisibilityAnimation(false, new Runnable() {
@@ -2111,6 +2112,7 @@
                         mEmptyShadeView.setVisibility(GONE);
                         mEmptyShadeView.setWillBeGone(false);
                         updateContentHeight();
+                        notifyHeightChangeListener(mDismissView);
                     }
                 });
             }
@@ -2121,15 +2123,16 @@
         int oldVisibility = mDismissView.willBeGone() ? GONE : mDismissView.getVisibility();
         int newVisibility = visible ? VISIBLE : GONE;
         if (oldVisibility != newVisibility) {
-            if (oldVisibility == GONE) {
+            if (newVisibility != GONE) {
                 if (mDismissView.willBeGone()) {
                     mDismissView.cancelAnimation();
                 } else {
                     mDismissView.setInvisible();
-                    mDismissView.setVisibility(newVisibility);
                 }
+                mDismissView.setVisibility(newVisibility);
                 mDismissView.setWillBeGone(false);
                 updateContentHeight();
+                notifyHeightChangeListener(mDismissView);
             } else {
                 mDismissView.setWillBeGone(true);
                 mDismissView.performVisibilityAnimation(false, new Runnable() {
@@ -2138,6 +2141,7 @@
                         mDismissView.setVisibility(GONE);
                         mDismissView.setWillBeGone(false);
                         updateContentHeight();
+                        notifyHeightChangeListener(mDismissView);
                     }
                 });
             }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index cd3c1a0..58d5813 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -166,6 +166,7 @@
         boolean hasDelays = mAnimationFilter.hasDelays;
         boolean isDelayRelevant = yTranslationChanging || zTranslationChanging || scaleChanging ||
                 alphaChanging || heightChanging || topInsetChanging;
+        boolean noAnimation = wasAdded && !mAnimationFilter.hasGoToFullShadeEvent;
         long delay = 0;
         long duration = mCurrentLength;
         if (hasDelays && isDelayRelevant || wasAdded) {
@@ -183,46 +184,72 @@
 
         // start translationY animation
         if (yTranslationChanging) {
-            startYTranslationAnimation(child, viewState, duration, delay);
+            if (noAnimation) {
+                child.setTranslationY(viewState.yTranslation);
+            } else {
+                startYTranslationAnimation(child, viewState, duration, delay);
+            }
         }
 
         // start translationZ animation
         if (zTranslationChanging) {
-            startZTranslationAnimation(child, viewState, duration, delay);
+            if (noAnimation) {
+                child.setTranslationZ(viewState.zTranslation);
+            } else {
+                startZTranslationAnimation(child, viewState, duration, delay);
+            }
         }
 
         // start scale animation
         if (scaleChanging) {
-            startScaleAnimation(child, viewState, duration);
+            if (noAnimation) {
+                child.setScaleX(viewState.scale);
+                child.setScaleY(viewState.scale);
+            } else {
+                startScaleAnimation(child, viewState, duration);
+            }
         }
 
         // start alpha animation
         if (alphaChanging && child.getTranslationX() == 0) {
-            startAlphaAnimation(child, viewState, duration, delay);
+            if (noAnimation) {
+                child.setAlpha(viewState.alpha);
+            } else {
+                startAlphaAnimation(child, viewState, duration, delay);
+            }
         }
 
         // start height animation
-        if (heightChanging) {
-            startHeightAnimation(child, viewState, duration, delay);
+        if (heightChanging && child.getActualHeight() != 0) {
+            if (noAnimation) {
+                child.setActualHeight(viewState.height, false);
+            } else {
+                startHeightAnimation(child, viewState, duration, delay);
+            }
         }
 
         // start top inset animation
         if (topInsetChanging) {
-            startInsetAnimation(child, viewState, duration, delay);
+            if (noAnimation) {
+                child.setClipTopAmount(viewState.clipTopAmount);
+            } else {
+                startInsetAnimation(child, viewState, duration, delay);
+            }
         }
 
         // start dimmed animation
-        child.setDimmed(viewState.dimmed, mAnimationFilter.animateDimmed && !wasAdded);
+        child.setDimmed(viewState.dimmed, mAnimationFilter.animateDimmed && !wasAdded
+                && !noAnimation);
 
         // start dark animation
-        child.setDark(viewState.dark, mAnimationFilter.animateDark);
+        child.setDark(viewState.dark, mAnimationFilter.animateDark && !noAnimation);
 
         // apply speed bump state
         child.setBelowSpeedBump(viewState.belowSpeedBump);
 
         // start hiding sensitive animation
-        child.setHideSensitive(viewState.hideSensitive,
-                mAnimationFilter.animateHideSensitive && !wasAdded, delay, duration);
+        child.setHideSensitive(viewState.hideSensitive, mAnimationFilter.animateHideSensitive &&
+                !wasAdded && !noAnimation, delay, duration);
 
         // apply scrimming
         child.setScrimAmount(viewState.scrimAmount);