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

Commit 1974fa7a authored by Tony Huang's avatar Tony Huang
Browse files

Reduce flicker for split resizing

Using screenshot fading out to reduce split resizing flicker caused
by content changed immediatly.

Bug: 245241787
Test: manual
Test: pass existing tests
Change-Id: I1949bffb6f9ddae78998eb90c1b5d469280b75ed
parent 6cc66e45
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import androidx.annotation.NonNull;

import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.R;
import com.android.wm.shell.common.ScreenshotUtils;
import com.android.wm.shell.common.SurfaceUtils;

import java.util.function.Consumer;
@@ -74,10 +75,14 @@ public class SplitDecorManager extends WindowlessWindowManager {

    private boolean mShown;
    private boolean mIsResizing;
    private Rect mBounds = new Rect();
    private final Rect mBounds = new Rect();
    private final Rect mResizingBounds = new Rect();
    private final Rect mTempRect = new Rect();
    private ValueAnimator mFadeAnimator;

    private int mIconSize;
    private int mOffsetX;
    private int mOffsetY;

    public SplitDecorManager(Configuration configuration, IconProvider iconProvider,
            SurfaceSession surfaceSession) {
@@ -158,7 +163,7 @@ public class SplitDecorManager extends WindowlessWindowManager {

    /** Showing resizing hint. */
    public void onResizing(ActivityManager.RunningTaskInfo resizingTask, Rect newBounds,
            Rect sideBounds, SurfaceControl.Transaction t) {
            Rect sideBounds, SurfaceControl.Transaction t, int offsetX, int offsetY) {
        if (mResizingIconView == null) {
            return;
        }
@@ -167,6 +172,9 @@ public class SplitDecorManager extends WindowlessWindowManager {
            mIsResizing = true;
            mBounds.set(newBounds);
        }
        mResizingBounds.set(newBounds);
        mOffsetX = offsetX;
        mOffsetY = offsetY;

        final boolean show =
                newBounds.width() > mBounds.width() || newBounds.height() > mBounds.height();
@@ -221,11 +229,37 @@ public class SplitDecorManager extends WindowlessWindowManager {

    /** Stops showing resizing hint. */
    public void onResized(SurfaceControl.Transaction t) {
        if (!mShown && mIsResizing) {
            mTempRect.set(mResizingBounds);
            mTempRect.offsetTo(-mOffsetX, -mOffsetY);
            final SurfaceControl screenshot = ScreenshotUtils.takeScreenshot(t,
                    mHostLeash, mTempRect, Integer.MAX_VALUE - 1);

            final SurfaceControl.Transaction animT = new SurfaceControl.Transaction();
            final ValueAnimator va = ValueAnimator.ofFloat(1, 0);
            va.addUpdateListener(valueAnimator -> {
                final float progress = (float) valueAnimator.getAnimatedValue();
                animT.setAlpha(screenshot, progress);
                animT.apply();
            });
            va.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(@androidx.annotation.NonNull Animator animation) {
                    animT.remove(screenshot);
                    animT.apply();
                    animT.close();
                }
            });
            va.start();
        }

        if (mResizingIconView == null) {
            return;
        }

        mIsResizing = false;
        mOffsetX = 0;
        mOffsetY = 0;
        if (mFadeAnimator != null && mFadeAnimator.isRunning()) {
            if (!mShown) {
                // If fade-out animation is running, just add release callback to it.
+3 −2
Original line number Diff line number Diff line
@@ -448,7 +448,8 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
     */
    void updateDivideBounds(int position) {
        updateBounds(position);
        mSplitLayoutHandler.onLayoutSizeChanging(this);
        mSplitLayoutHandler.onLayoutSizeChanging(this, mSurfaceEffectPolicy.mParallaxOffset.x,
                mSurfaceEffectPolicy.mParallaxOffset.y);
    }

    void setDividePosition(int position, boolean applyLayoutChange) {
@@ -811,7 +812,7 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange
         * @see #applySurfaceChanges(SurfaceControl.Transaction, SurfaceControl, SurfaceControl,
         * SurfaceControl, SurfaceControl, boolean)
         */
        void onLayoutSizeChanging(SplitLayout layout);
        void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY);

        /**
         * Calls when finish resizing the split bounds.
+3 −3
Original line number Diff line number Diff line
@@ -1633,14 +1633,14 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    }

    @Override
    public void onLayoutSizeChanging(SplitLayout layout) {
    public void onLayoutSizeChanging(SplitLayout layout, int offsetX, int offsetY) {
        final SurfaceControl.Transaction t = mTransactionPool.acquire();
        t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
        updateSurfaceBounds(layout, t, true /* applyResizingOffset */);
        getMainStageBounds(mTempRect1);
        getSideStageBounds(mTempRect2);
        mMainStage.onResizing(mTempRect1, mTempRect2, t);
        mSideStage.onResizing(mTempRect2, mTempRect1, t);
        mMainStage.onResizing(mTempRect1, mTempRect2, t, offsetX, offsetY);
        mSideStage.onResizing(mTempRect2, mTempRect1, t, offsetX, offsetY);
        t.apply();
        mTransactionPool.release(t);
    }
+4 −2
Original line number Diff line number Diff line
@@ -288,9 +288,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
        }
    }

    void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t) {
    void onResizing(Rect newBounds, Rect sideBounds, SurfaceControl.Transaction t, int offsetX,
            int offsetY) {
        if (mSplitDecorManager != null && mRootTaskInfo != null) {
            mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t);
            mSplitDecorManager.onResizing(mRootTaskInfo, newBounds, sideBounds, t, offsetX,
                    offsetY);
        }
    }

+2 −1
Original line number Diff line number Diff line
@@ -105,7 +105,8 @@ public class SplitLayoutTests extends ShellTestCase {
    @Test
    public void testUpdateDivideBounds() {
        mSplitLayout.updateDivideBounds(anyInt());
        verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class));
        verify(mSplitLayoutHandler).onLayoutSizeChanging(any(SplitLayout.class), anyInt(),
                anyInt());
    }

    @Test