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

Commit bb44c03b authored by Schneider Victor-tulias's avatar Schneider Victor-tulias
Browse files

Fix janky overview animation.

Switching to overview shortly after switching to 3-button mode caused a janky animation if the PagedView wasn't properly initialized yet. Moved the animation to a callback.

Fixes: 203632659
Fixes: 223719200
Test: manual
Change-Id: I8a345036c6b7322ae3fa50a23bcb7522f57c8a90
parent e73c3075
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.widget.Toast.LENGTH_SHORT;

import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER;
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
import static com.android.launcher3.PagedView.INVALID_PAGE;
import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
import static com.android.launcher3.anim.Interpolators.DEACCEL;
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
@@ -66,6 +67,7 @@ import android.graphics.RectF;
import android.os.Build;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnApplyWindowInsetsListener;
@@ -926,7 +928,13 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
            mLogDirectionUpOrLeft = velocity.x < 0;
        }
        mDownPos = downPos;
        handleNormalGestureEnd(endVelocity, isFling, velocity, false /* isCancel */);
        Runnable handleNormalGestureEndCallback = () ->
                handleNormalGestureEnd(endVelocity, isFling, velocity, /* isCancel= */ false);
        if (mRecentsView != null) {
            mRecentsView.runOnPageScrollsInitialized(handleNormalGestureEndCallback);
        } else {
            handleNormalGestureEndCallback.run();
        }
    }

    private void endRunningWindowAnim(boolean cancel) {
@@ -1130,6 +1138,13 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
        } else if (endTarget == RECENTS) {
            if (mRecentsView != null) {
                int nearestPage = mRecentsView.getDestinationPage();
                if (nearestPage == INVALID_PAGE) {
                    // Allow the snap to invalid page to catch future error cases.
                    Log.e(TAG,
                            "RecentsView destination page is invalid",
                            new IllegalStateException());
                }

                boolean isScrolling = false;
                if (mRecentsView.getNextPage() != nearestPage) {
                    // We shouldn't really scroll to the next page when swiping up to recents.
+8 −7
Original line number Diff line number Diff line
@@ -1855,17 +1855,18 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
        if (!mActivity.getDeviceProfile().isTablet) {
            return super.getDestinationPage(scaledScroll);
        }

        final int childCount = getChildCount();
        if (mPageScrolls == null || childCount != mPageScrolls.length) {
            return -1;
        if (!pageScrollsInitialized()) {
            Log.e(TAG,
                    "Cannot get destination page: RecentsView not properly initialized",
                    new IllegalStateException());
            return INVALID_PAGE;
        }

        // When in tablet with variable task width, return the page which scroll is closest to
        // screenStart instead of page nearest to center of screen.
        int minDistanceFromScreenStart = Integer.MAX_VALUE;
        int minDistanceFromScreenStartIndex = -1;
        for (int i = 0; i < childCount; ++i) {
        int minDistanceFromScreenStartIndex = INVALID_PAGE;
        for (int i = 0; i < getChildCount(); ++i) {
            int distanceFromScreenStart = Math.abs(mPageScrolls[i] - scaledScroll);
            if (distanceFromScreenStart < minDistanceFromScreenStart) {
                minDistanceFromScreenStart = distanceFromScreenStart;
+38 −11
Original line number Diff line number Diff line
@@ -129,7 +129,10 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
    private boolean mAllowEasyFling;
    protected PagedOrientationHandler mOrientationHandler = PagedOrientationHandler.PORTRAIT;

    protected int[] mPageScrolls;
    private final ArrayList<Runnable> mOnPageScrollsInitializedCallbacks = new ArrayList<>();

    // We should always check pageScrollsInitialized() is true when using mPageScrolls.
    @Nullable protected int[] mPageScrolls = null;
    private boolean mIsBeingDragged;

    // The amount of movement to begin scrolling
@@ -684,14 +687,37 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
        setMeasuredDimension(widthSize, heightSize);
    }

    /** Returns true iff this PagedView's scroll amounts are initialized to each page index. */
    protected boolean pageScrollsInitialized() {
        return mPageScrolls != null && mPageScrolls.length == getChildCount();
    }

    /**
     * Queues the given callback to be run once {@code mPageScrolls} has been initialized.
     */
    public void runOnPageScrollsInitialized(Runnable callback) {
        mOnPageScrollsInitializedCallbacks.add(callback);
        if (pageScrollsInitialized()) {
            onPageScrollsInitialized();
        }
    }

    private void onPageScrollsInitialized() {
        for (Runnable callback : mOnPageScrollsInitializedCallbacks) {
            callback.run();
        }
        mOnPageScrollsInitializedCallbacks.clear();
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        mIsLayoutValid = true;
        final int childCount = getChildCount();
        int[] pageScrolls = mPageScrolls;
        boolean pageScrollChanged = false;
        if (mPageScrolls == null || childCount != mPageScrolls.length) {
            mPageScrolls = new int[childCount];
        if (!pageScrollsInitialized()) {
            pageScrolls = new int[childCount];
            pageScrollChanged = true;
        }

@@ -701,10 +727,8 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou

        if (DEBUG) Log.d(TAG, "PagedView.onLayout()");

        boolean isScrollChanged = getPageScrolls(mPageScrolls, true, SIMPLE_SCROLL_LOGIC);
        if (isScrollChanged) {
            pageScrollChanged = true;
        }
        pageScrollChanged |= getPageScrolls(pageScrolls, true, SIMPLE_SCROLL_LOGIC);
        mPageScrolls = pageScrolls;

        final LayoutTransition transition = getLayoutTransition();
        // If the transition is running defer updating max scroll, as some empty pages could
@@ -738,6 +762,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
        if (mScroller.isFinished() && pageScrollChanged) {
            setCurrentPage(getNextPage());
        }
        onPageScrollsInitialized();
    }

    /**
@@ -849,8 +874,10 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
    @Override
    public void onViewRemoved(View child) {
        super.onViewRemoved(child);
        runOnPageScrollsInitialized(() -> {
            mCurrentPage = validateNewPage(mCurrentPage);
            mCurrentScrollOverPage = mCurrentPage;
        });
        dispatchPageCountChanged();
    }

@@ -1153,7 +1180,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
    }

    public int getScrollForPage(int index) {
        if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
        if (!pageScrollsInitialized() || index >= mPageScrolls.length || index < 0) {
            return 0;
        } else {
            return mPageScrolls[index];
@@ -1163,7 +1190,7 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
    // While layout transitions are occurring, a child's position may stray from its baseline
    // position. This method returns the magnitude of this stray at any given time.
    public int getLayoutTransitionOffsetForPage(int index) {
        if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
        if (!pageScrollsInitialized() || index >= mPageScrolls.length || index < 0) {
            return 0;
        } else {
            View child = getChildAt(index);