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

Commit 118295e0 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Fix some jank with transitions

- Animations in WorkspacePageIndicator while the app transition
was running was causing layer trashing, potentially leading to
jank.
- Make sure to use a layer in the wallpaper open animation.

Test: Open app while indicators are about to fade out.
Bug: 75985430
Change-Id: Iad6a511d98dff81b5cde727f4472f0f039ffc4be
parent dcad5534
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -333,10 +333,14 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
            launcherAnimator.play(dragLayerAlpha);
            launcherAnimator.play(dragLayerTransY);
            mDragLayer.setLayerType(View.LAYER_TYPE_HARDWARE, null);

            // Pause page indicator animations as they lead to layer trashing.
            mLauncher.getWorkspace().getPageIndicator().pauseAnimations();
            endListener = () -> {
                mDragLayer.setLayerType(View.LAYER_TYPE_NONE, null);
                mDragLayer.setAlpha(1);
                mDragLayer.setTranslationY(0);
                mLauncher.getWorkspace().getPageIndicator().skipAnimationsToEnd();
            };
        }
        return new Pair<>(launcherAnimator, endListener);
@@ -699,6 +703,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
            workspaceAnimator.setStartDelay(LAUNCHER_RESUME_START_DELAY);
            workspaceAnimator.setDuration(333);
            workspaceAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
            currentPage.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            workspaceAnimator.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    currentPage.setLayerType(View.LAYER_TYPE_NONE, null);
                }
            });

            // Animate the shelf in two parts: slide in, and overeshoot.
            AllAppsTransitionController allAppsController = mLauncher.getAllAppsController();
@@ -720,7 +731,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
            allAppsOvershoot.setDuration(153);
            allAppsOvershoot.setInterpolator(Interpolators.OVERSHOOT_0);


            anim.play(workspaceAnimator);
            anim.playSequentially(allAppsSlideIn, allAppsOvershoot);
            anim.addListener(mReapplyStateListener);
+24 −1
Original line number Diff line number Diff line
@@ -41,8 +41,9 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi
    private static final int LINE_ALPHA_ANIMATOR_INDEX = 0;
    private static final int NUM_PAGES_ANIMATOR_INDEX = 1;
    private static final int TOTAL_SCROLL_ANIMATOR_INDEX = 2;
    private static final int ANIMATOR_COUNT = 3;

    private ValueAnimator[] mAnimators = new ValueAnimator[3];
    private ValueAnimator[] mAnimators = new ValueAnimator[ANIMATOR_COUNT];

    private final Handler mDelayedLineFadeHandler = new Handler(Looper.getMainLooper());
    private final Launcher mLauncher;
@@ -232,6 +233,28 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi
        mAnimators[animatorIndex].start();
    }

    /**
     * Pauses all currently running animations.
     */
    public void pauseAnimations() {
        for (int i = 0; i < ANIMATOR_COUNT; i++) {
            if (mAnimators[i] != null) {
                mAnimators[i].pause();
            }
        }
    }

    /**
     * Force-ends all currently running or paused animations.
     */
    public void skipAnimationsToEnd() {
        for (int i = 0; i < ANIMATOR_COUNT; i++) {
            if (mAnimators[i] != null) {
                mAnimators[i].end();
            }
        }
    }

    @Override
    public void setInsets(Rect insets) {
        DeviceProfile grid = mLauncher.getDeviceProfile();