diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7ac887ed295dd..c439aae1b0dc5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7426,8 +7426,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public boolean shouldShowIme(int displayId) { synchronized (mGlobalLock) { - final DisplayContent displayContent = mRoot.getDisplayContent(displayId); - return mDisplayWindowSettings.shouldShowImeLocked(displayContent); + return WindowManagerService.this.shouldShowIme(displayId); } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java index 652ea7d329538..336fa041dea8c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java @@ -51,6 +51,7 @@ import android.view.Surface; import androidx.test.filters.SmallTest; import com.android.dx.mockito.inline.extended.ExtendedMockito; +import com.android.server.LocalServices; import com.android.server.policy.WindowManagerPolicy; import org.junit.After; @@ -588,6 +589,23 @@ public class DisplayWindowSettingsTests extends WindowTestsBase { getStoredDisplayAttributeValue("shouldShowIme")); } + @Test + public void testShouldShowImeWithinForceDesktopMode() { + try { + // Presume display enabled force desktop mode from developer options. + final DisplayContent dc = createMockSimulatedDisplay(); + mWm.setForceDesktopModeOnExternalDisplays(true); + final WindowManagerInternal wmInternal = LocalServices.getService( + WindowManagerInternal.class); + // Make sure WindowManagerInter#shouldShowIme as true is due to + // mForceDesktopModeOnExternalDisplays as true. + assertFalse(mWm.mDisplayWindowSettings.shouldShowImeLocked(dc)); + assertTrue(wmInternal.shouldShowIme(dc.getDisplayId())); + } finally { + mWm.setForceDesktopModeOnExternalDisplays(false); + } + } + /** * Prepares display settings and stores in {@link #mStorage}. Uses provided display identifier * and stores windowingMode=WINDOWING_MODE_PINNED. diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 8c37ca5e309e7..3a702cb9521ca 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.app.AppOpsManager.OP_NONE; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.os.Process.SYSTEM_UID; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS; import static android.view.View.VISIBLE; @@ -445,4 +446,13 @@ class WindowTestsBase { return new WindowTestUtils.TestWindowState(mWm, mMockSession, mIWindow, attrs, token); } } + + /** Creates a {@link DisplayContent} as parts of simulate display info for test. */ + DisplayContent createMockSimulatedDisplay() { + DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.copyFrom(mDisplayInfo); + displayInfo.type = Display.TYPE_VIRTUAL; + displayInfo.ownerUid = SYSTEM_UID; + return createNewDisplay(displayInfo); + } }