Loading services/core/java/com/android/server/wm/InsetsStateController.java +48 −35 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_INVALID; Loading @@ -29,6 +30,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; import android.app.WindowConfiguration.WindowingMode; import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseArray; Loading Loading @@ -74,30 +77,28 @@ class InsetsStateController { /** * When dispatching window state to the client, we'll need to exclude the source that represents * the window that is being dispatched. * the window that is being dispatched. We also need to exclude certain types of insets source * for client within specific windowing modes. * * @param target The client we dispatch the state to. * @return The state stripped of the necessary information. */ InsetsState getInsetsForDispatch(@NonNull WindowState target) { final InsetsSourceProvider provider = target.getControllableInsetProvider(); if (provider == null) { return mState; } final @InternalInsetsType int type = provider.getSource().getType(); return getInsetsForType(type); final @InternalInsetsType int type = provider != null ? provider.getSource().getType() : ITYPE_INVALID; return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode()); } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { final @InternalInsetsType int type = getInsetsTypeForWindowType(attrs.type); if (type == ITYPE_INVALID) { return mState; } return getInsetsForType(type); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; return getInsetsForTypeAndWindowingMode(type, windowingMode); } @InternalInsetsType private static int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { switch(type) { case TYPE_STATUS_BAR: return ITYPE_STATUS_BAR; Loading @@ -110,9 +111,13 @@ class InsetsStateController { } } private InsetsState getInsetsForType(@InternalInsetsType int type) { final InsetsState state = new InsetsState(); state.set(mState); /** @see #getInsetsForDispatch */ private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, @WindowingMode int windowingMode) { InsetsState state = mState; if (type != ITYPE_INVALID) { state = new InsetsState(state); state.removeSource(type); // Navigation bar doesn't get influenced by anything else Loading @@ -133,12 +138,20 @@ class InsetsStateController { InsetsSourceProvider otherProvider = mProviders.valueAt(i); if (otherProvider.overridesImeFrame()) { InsetsSource override = new InsetsSource(state.getSource(otherProvider.getSource().getType())); new InsetsSource( state.getSource(otherProvider.getSource().getType())); override.setFrame(otherProvider.getImeOverrideFrame()); state.addSource(override); } } } } if (WindowConfiguration.isFloating(windowingMode)) { state = new InsetsState(state); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); } return state; } Loading services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +31 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading Loading @@ -69,7 +71,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); statusBar.setControllableInsetProvider(getController().getSourceProvider(ITYPE_STATUS_BAR)); assertNotNull(getController().getInsetsForDispatch(app).getSource(ITYPE_STATUS_BAR)); assertNotNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); } @Test Loading Loading @@ -100,6 +102,34 @@ public class InsetsStateControllerTest extends WindowTestsBase { assertEquals(0, getController().getInsetsForDispatch(navBar).getSourcesCount()); } @Test public void testStripForDispatch_pip() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_PINNED); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_NAVIGATION_BAR)); } @Test public void testStripForDispatch_freeform() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_FREEFORM); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_NAVIGATION_BAR)); } @Test public void testImeForDispatch() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); Loading Loading
services/core/java/com/android/server/wm/InsetsStateController.java +48 −35 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_INVALID; Loading @@ -29,6 +30,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.WindowConfiguration; import android.app.WindowConfiguration.WindowingMode; import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseArray; Loading Loading @@ -74,30 +77,28 @@ class InsetsStateController { /** * When dispatching window state to the client, we'll need to exclude the source that represents * the window that is being dispatched. * the window that is being dispatched. We also need to exclude certain types of insets source * for client within specific windowing modes. * * @param target The client we dispatch the state to. * @return The state stripped of the necessary information. */ InsetsState getInsetsForDispatch(@NonNull WindowState target) { final InsetsSourceProvider provider = target.getControllableInsetProvider(); if (provider == null) { return mState; } final @InternalInsetsType int type = provider.getSource().getType(); return getInsetsForType(type); final @InternalInsetsType int type = provider != null ? provider.getSource().getType() : ITYPE_INVALID; return getInsetsForTypeAndWindowingMode(type, target.getWindowingMode()); } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { final @InternalInsetsType int type = getInsetsTypeForWindowType(attrs.type); if (type == ITYPE_INVALID) { return mState; } return getInsetsForType(type); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; return getInsetsForTypeAndWindowingMode(type, windowingMode); } @InternalInsetsType private static int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { switch(type) { case TYPE_STATUS_BAR: return ITYPE_STATUS_BAR; Loading @@ -110,9 +111,13 @@ class InsetsStateController { } } private InsetsState getInsetsForType(@InternalInsetsType int type) { final InsetsState state = new InsetsState(); state.set(mState); /** @see #getInsetsForDispatch */ private InsetsState getInsetsForTypeAndWindowingMode(@InternalInsetsType int type, @WindowingMode int windowingMode) { InsetsState state = mState; if (type != ITYPE_INVALID) { state = new InsetsState(state); state.removeSource(type); // Navigation bar doesn't get influenced by anything else Loading @@ -133,12 +138,20 @@ class InsetsStateController { InsetsSourceProvider otherProvider = mProviders.valueAt(i); if (otherProvider.overridesImeFrame()) { InsetsSource override = new InsetsSource(state.getSource(otherProvider.getSource().getType())); new InsetsSource( state.getSource(otherProvider.getSource().getType())); override.setFrame(otherProvider.getImeOverrideFrame()); state.addSource(override); } } } } if (WindowConfiguration.isFloating(windowingMode)) { state = new InsetsState(state); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_NAVIGATION_BAR); } return state; } Loading
services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +31 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading Loading @@ -69,7 +71,7 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); statusBar.setControllableInsetProvider(getController().getSourceProvider(ITYPE_STATUS_BAR)); assertNotNull(getController().getInsetsForDispatch(app).getSource(ITYPE_STATUS_BAR)); assertNotNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); } @Test Loading Loading @@ -100,6 +102,34 @@ public class InsetsStateControllerTest extends WindowTestsBase { assertEquals(0, getController().getInsetsForDispatch(navBar).getSourcesCount()); } @Test public void testStripForDispatch_pip() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_PINNED); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_NAVIGATION_BAR)); } @Test public void testStripForDispatch_freeform() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); getController().getSourceProvider(ITYPE_STATUS_BAR).setWindow(statusBar, null, null); getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindow(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_FREEFORM); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_STATUS_BAR)); assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_NAVIGATION_BAR)); } @Test public void testImeForDispatch() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); Loading