Settings: Only show gesture navigation if device has a software nav bar

Change-Id: Ic90c8a194a736807c2e101ffd5f7e90c86a55381
diff --git a/src/com/android/settings/gestures/SystemNavigationPreferenceController.java b/src/com/android/settings/gestures/SystemNavigationPreferenceController.java
index ccdb257..797c0c0 100644
--- a/src/com/android/settings/gestures/SystemNavigationPreferenceController.java
+++ b/src/com/android/settings/gestures/SystemNavigationPreferenceController.java
@@ -23,6 +23,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.view.Display;
+import android.view.IWindowManager;
+import android.view.WindowManagerGlobal;
 
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
@@ -54,9 +58,20 @@
 
     /** Returns {@code true} if gesture is available. */
     public static boolean isGestureAvailable(Context context) {
+        boolean hasNavigationBar = false;
+        final boolean configEnabled = context.getResources().getBoolean(
+                com.android.internal.R.bool.config_swipe_up_gesture_setting_available);
+
+        try {
+            IWindowManager windowManager = WindowManagerGlobal.getWindowManagerService();
+            hasNavigationBar = windowManager.hasNavigationBar(Display.DEFAULT_DISPLAY);
+        } catch (RemoteException ex) {
+            // no window manager? good luck with that
+        }
+
         // Skip if the swipe up settings are not available
-        if (!context.getResources().getBoolean(
-                com.android.internal.R.bool.config_swipe_up_gesture_setting_available)) {
+        // or if on-screen navbar is disabled (for devices with hardware keys)
+        if (!configEnabled || !hasNavigationBar) {
             return false;
         }