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:
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user