diff options
3 files changed, 24 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index 3bef5822291a..e011224169ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; import static android.view.Display.INVALID_DISPLAY; +import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; +import static android.view.View.NAVIGATION_BAR_TRANSIENT; import android.content.Context; import android.content.pm.ParceledListSlice; @@ -154,6 +156,7 @@ public class EdgeBackGestureHandler implements DisplayListener { private boolean mIsAttached; private boolean mIsGesturalModeEnabled; private boolean mIsEnabled; + private boolean mIsInTransientImmersiveStickyState; private InputMonitor mInputMonitor; private InputEventReceiver mInputEventReceiver; @@ -215,6 +218,12 @@ public class EdgeBackGestureHandler implements DisplayListener { updateCurrentUserResources(currentUserContext.getResources()); } + public void onSystemUiVisibilityChanged(int systemUiVisibility) { + mIsInTransientImmersiveStickyState = + (systemUiVisibility & SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0 + && (systemUiVisibility & NAVIGATION_BAR_TRANSIENT) != 0; + } + private void disposeInputChannel() { if (mInputEventReceiver != null) { mInputEventReceiver.dispose(); @@ -315,13 +324,21 @@ public class EdgeBackGestureHandler implements DisplayListener { } private boolean isWithinTouchRegion(int x, int y) { + // Disallow if over the IME if (y > (mDisplaySize.y - Math.max(mImeHeight, mNavBarHeight))) { return false; } + // Disallow if too far from the edge if (x > mEdgeWidth + mLeftInset && x < (mDisplaySize.x - mEdgeWidth - mRightInset)) { return false; } + + // Always allow if the user is in a transient sticky immersive state + if (mIsInTransientImmersiveStickyState) { + return true; + } + boolean isInExcludedRegion = mExcludeRegion.contains(x, y); if (isInExcludedRegion) { mOverviewProxyService.notifyBackAction(false /* completed */, -1, -1, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index e9731c521308..f5f2dd9d2438 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -539,6 +539,9 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback } mAutoHideController.touchAutoHide(); } + if (mNavigationBarView != null) { + mNavigationBarView.onSystemUiVisibilityChanged(mSystemUiVisibility); + } } mLightBarController.onNavigationVisibilityChanged( vis, mask, nbModeChanged, mNavigationBarMode, navbarColorManagedByIme); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index a2740c8dc322..f0415cb0c69f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -349,6 +349,10 @@ public class NavigationBarView extends FrameLayout implements return super.onTouchEvent(event); } + void onSystemUiVisibilityChanged(int systemUiVisibility) { + mEdgeBackGestureHandler.onSystemUiVisibilityChanged(systemUiVisibility); + } + void onBarTransition(int newMode) { if (newMode == MODE_OPAQUE) { // If the nav bar background is opaque, stop auto tinting since we know the icons are |