Loading services/core/java/com/android/server/wm/DisplayContent.java +12 −3 Original line number Diff line number Diff line Loading @@ -1244,6 +1244,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return mDisplayRotation; } void setInsetProvider(@InternalInsetsType int type, WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider){ setInsetProvider(type, win, frameProvider, null /* imeFrameProvider */); } /** * Marks a window as providing insets for the rest of the windows in the system. * Loading @@ -1251,10 +1256,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * @param win The window. * @param frameProvider Function to compute the frame, or {@code null} if the just the frame of * the window should be taken. * @param imeFrameProvider Function to compute the frame when dispatching insets to the IME, or * {@code null} if the normal frame should be taken. */ void setInsetProvider(@InternalInsetsType int type, WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) { mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider); @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) { mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider, imeFrameProvider); } InsetsStateController getInsetsStateController() { Loading Loading @@ -3283,7 +3292,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } computeImeTarget(true /* updateImeTarget */); mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win, null /* frameProvider */); null /* frameProvider */, null /* imeFrameProvider */); } /** Loading services/core/java/com/android/server/wm/DisplayPolicy.java +6 −1 Original line number Diff line number Diff line Loading @@ -1026,7 +1026,12 @@ public class DisplayPolicy { - getNavigationBarHeight(displayFrames.mRotation, mDisplayContent.getConfiguration().uiMode); } }); }, // For IME we use regular frame. (displayFrames, windowState, inOutFrame) -> inOutFrame.set(windowState.getFrameLw())); mDisplayContent.setInsetProvider(ITYPE_BOTTOM_GESTURES, win, (displayFrames, windowState, inOutFrame) -> { inOutFrame.top -= mBottomGestureAdditionalInset; Loading services/core/java/com/android/server/wm/InsetsSourceProvider.java +29 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream; import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; Loading Loading @@ -61,6 +62,8 @@ class InsetsSourceProvider { private @Nullable ControlAdapter mAdapter; private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider; private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider; private final Rect mImeOverrideFrame = new Rect(); /** The visibility override from the current controlling window. */ private boolean mClientVisible; Loading Loading @@ -111,9 +114,12 @@ class InsetsSourceProvider { * @param win The window that links to this source. * @param frameProvider Based on display frame state and the window, calculates the resulting * frame that should be reported to clients. * @param imeFrameProvider Based on display frame state and the window, calculates the resulting * frame that should be reported to IME. */ void setWindow(@Nullable WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) { @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) { if (mWin != null) { if (mControllable) { mWin.setControllableInsetProvider(null); Loading @@ -126,6 +132,7 @@ class InsetsSourceProvider { } mWin = win; mFrameProvider = frameProvider; mImeFrameProvider = imeFrameProvider; if (win == null) { setServerVisible(false); mSource.setFrame(new Rect()); Loading Loading @@ -162,6 +169,12 @@ class InsetsSourceProvider { } mSource.setFrame(mTmpRect); if (mImeFrameProvider != null) { mImeOverrideFrame.set(mWin.getFrameLw()); mImeFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mImeOverrideFrame); } if (mWin.mGivenVisibleInsets.left != 0 || mWin.mGivenVisibleInsets.top != 0 || mWin.mGivenVisibleInsets.right != 0 || mWin.mGivenVisibleInsets.bottom != 0) { mTmpRect.set(mWin.getFrameLw()); Loading Loading @@ -303,6 +316,21 @@ class InsetsSourceProvider { return sNewInsetsMode == NEW_INSETS_MODE_NONE || mClientVisible; } /** * @return Whether this provider uses a different frame to dispatch to the IME. */ boolean overridesImeFrame() { return mImeFrameProvider != null; } /** * @return Rect to dispatch to the IME as frame. Only valid if {@link #overridesImeFrame()} * returns {@code true}. */ Rect getImeOverrideFrame() { return mImeOverrideFrame; } private class ControlAdapter implements AnimationAdapter { private SurfaceControl mCapturedLeash; Loading services/core/java/com/android/server/wm/InsetsStateController.java +14 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,20 @@ class InsetsStateController { state.removeSource(ITYPE_IME); state.removeSource(ITYPE_STATUS_BAR); } // IME needs different frames for certain cases (e.g. navigation bar in gesture nav). if (type == ITYPE_IME) { for (int i = mProviders.size() - 1; i >= 0; i--) { InsetsSourceProvider otherProvider = mProviders.valueAt(i); if (otherProvider.overridesImeFrame()) { InsetsSource override = new InsetsSource(state.getSource(otherProvider.getSource().getType())); override.setFrame(otherProvider.getImeOverrideFrame()); state.addSource(override); } } } return state; } Loading services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +8 −8 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); statusBar.getFrameLw().set(0, 0, 500, 100); statusBar.mHasSurface = true; mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.onPostLayout(); assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame()); assertEquals(Insets.of(0, 100, 0, 0), Loading @@ -74,7 +74,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { ime.getGivenContentInsetsLw().set(0, 0, 0, 60); ime.getGivenVisibleInsetsLw().set(0, 0, 0, 75); ime.mHasSurface = true; mProvider.setWindow(ime, null); mProvider.setWindow(ime, null, null); mProvider.onPostLayout(); assertEquals(new Rect(0, 0, 500, 40), mProvider.getSource().getFrame()); assertEquals(new Rect(0, 0, 500, 25), mProvider.getSource().getVisibleFrame()); Loading @@ -89,7 +89,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { public void testPostLayout_invisible() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.onPostLayout(); assertEquals(Insets.NONE, mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), false /* ignoreVisibility */)); Loading @@ -102,7 +102,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { mProvider.setWindow(statusBar, (displayFrames, windowState, rect) -> { rect.set(10, 10, 20, 20); }); }, null); mProvider.onPostLayout(); assertEquals(new Rect(10, 10, 20, 20), mProvider.getSource().getFrame()); } Loading @@ -112,7 +112,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForTarget(target, false /* force */); assertNotNull(mProvider.getControl(target)); mProvider.updateControlForTarget(null, false /* force */); Loading @@ -124,7 +124,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForFakeTarget(target); assertNotNull(mProvider.getControl(target)); assertNull(mProvider.getControl(target).getLeash()); Loading @@ -137,7 +137,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForTarget(target, false /* force */); InsetsState state = new InsetsState(); state.getSource(ITYPE_STATUS_BAR).setVisible(false); Loading @@ -150,7 +150,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); InsetsState state = new InsetsState(); state.getSource(ITYPE_STATUS_BAR).setVisible(false); mProvider.onInsetsModified(target, state.getSource(ITYPE_STATUS_BAR)); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +12 −3 Original line number Diff line number Diff line Loading @@ -1244,6 +1244,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return mDisplayRotation; } void setInsetProvider(@InternalInsetsType int type, WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider){ setInsetProvider(type, win, frameProvider, null /* imeFrameProvider */); } /** * Marks a window as providing insets for the rest of the windows in the system. * Loading @@ -1251,10 +1256,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * @param win The window. * @param frameProvider Function to compute the frame, or {@code null} if the just the frame of * the window should be taken. * @param imeFrameProvider Function to compute the frame when dispatching insets to the IME, or * {@code null} if the normal frame should be taken. */ void setInsetProvider(@InternalInsetsType int type, WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) { mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider); @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) { mInsetsStateController.getSourceProvider(type).setWindow(win, frameProvider, imeFrameProvider); } InsetsStateController getInsetsStateController() { Loading Loading @@ -3283,7 +3292,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } computeImeTarget(true /* updateImeTarget */); mInsetsStateController.getSourceProvider(ITYPE_IME).setWindow(win, null /* frameProvider */); null /* frameProvider */, null /* imeFrameProvider */); } /** Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +6 −1 Original line number Diff line number Diff line Loading @@ -1026,7 +1026,12 @@ public class DisplayPolicy { - getNavigationBarHeight(displayFrames.mRotation, mDisplayContent.getConfiguration().uiMode); } }); }, // For IME we use regular frame. (displayFrames, windowState, inOutFrame) -> inOutFrame.set(windowState.getFrameLw())); mDisplayContent.setInsetProvider(ITYPE_BOTTOM_GESTURES, win, (displayFrames, windowState, inOutFrame) -> { inOutFrame.top -= mBottomGestureAdditionalInset; Loading
services/core/java/com/android/server/wm/InsetsSourceProvider.java +29 −1 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.util.proto.ProtoOutputStream; import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; Loading Loading @@ -61,6 +62,8 @@ class InsetsSourceProvider { private @Nullable ControlAdapter mAdapter; private TriConsumer<DisplayFrames, WindowState, Rect> mFrameProvider; private TriConsumer<DisplayFrames, WindowState, Rect> mImeFrameProvider; private final Rect mImeOverrideFrame = new Rect(); /** The visibility override from the current controlling window. */ private boolean mClientVisible; Loading Loading @@ -111,9 +114,12 @@ class InsetsSourceProvider { * @param win The window that links to this source. * @param frameProvider Based on display frame state and the window, calculates the resulting * frame that should be reported to clients. * @param imeFrameProvider Based on display frame state and the window, calculates the resulting * frame that should be reported to IME. */ void setWindow(@Nullable WindowState win, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider) { @Nullable TriConsumer<DisplayFrames, WindowState, Rect> frameProvider, @Nullable TriConsumer<DisplayFrames, WindowState, Rect> imeFrameProvider) { if (mWin != null) { if (mControllable) { mWin.setControllableInsetProvider(null); Loading @@ -126,6 +132,7 @@ class InsetsSourceProvider { } mWin = win; mFrameProvider = frameProvider; mImeFrameProvider = imeFrameProvider; if (win == null) { setServerVisible(false); mSource.setFrame(new Rect()); Loading Loading @@ -162,6 +169,12 @@ class InsetsSourceProvider { } mSource.setFrame(mTmpRect); if (mImeFrameProvider != null) { mImeOverrideFrame.set(mWin.getFrameLw()); mImeFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mImeOverrideFrame); } if (mWin.mGivenVisibleInsets.left != 0 || mWin.mGivenVisibleInsets.top != 0 || mWin.mGivenVisibleInsets.right != 0 || mWin.mGivenVisibleInsets.bottom != 0) { mTmpRect.set(mWin.getFrameLw()); Loading Loading @@ -303,6 +316,21 @@ class InsetsSourceProvider { return sNewInsetsMode == NEW_INSETS_MODE_NONE || mClientVisible; } /** * @return Whether this provider uses a different frame to dispatch to the IME. */ boolean overridesImeFrame() { return mImeFrameProvider != null; } /** * @return Rect to dispatch to the IME as frame. Only valid if {@link #overridesImeFrame()} * returns {@code true}. */ Rect getImeOverrideFrame() { return mImeOverrideFrame; } private class ControlAdapter implements AnimationAdapter { private SurfaceControl mCapturedLeash; Loading
services/core/java/com/android/server/wm/InsetsStateController.java +14 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,20 @@ class InsetsStateController { state.removeSource(ITYPE_IME); state.removeSource(ITYPE_STATUS_BAR); } // IME needs different frames for certain cases (e.g. navigation bar in gesture nav). if (type == ITYPE_IME) { for (int i = mProviders.size() - 1; i >= 0; i--) { InsetsSourceProvider otherProvider = mProviders.valueAt(i); if (otherProvider.overridesImeFrame()) { InsetsSource override = new InsetsSource(state.getSource(otherProvider.getSource().getType())); override.setFrame(otherProvider.getImeOverrideFrame()); state.addSource(override); } } } return state; } Loading
services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +8 −8 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); statusBar.getFrameLw().set(0, 0, 500, 100); statusBar.mHasSurface = true; mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.onPostLayout(); assertEquals(new Rect(0, 0, 500, 100), mProvider.getSource().getFrame()); assertEquals(Insets.of(0, 100, 0, 0), Loading @@ -74,7 +74,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { ime.getGivenContentInsetsLw().set(0, 0, 0, 60); ime.getGivenVisibleInsetsLw().set(0, 0, 0, 75); ime.mHasSurface = true; mProvider.setWindow(ime, null); mProvider.setWindow(ime, null, null); mProvider.onPostLayout(); assertEquals(new Rect(0, 0, 500, 40), mProvider.getSource().getFrame()); assertEquals(new Rect(0, 0, 500, 25), mProvider.getSource().getVisibleFrame()); Loading @@ -89,7 +89,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { public void testPostLayout_invisible() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.onPostLayout(); assertEquals(Insets.NONE, mProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), false /* ignoreVisibility */)); Loading @@ -102,7 +102,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { mProvider.setWindow(statusBar, (displayFrames, windowState, rect) -> { rect.set(10, 10, 20, 20); }); }, null); mProvider.onPostLayout(); assertEquals(new Rect(10, 10, 20, 20), mProvider.getSource().getFrame()); } Loading @@ -112,7 +112,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForTarget(target, false /* force */); assertNotNull(mProvider.getControl(target)); mProvider.updateControlForTarget(null, false /* force */); Loading @@ -124,7 +124,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForFakeTarget(target); assertNotNull(mProvider.getControl(target)); assertNull(mProvider.getControl(target).getLeash()); Loading @@ -137,7 +137,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); mProvider.updateControlForTarget(target, false /* force */); InsetsState state = new InsetsState(); state.getSource(ITYPE_STATUS_BAR).setVisible(false); Loading @@ -150,7 +150,7 @@ public class InsetsSourceProviderTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrameLw().set(0, 0, 500, 100); mProvider.setWindow(statusBar, null); mProvider.setWindow(statusBar, null, null); InsetsState state = new InsetsState(); state.getSource(ITYPE_STATUS_BAR).setVisible(false); mProvider.onInsetsModified(target, state.getSource(ITYPE_STATUS_BAR)); Loading