diff options
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 3a1752dda756..b4ce9cda3624 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(); @@ -1338,6 +1342,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 76fb41685567..4bb97974b88b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1505,6 +1505,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); @@ -1544,12 +1548,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<ExpandableNotificationRow> notificationChildren = entry.row.getNotificationChildren(); ArrayList<ExpandableNotificationRow> 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 06412758727c..1edaa0f6b68d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2188,7 +2188,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; @@ -2200,10 +2200,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); @@ -2885,22 +2885,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() { @@ -3020,7 +3022,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 e8472ac5c8d5..0c08d1303aaa 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); |