diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/InsetsSourceProvider.java | 15 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java | 31 |
2 files changed, 42 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 56986c2e7e41..dfd44f549c49 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -166,11 +166,18 @@ class InsetsSourceProvider { return; } - mTmpRect.set(mWin.getFrameLw()); - if (mFrameProvider != null) { - mFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mTmpRect); + // Make sure we set the valid source frame only when server visible is true, because the + // frame may not yet determined that server side doesn't think the window is ready to + // visible. (i.e. No surface, pending insets that were given during layout, etc..) + if (mServerVisible) { + mTmpRect.set(mWin.getFrameLw()); + if (mFrameProvider != null) { + mFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mTmpRect); + } else { + mTmpRect.inset(mWin.mGivenContentInsets); + } } else { - mTmpRect.inset(mWin.mGivenContentInsets); + mTmpRect.setEmpty(); } mSource.setFrame(mTmpRect); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index ca016761438b..9bf9ffed57be 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -16,8 +16,10 @@ package com.android.server.wm; +import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,12 +46,17 @@ public class InsetsSourceProviderTest extends WindowTestsBase { private InsetsSource mSource = new InsetsSource(ITYPE_STATUS_BAR); private InsetsSourceProvider mProvider; + private InsetsSource mImeSource = new InsetsSource(ITYPE_IME); + private InsetsSourceProvider mImeProvider; @Before public void setUp() throws Exception { mSource.setVisible(true); mProvider = new InsetsSourceProvider(mSource, mDisplayContent.getInsetsStateController(), mDisplayContent); + mProvider.setServerVisible(true); + mImeProvider = new InsetsSourceProvider(mImeSource, + mDisplayContent.getInsetsStateController(), mDisplayContent); } @Test @@ -166,6 +173,30 @@ public class InsetsSourceProviderTest extends WindowTestsBase { } @Test + public void testUpdateSourceFrameForIme() { + final WindowState inputMethod = createWindow(null, TYPE_INPUT_METHOD, "inputMethod"); + + inputMethod.getFrameLw().set(new Rect(0, 400, 500, 500)); + + mImeProvider.setWindow(inputMethod, null, null); + mImeProvider.setServerVisible(false); + mImeSource.setVisible(true); + mImeProvider.updateSourceFrame(); + assertEquals(new Rect(0, 0, 0, 0), mImeSource.getFrame()); + Insets insets = mImeSource.calculateInsets(new Rect(0, 0, 500, 500), + false /* ignoreVisibility */); + assertEquals(Insets.of(0, 0, 0, 0), insets); + + mImeProvider.setServerVisible(true); + mImeSource.setVisible(true); + mImeProvider.updateSourceFrame(); + assertEquals(inputMethod.getFrameLw(), mImeSource.getFrame()); + insets = mImeSource.calculateInsets(new Rect(0, 0, 500, 500), + false /* ignoreVisibility */); + assertEquals(Insets.of(0, 0, 0, 100), insets); + } + + @Test public void testInsetsModified() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); |