base: navigation mode settings [1/2]
to configure the height of the back gesture
Change-Id: I6ebe0039e250f3b8f0b91b232df5941b58026499
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index b931c8c..a8e3f14 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6532,6 +6532,16 @@
public static final String WIFI_WATCHDOG_PING_DELAY_MS = Secure.WIFI_WATCHDOG_PING_DELAY_MS;
/**
+ * IMPORTANT: If you add a new public settings you also have to add it to
+ * PUBLIC_SETTINGS below. If the new setting is hidden you have to add
+ * it to PRIVATE_SETTINGS below. Also add a validator that can validate
+ * the setting value. See an example above.
+ */
+
+ /** @hide */
+ public static final String BACK_GESTURE_HEIGHT = "back_gesture_height";
+
+ /**
* @deprecated Use {@link android.provider.Settings.Secure#WIFI_WATCHDOG_PING_TIMEOUT_MS}
* instead
*/
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 0a72a2f..6f535e8 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -1980,6 +1980,11 @@
setNavBarMode(mode);
mView.setShouldShowSwipeUpUi(mOverviewProxyService.shouldShowSwipeUpUI());
}
+
+ @Override
+ public void onSettingsChanged() {
+ mEdgeBackGestureHandler.onSettingsChanged();
+ }
};
private final Gefingerpoken mTouchHandler = new Gefingerpoken() {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
index 99daf36..0e5be0f 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
@@ -19,12 +19,16 @@
import static android.content.Intent.ACTION_OVERLAY_CHANGED;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.om.IOverlayManager;
import android.content.pm.PackageManager;
import android.content.res.ApkAssets;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
import android.os.PatternMatcher;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -61,6 +65,7 @@
public interface ModeChangedListener {
void onNavigationModeChanged(int mode);
+ default void onSettingsChanged() {}
}
private final Context mContext;
@@ -83,6 +88,21 @@
}
};
+ private final class SettingsObserver extends ContentObserver {
+ public SettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ for (int i = 0; i < mListeners.size(); i++) {
+ mListeners.get(i).onSettingsChanged();
+ }
+ }
+ }
+
+ private SettingsObserver mSettingsObserver;
+
// The primary user SysUI process doesn't get AppInfo changes from overlay package changes for
// the secondary user (b/158613864), so we need to update the interaction mode here as well
// as a fallback if we don't receive the configuration change
@@ -118,6 +138,11 @@
overlayFilter.addDataSchemeSpecificPart("android", PatternMatcher.PATTERN_LITERAL);
mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, overlayFilter, null, null);
+ mSettingsObserver = new SettingsObserver(new Handler());
+ mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(
+ Settings.System.BACK_GESTURE_HEIGHT),
+ false, mSettingsObserver, UserHandle.USER_ALL);
+
configurationController.addCallback(new ConfigurationController.ConfigurationListener() {
@Override
public void onThemeChanged() {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
index e660b97..81b9690 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
@@ -47,6 +47,8 @@
import android.os.Trace;
import android.provider.DeviceConfig;
import android.util.DisplayMetrics;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Log;
import android.util.TypedValue;
import android.view.Choreographer;
@@ -270,6 +272,8 @@
private int mRightInset;
private int mSysUiFlags;
+ private int mEdgeHeight;
+
// For Tf-Lite model.
private BackGestureTfClassifierProvider mBackGestureTfClassifierProvider;
private Map<String, Integer> mVocab;
@@ -470,6 +474,28 @@
updateCurrentUserResources();
}
+ private void updateEdgeHeightValue() {
+ if (mDisplaySize == null) {
+ return;
+ }
+ int edgeHeightSetting = Settings.System.getIntForUser(mContext.getContentResolver(),
+ Settings.System.BACK_GESTURE_HEIGHT, 0, UserHandle.USER_CURRENT);
+ // edgeHeigthSettings cant be range 0 - 3
+ // 0 means full height
+ // 1 measns half of the screen
+ // 2 means lower third of the screen
+ // 3 means lower sicth of the screen
+ if (edgeHeightSetting == 0) {
+ mEdgeHeight = mDisplaySize.y;
+ } else if (edgeHeightSetting == 1) {
+ mEdgeHeight = mDisplaySize.y / 2;
+ } else if (edgeHeightSetting == 2) {
+ mEdgeHeight = mDisplaySize.y / 3;
+ } else {
+ mEdgeHeight = mDisplaySize.y / 6;
+ }
+ }
+
public void setStateChangeCallback(Runnable callback) {
mStateChangeCallback = callback;
}
@@ -589,6 +615,10 @@
}
}
+ public void onSettingsChanged() {
+ updateEdgeHeightValue();
+ }
+
public void onNavBarTransientStateChanged(boolean isTransient) {
mIsNavBarShownTransiently = isTransient;
}
@@ -855,6 +885,11 @@
if (y >= (mDisplaySize.y - mBottomGestureHeight)) {
return false;
}
+ if (mEdgeHeight != 0) {
+ if (y < (mDisplaySize.y - mBottomGestureHeight - mEdgeHeight)) {
+ return false;
+ }
+ }
// If the point is way too far (twice the margin), it is
// not interesting to us for logging purposes, nor we
// should process it. Simply return false and keep
@@ -1198,6 +1233,7 @@
mEdgeBackPlugin.setDisplaySize(mDisplaySize);
}
updateBackAnimationThresholds();
+ updateEdgeHeightValue();
}
private void updateBackAnimationThresholds() {