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

Commit 1c0bfee2 authored by Tony Huang's avatar Tony Huang Committed by Automerger Merge Worker
Browse files

Merge "Reduce flicker for split resizing" into tm-qpr-dev am: 32c99955

parents 23bc5e6b 32c99955
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