From 36941636851ec20b2b5aa32004d9f30c079b315c Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 19 Apr 2019 15:21:38 -0700 Subject: [PATCH] Allow gestural nav to trigger the transient bars when swiping on side edges Bug: 130907345 Test: Enable gestural nav, enter immersive mode, swipe from edges Change-Id: If7c29b92f027b9995a8a535756d8fdb5b81d7543 --- core/res/res/values/config.xml | 4 ++++ core/res/res/values/symbols.xml | 1 + .../res/values/config.xml | 4 ++++ .../com/android/server/wm/DisplayPolicy.java | 23 +++++++++++++++---- .../SystemGesturesPointerEventListener.java | 5 ++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 04ccb74dae3c5..e59ac9e15eee3 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3268,6 +3268,10 @@ false + + false + 0dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index fbe340ed61d35..c7d7044dfc815 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2858,6 +2858,7 @@ + diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml index 637637ad6fdd2..9694e76e138be 100644 --- a/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml +++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values/config.xml @@ -37,4 +37,8 @@ {@link Window#setEnsuringNavigationBarContrastWhenTransparent}. --> false + + true + diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 32d0b32956cfa..43e45f761a8ab 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 35afaedb0b437..854537b4618fb 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) {