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

Commit ba61b98f authored by Alex Chau's avatar Alex Chau
Browse files

Snap to relative position to snappd task when dismissing

- Calculate the diff to snapped page scroll and apply in onLayout, so tasks won't jump after dismiss when not in snapped position
- In grid, always keep the relateive snapped page unchanged to avoid jump

Bug: 188793333
Test: manual
Change-Id: Id11c2d700dc55440de39cc7409d06a712cedc9bc
parent b14a7a2d
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -2438,12 +2438,15 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
                    resetTaskVisuals();

                    int pageToSnapTo = mCurrentPage;
                    if (finalNextFocusedTaskView != null) {
                        pageToSnapTo = indexOfChild(finalNextFocusedTaskView);
                    }
                    if (dismissedIndex < pageToSnapTo || pageToSnapTo == (taskCount - 1)) {
                    if ((dismissedIndex < pageToSnapTo && !showAsGrid)
                            || pageToSnapTo == taskCount - 1) {
                        pageToSnapTo -= 1;
                    }
                    if (showAsGrid) {
                        int primaryScroll = mOrientationHandler.getPrimaryScroll(RecentsView.this);
                        int currentPageScroll = getScrollForPage(pageToSnapTo);
                        mCurrentPageScrollDiff = primaryScroll - currentPageScroll;
                    }
                    removeViewInLayout(dismissedTaskView);
                    mTopRowIdSet.remove(dismissedTaskId);

@@ -2456,12 +2459,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
                            mFocusedTaskId = finalNextFocusedTaskView.getTaskId();
                            mTopRowIdSet.remove(mFocusedTaskId);
                            finalNextFocusedTaskView.animateIconScaleAndDimIntoView();
                            setCurrentPage(pageToSnapTo);
                        }
                        updateTaskSize(true);
                        // Update scroll and snap to page.
                        updateScrollSynchronously();
                        snapToPageImmediately(pageToSnapTo);
                        setCurrentPage(pageToSnapTo);
                        dispatchScrollChanged();
                    }
                }
+6 −1
Original line number Diff line number Diff line
@@ -104,6 +104,10 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou

    @ViewDebug.ExportedProperty(category = "launcher")
    protected int mCurrentPage;
    // Difference between current scroll position and mCurrentPage's page scroll. Used to maintain
    // relative scroll position unchanged in updateCurrentPageScroll. Cleared when snapping to a
    // page.
    protected int mCurrentPageScrollDiff;

    @ViewDebug.ExportedProperty(category = "launcher")
    protected int mNextPage = INVALID_PAGE;
@@ -247,7 +251,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
        // If the current page is invalid, just reset the scroll position to zero
        int newPosition = 0;
        if (0 <= mCurrentPage && mCurrentPage < getPageCount()) {
            newPosition = getScrollForPage(mCurrentPage);
            newPosition = getScrollForPage(mCurrentPage) + mCurrentPageScrollDiff;
        }
        mOrientationHandler.set(this, VIEW_SCROLL_TO, newPosition);
        mScroller.startScroll(mScroller.getCurrX(), 0, newPosition - mScroller.getCurrX(), 0);
@@ -452,6 +456,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
     * to provide custom behavior during animation.
     */
    protected void onPageEndTransition() {
        mCurrentPageScrollDiff = 0;
        AccessibilityManagerCompat.sendScrollFinishedEventToTest(getContext());
        AccessibilityManagerCompat.sendCustomAccessibilityEvent(getPageAt(mCurrentPage),
                AccessibilityEvent.TYPE_VIEW_FOCUSED, null);