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

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

Made the dismissal of notifications snappier

The notifications now dismiss as soon as the finger is
lifted from the screen and we don't wait until it's fully
translated.

Change-Id: I2a37e019ce628ccf77e12bf8756bd05e549eca61
Fixes: 27418846
parent 3f19f60d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -669,6 +669,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
        mRemoved = removed;
    }

    public NotificationChildrenContainer getChildrenContainer() {
        return mChildrenContainer;
    }

    public interface ExpansionLogger {
        public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
    }
+9 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ public abstract class ExpandableView extends FrameLayout {
    private int mMinClipTopAmount = 0;
    private boolean mClipToActualHeight = true;
    private boolean mChangingPosition = false;
    private ViewGroup mTransientContainer;

    public ExpandableView(Context context, AttributeSet attrs) {
        super(context, attrs);
@@ -416,6 +417,14 @@ public abstract class ExpandableView extends FrameLayout {
        return mChangingPosition;
    }

    public void setTransientContainer(ViewGroup transientContainer) {
        mTransientContainer = transientContainer;
    }

    public ViewGroup getTransientContainer() {
        return mTransientContainer;
    }

    /**
     * A listener notifying when {@link #getActualHeight} changes.
     */
+2 −1
Original line number Diff line number Diff line
@@ -1736,7 +1736,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                    if (mNotificationData.get(remove.getStatusBarNotification().getKey()) == null) {
                        // We only want to add an animation if the view is completely removed
                        // otherwise it's just a transfer
                        mStackScroller.notifyGroupChildRemoved(remove);
                        mStackScroller.notifyGroupChildRemoved(remove,
                                parent.getChildrenContainer());
                    }
                }
            }
+49 −13
Original line number Diff line number Diff line
@@ -686,6 +686,17 @@ public class NotificationStackScrollLayout extends ViewGroup
    }

    public void onChildDismissed(View v) {
        ExpandableNotificationRow row = (ExpandableNotificationRow) v;
        if (!row.isDismissed()) {
            handleChildDismissed(v);
        }
        ViewGroup transientContainer = row.getTransientContainer();
        if (transientContainer != null) {
            transientContainer.removeTransientView(v);
        }
    }

    private void handleChildDismissed(View v) {
        if (mDismissAllInProgress) {
            return;
        }
@@ -2058,7 +2069,7 @@ public class NotificationStackScrollLayout extends ViewGroup
        // we only call our internal methods if this is actually a removal and not just a
        // notification which becomes a child notification
        if (!mChildTransferInProgress) {
            onViewRemovedInternal(child);
            onViewRemovedInternal(child, this);
        }
    }

@@ -2070,24 +2081,30 @@ public class NotificationStackScrollLayout extends ViewGroup
        }
    }

    private void onViewRemovedInternal(View child) {
    private void onViewRemovedInternal(View child, ViewGroup transientContainer) {
        if (mChangePositionInProgress) {
            // This is only a position change, don't do anything special
            return;
        }
        ((ExpandableView) child).setOnHeightChangedListener(null);
        ExpandableView expandableView = (ExpandableView) child;
        expandableView.setOnHeightChangedListener(null);
        mCurrentStackScrollState.removeViewStateForView(child);
        updateScrollStateForRemovedChild((ExpandableView) child);
        updateScrollStateForRemovedChild(expandableView);
        boolean animationGenerated = generateRemoveAnimation(child);
        if (animationGenerated && !mSwipedOutViews.contains(child)) {
            // Add this view to an overlay in order to ensure that it will still be temporary
            // drawn when removed
        if (animationGenerated) {
            if (!mSwipedOutViews.contains(child)) {
                getOverlay().add(child);
            } else if (Math.abs(expandableView.getTranslation()) != expandableView.getWidth()) {
                transientContainer.addTransientView(child, 0);
                expandableView.setTransientContainer(transientContainer);
            }
        } else {
            mSwipedOutViews.remove(child);
        }
        updateAnimationState(false, child);

        // Make sure the clipRect we might have set is removed
        ((ExpandableView) child).setClipTopOptimization(0);
        expandableView.setClipTopOptimization(0);
    }

    private boolean isChildInGroup(View child) {
@@ -2264,8 +2281,8 @@ public class NotificationStackScrollLayout extends ViewGroup
        }
    }

    public void notifyGroupChildRemoved(View row) {
        onViewRemovedInternal(row);
    public void notifyGroupChildRemoved(View row, ViewGroup childrenContainer) {
        onViewRemovedInternal(row, childrenContainer);
    }

    public void notifyGroupChildAdded(View row) {
@@ -2472,8 +2489,8 @@ public class NotificationStackScrollLayout extends ViewGroup
            // we need to know the view after this one
            event.viewAfterChangingView = getFirstChildBelowTranlsationY(child.getTranslationY());
            mAnimationEvents.add(event);
            mSwipedOutViews.remove(child);
        }
        mSwipedOutViews.clear();
        mChildrenToRemoveAnimated.clear();
    }

@@ -2746,11 +2763,25 @@ public class NotificationStackScrollLayout extends ViewGroup
            mOwnScrollY = 0;
            mPhoneStatusBar.resetUserExpandedStates();

            // lets make sure nothing is in the overlay anymore
            // lets make sure nothing is in the overlay / transient anymore
            clearTransientViews(this);
            for (int i = 0; i < getChildCount(); i++) {
                ExpandableView child = (ExpandableView) getChildAt(i);
                if (child instanceof ExpandableNotificationRow) {
                    ExpandableNotificationRow row = (ExpandableNotificationRow) child;
                    clearTransientViews(row.getChildrenContainer());
                }
            }
            getOverlay().clear();
        }
    }

    private void clearTransientViews(ViewGroup viewGroup) {
        while (viewGroup != null && viewGroup.getTransientViewCount() != 0) {
            viewGroup.removeTransientView(getTransientView(0));
        }
    }

    public void onPanelTrackingStarted() {
        mPanelTracking = true;
    }
@@ -3573,6 +3604,11 @@ public class NotificationStackScrollLayout extends ViewGroup
        public void dismissChild(final View view, float velocity,
                boolean useAccelerateInterpolator) {
            super.dismissChild(view, velocity, useAccelerateInterpolator);
            if (mIsExpanded) {
                // We don't want to quick-dismiss when it's a heads up as this might lead to closing
                // of the panel early.
                handleChildDismissed(view);
            }
            handleGearCoveredOrDismissed();
        }

+5 −1
Original line number Diff line number Diff line
@@ -865,8 +865,12 @@ public class StackStateAnimator {
            } else if (event.animationType ==
                NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) {
                // A race condition can trigger the view to be added to the overlay even though
                // it is swiped out. So let's remove it
                // it was fully swiped out. So let's remove it
                mHostLayout.getOverlay().remove(changingView);
                if (Math.abs(changingView.getTranslation()) == changingView.getWidth()
                        && changingView.getTransientContainer() != null) {
                    changingView.getTransientContainer().removeTransientView(changingView);
                }
            } else if (event.animationType == NotificationStackScrollLayout
                    .AnimationEvent.ANIMATION_TYPE_GROUP_EXPANSION_CHANGED) {
                ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView;