From 70d628061092e63d146a26f8474471e85ecb4d71 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Tue, 21 Mar 2023 16:12:30 -0700 Subject: [PATCH] Do not start another transition from handleRequest In DesktopModeController we were starting another transition from handleRequest method. This lead to a stack overflow due to dispatchRequest ending up here in handleRequest and that calling dispatchRequest again. Removed the dispatchRequest call here and just creating the WindowContainerTransaction as needed. Test: atest DesktopModeControllerTest Bug: 274672225 Change-Id: If415fb84ffdec7a1f1cdfd8a17a368739a505f66 --- .../wm/shell/desktopmode/DesktopModeController.java | 6 +----- .../shell/desktopmode/DesktopModeControllerTest.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java index c9c0e40f616ce..ad334b5f2dc8c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeController.java @@ -41,7 +41,6 @@ import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.util.ArraySet; -import android.util.Pair; import android.view.SurfaceControl; import android.view.WindowManager; import android.window.DisplayAreaInfo; @@ -364,10 +363,7 @@ public class DesktopModeController implements RemoteCallable subHandler = - mTransitions.dispatchRequest(transition, request, this); - WindowContainerTransaction wct = subHandler != null - ? subHandler.second : new WindowContainerTransaction(); + WindowContainerTransaction wct = new WindowContainerTransaction(); bringDesktopAppsToFront(wct); wct.reorder(request.getTriggerTask().token, true /* onTop */); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java index 43f8f7b074bfc..63de74fa3b054 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeControllerTest.java @@ -41,6 +41,7 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.ActivityManager.RunningTaskInfo; @@ -418,6 +419,17 @@ public class DesktopModeControllerTest extends ShellTestCase { assertThat(wct).isNotNull(); } + @Test + public void testHandleTransitionRequest_taskOpen_doesNotStartAnotherTransition() { + RunningTaskInfo trigger = new RunningTaskInfo(); + trigger.token = new MockToken().token(); + trigger.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); + mController.handleRequest( + mock(IBinder.class), + new TransitionRequestInfo(TRANSIT_OPEN, trigger, null /* remote */)); + verifyZeroInteractions(mTransitions); + } + private DesktopModeController createController() { return new DesktopModeController(mContext, mShellInit, mShellController, mShellTaskOrganizer, mRootTaskDisplayAreaOrganizer, mTransitions,