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
This commit is contained in:
Jerry Chang
2022-03-02 11:01:44 +00:00
parent 18b848e66a
commit 5982b80584
2 changed files with 13 additions and 3 deletions

View File

@@ -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();

View File

@@ -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,