diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/InsetsSourceProvider.java | 38 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java | 51 |
2 files changed, 71 insertions, 18 deletions
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 2b8312c3ea60..5f3d517b2cdf 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -81,6 +81,7 @@ class InsetsSourceProvider { private boolean mIsLeashReadyForDispatching; private final Rect mSourceFrame = new Rect(); private final Rect mLastSourceFrame = new Rect(); + private final Rect mLastContainerBounds = new Rect(); private @NonNull Insets mInsetsHint = Insets.NONE; private @Flags int mFlagsFromFrameProvider; private @Flags int mFlagsFromServer; @@ -278,11 +279,31 @@ class InsetsSourceProvider { // visible. (i.e. No surface, pending insets that were given during layout, etc..) if (mServerVisible) { mSource.setFrame(mSourceFrame); + updateInsetsHint(); } else { mSource.setFrame(0, 0, 0, 0); } } + // To be called when mSourceFrame or the window container bounds is changed. + private void updateInsetsHint() { + if (!mControllable || !mServerVisible) { + return; + } + final Rect bounds = mWindowContainer.getBounds(); + if (mSourceFrame.equals(mLastSourceFrame) && bounds.equals(mLastContainerBounds)) { + return; + } + mLastSourceFrame.set(mSourceFrame); + mLastContainerBounds.set(bounds); + mInsetsHint = mSource.calculateInsets(bounds, true /* ignoreVisibility */); + } + + @VisibleForTesting + Insets getInsetsHint() { + return mInsetsHint; + } + /** @return A new source computed by the specified window frame in the given display frames. */ InsetsSource createSimulatedSource(DisplayFrames displayFrames, Rect frame) { final InsetsSource source = new InsetsSource(mSource); @@ -338,15 +359,9 @@ class InsetsSourceProvider { mSetLeashPositionConsumer.accept(t); } } - if (mServerVisible && !mLastSourceFrame.equals(mSource.getFrame())) { - final Insets insetsHint = mSource.calculateInsets( - mWindowContainer.getBounds(), true /* ignoreVisibility */); - if (!insetsHint.equals(mControl.getInsetsHint())) { - changed = true; - mControl.setInsetsHint(insetsHint); - mInsetsHint = insetsHint; - } - mLastSourceFrame.set(mSource.getFrame()); + if (!mControl.getInsetsHint().equals(mInsetsHint)) { + mControl.setInsetsHint(mInsetsHint); + changed = true; } if (changed) { mStateController.notifyControlChanged(mControlTarget); @@ -587,6 +602,11 @@ class InsetsSourceProvider { pw.print(prefix + "mControl="); mControl.dump("", pw); } + if (mControllable) { + pw.print(prefix + "mInsetsHint="); + pw.print(mInsetsHint); + pw.println(); + } pw.print(prefix); pw.print("mIsLeashReadyForDispatching="); pw.print(mIsLeashReadyForDispatching); pw.println(); 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 3934b023b9fd..4034dbc70236 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -62,28 +62,31 @@ public class InsetsSourceProviderTest extends WindowTestsBase { @Test public void testPostLayout() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + statusBar.setBounds(0, 0, 500, 1000); statusBar.getFrame().set(0, 0, 500, 100); statusBar.mHasSurface = true; mProvider.setWindowContainer(statusBar, null, null); mProvider.updateSourceFrame(statusBar.getFrame()); mProvider.onPostLayout(); assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame()); - assertEquals(Insets.of(0, 100, 0, 0), - mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), - false /* ignoreVisibility */)); - assertEquals(Insets.of(0, 100, 0, 0), - mProvider.getSource().calculateVisibleInsets(new Rect(0, 0, 500, 500))); + assertEquals(Insets.of(0, 100, 0, 0), mProvider.getInsetsHint()); + + // Change the bounds and call onPostLayout. Make sure the insets hint gets updated. + statusBar.setBounds(0, 10, 500, 1000); + mProvider.onPostLayout(); + assertEquals(Insets.of(0, 90, 0, 0), mProvider.getInsetsHint()); } @Test public void testPostLayout_invisible() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + statusBar.setBounds(0, 0, 500, 1000); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); mProvider.updateSourceFrame(statusBar.getFrame()); mProvider.onPostLayout(); - assertEquals(Insets.NONE, mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), - false /* ignoreVisibility */)); + assertTrue(mProvider.getSource().getFrame().isEmpty()); + assertEquals(Insets.NONE, mProvider.getInsetsHint()); } @Test @@ -160,6 +163,36 @@ public class InsetsSourceProviderTest extends WindowTestsBase { } @Test + public void testUpdateSourceFrame() { + final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); + mProvider.setWindowContainer(statusBar, null, null); + statusBar.setBounds(0, 0, 500, 1000); + + mProvider.setServerVisible(true); + statusBar.getFrame().set(0, 0, 500, 100); + mProvider.updateSourceFrame(statusBar.getFrame()); + assertEquals(statusBar.getFrame(), mProvider.getSource().getFrame()); + assertEquals(Insets.of(0, 100, 0, 0), mProvider.getInsetsHint()); + + // Only change the source frame but not the visibility. + statusBar.getFrame().set(0, 0, 500, 90); + mProvider.updateSourceFrame(statusBar.getFrame()); + assertEquals(statusBar.getFrame(), mProvider.getSource().getFrame()); + assertEquals(Insets.of(0, 90, 0, 0), mProvider.getInsetsHint()); + + mProvider.setServerVisible(false); + statusBar.getFrame().set(0, 0, 500, 80); + mProvider.updateSourceFrame(statusBar.getFrame()); + assertTrue(mProvider.getSource().getFrame().isEmpty()); + assertEquals(Insets.of(0, 90, 0, 0), mProvider.getInsetsHint()); + + // Only change the visibility but not the frame. + mProvider.setServerVisible(true); + assertEquals(statusBar.getFrame(), mProvider.getSource().getFrame()); + assertEquals(Insets.of(0, 80, 0, 0), mProvider.getInsetsHint()); + } + + @Test public void testUpdateSourceFrameForIme() { final WindowState inputMethod = createWindow(null, TYPE_INPUT_METHOD, "inputMethod"); @@ -184,7 +217,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { } @Test - public void testInsetsModified() { + public void testSetRequestedVisibleTypes() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrame().set(0, 0, 500, 100); @@ -196,7 +229,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { } @Test - public void testInsetsModified_noControl() { + public void testSetRequestedVisibleTypes_noControl() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrame().set(0, 0, 500, 100); |