Loading core/java/android/view/InsetsState.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -453,9 +453,11 @@ public class InsetsState implements Parcelable { final ArraySet<Integer> result = new ArraySet<>(); final ArraySet<Integer> result = new ArraySet<>(); if ((types & Type.STATUS_BARS) != 0) { if ((types & Type.STATUS_BARS) != 0) { result.add(ITYPE_STATUS_BAR); result.add(ITYPE_STATUS_BAR); result.add(ITYPE_CLIMATE_BAR); } } if ((types & Type.NAVIGATION_BARS) != 0) { if ((types & Type.NAVIGATION_BARS) != 0) { result.add(ITYPE_NAVIGATION_BAR); result.add(ITYPE_NAVIGATION_BAR); result.add(ITYPE_EXTRA_NAVIGATION_BAR); } } if ((types & Type.CAPTION_BAR) != 0) { if ((types & Type.CAPTION_BAR) != 0) { result.add(ITYPE_CAPTION_BAR); result.add(ITYPE_CAPTION_BAR); Loading core/tests/coretests/src/android/view/InsetsStateTest.java +20 −0 Original line number Original line Diff line number Diff line Loading @@ -123,6 +123,24 @@ public class InsetsStateTest { } } } } @Test public void testCalculateInsets_extraNavRightClimateTop() throws Exception { try (final InsetsModeSession session = new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_FULL)) { mState.getSource(ITYPE_CLIMATE_BAR).setFrame(new Rect(0, 0, 100, 100)); mState.getSource(ITYPE_CLIMATE_BAR).setVisible(true); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false, DisplayCutout.NO_CUTOUT, 0, 0, 0, null); // ITYPE_CLIMATE_BAR is a type of status bar and ITYPE_EXTRA_NAVIGATION_BAR is a type // of navigation bar. assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.statusBars())); assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(Type.navigationBars())); } } @Test @Test public void testCalculateInsets_imeIgnoredWithoutAdjustResize() { public void testCalculateInsets_imeIgnoredWithoutAdjustResize() { try (final InsetsModeSession session = try (final InsetsModeSession session = Loading Loading @@ -331,6 +349,8 @@ public class InsetsStateTest { public void testGetDefaultVisibility() { public void testGetDefaultVisibility() { assertTrue(InsetsState.getDefaultVisibility(ITYPE_STATUS_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_STATUS_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CLIMATE_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_EXTRA_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CAPTION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CAPTION_BAR)); assertFalse(InsetsState.getDefaultVisibility(ITYPE_IME)); assertFalse(InsetsState.getDefaultVisibility(ITYPE_IME)); } } Loading services/core/java/com/android/server/wm/DisplayPolicy.java +68 −2 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,8 @@ import static android.view.InsetsState.ITYPE_BOTTOM_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; Loading Loading @@ -248,7 +250,8 @@ public class DisplayPolicy { | View.STATUS_BAR_TRANSPARENT | View.STATUS_BAR_TRANSPARENT | View.NAVIGATION_BAR_TRANSPARENT; | View.NAVIGATION_BAR_TRANSPARENT; private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR}; private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR, ITYPE_CLIMATE_BAR, ITYPE_EXTRA_NAVIGATION_BAR}; private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR}; private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR}; private final WindowManagerService mService; private final WindowManagerService mService; Loading Loading @@ -334,6 +337,16 @@ public class DisplayPolicy { private WindowState mNavigationBarAlt = null; private WindowState mNavigationBarAlt = null; @WindowManagerPolicy.AltBarPosition @WindowManagerPolicy.AltBarPosition private int mNavigationBarAltPosition = ALT_BAR_UNKNOWN; private int mNavigationBarAltPosition = ALT_BAR_UNKNOWN; // Alternative climate bar for when flexible insets mapping is used to place a climate bar on // the screen. private WindowState mClimateBarAlt = null; @WindowManagerPolicy.AltBarPosition private int mClimateBarAltPosition = ALT_BAR_UNKNOWN; // Alternative extra nav bar for when flexible insets mapping is used to place an extra nav bar // on the screen. private WindowState mExtraNavBarAlt = null; @WindowManagerPolicy.AltBarPosition private int mExtraNavBarAltPosition = ALT_BAR_UNKNOWN; /** See {@link #getNavigationBarFrameHeight} */ /** See {@link #getNavigationBarFrameHeight} */ private int[] mNavigationBarFrameHeightForRotationDefault = new int[4]; private int[] mNavigationBarFrameHeightForRotationDefault = new int[4]; Loading Loading @@ -670,6 +683,12 @@ public class DisplayPolicy { if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); requestTransientBars(mNavigationBarAlt); } } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } } void systemReady() { void systemReady() { Loading Loading @@ -941,6 +960,12 @@ public class DisplayPolicy { if (mNavigationBarAlt == win) { if (mNavigationBarAlt == win) { mNavigationBarAltPosition = getAltBarPosition(attrs); mNavigationBarAltPosition = getAltBarPosition(attrs); } } if (mClimateBarAlt == win) { mClimateBarAltPosition = getAltBarPosition(attrs); } if (mExtraNavBarAlt == win) { mExtraNavBarAltPosition = getAltBarPosition(attrs); } } } /** /** Loading Loading @@ -1048,6 +1073,16 @@ public class DisplayPolicy { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } } break; break; case ITYPE_CLIMATE_BAR: if (mClimateBarAlt != null && mClimateBarAlt.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case ITYPE_EXTRA_NAVIGATION_BAR: if (mExtraNavBarAlt != null && mExtraNavBarAlt.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; } } } } } } Loading Loading @@ -1153,6 +1188,14 @@ public class DisplayPolicy { mNavigationBarController.setWindow(mNavigationBarAlt); mNavigationBarController.setWindow(mNavigationBarAlt); mNavigationBarAltPosition = getAltBarPosition(attrs); mNavigationBarAltPosition = getAltBarPosition(attrs); break; break; case ITYPE_CLIMATE_BAR: mClimateBarAlt = win; mClimateBarAltPosition = getAltBarPosition(attrs); break; case ITYPE_EXTRA_NAVIGATION_BAR: mExtraNavBarAlt = win; mExtraNavBarAltPosition = getAltBarPosition(attrs); break; } } mDisplayContent.setInsetProvider(insetsType, win, null); mDisplayContent.setInsetProvider(insetsType, win, null); } } Loading Loading @@ -1201,6 +1244,8 @@ public class DisplayPolicy { switch (insetsType) { switch (insetsType) { case ITYPE_NAVIGATION_BAR: case ITYPE_NAVIGATION_BAR: case ITYPE_STATUS_BAR: case ITYPE_STATUS_BAR: case ITYPE_CLIMATE_BAR: case ITYPE_EXTRA_NAVIGATION_BAR: case ITYPE_CAPTION_BAR: case ITYPE_CAPTION_BAR: if (++count > 1) { if (++count > 1) { throw new IllegalArgumentException( throw new IllegalArgumentException( Loading Loading @@ -1232,6 +1277,12 @@ public class DisplayPolicy { if (mDisplayContent.isDefaultDisplay) { if (mDisplayContent.isDefaultDisplay) { mService.mPolicy.setKeyguardCandidateLw(null); mService.mPolicy.setKeyguardCandidateLw(null); } } } else if (mClimateBarAlt == win) { mClimateBarAlt = null; mDisplayContent.setInsetProvider(ITYPE_CLIMATE_BAR, null, null); } else if (mExtraNavBarAlt == win) { mExtraNavBarAlt = null; mDisplayContent.setInsetProvider(ITYPE_EXTRA_NAVIGATION_BAR, null, null); } } if (mLastFocusedWindow == win) { if (mLastFocusedWindow == win) { mLastFocusedWindow = null; mLastFocusedWindow = null; Loading Loading @@ -1320,7 +1371,8 @@ public class DisplayPolicy { return R.anim.dock_left_enter; return R.anim.dock_left_enter; } } } } } else if (win == mStatusBarAlt || win == mNavigationBarAlt) { } else if (win == mStatusBarAlt || win == mNavigationBarAlt || win == mClimateBarAlt || win == mExtraNavBarAlt) { if (win.getAttrs().windowAnimations != 0) { if (win.getAttrs().windowAnimations != 0) { return ANIMATION_STYLEABLE; return ANIMATION_STYLEABLE; } } Loading Loading @@ -3347,6 +3399,10 @@ public class DisplayPolicy { (requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR) (requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR) ? Type.navigationBars() : 0) ? Type.navigationBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR) | (requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR) ? Type.statusBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_EXTRA_NAVIGATION_BAR) ? Type.navigationBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_CLIMATE_BAR) ? Type.statusBars() : 0); ? Type.statusBars() : 0); if (swipeTarget == mNavigationBar if (swipeTarget == mNavigationBar Loading Loading @@ -4046,6 +4102,16 @@ public class DisplayPolicy { pw.print(prefix); pw.print("mNavigationBarAltPosition="); pw.print(prefix); pw.print("mNavigationBarAltPosition="); pw.println(mNavigationBarAltPosition); pw.println(mNavigationBarAltPosition); } } if (mClimateBarAlt != null) { pw.print(prefix); pw.print("mClimateBarAlt="); pw.println(mClimateBarAlt); pw.print(prefix); pw.print("mClimateBarAltPosition="); pw.println(mClimateBarAltPosition); } if (mExtraNavBarAlt != null) { pw.print(prefix); pw.print("mExtraNavBarAlt="); pw.println(mExtraNavBarAlt); pw.print(prefix); pw.print("mExtraNavBarAltPosition="); pw.println(mExtraNavBarAltPosition); } if (mFocusedWindow != null) { if (mFocusedWindow != null) { pw.print(prefix); pw.print("mFocusedWindow="); pw.println(mFocusedWindow); pw.print(prefix); pw.print("mFocusedWindow="); pw.println(mFocusedWindow); } } Loading services/core/java/com/android/server/wm/InsetsSourceProvider.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.wm; package com.android.server.wm; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading Loading @@ -94,7 +96,8 @@ class InsetsSourceProvider { new Point()); new Point()); final int type = source.getType(); final int type = source.getType(); if (type == ITYPE_STATUS_BAR || type == ITYPE_NAVIGATION_BAR) { if (type == ITYPE_STATUS_BAR || type == ITYPE_NAVIGATION_BAR || type == ITYPE_CLIMATE_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) { mControllable = sNewInsetsMode == NEW_INSETS_MODE_FULL; mControllable = sNewInsetsMode == NEW_INSETS_MODE_FULL; } else if (type == ITYPE_IME) { } else if (type == ITYPE_IME) { mControllable = sNewInsetsMode >= NEW_INSETS_MODE_IME; mControllable = sNewInsetsMode >= NEW_INSETS_MODE_IME; Loading services/core/java/com/android/server/wm/InsetsStateController.java +29 −6 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_INVALID; import static android.view.InsetsState.ITYPE_INVALID; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; Loading @@ -43,6 +45,7 @@ import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.InsetsState.InternalInsetsType; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManager.LayoutParams.WindowType; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.protolog.common.ProtoLog; import com.android.server.protolog.common.ProtoLog; Loading Loading @@ -112,7 +115,7 @@ class InsetsStateController { } } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { final @InternalInsetsType int type = getInsetsTypeForWindowType(attrs.type); final @InternalInsetsType int type = getInsetsTypeForLayoutParams(attrs); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; Loading @@ -132,7 +135,9 @@ class InsetsStateController { return false; return false; } } private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForLayoutParams(WindowManager.LayoutParams attrs) { @WindowType int type = attrs.type; switch (type) { switch (type) { case TYPE_STATUS_BAR: case TYPE_STATUS_BAR: return ITYPE_STATUS_BAR; return ITYPE_STATUS_BAR; Loading @@ -140,9 +145,22 @@ class InsetsStateController { return ITYPE_NAVIGATION_BAR; return ITYPE_NAVIGATION_BAR; case TYPE_INPUT_METHOD: case TYPE_INPUT_METHOD: return ITYPE_IME; return ITYPE_IME; default: return ITYPE_INVALID; } } // If not one of the types above, check whether an internal inset mapping is specified. if (attrs.providesInsetsTypes != null) { for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) { switch (insetsType) { case ITYPE_STATUS_BAR: case ITYPE_NAVIGATION_BAR: case ITYPE_CLIMATE_BAR: case ITYPE_EXTRA_NAVIGATION_BAR: return insetsType; } } } return ITYPE_INVALID; } } /** @see #getInsetsForDispatch */ /** @see #getInsetsForDispatch */ Loading @@ -155,14 +173,15 @@ class InsetsStateController { state.removeSource(type); state.removeSource(type); // Navigation bar doesn't get influenced by anything else // Navigation bar doesn't get influenced by anything else if (type == ITYPE_NAVIGATION_BAR) { if (type == ITYPE_NAVIGATION_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) { state.removeSource(ITYPE_IME); state.removeSource(ITYPE_IME); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_CLIMATE_BAR); state.removeSource(ITYPE_CAPTION_BAR); state.removeSource(ITYPE_CAPTION_BAR); } } // Status bar doesn't get influenced by caption bar // Status bar doesn't get influenced by caption bar if (type == ITYPE_STATUS_BAR) { if (type == ITYPE_STATUS_BAR || type == ITYPE_CLIMATE_BAR) { state.removeSource(ITYPE_CAPTION_BAR); state.removeSource(ITYPE_CAPTION_BAR); } } Loading Loading @@ -332,8 +351,12 @@ class InsetsStateController { @Nullable InsetsControlTarget fakeNavControlling) { @Nullable InsetsControlTarget fakeNavControlling) { onControlChanged(ITYPE_STATUS_BAR, statusControlling); onControlChanged(ITYPE_STATUS_BAR, statusControlling); onControlChanged(ITYPE_NAVIGATION_BAR, navControlling); onControlChanged(ITYPE_NAVIGATION_BAR, navControlling); onControlChanged(ITYPE_CLIMATE_BAR, statusControlling); onControlChanged(ITYPE_EXTRA_NAVIGATION_BAR, navControlling); onControlFakeTargetChanged(ITYPE_STATUS_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_STATUS_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_NAVIGATION_BAR, fakeNavControlling); onControlFakeTargetChanged(ITYPE_NAVIGATION_BAR, fakeNavControlling); onControlFakeTargetChanged(ITYPE_CLIMATE_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_EXTRA_NAVIGATION_BAR, fakeNavControlling); notifyPendingInsetsControlChanged(); notifyPendingInsetsControlChanged(); } } Loading Loading
core/java/android/view/InsetsState.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -453,9 +453,11 @@ public class InsetsState implements Parcelable { final ArraySet<Integer> result = new ArraySet<>(); final ArraySet<Integer> result = new ArraySet<>(); if ((types & Type.STATUS_BARS) != 0) { if ((types & Type.STATUS_BARS) != 0) { result.add(ITYPE_STATUS_BAR); result.add(ITYPE_STATUS_BAR); result.add(ITYPE_CLIMATE_BAR); } } if ((types & Type.NAVIGATION_BARS) != 0) { if ((types & Type.NAVIGATION_BARS) != 0) { result.add(ITYPE_NAVIGATION_BAR); result.add(ITYPE_NAVIGATION_BAR); result.add(ITYPE_EXTRA_NAVIGATION_BAR); } } if ((types & Type.CAPTION_BAR) != 0) { if ((types & Type.CAPTION_BAR) != 0) { result.add(ITYPE_CAPTION_BAR); result.add(ITYPE_CAPTION_BAR); Loading
core/tests/coretests/src/android/view/InsetsStateTest.java +20 −0 Original line number Original line Diff line number Diff line Loading @@ -123,6 +123,24 @@ public class InsetsStateTest { } } } } @Test public void testCalculateInsets_extraNavRightClimateTop() throws Exception { try (final InsetsModeSession session = new InsetsModeSession(ViewRootImpl.NEW_INSETS_MODE_FULL)) { mState.getSource(ITYPE_CLIMATE_BAR).setFrame(new Rect(0, 0, 100, 100)); mState.getSource(ITYPE_CLIMATE_BAR).setVisible(true); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false, DisplayCutout.NO_CUTOUT, 0, 0, 0, null); // ITYPE_CLIMATE_BAR is a type of status bar and ITYPE_EXTRA_NAVIGATION_BAR is a type // of navigation bar. assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(Type.statusBars())); assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(Type.navigationBars())); } } @Test @Test public void testCalculateInsets_imeIgnoredWithoutAdjustResize() { public void testCalculateInsets_imeIgnoredWithoutAdjustResize() { try (final InsetsModeSession session = try (final InsetsModeSession session = Loading Loading @@ -331,6 +349,8 @@ public class InsetsStateTest { public void testGetDefaultVisibility() { public void testGetDefaultVisibility() { assertTrue(InsetsState.getDefaultVisibility(ITYPE_STATUS_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_STATUS_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CLIMATE_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_EXTRA_NAVIGATION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CAPTION_BAR)); assertTrue(InsetsState.getDefaultVisibility(ITYPE_CAPTION_BAR)); assertFalse(InsetsState.getDefaultVisibility(ITYPE_IME)); assertFalse(InsetsState.getDefaultVisibility(ITYPE_IME)); } } Loading
services/core/java/com/android/server/wm/DisplayPolicy.java +68 −2 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,8 @@ import static android.view.InsetsState.ITYPE_BOTTOM_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; Loading Loading @@ -248,7 +250,8 @@ public class DisplayPolicy { | View.STATUS_BAR_TRANSPARENT | View.STATUS_BAR_TRANSPARENT | View.NAVIGATION_BAR_TRANSPARENT; | View.NAVIGATION_BAR_TRANSPARENT; private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR}; private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR, ITYPE_CLIMATE_BAR, ITYPE_EXTRA_NAVIGATION_BAR}; private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR}; private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR}; private final WindowManagerService mService; private final WindowManagerService mService; Loading Loading @@ -334,6 +337,16 @@ public class DisplayPolicy { private WindowState mNavigationBarAlt = null; private WindowState mNavigationBarAlt = null; @WindowManagerPolicy.AltBarPosition @WindowManagerPolicy.AltBarPosition private int mNavigationBarAltPosition = ALT_BAR_UNKNOWN; private int mNavigationBarAltPosition = ALT_BAR_UNKNOWN; // Alternative climate bar for when flexible insets mapping is used to place a climate bar on // the screen. private WindowState mClimateBarAlt = null; @WindowManagerPolicy.AltBarPosition private int mClimateBarAltPosition = ALT_BAR_UNKNOWN; // Alternative extra nav bar for when flexible insets mapping is used to place an extra nav bar // on the screen. private WindowState mExtraNavBarAlt = null; @WindowManagerPolicy.AltBarPosition private int mExtraNavBarAltPosition = ALT_BAR_UNKNOWN; /** See {@link #getNavigationBarFrameHeight} */ /** See {@link #getNavigationBarFrameHeight} */ private int[] mNavigationBarFrameHeightForRotationDefault = new int[4]; private int[] mNavigationBarFrameHeightForRotationDefault = new int[4]; Loading Loading @@ -670,6 +683,12 @@ public class DisplayPolicy { if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { requestTransientBars(mNavigationBarAlt); requestTransientBars(mNavigationBarAlt); } } if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { requestTransientBars(mClimateBarAlt); } if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { requestTransientBars(mExtraNavBarAlt); } } } void systemReady() { void systemReady() { Loading Loading @@ -941,6 +960,12 @@ public class DisplayPolicy { if (mNavigationBarAlt == win) { if (mNavigationBarAlt == win) { mNavigationBarAltPosition = getAltBarPosition(attrs); mNavigationBarAltPosition = getAltBarPosition(attrs); } } if (mClimateBarAlt == win) { mClimateBarAltPosition = getAltBarPosition(attrs); } if (mExtraNavBarAlt == win) { mExtraNavBarAltPosition = getAltBarPosition(attrs); } } } /** /** Loading Loading @@ -1048,6 +1073,16 @@ public class DisplayPolicy { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } } break; break; case ITYPE_CLIMATE_BAR: if (mClimateBarAlt != null && mClimateBarAlt.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; case ITYPE_EXTRA_NAVIGATION_BAR: if (mExtraNavBarAlt != null && mExtraNavBarAlt.isAlive()) { return WindowManagerGlobal.ADD_MULTIPLE_SINGLETON; } break; } } } } } } Loading Loading @@ -1153,6 +1188,14 @@ public class DisplayPolicy { mNavigationBarController.setWindow(mNavigationBarAlt); mNavigationBarController.setWindow(mNavigationBarAlt); mNavigationBarAltPosition = getAltBarPosition(attrs); mNavigationBarAltPosition = getAltBarPosition(attrs); break; break; case ITYPE_CLIMATE_BAR: mClimateBarAlt = win; mClimateBarAltPosition = getAltBarPosition(attrs); break; case ITYPE_EXTRA_NAVIGATION_BAR: mExtraNavBarAlt = win; mExtraNavBarAltPosition = getAltBarPosition(attrs); break; } } mDisplayContent.setInsetProvider(insetsType, win, null); mDisplayContent.setInsetProvider(insetsType, win, null); } } Loading Loading @@ -1201,6 +1244,8 @@ public class DisplayPolicy { switch (insetsType) { switch (insetsType) { case ITYPE_NAVIGATION_BAR: case ITYPE_NAVIGATION_BAR: case ITYPE_STATUS_BAR: case ITYPE_STATUS_BAR: case ITYPE_CLIMATE_BAR: case ITYPE_EXTRA_NAVIGATION_BAR: case ITYPE_CAPTION_BAR: case ITYPE_CAPTION_BAR: if (++count > 1) { if (++count > 1) { throw new IllegalArgumentException( throw new IllegalArgumentException( Loading Loading @@ -1232,6 +1277,12 @@ public class DisplayPolicy { if (mDisplayContent.isDefaultDisplay) { if (mDisplayContent.isDefaultDisplay) { mService.mPolicy.setKeyguardCandidateLw(null); mService.mPolicy.setKeyguardCandidateLw(null); } } } else if (mClimateBarAlt == win) { mClimateBarAlt = null; mDisplayContent.setInsetProvider(ITYPE_CLIMATE_BAR, null, null); } else if (mExtraNavBarAlt == win) { mExtraNavBarAlt = null; mDisplayContent.setInsetProvider(ITYPE_EXTRA_NAVIGATION_BAR, null, null); } } if (mLastFocusedWindow == win) { if (mLastFocusedWindow == win) { mLastFocusedWindow = null; mLastFocusedWindow = null; Loading Loading @@ -1320,7 +1371,8 @@ public class DisplayPolicy { return R.anim.dock_left_enter; return R.anim.dock_left_enter; } } } } } else if (win == mStatusBarAlt || win == mNavigationBarAlt) { } else if (win == mStatusBarAlt || win == mNavigationBarAlt || win == mClimateBarAlt || win == mExtraNavBarAlt) { if (win.getAttrs().windowAnimations != 0) { if (win.getAttrs().windowAnimations != 0) { return ANIMATION_STYLEABLE; return ANIMATION_STYLEABLE; } } Loading Loading @@ -3347,6 +3399,10 @@ public class DisplayPolicy { (requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR) (requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR) ? Type.navigationBars() : 0) ? Type.navigationBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR) | (requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR) ? Type.statusBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_EXTRA_NAVIGATION_BAR) ? Type.navigationBars() : 0) | (requestedState.getSourceOrDefaultVisibility(ITYPE_CLIMATE_BAR) ? Type.statusBars() : 0); ? Type.statusBars() : 0); if (swipeTarget == mNavigationBar if (swipeTarget == mNavigationBar Loading Loading @@ -4046,6 +4102,16 @@ public class DisplayPolicy { pw.print(prefix); pw.print("mNavigationBarAltPosition="); pw.print(prefix); pw.print("mNavigationBarAltPosition="); pw.println(mNavigationBarAltPosition); pw.println(mNavigationBarAltPosition); } } if (mClimateBarAlt != null) { pw.print(prefix); pw.print("mClimateBarAlt="); pw.println(mClimateBarAlt); pw.print(prefix); pw.print("mClimateBarAltPosition="); pw.println(mClimateBarAltPosition); } if (mExtraNavBarAlt != null) { pw.print(prefix); pw.print("mExtraNavBarAlt="); pw.println(mExtraNavBarAlt); pw.print(prefix); pw.print("mExtraNavBarAltPosition="); pw.println(mExtraNavBarAltPosition); } if (mFocusedWindow != null) { if (mFocusedWindow != null) { pw.print(prefix); pw.print("mFocusedWindow="); pw.println(mFocusedWindow); pw.print(prefix); pw.print("mFocusedWindow="); pw.println(mFocusedWindow); } } Loading
services/core/java/com/android/server/wm/InsetsSourceProvider.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.wm; package com.android.server.wm; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading Loading @@ -94,7 +96,8 @@ class InsetsSourceProvider { new Point()); new Point()); final int type = source.getType(); final int type = source.getType(); if (type == ITYPE_STATUS_BAR || type == ITYPE_NAVIGATION_BAR) { if (type == ITYPE_STATUS_BAR || type == ITYPE_NAVIGATION_BAR || type == ITYPE_CLIMATE_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) { mControllable = sNewInsetsMode == NEW_INSETS_MODE_FULL; mControllable = sNewInsetsMode == NEW_INSETS_MODE_FULL; } else if (type == ITYPE_IME) { } else if (type == ITYPE_IME) { mControllable = sNewInsetsMode >= NEW_INSETS_MODE_IME; mControllable = sNewInsetsMode >= NEW_INSETS_MODE_IME; Loading
services/core/java/com/android/server/wm/InsetsStateController.java +29 −6 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_INVALID; import static android.view.InsetsState.ITYPE_INVALID; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; Loading @@ -43,6 +45,7 @@ import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.InsetsState.InternalInsetsType; import android.view.WindowManager; import android.view.WindowManager; import android.view.WindowManager.LayoutParams.WindowType; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.protolog.common.ProtoLog; import com.android.server.protolog.common.ProtoLog; Loading Loading @@ -112,7 +115,7 @@ class InsetsStateController { } } InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { InsetsState getInsetsForWindowMetrics(@NonNull WindowManager.LayoutParams attrs) { final @InternalInsetsType int type = getInsetsTypeForWindowType(attrs.type); final @InternalInsetsType int type = getInsetsTypeForLayoutParams(attrs); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final WindowToken token = mDisplayContent.getWindowToken(attrs.token); final @WindowingMode int windowingMode = token != null final @WindowingMode int windowingMode = token != null ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; ? token.getWindowingMode() : WINDOWING_MODE_UNDEFINED; Loading @@ -132,7 +135,9 @@ class InsetsStateController { return false; return false; } } private static @InternalInsetsType int getInsetsTypeForWindowType(int type) { private static @InternalInsetsType int getInsetsTypeForLayoutParams(WindowManager.LayoutParams attrs) { @WindowType int type = attrs.type; switch (type) { switch (type) { case TYPE_STATUS_BAR: case TYPE_STATUS_BAR: return ITYPE_STATUS_BAR; return ITYPE_STATUS_BAR; Loading @@ -140,9 +145,22 @@ class InsetsStateController { return ITYPE_NAVIGATION_BAR; return ITYPE_NAVIGATION_BAR; case TYPE_INPUT_METHOD: case TYPE_INPUT_METHOD: return ITYPE_IME; return ITYPE_IME; default: return ITYPE_INVALID; } } // If not one of the types above, check whether an internal inset mapping is specified. if (attrs.providesInsetsTypes != null) { for (@InternalInsetsType int insetsType : attrs.providesInsetsTypes) { switch (insetsType) { case ITYPE_STATUS_BAR: case ITYPE_NAVIGATION_BAR: case ITYPE_CLIMATE_BAR: case ITYPE_EXTRA_NAVIGATION_BAR: return insetsType; } } } return ITYPE_INVALID; } } /** @see #getInsetsForDispatch */ /** @see #getInsetsForDispatch */ Loading @@ -155,14 +173,15 @@ class InsetsStateController { state.removeSource(type); state.removeSource(type); // Navigation bar doesn't get influenced by anything else // Navigation bar doesn't get influenced by anything else if (type == ITYPE_NAVIGATION_BAR) { if (type == ITYPE_NAVIGATION_BAR || type == ITYPE_EXTRA_NAVIGATION_BAR) { state.removeSource(ITYPE_IME); state.removeSource(ITYPE_IME); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_STATUS_BAR); state.removeSource(ITYPE_CLIMATE_BAR); state.removeSource(ITYPE_CAPTION_BAR); state.removeSource(ITYPE_CAPTION_BAR); } } // Status bar doesn't get influenced by caption bar // Status bar doesn't get influenced by caption bar if (type == ITYPE_STATUS_BAR) { if (type == ITYPE_STATUS_BAR || type == ITYPE_CLIMATE_BAR) { state.removeSource(ITYPE_CAPTION_BAR); state.removeSource(ITYPE_CAPTION_BAR); } } Loading Loading @@ -332,8 +351,12 @@ class InsetsStateController { @Nullable InsetsControlTarget fakeNavControlling) { @Nullable InsetsControlTarget fakeNavControlling) { onControlChanged(ITYPE_STATUS_BAR, statusControlling); onControlChanged(ITYPE_STATUS_BAR, statusControlling); onControlChanged(ITYPE_NAVIGATION_BAR, navControlling); onControlChanged(ITYPE_NAVIGATION_BAR, navControlling); onControlChanged(ITYPE_CLIMATE_BAR, statusControlling); onControlChanged(ITYPE_EXTRA_NAVIGATION_BAR, navControlling); onControlFakeTargetChanged(ITYPE_STATUS_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_STATUS_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_NAVIGATION_BAR, fakeNavControlling); onControlFakeTargetChanged(ITYPE_NAVIGATION_BAR, fakeNavControlling); onControlFakeTargetChanged(ITYPE_CLIMATE_BAR, fakeStatusControlling); onControlFakeTargetChanged(ITYPE_EXTRA_NAVIGATION_BAR, fakeNavControlling); notifyPendingInsetsControlChanged(); notifyPendingInsetsControlChanged(); } } Loading