From 44409a0efb17744346ae2a7014637fa32c01ffce Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Tue, 17 Nov 2020 17:24:15 +0800 Subject: [PATCH] Use the secondary display for InputMethodMenuControllerTest After [1] merged, mDisplayContent is assigned to mDefaultDisplay if the test is not marked as @UseTestDisplay. However, the CL to introduce testGetSettingsContext wasn't aware of the change and didn't test the behavior of switching displays. This CL creates a test display and also mock some methods to verify the behavior. [1]: f8d8aea425f423db701edbff2724557d309c7509 fixes: 173491267 Test: atest InputMethodMenuControllerTest Change-Id: Ie5ee0f1c781a20d0b97b1a948cb44dcb120b81ae --- .../wm/InputMethodMenuControllerTest.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) 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 a9f6b50d4be54..f75c98f39323c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java @@ -18,14 +18,28 @@ package com.android.server.wm; import static android.view.Display.DEFAULT_DISPLAY; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import android.content.Context; +import android.content.res.Resources; import android.graphics.Rect; +import android.hardware.display.DisplayManagerGlobal; +import android.os.IBinder; import android.platform.test.annotations.Presubmit; +import android.view.Display; +import android.view.IWindowManager; import android.view.WindowManager; +import android.view.WindowManagerGlobal; import com.android.server.inputmethod.InputMethodManagerService; import com.android.server.inputmethod.InputMethodMenuController; @@ -45,10 +59,34 @@ import org.junit.runner.RunWith; public class InputMethodMenuControllerTest extends WindowTestsBase { private InputMethodMenuController mController; + private TestDisplayContent mSecondaryDisplay; @Before - public void setUp() { + public void setUp() throws Exception { mController = new InputMethodMenuController(mock(InputMethodManagerService.class)); + + // Mock addWindowTokenWithOptions to create a test window token. + IWindowManager wms = WindowManagerGlobal.getWindowManagerService(); + spyOn(wms); + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + final IBinder token = (IBinder) args[0]; + final int windowType = (int) args[1]; + new WindowToken(mWm, token, windowType, true /* persistOnEmpty */, + mDefaultDisplay, true /* ownerCanManageAppTokens */, 1000 /* ownerUid */, + false /* roundedCornerOverlay */, true /* fromClientToken */); + return WindowManagerGlobal.ADD_OKAY; + }).when(wms).addWindowTokenWithOptions(any(), anyInt(), anyInt(), any(), anyString()); + + mSecondaryDisplay = new TestDisplayContent.Builder(mAtm, 1000, 1000).build(); + + // Mock DisplayManagerGlobal to return test display when obtaining Display instance. + final int displayId = mSecondaryDisplay.getDisplayId(); + final Display display = mSecondaryDisplay.getDisplay(); + DisplayManagerGlobal displayManagerGlobal = DisplayManagerGlobal.getInstance(); + spyOn(displayManagerGlobal); + doReturn(display).when(displayManagerGlobal).getCompatibleDisplay(eq(displayId), + (Resources) any()); } @Test @@ -60,9 +98,9 @@ public class InputMethodMenuControllerTest extends WindowTestsBase { // Obtain the context again and check they are the same instance and match the display // metrics of the secondary display. final Context contextOnSecondaryDisplay = mController.getSettingsContext( - mDisplayContent.getDisplayId()); + mSecondaryDisplay.getDisplayId()); - assertImeSwitchContextMetricsValidity(contextOnSecondaryDisplay, mDisplayContent); + assertImeSwitchContextMetricsValidity(contextOnSecondaryDisplay, mSecondaryDisplay); assertThat(contextOnDefaultDisplay.getWindowContextToken()) .isEqualTo(contextOnSecondaryDisplay.getWindowContextToken()); }