From dc5743a4136a858a36595f73da9c7a53faa7c9ea Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Wed, 7 Dec 2022 17:30:42 +0100 Subject: [PATCH] Fix notification launch animation for groups This fixes a problem where the z ordering is not correct during the launch animation of a child notification inside a notification group. The launched notification was rendered below other notifications in some cases. Test: Manual, i.e. posting various types of notifications and analyzing the animations in screenrecordings. Bug: 246932690 Change-Id: I658b4b3db75da5199b7b7cb416b7d7fabbc75520 --- .../row/ExpandableNotificationRow.java | 4 +-- .../stack/NotificationChildrenContainer.java | 29 ++++++++++++++----- .../stack/StackScrollAlgorithm.java | 7 ++--- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a487af1998fcd..44a231d55c089 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -976,10 +976,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView /** * Updates states of all children. */ - public void updateChildrenStates(AmbientState ambientState) { + public void updateChildrenStates() { if (mIsSummaryWithChildren) { ExpandableViewState parentState = getViewState(); - mChildrenContainer.updateState(parentState, ambientState); + mChildrenContainer.updateState(parentState); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 4a8e2dbb5334a..4d1451e3a6e28 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -616,9 +616,8 @@ public class NotificationChildrenContainer extends ViewGroup * Update the state of all its children based on a linear layout algorithm. * * @param parentState the state of the parent - * @param ambientState the ambient state containing ambient information */ - public void updateState(ExpandableViewState parentState, AmbientState ambientState) { + public void updateState(ExpandableViewState parentState) { int childCount = mAttachedChildren.size(); int yPosition = mNotificationHeaderMargin + mCurrentHeaderTranslation; boolean firstChild = true; @@ -661,9 +660,17 @@ public class NotificationChildrenContainer extends ViewGroup childState.height = intrinsicHeight; childState.setYTranslation(yPosition + launchTransitionCompensation); childState.hidden = false; - // When the group is expanded, the children cast the shadows rather than the parent - // so use the parent's elevation here. - if (childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications) { + if (child.isExpandAnimationRunning() || mContainingNotification.hasExpandingChild()) { + // Not modifying translationZ during launch animation. The translationZ of the + // expanding child is handled inside ExpandableNotificationRow and the translationZ + // of the other children inside the group should remain unchanged. In particular, + // they should not take over the translationZ of the parent, since the parent has + // a positive translationZ set only for the expanding child to be drawn above other + // notifications. + childState.setZTranslation(child.getTranslationZ()); + } else if (childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications) { + // When the group is expanded, the children cast the shadows rather than the parent + // so use the parent's elevation here. childState.setZTranslation(parentState.getZTranslation()); } else { childState.setZTranslation(0); @@ -716,9 +723,15 @@ public class NotificationChildrenContainer extends ViewGroup mHeaderViewState = new ViewState(); } mHeaderViewState.initFrom(mNotificationHeader); - mHeaderViewState.setZTranslation(childrenExpandedAndNotAnimating - ? parentState.getZTranslation() - : 0); + + if (mContainingNotification.hasExpandingChild()) { + // Not modifying translationZ during expand animation. + mHeaderViewState.setZTranslation(mNotificationHeader.getTranslationZ()); + } else if (childrenExpandedAndNotAnimating) { + mHeaderViewState.setZTranslation(parentState.getZTranslation()); + } else { + mHeaderViewState.setZTranslation(0); + } mHeaderViewState.setYTranslation(mCurrentHeaderTranslation); mHeaderViewState.setAlpha(mHeaderVisibleAmount); // The hiding is done automatically by the alpha, otherwise we'll pick it up again diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index aff7b4c6c515c..3170f34bcebd0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -128,7 +128,7 @@ public class StackScrollAlgorithm { updateSpeedBumpState(algorithmState, speedBumpIndex); updateShelfState(algorithmState, ambientState); updateAlphaState(algorithmState, ambientState); - getNotificationChildrenStates(algorithmState, ambientState); + getNotificationChildrenStates(algorithmState); } private void updateAlphaState(StackScrollAlgorithmState algorithmState, @@ -231,14 +231,13 @@ public class StackScrollAlgorithm { } } - private void getNotificationChildrenStates(StackScrollAlgorithmState algorithmState, - AmbientState ambientState) { + private void getNotificationChildrenStates(StackScrollAlgorithmState algorithmState) { int childCount = algorithmState.visibleChildren.size(); for (int i = 0; i < childCount; i++) { ExpandableView v = algorithmState.visibleChildren.get(i); if (v instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) v; - row.updateChildrenStates(ambientState); + row.updateChildrenStates(); } } }