diff options
5 files changed, 32 insertions, 5 deletions
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 04ccb74dae3c..e59ac9e15eee 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3268,6 +3268,10 @@ <!-- Controls whether the navigation bar lets through taps. --> <bool name="config_navBarTapThrough">false</bool> + <!-- Controls whether the side edge gestures can always trigger the transient nav bar to + show. --> + <bool name="config_navBarAlwaysShowOnSideEdgeGesture">false</bool> + <!-- Controls the size of the back gesture inset. --> <dimen name="config_backGestureInset">0dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fbe340ed61d3..c7d7044dfc81 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2858,6 +2858,7 @@ <java-symbol type="integer" name="config_navBarInteractionMode" /> <java-symbol type="bool" name="config_navBarCanMove" /> <java-symbol type="bool" name="config_navBarTapThrough" /> + <java-symbol type="bool" name="config_navBarAlwaysShowOnSideEdgeGesture" /> <java-symbol type="bool" name="config_navBarNeedsScrim" /> <java-symbol type="dimen" name="config_backGestureInset" /> <java-symbol type="color" name="system_bar_background_semi_transparent" /> diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml index 637637ad6fdd..9694e76e138b 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml @@ -37,4 +37,8 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> <bool name="config_navBarNeedsScrim">false</bool> + <!-- Controls whether the side edge gestures can always trigger the transient nav bar to + show. --> + <bool name="config_navBarAlwaysShowOnSideEdgeGesture">true</bool> + </resources> diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 32d0b32956cf..43e45f761a8a 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -123,6 +123,7 @@ import android.content.res.Resources; import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.graphics.Region; import android.hardware.input.InputManager; import android.hardware.power.V1_0.PowerHint; import android.os.Handler; @@ -228,7 +229,6 @@ public class DisplayPolicy { private int mBottomGestureAdditionalInset; @Px private int mSideGestureInset; - private boolean mNavigationBarLetsThroughTaps; private StatusBarManagerInternal getStatusBarManagerInternal() { synchronized (mServiceAcquireLock) { @@ -250,6 +250,8 @@ public class DisplayPolicy { private volatile boolean mHasNavigationBar; // Can the navigation bar ever move to the side? private volatile boolean mNavigationBarCanMove; + private volatile boolean mNavigationBarLetsThroughTaps; + private volatile boolean mNavigationBarAlwaysShowOnSideGesture; // Written by vr manager thread, only read in this class. private volatile boolean mPersistentVrModeEnabled; @@ -461,22 +463,31 @@ public class DisplayPolicy { @Override public void onSwipeFromBottom() { - if (mNavigationBar != null - && mNavigationBarPosition == NAV_BAR_BOTTOM) { + if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_BOTTOM) { requestTransientBars(mNavigationBar); } } @Override public void onSwipeFromRight() { - if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_RIGHT) { + final Region excludedRegion = + mDisplayContent.calculateSystemGestureExclusion(); + final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture + || mNavigationBarPosition == NAV_BAR_RIGHT; + if (mNavigationBar != null && sideAllowed + && !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) { requestTransientBars(mNavigationBar); } } @Override public void onSwipeFromLeft() { - if (mNavigationBar != null && mNavigationBarPosition == NAV_BAR_LEFT) { + final Region excludedRegion = + mDisplayContent.calculateSystemGestureExclusion(); + final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture + || mNavigationBarPosition == NAV_BAR_LEFT; + if (mNavigationBar != null && sideAllowed + && !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) { requestTransientBars(mNavigationBar); } } @@ -2694,6 +2705,8 @@ public class DisplayPolicy { mNavBarOpacityMode = res.getInteger(R.integer.config_navBarOpacityMode); mSideGestureInset = res.getDimensionPixelSize(R.dimen.config_backGestureInset); mNavigationBarLetsThroughTaps = res.getBoolean(R.bool.config_navBarTapThrough); + mNavigationBarAlwaysShowOnSideGesture = + res.getBoolean(R.bool.config_navBarAlwaysShowOnSideEdgeGesture); // This should calculate how much above the frame we accept gestures. mBottomGestureAdditionalInset = Math.max(0, diff --git a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java index 35afaedb0b43..854537b4618f 100644 --- a/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java +++ b/services/core/java/com/android/server/wm/SystemGesturesPointerEventListener.java @@ -18,6 +18,7 @@ package com.android.server.wm; import android.content.Context; import android.graphics.Rect; +import android.graphics.Region; import android.hardware.display.DisplayManagerGlobal; import android.os.Handler; import android.os.SystemClock; @@ -201,6 +202,10 @@ class SystemGesturesPointerEventListener implements PointerEventListener { } } + protected boolean currentGestureStartedInRegion(Region r) { + return r.contains((int) mDownX[0], (int) mDownY[0]); + } + private int findIndex(int pointerId) { for (int i = 0; i < mDownPointers; i++) { if (mDownPointerId[i] == pointerId) { |