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

Commit 63b565d6 authored by Hongwei Wang's avatar Hongwei Wang Committed by Android (Google) Code Review
Browse files

Merge "Use SyncTransactionQueue in PiP" into sc-dev

parents be1e8edc 33c42511
Loading
Loading
Loading
Loading
+47 −59
Original line number Original line Diff line number Diff line
@@ -58,13 +58,13 @@ import android.view.SurfaceControl;
import android.window.TaskOrganizer;
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransactionCallback;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.wm.shell.R;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.pip.phone.PipMotionHelper;
import com.android.wm.shell.pip.phone.PipMotionHelper;
@@ -123,6 +123,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        }
        }
    }
    }


    private final SyncTransactionQueue mSyncTransactionQueue;
    private final PipBoundsState mPipBoundsState;
    private final PipBoundsState mPipBoundsState;
    private final PipBoundsAlgorithm mPipBoundsAlgorithm;
    private final PipBoundsAlgorithm mPipBoundsAlgorithm;
    private final @NonNull PipMenuController mPipMenuController;
    private final @NonNull PipMenuController mPipMenuController;
@@ -205,7 +206,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
     */
     */
    private boolean mInSwipePipToHomeTransition;
    private boolean mInSwipePipToHomeTransition;


    public PipTaskOrganizer(Context context, @NonNull PipBoundsState pipBoundsState,
    public PipTaskOrganizer(Context context,
            @NonNull SyncTransactionQueue syncTransactionQueue,
            @NonNull PipBoundsState pipBoundsState,
            @NonNull PipBoundsAlgorithm boundsHandler,
            @NonNull PipBoundsAlgorithm boundsHandler,
            @NonNull PipMenuController pipMenuController,
            @NonNull PipMenuController pipMenuController,
            @NonNull PipAnimationController pipAnimationController,
            @NonNull PipAnimationController pipAnimationController,
@@ -216,6 +219,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            @NonNull PipUiEventLogger pipUiEventLogger,
            @NonNull PipUiEventLogger pipUiEventLogger,
            @NonNull ShellTaskOrganizer shellTaskOrganizer,
            @NonNull ShellTaskOrganizer shellTaskOrganizer,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        mSyncTransactionQueue = syncTransactionQueue;
        mPipBoundsState = pipBoundsState;
        mPipBoundsState = pipBoundsState;
        mPipBoundsAlgorithm = boundsHandler;
        mPipBoundsAlgorithm = boundsHandler;
        mPipMenuController = pipMenuController;
        mPipMenuController = pipMenuController;
@@ -337,11 +341,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                        : WINDOWING_MODE_FULLSCREEN);
                        : WINDOWING_MODE_FULLSCREEN);
        wct.setBounds(mToken, destinationBounds);
        wct.setBounds(mToken, destinationBounds);
        wct.setBoundsChangeTransaction(mToken, tx);
        wct.setBoundsChangeTransaction(mToken, tx);
        mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() {
        mSyncTransactionQueue.queue(wct);
            @Override
        mSyncTransactionQueue.runInSync(t -> {
            public void onTransactionReady(int id, SurfaceControl.Transaction t) {
                mMainExecutor.execute(() -> {
                    t.apply();
            // Make sure to grab the latest source hint rect as it could have been
            // Make sure to grab the latest source hint rect as it could have been
            // updated right after applying the windowing mode change.
            // updated right after applying the windowing mode change.
            final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
            final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect(
@@ -352,8 +353,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            mState = State.EXITING_PIP;
            mState = State.EXITING_PIP;
        });
        });
    }
    }
        });
    }


    private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) {
    private void applyWindowingModeChangeOnExit(WindowContainerTransaction wct, int direction) {
        // Reset the final windowing mode.
        // Reset the final windowing mode.
@@ -502,18 +501,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
        wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED);
        wct.setBounds(mToken, destinationBounds);
        wct.setBounds(mToken, destinationBounds);
        wct.scheduleFinishEnterPip(mToken, destinationBounds);
        wct.scheduleFinishEnterPip(mToken, destinationBounds);
        // TODO: Migrate to SyncTransactionQueue
        mSyncTransactionQueue.queue(wct);
        mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() {
            @Override
            public void onTransactionReady(int id, SurfaceControl.Transaction t) {
                mMainExecutor.execute(() -> {
                    t.apply();
        if (runnable != null) {
        if (runnable != null) {
                        runnable.run();
            mSyncTransactionQueue.runInSync(t -> runnable.run());
        }
        }
                });
            }
        });
    }
    }


    private void sendOnPipTransitionStarted(
    private void sendOnPipTransitionStarted(
@@ -951,16 +942,14 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
            final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken);
            final SurfaceControl snapshotSurface = mTaskOrganizer.takeScreenshot(mToken);
            mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot(
            mSurfaceTransactionHelper.reparentAndShowSurfaceSnapshot(
                    mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface);
                    mSurfaceControlTransactionFactory.getTransaction(), mLeash, snapshotSurface);
            mTaskOrganizer.applySyncTransaction(wct, new WindowContainerTransactionCallback() {
            mSyncTransactionQueue.queue(wct);
                @Override
            mSyncTransactionQueue.runInSync(t -> {
                public void onTransactionReady(int id, @NonNull SurfaceControl.Transaction t) {
                // Scale the snapshot from its pre-resize bounds to the post-resize bounds.
                // Scale the snapshot from its pre-resize bounds to the post-resize bounds.
                final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(),
                final Rect snapshotSrc = new Rect(0, 0, snapshotSurface.getWidth(),
                        snapshotSurface.getHeight());
                        snapshotSurface.getHeight());
                final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(),
                final Rect snapshotDest = new Rect(0, 0, destinationBounds.width(),
                        destinationBounds.height());
                        destinationBounds.height());
                mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest);
                mSurfaceTransactionHelper.scale(t, snapshotSurface, snapshotSrc, snapshotDest);
                    t.apply();


                mMainExecutor.execute(() -> {
                mMainExecutor.execute(() -> {
                    // Start animation to fade out the snapshot.
                    // Start animation to fade out the snapshot.
@@ -968,10 +957,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                    animator.setDuration(mEnterExitAnimationDuration);
                    animator.setDuration(mEnterExitAnimationDuration);
                    animator.addUpdateListener(animation -> {
                    animator.addUpdateListener(animation -> {
                        final float alpha = (float) animation.getAnimatedValue();
                        final float alpha = (float) animation.getAnimatedValue();
                            final SurfaceControl.Transaction tx =
                        final SurfaceControl.Transaction transaction =
                                mSurfaceControlTransactionFactory.getTransaction();
                                mSurfaceControlTransactionFactory.getTransaction();
                            tx.setAlpha(snapshotSurface, alpha);
                        transaction.setAlpha(snapshotSurface, alpha);
                            tx.apply();
                        transaction.apply();
                    });
                    });
                    animator.addListener(new AnimatorListenerAdapter() {
                    animator.addListener(new AnimatorListenerAdapter() {
                        @Override
                        @Override
@@ -984,7 +973,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                    });
                    });
                    animator.start();
                    animator.start();
                });
                });
                }
            });
            });
        } else {
        } else {
            applyFinishBoundsResize(wct, direction);
            applyFinishBoundsResize(wct, direction);
+7 −5
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.pip.phone.PhonePipMenuController;
import com.android.wm.shell.pip.phone.PhonePipMenuController;


@@ -65,8 +66,8 @@ import java.util.Optional;
public class PipTaskOrganizerTest extends ShellTestCase {
public class PipTaskOrganizerTest extends ShellTestCase {
    private PipTaskOrganizer mSpiedPipTaskOrganizer;
    private PipTaskOrganizer mSpiedPipTaskOrganizer;


    @Mock private DisplayController mMockdDisplayController;
    @Mock private DisplayController mMockDisplayController;

    @Mock private SyncTransactionQueue mMockSyncTransactionQueue;
    @Mock private PhonePipMenuController mMockPhonePipMenuController;
    @Mock private PhonePipMenuController mMockPhonePipMenuController;
    @Mock private PipAnimationController mMockPipAnimationController;
    @Mock private PipAnimationController mMockPipAnimationController;
    @Mock private PipTransitionController mMockPipTransitionController;
    @Mock private PipTransitionController mMockPipTransitionController;
@@ -89,10 +90,11 @@ public class PipTaskOrganizerTest extends ShellTestCase {
        mPipBoundsState = new PipBoundsState(mContext);
        mPipBoundsState = new PipBoundsState(mContext);
        mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
        mPipBoundsAlgorithm = new PipBoundsAlgorithm(mContext, mPipBoundsState);
        mMainExecutor = new TestShellExecutor();
        mMainExecutor = new TestShellExecutor();
        mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext, mPipBoundsState,
        mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mContext,
                mMockSyncTransactionQueue, mPipBoundsState,
                mPipBoundsAlgorithm, mMockPhonePipMenuController,
                mPipBoundsAlgorithm, mMockPhonePipMenuController,
                mMockPipAnimationController, mMockPipSurfaceTransactionHelper,
                mMockPipAnimationController, mMockPipSurfaceTransactionHelper,
                mMockPipTransitionController, mMockOptionalSplitScreen, mMockdDisplayController,
                mMockPipTransitionController, mMockOptionalSplitScreen, mMockDisplayController,
                mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor));
                mMockPipUiEventLogger, mMockShellTaskOrganizer, mMainExecutor));
        mMainExecutor.flushAll();
        mMainExecutor.flushAll();
        preparePipTaskOrg();
        preparePipTaskOrg();
