From a5703187a9dba418f742fab0874a8f683b0bbb0e Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Wed, 11 May 2016 21:23:16 -0400 Subject: [PATCH] Fixed the remove animations for notification children Previously the children container wasn't fading out. In addition was the child added to the wrong overlay leading to completely wrong animations for the children. Change-Id: I1ae395dc02cecb8629e509dfb55870f9c79d7854 Fixes: 27719756 --- .../statusbar/ExpandableNotificationRow.java | 11 ++++++++-- .../statusbar/phone/PhoneStatusBar.java | 7 ++++++- .../stack/NotificationStackScrollLayout.java | 20 ++++++++++--------- .../statusbar/stack/StackStateAnimator.java | 14 ++++++++++--- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 1a34dd79d63ae..021b9f5cd5d3a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -329,7 +329,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (mChildrenContainer != null) { mChildrenContainer.removeNotification(row); } - mHeaderUtil.restoreNotificationHeader(row); + if (!row.isRemoved()) { + mHeaderUtil.restoreNotificationHeader(row); + } onChildrenCountChanged(); row.setIsChildInGroup(false, null); } @@ -644,7 +646,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { continue; } mChildrenContainer.removeNotification(row); - mHeaderUtil.restoreNotificationHeader(row); + if (!row.isRemoved()) { + mHeaderUtil.restoreNotificationHeader(row); + } row.setIsChildInGroup(false, null); } onChildrenCountChanged(); @@ -1330,6 +1334,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override protected View getContentView() { + if (mIsSummaryWithChildren) { + return mChildrenContainer; + } return getShowingLayout(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 3864f26eef26e..0af29d840bab2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1485,6 +1485,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key)); return; } + Entry entry = mNotificationData.get(key); + if (entry != null && entry.row != null) { + entry.row.setRemoved(true); + } // Let's remove the children if this was a summary handleGroupSummaryRemoved(key, ranking); StatusBarNotification old = removeNotificationViews(key, ranking); @@ -1524,12 +1528,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // always cancelled. We only remove them if they were dismissed by the user. return; } - entry.row.setRemoved(true); List notificationChildren = entry.row.getNotificationChildren(); ArrayList toRemove = new ArrayList<>(notificationChildren); for (int i = 0; i < toRemove.size(); i++) { toRemove.get(i).setKeepInParent(true); + // we need to set this state earlier as otherwise we might generate some weird + // animations toRemove.get(i).setRemoved(true); } for (int i = 0; i < toRemove.size(); i++) { 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 87dcb914acd6a..705834a786f35 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2138,7 +2138,7 @@ public class NotificationStackScrollLayout extends ViewGroup } } - private void onViewRemovedInternal(View child, ViewGroup transientContainer) { + private void onViewRemovedInternal(View child, ViewGroup container) { if (mChangePositionInProgress) { // This is only a position change, don't do anything special return; @@ -2150,10 +2150,10 @@ public class NotificationStackScrollLayout extends ViewGroup boolean animationGenerated = generateRemoveAnimation(child); if (animationGenerated) { if (!mSwipedOutViews.contains(child)) { - getOverlay().add(child); + container.getOverlay().add(child); } else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) { - transientContainer.addTransientView(child, 0); - expandableView.setTransientContainer(transientContainer); + container.addTransientView(child, 0); + expandableView.setTransientContainer(container); } } else { mSwipedOutViews.remove(child); @@ -2822,22 +2822,24 @@ public class NotificationStackScrollLayout extends ViewGroup mPhoneStatusBar.resetUserExpandedStates(); // lets make sure nothing is in the overlay / transient anymore - clearTransientViews(this); + clearTemporaryViews(this); for (int i = 0; i < getChildCount(); i++) { ExpandableView child = (ExpandableView) getChildAt(i); if (child instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; - clearTransientViews(row.getChildrenContainer()); + clearTemporaryViews(row.getChildrenContainer()); } } - getOverlay().clear(); } } - private void clearTransientViews(ViewGroup viewGroup) { + private void clearTemporaryViews(ViewGroup viewGroup) { while (viewGroup != null && viewGroup.getTransientViewCount() != 0) { viewGroup.removeTransientView(viewGroup.getTransientView(0)); } + if (viewGroup != null) { + viewGroup.getOverlay().clear(); + } } public void onPanelTrackingStarted() { @@ -2957,7 +2959,7 @@ public class NotificationStackScrollLayout extends ViewGroup private void clearViewOverlays() { for (View view : mClearOverlayViewsWhenFinished) { - getOverlay().remove(view); + StackStateAnimator.removeFromOverlay(view); } } 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 e8472ac5c8d50..0c08d1303aaa1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -22,6 +22,7 @@ import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.view.View; +import android.view.ViewGroup; import android.view.animation.Interpolator; import com.android.systemui.Interpolators; @@ -797,7 +798,7 @@ public class StackStateAnimator { private void onAnimationFinished() { mHostLayout.onChildAnimationFinished(); for (View v : mChildrenToClearFromOverlay) { - mHostLayout.getOverlay().remove(v); + removeFromOverlay(v); } mChildrenToClearFromOverlay.clear(); } @@ -829,7 +830,7 @@ public class StackStateAnimator { } else if (event.animationType == NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE) { if (changingView.getVisibility() == View.GONE) { - mHostLayout.getOverlay().remove(changingView); + removeFromOverlay(changingView); continue; } @@ -854,7 +855,7 @@ public class StackStateAnimator { @Override public void run() { // remove the temporary overlay - mHostLayout.getOverlay().remove(changingView); + removeFromOverlay(changingView); } }); } else if (event.animationType == @@ -909,6 +910,13 @@ public class StackStateAnimator { } } + public static void removeFromOverlay(View changingView) { + ViewGroup parent = (ViewGroup) changingView.getParent(); + if (parent != null) { + parent.removeView(changingView); + } + } + public void animateOverScrollToAmount(float targetAmount, final boolean onTop, final boolean isRubberbanded) { final float startOverScrollAmount = mHostLayout.getCurrentOverScrollAmount(onTop);