summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/InsetsSourceProvider.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java31
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");