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

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

Made heads up work again

Heads up notifications were completely broken before
with the shelf, but work better now.

Test: Add heads-up observe that it's visible
Bug: 32437839
Change-Id: I9ac08f4ea54a912efd53bb849b3223f534b76915
parent a686b2c9
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -771,9 +771,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
        return mChildrenContainer;
    }

    public void setHeadsupDisappearRunning(boolean running) {
        mHeadsupDisappearRunning = running;
        mPrivateLayout.setHeadsupDisappearRunning(running);
    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
        mHeadsupDisappearRunning = headsUpAnimatingAway;
        mPrivateLayout.setHeadsUpAnimatingAway(headsUpAnimatingAway);
    }

    /**
     * @return if the view was just heads upped and is now animating away. During such a time the
     * layout needs to be kept consistent
     */
    public boolean isHeadsUpAnimatingAway() {
        return mHeadsupDisappearRunning;
    }

    public View getChildAfterViewWhenDismissed() {
@@ -1795,7 +1803,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
        protected void onYTranslationAnimationFinished() {
            super.onYTranslationAnimationFinished();
            if (mHeadsupDisappearRunning) {
                setHeadsupDisappearRunning(false);
                setHeadsUpAnimatingAway(false);
            }
        }

+5 −5
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ public class NotificationContentView extends FrameLayout {

    private int mContentHeightAtAnimationStart = UNDEFINED;
    private boolean mFocusOnVisibilityChange;
    private boolean mHeadsupDisappearRunning;
    private boolean mHeadsUpAnimatingAway;
    private boolean mIconsVisible;
    private int mClipBottomAmount;

@@ -458,7 +458,7 @@ public class NotificationContentView extends FrameLayout {
                    isTransitioningFromTo(VISIBLE_TYPE_HEADSUP, VISIBLE_TYPE_EXPANDED) ||
                    isTransitioningFromTo(VISIBLE_TYPE_EXPANDED, VISIBLE_TYPE_HEADSUP);
            boolean pinned = !isVisibleOrTransitioning(VISIBLE_TYPE_CONTRACTED)
                    && (mIsHeadsUp || mHeadsupDisappearRunning);
                    && (mIsHeadsUp || mHeadsUpAnimatingAway);
            if (transitioningBetweenHunAndExpanded || pinned) {
                return Math.min(mHeadsUpChild.getHeight(), mExpandedChild.getHeight());
            }
@@ -851,7 +851,7 @@ public class NotificationContentView extends FrameLayout {
            return VISIBLE_TYPE_SINGLELINE;
        }

        if ((mIsHeadsUp || mHeadsupDisappearRunning) && mHeadsUpChild != null) {
        if ((mIsHeadsUp || mHeadsUpAnimatingAway) && mHeadsUpChild != null) {
            if (viewHeight <= mHeadsUpChild.getHeight() || noExpandedChild) {
                return VISIBLE_TYPE_HEADSUP;
            } else {
@@ -1194,8 +1194,8 @@ public class NotificationContentView extends FrameLayout {
        }
    }

    public void setHeadsupDisappearRunning(boolean headsupDisappearRunning) {
        mHeadsupDisappearRunning = headsupDisappearRunning;
    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
        mHeadsUpAnimatingAway = headsUpAnimatingAway;
        selectLayout(false /* animate */, true /* force */);
    }

+11 −3
Original line number Diff line number Diff line
@@ -206,6 +206,11 @@ public class NotificationShelf extends ActivatableNotificationView {
            if (child.getClipBottomAmount() != 0) {
                child.setClipBottomAmount(0);
            }
            if (child instanceof ExpandableNotificationRow) {
                ExpandableNotificationRow row = (ExpandableNotificationRow) child;
                row.setIconTransformationAmount(0);
            }

        }
        mNotificationIconContainer.calculateIconTranslations();
        mNotificationIconContainer.applyIconStates();
@@ -216,7 +221,8 @@ public class NotificationShelf extends ActivatableNotificationView {
    private void updateNotificationClipHeight(ExpandableNotificationRow row,
            float notificationClipEnd) {
        float viewEnd = row.getTranslationY() + row.getActualHeight();
        if (viewEnd > notificationClipEnd) {
        if (viewEnd > notificationClipEnd && !row.isPinned() && !row.isHeadsUpAnimatingAway()) {
            // TODO: handle heads up clipping correctly when closing.
            row.setClipBottomAmount((int) (viewEnd - notificationClipEnd));
        } else {
            row.setClipBottomAmount(0);
@@ -229,7 +235,8 @@ public class NotificationShelf extends ActivatableNotificationView {
        float viewStart = row.getTranslationY();
        int transformHeight = row.getActualHeight() + mPaddingBetweenElements;
        float viewEnd = viewStart + transformHeight;
        if (viewEnd >= shelfTransformationStart) {
        if (viewEnd >= shelfTransformationStart && !row.isPinned()
                && !row.isHeadsUpAnimatingAway()) {
            if (viewStart < shelfTransformationStart) {
                float linearAmount = (shelfTransformationStart - viewStart) / transformHeight;
                float interpolatedAmount =  Interpolators.ACCELERATE_DECELERATE.getInterpolation(
@@ -269,7 +276,8 @@ public class NotificationShelf extends ActivatableNotificationView {
        float transitionDistance = getIntrinsicHeight() * 1.5f;
        float transformationStartPosition = getTranslationY() - transitionDistance;
        float transitionAmount = 0.0f;
        if (viewStart < transformationStartPosition) {
        if (viewStart < transformationStartPosition || row.isPinned()
                || row.isHeadsUpAnimatingAway()) {
            // We simply place it on the icon of the notification
            iconState.yTranslation = notificationIconPosition - shelfIconPosition;
        } else {
+8 −2
Original line number Diff line number Diff line
@@ -202,7 +202,7 @@ public class NotificationPanelView extends PanelView implements
    private Runnable mHeadsUpExistenceChangedRunnable = new Runnable() {
        @Override
        public void run() {
            mHeadsUpAnimatingAway = false;
            setHeadsUpAnimatingAway(false);
            notifyBarPanelExpansionChanged();
        }
    };
@@ -2195,16 +2195,22 @@ public class NotificationPanelView extends PanelView implements

    @Override
    public void onHeadsUpPinnedModeChanged(final boolean inPinnedMode) {
        mNotificationStackScroller.setInHeadsUpPinnedMode(inPinnedMode);
        if (inPinnedMode) {
            mHeadsUpExistenceChangedRunnable.run();
            updateNotificationTranslucency();
        } else {
            mHeadsUpAnimatingAway = true;
            setHeadsUpAnimatingAway(true);
            mNotificationStackScroller.runAfterAnimationFinished(
                    mHeadsUpExistenceChangedRunnable);
        }
    }

    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
        mHeadsUpAnimatingAway = headsUpAnimatingAway;
        mNotificationStackScroller.setHeadsUpAnimatingAway(headsUpAnimatingAway);
    }

    @Override
    public void onHeadsUpPinned(ExpandableNotificationRow headsUp) {
        mNotificationStackScroller.generateHeadsUpAnimation(headsUp, true);
+41 −18
Original line number Diff line number Diff line
@@ -356,6 +356,9 @@ public class NotificationStackScrollLayout extends ViewGroup
    private boolean mNoAmbient;
    private final Rect mClipRect = new Rect();
    private boolean mIsClipped;
    private Rect mRequestedClipBounds;
    private boolean mInHeadsUpPinnedMode;
    private boolean mHeadsUpAnimatingAway;

    public NotificationStackScrollLayout(Context context) {
        this(context, null);
@@ -679,16 +682,6 @@ public class NotificationStackScrollLayout extends ViewGroup
        }
    }

    @Override
    public void setClipBounds(Rect clipBounds) {
        super.setClipBounds(clipBounds);
        boolean clipped = clipBounds != null;
        if (clipped != mIsClipped) {
            mIsClipped = clipped;
            updateFadingState();
        }
    }

    /**
     * Update the height of the panel.
     *
@@ -696,6 +689,7 @@ public class NotificationStackScrollLayout extends ViewGroup
     */
    public void setExpandedHeight(float height) {
        mExpandedHeight = height;
        setIsExpanded(height > 0);
        int minExpansionHeight = getMinExpansionHeight();
        if (height < minExpansionHeight) {
            mClipRect.left = 0;
@@ -703,11 +697,10 @@ public class NotificationStackScrollLayout extends ViewGroup
            mClipRect.top = 0;
            mClipRect.bottom = (int) height;
            height = minExpansionHeight;
            setClipBounds(mClipRect);
            setRequestedClipBounds(mClipRect);
        } else {
            setClipBounds(null);
            setRequestedClipBounds(null);
        }
        setIsExpanded(height > getMinExpansionHeight());
        int stackHeight;
        float translationY;
        float appearEndPosition = getAppearEndPosition();
@@ -733,6 +726,26 @@ public class NotificationStackScrollLayout extends ViewGroup
            requestChildrenUpdate();
        }
        setStackTranslation(translationY);
        requestChildrenUpdate();
    }

    private void setRequestedClipBounds(Rect clipRect) {
        mRequestedClipBounds = clipRect;
        updateClipping();
    }

    public void updateClipping() {
        boolean clipped = mRequestedClipBounds != null && !mInHeadsUpPinnedMode
                && !mHeadsUpAnimatingAway;
        if (mIsClipped != clipped) {
            mIsClipped = clipped;
            updateFadingState();
        }
        if (clipped) {
            setClipBounds(mRequestedClipBounds);
        } else {
            setClipBounds(null);
        }
    }

    /**
@@ -2508,7 +2521,7 @@ public class NotificationStackScrollLayout extends ViewGroup
        if (hasAddEvent) {
            // This child was just added lets remove all events.
            mHeadsUpChangeAnimations.removeAll(mTmpList);
            ((ExpandableNotificationRow ) child).setHeadsupDisappearRunning(false);
            ((ExpandableNotificationRow ) child).setHeadsUpAnimatingAway(false);
        }
        mTmpList.clear();
        return hasAddEvent;
@@ -2768,7 +2781,7 @@ public class NotificationStackScrollLayout extends ViewGroup
                        : AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR;
                if (row.isChildInGroup()) {
                    // We can otherwise get stuck in there if it was just isolated
                    row.setHeadsupDisappearRunning(false);
                    row.setHeadsUpAnimatingAway(false);
                }
            } else {
                ExpandableViewState viewState = mCurrentStackScrollState.getViewStateForView(row);
@@ -3271,10 +3284,10 @@ public class NotificationStackScrollLayout extends ViewGroup
            View view = getChildAt(i);
            if (view instanceof ExpandableNotificationRow) {
                ExpandableNotificationRow row = (ExpandableNotificationRow) view;
                row.setHeadsupDisappearRunning(false);
                row.setHeadsUpAnimatingAway(false);
                if (row.isSummaryWithChildren()) {
                    for (ExpandableNotificationRow child : row.getNotificationChildren()) {
                        child.setHeadsupDisappearRunning(false);
                        child.setHeadsUpAnimatingAway(false);
                    }
                }
            }
@@ -3833,7 +3846,7 @@ public class NotificationStackScrollLayout extends ViewGroup
            mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp));
            mNeedsAnimation = true;
            if (!mIsExpanded && !isHeadsUp) {
                row.setHeadsupDisappearRunning(true);
                row.setHeadsUpAnimatingAway(true);
            }
            requestChildrenUpdate();
        }
@@ -3982,6 +3995,16 @@ public class NotificationStackScrollLayout extends ViewGroup
                        - (mShelf.getIntrinsicHeight() - mStatusBarHeight) / 2;
    }

    public void setInHeadsUpPinnedMode(boolean inHeadsUpPinnedMode) {
        mInHeadsUpPinnedMode = inHeadsUpPinnedMode;
        updateClipping();
    }

    public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) {
        mHeadsUpAnimatingAway = headsUpAnimatingAway;
        updateClipping();
    }

    /**
     * A listener that is notified when some child locations might have changed.
     */
Loading