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

Commit 33c42511 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Use SyncTransactionQueue in PiP

Bug: 171393374
Test: manual, make sure PiP makes as before
Test: atest PinnedStackTests \
            WMShellUnitTests:com.android.wm.shell.pip
Change-Id: I9014f7df900a6f0a900874b4ee4f2345bb99f886
parent 7660d740
Loading
Loading
Loading
Loading
+47 −59
Original line number Diff line number Diff line
@@ -58,13 +58,13 @@ import android.view.SurfaceControl;
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import android.window.WindowContainerTransactionCallback;

import com.android.internal.annotations.VisibleForTesting;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
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.legacysplitscreen.LegacySplitScreenController;
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 PipBoundsAlgorithm mPipBoundsAlgorithm;
    private final @NonNull PipMenuController mPipMenuController;
@@ -201,7 +202,9 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
     */
    private boolean mInSwipePipToHomeTransition;

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

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

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

                mMainExecutor.execute(() -> {
                    // Start animation to fade out the snapshot.
@@ -953,10 +942,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                    animator.setDuration(mEnterExitAnimationDuration);
                    animator.addUpdateListener(animation -> {
                        final float alpha = (float) animation.getAnimatedValue();
                            final SurfaceControl.Transaction tx =
                        final SurfaceControl.Transaction transaction =
                                mSurfaceControlTransactionFactory.getTransaction();
                            tx.setAlpha(snapshotSurface, alpha);
                            tx.apply();
                        transaction.setAlpha(snapshotSurface, alpha);
                        transaction.apply();
                    });
                    animator.addListener(new AnimatorListenerAdapter() {
                        @Override
@@ -969,7 +958,6 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener,
                    });
                    animator.start();
                });
                }
            });
        } else {
            applyFinishBoundsResize(wct, direction);
+7 −5
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayController;
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.pip.phone.PhonePipMenuController;

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

    @Mock private DisplayController mMockdDisplayController;

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

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

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

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