diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java | 15 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java | 21 |
2 files changed, 32 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index ff2985c98421..e8a4c1c5c3d3 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -91,6 +91,21 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { } @Override + void setClientVisible(boolean clientVisible) { + final boolean wasClientVisible = isClientVisible(); + super.setClientVisible(clientVisible); + // The layer of ImePlaceholder needs to be updated on a higher z-order for + // non-activity window (For activity window, IME is already on top of it). + if (!wasClientVisible && isClientVisible()) { + final InsetsControlTarget imeControlTarget = getControlTarget(); + if (imeControlTarget != null && imeControlTarget.getWindow() != null + && imeControlTarget.getWindow().mActivityRecord == null) { + mDisplayContent.assignWindowLayers(false /* setLayoutNeeded */); + } + } + } + + @Override void setServerVisible(boolean serverVisible) { mServerVisible = serverVisible; if (!mFrozen) { diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index d1d83f62934d..d7e736df064b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -25,6 +25,7 @@ import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsets.Type.statusBars; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; @@ -38,6 +39,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.spy; @@ -420,10 +422,10 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testUpdateAboveInsetsState_zOrderChanged() { - final WindowState ime = createTestWindow("ime"); - final WindowState app = createTestWindow("app"); - final WindowState statusBar = createTestWindow("statusBar"); - final WindowState navBar = createTestWindow("navBar"); + final WindowState ime = createNonAppWindow("ime"); + final WindowState app = createNonAppWindow("app"); + final WindowState statusBar = createNonAppWindow("statusBar"); + final WindowState navBar = createNonAppWindow("navBar"); final InsetsSourceProvider imeSourceProvider = getController().getOrCreateSourceProvider(ID_IME, ime()); @@ -431,7 +433,9 @@ public class InsetsStateControllerTest extends WindowTestsBase { waitUntilHandlersIdle(); clearInvocations(mDisplayContent); + imeSourceProvider.updateControlForTarget(app, false /* force */); imeSourceProvider.setClientVisible(true); + verify(mDisplayContent).assignWindowLayers(anyBoolean()); waitUntilHandlersIdle(); // The visibility change should trigger a traversal to notify the change. verify(mDisplayContent).notifyInsetsChanged(any()); @@ -547,6 +551,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { control2.getInsetsHint().bottom); } + /** Creates a window which is associated with ActivityRecord. */ private WindowState createTestWindow(String name) { final WindowState win = createWindow(null, TYPE_APPLICATION, name); win.setHasSurface(true); @@ -554,6 +559,14 @@ public class InsetsStateControllerTest extends WindowTestsBase { return win; } + /** Creates a non-activity window. */ + private WindowState createNonAppWindow(String name) { + final WindowState win = createWindow(null, LAST_APPLICATION_WINDOW + 1, name); + win.setHasSurface(true); + spyOn(win); + return win; + } + private InsetsStateController getController() { return mDisplayContent.getInsetsStateController(); } |