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();      }  |