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

Commit 8b70910b authored by Ben Lin's avatar Ben Lin Committed by Winson Chung
Browse files

PiP: Ensure PiP menu layout updates are on Shell main thread.

Only the thread which created the menu view (shell main thread) can
update its view layout, so ensuring that it is executed in that sense.

Also moved setup work in PipController to Shell Main thread. Ideally
they should be in ShellInit, but that will need to wait until
tv.PipController can unify with PipController.

Bug: 182418859
Test: Enter PIP
Change-Id: Ib88fefb9320ab441715c6ef3d5cf4f80dc9f022f
parent 65da93d3
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
    private PipBoundsState mPipBoundsState;
    private PipTouchHandler mTouchHandler;
    private PipTransitionController mPipTransitionController;
    private TaskStackListenerImpl mTaskStackListener;
    private Optional<OneHandedController> mOneHandedController;
    protected final PipImpl mImpl;

@@ -291,12 +292,18 @@ public class PipController implements PipTransitionController.PipTransitionCallb
        mAppOpsListener = pipAppOpsListener;
        mOneHandedController = oneHandedController;
        mPipTransitionController = pipTransitionController;
        mTaskStackListener = taskStackListener;
        mPipInputConsumer = new PipInputConsumer(WindowManagerGlobal.getWindowManagerService(),
                INPUT_CONSUMER_PIP, mainExecutor);
        //TODO: move this to ShellInit when PipController can be injected
        mMainExecutor.execute(this::init);
    }

    public void init() {
        mPipTransitionController.registerPipTransitionCallback(this);
        mPipTaskOrganizer.registerOnDisplayIdChangeCallback((int displayId) -> {
            mPipBoundsState.setDisplayId(displayId);
            onDisplayChanged(displayController.getDisplayLayout(displayId),
            onDisplayChanged(mDisplayController.getDisplayLayout(displayId),
                    false /* saveRestoreSnapFraction */);
        });
        mPipBoundsState.setOnMinimalSizeChangeCallback(
@@ -321,13 +328,13 @@ public class PipController implements PipTransitionController.PipTransitionCallb
            mPipInputConsumer.setInputListener(mTouchHandler::handleTouchEvent);
            mPipInputConsumer.setRegistrationListener(mTouchHandler::onRegistrationChanged);
        }
        displayController.addDisplayChangingController(mRotationController);
        displayController.addDisplayWindowListener(mDisplaysChangedListener);
        mDisplayController.addDisplayChangingController(mRotationController);
        mDisplayController.addDisplayWindowListener(mDisplaysChangedListener);

        // Ensure that we have the display info in case we get calls to update the bounds before the
        // listener calls back
        mPipBoundsState.setDisplayId(context.getDisplayId());
        mPipBoundsState.setDisplayLayout(new DisplayLayout(context, context.getDisplay()));
        mPipBoundsState.setDisplayId(mContext.getDisplayId());
        mPipBoundsState.setDisplayLayout(new DisplayLayout(mContext, mContext.getDisplay()));

        try {
            mWindowManagerShellWrapper.addPinnedStackListener(mPinnedTaskListener);
@@ -349,7 +356,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
        }

        // Handle for system task stack changes.
        taskStackListener.addListener(
        mTaskStackListener.addListener(
                new TaskStackListenerCallback() {
                    @Override
                    public void onActivityPinned(String packageName, int userId, int taskId,
+4 −4
Original line number Diff line number Diff line
@@ -83,15 +83,15 @@ public class PipControllerTest extends ShellTestCase {
    @Before
    public void setUp() throws RemoteException {
        MockitoAnnotations.initMocks(this);
        doAnswer(invocation -> {
            ((Runnable) invocation.getArgument(0)).run();
            return null;
        }).when(mMockExecutor).execute(any());
        mPipController = new PipController(mContext, mMockDisplayController,
                mMockPipAppOpsListener, mMockPipBoundsAlgorithm, mMockPipBoundsState,
                mMockPipMediaController, mMockPhonePipMenuController, mMockPipTaskOrganizer,
                mMockPipTouchHandler, mMockPipTransitionController, mMockWindowManagerShellWrapper,
                mMockTaskStackListener, mMockOneHandedController, mMockExecutor);
        doAnswer(invocation -> {
            ((Runnable) invocation.getArgument(0)).run();
            return null;
        }).when(mMockExecutor).execute(any());
    }

    @Test