Merge "Verify IME switch dialog on DualDisplayContent" into sc-dev
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index e25b03481..403187b 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -221,7 +221,6 @@
      */
     @VisibleForTesting
     public Context getSettingsContext(int displayId) {
-        // TODO(b/178462039): Cover the case when IME is moved to another ImeContainer.
         if (mSettingsContext == null || mSettingsContext.getDisplayId() != displayId) {
             final Context systemUiContext = ActivityThread.currentActivityThread()
                     .createSystemUiContext(displayId);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
index bdc4b4e..2c3f52e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java
@@ -91,7 +91,7 @@
         doReturn(policyProvider).when(mWm).getDisplayAreaPolicyProvider();
 
         // Display: 1920x1200 (landscape). First and second display are both 860x1200 (portrait).
-        mDisplay = (DualDisplayContent) new DualDisplayContent.Builder(mAtm, 1920, 1200).build();
+        mDisplay = new DualDisplayContent.Builder(mAtm, 1920, 1200).build();
         mFirstRoot = mDisplay.mFirstRoot;
         mSecondRoot = mDisplay.mSecondRoot;
         mFirstTda = mDisplay.getTaskDisplayArea(FEATURE_FIRST_TASK_CONTAINER);
@@ -395,7 +395,7 @@
     }
 
     /** Display with two {@link DisplayAreaGroup}. Each of them take half of the screen. */
-    private static class DualDisplayContent extends TestDisplayContent {
+    static class DualDisplayContent extends TestDisplayContent {
         final DisplayAreaGroup mFirstRoot;
         final DisplayAreaGroup mSecondRoot;
         final Rect mLastDisplayBounds;
@@ -476,11 +476,15 @@
             TestDisplayContent createInternal(Display display) {
                 return new DualDisplayContent(mService.mRootWindowContainer, display);
             }
+
+            DualDisplayContent build() {
+                return (DualDisplayContent) super.build();
+            }
         }
     }
 
     /** Policy to create a dual {@link DisplayAreaGroup} policy in test. */
-    private static class DualDisplayTestPolicyProvider implements DisplayAreaPolicy.Provider {
+    static class DualDisplayTestPolicyProvider implements DisplayAreaPolicy.Provider {
 
         @Override
         public DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content,
diff --git a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
index 1b9308d..f2418c6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
@@ -47,6 +47,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mockito;
 
 // TODO(b/157888351): Move the test to inputmethod package once we find the way to test the
 //  scenario there.
@@ -59,10 +60,15 @@
 public class InputMethodMenuControllerTest extends WindowTestsBase {
 
     private InputMethodMenuController mController;
-    private TestDisplayContent mSecondaryDisplay;
+    private DualDisplayAreaGroupPolicyTest.DualDisplayContent mSecondaryDisplay;
 
     @Before
     public void setUp() throws Exception {
+        // Let the Display to be created with the DualDisplay policy.
+        final DisplayAreaPolicy.Provider policyProvider =
+                new DualDisplayAreaGroupPolicyTest.DualDisplayTestPolicyProvider();
+        Mockito.doReturn(policyProvider).when(mWm).getDisplayAreaPolicyProvider();
+
         mController = new InputMethodMenuController(mock(InputMethodManagerService.class));
 
         // Mock addWindowTokenWithOptions to create a test window token.
@@ -80,7 +86,8 @@
         }).when(wms).attachWindowContextToDisplayArea(any(), eq(TYPE_INPUT_METHOD_DIALOG),
                 anyInt(), any());
 
-        mSecondaryDisplay = new TestDisplayContent.Builder(mAtm, 1000, 1000).build();
+        mSecondaryDisplay = new DualDisplayAreaGroupPolicyTest.DualDisplayContent
+                .Builder(mAtm, 1000, 1000).build();
 
         // Mock DisplayManagerGlobal to return test display when obtaining Display instance.
         final int displayId = mSecondaryDisplay.getDisplayId();
@@ -105,6 +112,22 @@
         assertImeSwitchContextMetricsValidity(contextOnSecondaryDisplay, mSecondaryDisplay);
     }
 
+    @Test
+    public void testGetSettingsContextOnDualDisplayContent() {
+        final Context context = mController.getSettingsContext(mSecondaryDisplay.getDisplayId());
+
+        final DisplayArea.Tokens imeContainer = mSecondaryDisplay.getImeContainer();
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay);
+
+        mSecondaryDisplay.mFirstRoot.placeImeContainer(imeContainer);
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mFirstRoot);
+        assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
+
+        mSecondaryDisplay.mSecondRoot.placeImeContainer(imeContainer);
+        assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mSecondRoot);
+        assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
+    }
+
     private void assertImeSwitchContextMetricsValidity(Context context, DisplayContent dc) {
         assertThat(context.getDisplayId()).isEqualTo(dc.getDisplayId());