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

Commit ffd3dc60 authored by Selim Cinek's avatar Selim Cinek
Browse files

Fixed the inline launch animation for notification groups

When launching a child of a group there would be strange artifacts
from the clipping. These are now fixed. Also made sure that
the notification can't be launched if the parent is translated.

Test: launch child in a group, observe normal animation
Change-Id: Iee8e4b49462e140d3eaffe5b2504caa1b67d04e2
Merged-In: Iee8e4b49462e140d3eaffe5b2504caa1b67d04e2
Fixes: 110093221
parent c769caaf
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -1856,7 +1856,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        float interpolation = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(params.getProgress());
        int startClipTopAmount = params.getStartClipTopAmount();
        if (mNotificationParent != null) {
            top -= mNotificationParent.getTranslationY();
            float parentY = mNotificationParent.getTranslationY();
            top -= parentY;
            mNotificationParent.setTranslationZ(translationZ);
            int parentStartClipTopAmount = params.getParentStartClipTopAmount();
            if (startClipTopAmount != 0) {
@@ -1866,8 +1867,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
                mNotificationParent.setClipTopAmount(clipTopAmount);
            }
            mNotificationParent.setExtraWidthForClipping(extraWidthForClipping);
            mNotificationParent.setMinimumHeightForClipping(params.getHeight()
                    + mNotificationParent.getActualHeight());
            float clipBottom = Math.max(params.getBottom(),
                    parentY + mNotificationParent.getActualHeight()
                            - mNotificationParent.getClipBottomAmount());
            float clipTop = Math.min(params.getTop(), parentY);
            int minimumHeightForClipping = (int) (clipBottom - clipTop);
            mNotificationParent.setMinimumHeightForClipping(minimumHeightForClipping);
        } else if (startClipTopAmount != 0) {
            int clipTopAmount = (int) MathUtils.lerp(startClipTopAmount, 0, interpolation);
            setClipTopAmount(clipTopAmount);
@@ -1922,6 +1927,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView

    private void setChildIsExpanding(boolean isExpanding) {
        mChildIsExpanding = isExpanding;
        updateClipping();
        invalidate();
    }

    @Override
@@ -1931,7 +1938,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView

    @Override
    protected boolean shouldClipToActualHeight() {
        return super.shouldClipToActualHeight() && !mExpandAnimationRunning && !mChildIsExpanding;
        return super.shouldClipToActualHeight() && !mExpandAnimationRunning;
    }

    @Override
@@ -2827,7 +2834,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
                return true;
            }
        } else if (child == mChildrenContainer) {
            if (!mChildIsExpanding && (isClippingNeeded() || !hasNoRounding())) {
            if (isClippingNeeded() || !hasNoRounding()) {
                return true;
            }
        } else if (child instanceof NotificationGuts) {
+11 −7
Original line number Diff line number Diff line
@@ -78,8 +78,6 @@ public abstract class ExpandableOutlineView extends ExpandableView {
    protected boolean mShouldTranslateContents;
    private boolean mTopAmountRounded;
    private float mDistanceToTopRoundness = -1;
    private float mExtraWidthForClipping;
    private int mMinimumHeightForClipping = 0;

    private final ViewOutlineProvider mProvider = new ViewOutlineProvider() {
        @Override
@@ -120,11 +118,13 @@ public abstract class ExpandableOutlineView extends ExpandableView {
        if (!mCustomOutline) {
            int translation = mShouldTranslateContents && !ignoreTranslation
                    ? (int) getTranslation() : 0;
            left = Math.max(translation, 0);
            int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f);
            left = Math.max(translation, 0) - halfExtraWidth;
            top = mClipTopAmount + mBackgroundTop;
            right = getWidth() + Math.min(translation, 0);
            right = getWidth() + halfExtraWidth + Math.min(translation, 0);
            bottom = Math.max(getActualHeight(), top);
            int intersectBottom = Math.max(getActualHeight() - mClipBottomAmount, top);
            int intersectBottom = Math.max(mMinimumHeightForClipping,
                    Math.max(getActualHeight() - mClipBottomAmount, top));
            if (bottom != intersectBottom) {
                if (clipRoundedToBottom) {
                    bottom = intersectBottom;
@@ -237,12 +237,16 @@ public abstract class ExpandableOutlineView extends ExpandableView {
        return result;
    }

    @Override
    public void setExtraWidthForClipping(float extraWidthForClipping) {
        mExtraWidthForClipping = extraWidthForClipping;
        super.setExtraWidthForClipping(extraWidthForClipping);
        invalidate();
    }

    @Override
    public void setMinimumHeightForClipping(int minimumHeightForClipping) {
        mMinimumHeightForClipping = minimumHeightForClipping;
        super.setMinimumHeightForClipping(minimumHeightForClipping);
        invalidate();
    }

    @Override
+16 −2
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ public abstract class ExpandableView extends FrameLayout {
    private int mActualHeight;
    protected int mClipTopAmount;
    protected int mClipBottomAmount;
    protected int mMinimumHeightForClipping = 0;
    protected float mExtraWidthForClipping = 0;
    private boolean mDark;
    private ArrayList<View> mMatchParentViews = new ArrayList<View>();
    private static Rect mClipRect = new Rect();
@@ -390,14 +392,26 @@ public abstract class ExpandableView extends FrameLayout {
    protected void updateClipping() {
        if (mClipToActualHeight && shouldClipToActualHeight()) {
            int top = getClipTopAmount();
            mClipRect.set(0, top, getWidth(), Math.max(getActualHeight() + getExtraBottomPadding()
                    - mClipBottomAmount, top));
            int bottom = Math.max(Math.max(getActualHeight() + getExtraBottomPadding()
                    - mClipBottomAmount, top), mMinimumHeightForClipping);
            int halfExtraWidth = (int) (mExtraWidthForClipping / 2.0f);
            mClipRect.set(-halfExtraWidth, top, getWidth() + halfExtraWidth, bottom);
            setClipBounds(mClipRect);
        } else {
            setClipBounds(null);
        }
    }

    public void setMinimumHeightForClipping(int minimumHeightForClipping) {
        mMinimumHeightForClipping = minimumHeightForClipping;
        updateClipping();
    }

    public void setExtraWidthForClipping(float extraWidthForClipping) {
        mExtraWidthForClipping = extraWidthForClipping;
        updateClipping();
    }

    public float getHeaderVisibleAmount() {
        return 1.0f;
    }
+13 −2
Original line number Diff line number Diff line
@@ -156,9 +156,16 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
            }

            // Check if the notification is displaying the menu, if so slide notification back
            if (row.getProvider() != null && row.getProvider().isMenuVisible()) {
            if (isMenuVisible(row)) {
                row.animateTranslateNotification(0);
                return;
            } else if (row.isChildInGroup() && isMenuVisible(row.getNotificationParent())) {
                row.getNotificationParent().animateTranslateNotification(0);
                return;
            } else if (row.isSummaryWithChildren() && row.areChildrenExpanded()) {
                // We never want to open the app directly if the user clicks in between
                // the notifications.
                return;
            } 

            // Mark notification for one frame.
@@ -168,6 +175,10 @@ public class NotificationEntryManager implements Dumpable, NotificationInflater.
            mCallback.onNotificationClicked(sbn, row);
        }

        private boolean isMenuVisible(ExpandableNotificationRow row) {
            return row.getProvider() != null && row.getProvider().isMenuVisible();
        }

        public void register(ExpandableNotificationRow row, StatusBarNotification sbn) {
            Notification notification = sbn.getNotification();
            if (notification.contentIntent != null || notification.fullScreenIntent != null) {
+4 −0
Original line number Diff line number Diff line
@@ -278,6 +278,10 @@ public class ActivityLaunchAnimator {
            return top;
        }

        public int getBottom() {
            return bottom;
        }

        public int getWidth() {
            return right - left;
        }
Loading