@@ -105,7 +107,7 @@ public class PipTaskOrganizerTest extends ShellTestCase {


    @Test
    @Test
    public void instantiatePipTaskOrganizer_addsDisplayWindowListener() {
    public void instantiatePipTaskOrganizer_addsDisplayWindowListener() {
        verify(mMockdDisplayController).addDisplayWindowListener(any());
        verify(mMockDisplayController).addDisplayWindowListener(any());
    }
    }


    @Test
    @Test
+4 −3
Original line number Original line Diff line number Diff line
@@ -19,16 +19,15 @@ package com.android.systemui.wmshell;
import android.content.Context;
import android.content.Context;
import android.os.Handler;
import android.os.Handler;


import com.android.systemui.dagger.WMComponent;
import com.android.systemui.dagger.WMSingleton;
import com.android.systemui.dagger.WMSingleton;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.common.SystemWindows;
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.common.TaskStackListenerImpl;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.PipAnimationController;
import com.android.wm.shell.pip.PipAnimationController;
@@ -140,6 +139,7 @@ public abstract class TvPipModule {
    @Provides
    @Provides
    static PipTaskOrganizer providePipTaskOrganizer(Context context,
    static PipTaskOrganizer providePipTaskOrganizer(Context context,
            TvPipMenuController tvPipMenuController,
            TvPipMenuController tvPipMenuController,
            SyncTransactionQueue syncTransactionQueue,
            PipBoundsState pipBoundsState,
            PipBoundsState pipBoundsState,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PipAnimationController pipAnimationController,
            PipAnimationController pipAnimationController,
@@ -149,7 +149,8 @@ public abstract class TvPipModule {
            DisplayController displayController,
            DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm,
        return new PipTaskOrganizer(context,
                syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm,
                tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper,
                tvPipMenuController, pipAnimationController, pipSurfaceTransactionHelper,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                shellTaskOrganizer, mainExecutor);
                shellTaskOrganizer, mainExecutor);
+3 −1
Original line number Original line Diff line number Diff line
@@ -172,6 +172,7 @@ public class WMShellModule {
    @WMSingleton
    @WMSingleton
    @Provides
    @Provides
    static PipTaskOrganizer providePipTaskOrganizer(Context context,
    static PipTaskOrganizer providePipTaskOrganizer(Context context,
            SyncTransactionQueue syncTransactionQueue,
            PipBoundsState pipBoundsState,
            PipBoundsState pipBoundsState,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PipBoundsAlgorithm pipBoundsAlgorithm,
            PhonePipMenuController menuPhoneController,
            PhonePipMenuController menuPhoneController,
@@ -182,7 +183,8 @@ public class WMShellModule {
            DisplayController displayController,
            DisplayController displayController,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer,
            @ShellMainThread ShellExecutor mainExecutor) {
            @ShellMainThread ShellExecutor mainExecutor) {
        return new PipTaskOrganizer(context, pipBoundsState, pipBoundsAlgorithm,
        return new PipTaskOrganizer(context,
                syncTransactionQueue, pipBoundsState, pipBoundsAlgorithm,
                menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper,
                menuPhoneController, pipAnimationController, pipSurfaceTransactionHelper,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                pipTransitionController, splitScreenOptional, displayController, pipUiEventLogger,
                shellTaskOrganizer, mainExecutor);
                shellTaskOrganizer, mainExecutor);