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