From 8b70910bebfeb5047a71b3d5a3756e97427ae17b Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Fri, 19 Mar 2021 17:19:51 -0700 Subject: [PATCH] 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 --- .../wm/shell/pip/phone/PipController.java | 19 +++++++++++++------ .../wm/shell/pip/phone/PipControllerTest.java | 8 ++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index d75c1d65614dc..62ae1d5d600c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -95,6 +95,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb private PipBoundsState mPipBoundsState; private PipTouchHandler mTouchHandler; private PipTransitionController mPipTransitionController; + private TaskStackListenerImpl mTaskStackListener; private Optional 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, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index 700bf7850604f..c61302be19b1f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -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