Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc5743a4 authored by Johannes Gallmann's avatar Johannes Gallmann
Browse files

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
parent d9aac37c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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);
        }
    }

+21 −8
Original line number Diff line number Diff line
@@ -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;
            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.
            if (childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications) {
                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
+3 −4
Original line number Diff line number Diff line
@@ -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();
            }
        }
    }