From 5982b805846bbd4a904dc7226c92396a02c09c48 Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Wed, 2 Mar 2022 11:01:44 +0000 Subject: [PATCH] Fix no touch events on half of the split screen Make sure the surface bounds of split root tasks will be properly set after enabled shell-transition. So client apps can inherit the correct touch region. Fix: 222163100 Test: atest StageCoordinatorTests Test: manual check with the repro steps Change-Id: I5c71e54513ad37d43347f9716081751aad477149 --- .../wm/shell/splitscreen/StageCoordinator.java | 1 + .../shell/splitscreen/StageCoordinatorTests.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 76641f0e6c21a..4cd0f65faa74f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -781,6 +781,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, void finishEnterSplitScreen(SurfaceControl.Transaction t) { mSplitLayout.init(); setDividerVisibility(true, t); + updateSurfaceBounds(mSplitLayout, t); setSplitsVisible(true); mShouldUpdateRecents = true; updateRecentTasksSplitPair(); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index 099987a2f821f..a6ee8ff147db6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -41,6 +41,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.graphics.Rect; +import android.view.SurfaceControl; import android.window.DisplayAreaInfo; import android.window.WindowContainerTransaction; @@ -112,7 +113,7 @@ public class StageCoordinatorTests extends ShellTestCase { @Before public void setup() { MockitoAnnotations.initMocks(this); - mStageCoordinator = spy(createStageCoordinator(/* splitLayout */ null)); + mStageCoordinator = spy(createStageCoordinator(mSplitLayout)); doNothing().when(mStageCoordinator).updateActivityOptions(any(), anyInt()); when(mSplitLayout.getBounds1()).thenReturn(mBounds1); @@ -158,6 +159,9 @@ public class StageCoordinatorTests extends ShellTestCase { @Test public void testDisplayAreaAppeared_initializesUnfoldControllers() { + // Create a stage coordinator with null split layout to test layout init flow. + mStageCoordinator = createStageCoordinator(null /* splitLayout */); + mStageCoordinator.onDisplayAreaAppeared(mock(DisplayAreaInfo.class)); verify(mMainUnfoldController).init(); @@ -166,7 +170,6 @@ public class StageCoordinatorTests extends ShellTestCase { @Test public void testLayoutChanged_topLeftSplitPosition_updatesUnfoldStageBounds() { - mStageCoordinator = createStageCoordinator(mSplitLayout); mStageCoordinator.setSideStagePosition(SPLIT_POSITION_TOP_OR_LEFT, null); clearInvocations(mMainUnfoldController, mSideUnfoldController); @@ -179,7 +182,6 @@ public class StageCoordinatorTests extends ShellTestCase { @Test public void testLayoutChanged_bottomRightSplitPosition_updatesUnfoldStageBounds() { - mStageCoordinator = createStageCoordinator(mSplitLayout); mStageCoordinator.setSideStagePosition(SPLIT_POSITION_BOTTOM_OR_RIGHT, null); clearInvocations(mMainUnfoldController, mSideUnfoldController); @@ -293,6 +295,13 @@ public class StageCoordinatorTests extends ShellTestCase { assertEquals(mStageCoordinator.getMainStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT); } + @Test + public void testFinishEnterSplitScreen_applySurfaceLayout() { + mStageCoordinator.finishEnterSplitScreen(new SurfaceControl.Transaction()); + + verify(mSplitLayout).applySurfaceChanges(any(), any(), any(), any(), any()); + } + private StageCoordinator createStageCoordinator(SplitLayout splitLayout) { return new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage,