Verify IME switch dialog on DualDisplayContent

The current WindowContext mechanism has already covered
the case when ImeContainer reparent to another RootDisplayArea.
When ImeContainer is moved, it sends a onConfigurationChanged
callback, which propagates to the associated WindowContext
and updates its Resources.
Add a test to verify IME switch dialog behavior on display
with dual RootDisplayArea.

fixes: 178462039
Test: atest InputmethodMenuControllerTest

Change-Id: If880ff7207a12d509e8bc37a99583280c793e38c
This commit is contained in:
Charles Chen
2021-04-22 14:15:46 +08:00
parent f0572fd733
commit 467ebb6069
3 changed files with 32 additions and 6 deletions

View File

@@ -221,7 +221,6 @@ public class InputMethodMenuController {
*/
@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);

View File

@@ -91,7 +91,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
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 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
}
/** 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 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase {
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,

View File

@@ -47,6 +47,7 @@ import com.android.server.inputmethod.InputMethodMenuController;
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 @@ import org.junit.runner.RunWith;
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 @@ public class InputMethodMenuControllerTest extends WindowTestsBase {
}).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 @@ public class InputMethodMenuControllerTest extends WindowTestsBase {
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());