DeviceParts: Update Offscreen and FP gestures

* Cleanup the code too
diff --git a/DeviceParts/res/values/strings.xml b/DeviceParts/res/values/strings.xml
index b8caa3f..f64967c 100644
--- a/DeviceParts/res/values/strings.xml
+++ b/DeviceParts/res/values/strings.xml
@@ -58,6 +58,12 @@
     <string name="choose_app">Choose app</string>
     <string name="category_double_swipe_gesture">II gesture</string>
     <string name="offscreen_gesture_title">Offscreen gestures</string>
+    <string name="category_c_gesture">C gesture</string>
+    <string name="category_e_gesture">E gesture</string>
+    <string name="category_s_gesture">S gesture</string>
+    <string name="category_v_gesture">V gesture</string>
+    <string name="category_w_gesture">W gesture</string>
+    <string name="category_z_gesture">Z gesture</string>
     <string name="category_circle_gesture">O gesture</string>
     <string name="category_down_arrow_gesture">V gesture</string>
     <string name="category_up_arrow_gesture">A gesture</string>
diff --git a/DeviceParts/res/xml/gesture_settings.xml b/DeviceParts/res/xml/gesture_settings.xml
index c7ef445..aa88399 100644
--- a/DeviceParts/res/xml/gesture_settings.xml
+++ b/DeviceParts/res/xml/gesture_settings.xml
@@ -45,53 +45,53 @@
         android:title="@string/offscreen_gesture_title">
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="circle_gesture_app"
-            android:title="@string/category_circle_gesture"
+            android:key="c_gesture_app"
+            android:title="@string/category_c_gesture"
             android:persistent="false" />
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="double_swipe_gesture_app"
-            android:title="@string/category_double_swipe_gesture"
+            android:key="e_gesture_app"
+            android:title="@string/category_e_gesture"
             android:persistent="false" />
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="left_arrow_gesture_app"
-            android:title="@string/category_left_arrow_gesture"
-            android:persistent="false"/>
-
-        <org.omnirom.device.AppSelectListPreference
-            android:key="right_arrow_gesture_app"
-            android:title="@string/category_right_arrow_gesture"
-            android:persistent="false"/>
-
-        <org.omnirom.device.AppSelectListPreference
-            android:key="up_arrow_gesture_app"
-            android:title="@string/category_up_arrow_gesture"
+            android:key="s_gesture_app"
+            android:title="@string/category_s_gesture"
             android:persistent="false" />
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="down_arrow_gesture_app"
-            android:title="@string/category_down_arrow_gesture"
+            android:key="v_gesture_app"
+            android:title="@string/category_v_gesture"
             android:persistent="false"/>
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="down_swipe_gesture_app"
+            android:key="w_gesture_app"
+            android:title="@string/category_w_gesture"
+            android:persistent="false"/>
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="z_gesture_app"
+            android:title="@string/category_z_gesture"
+            android:persistent="false"/>
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="up_gesture_app"
+            android:title="@string/category_up_swipe_gesture"
+            android:persistent="false" />
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="down_gesture_app"
             android:title="@string/category_down_swipe_gesture"
             android:persistent="false"/>
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="up_swipe_gesture_app"
-            android:title="@string/category_up_swipe_gesture"
+            android:key="left_gesture_app"
+            android:title="@string/category_left_arrow_gesture"
             android:persistent="false"/>
 
         <org.omnirom.device.AppSelectListPreference
-            android:key="left_swipe_gesture_app"
-            android:title="@string/category_left_swipe_gesture"
-            android:persistent="false"/>
-
-        <org.omnirom.device.AppSelectListPreference
-            android:key="right_swipe_gesture_app"
-            android:title="@string/category_right_swipe_gesture"
+            android:key="right_gesture_app"
+            android:title="@string/category_right_arrow_gesture"
             android:persistent="false"/>
 
     </PreferenceCategory>
diff --git a/DeviceParts/src/org/omnirom/device/GestureSettings.java b/DeviceParts/src/org/omnirom/device/GestureSettings.java
index 00e1d99..02c7e3b 100644
--- a/DeviceParts/src/org/omnirom/device/GestureSettings.java
+++ b/DeviceParts/src/org/omnirom/device/GestureSettings.java
@@ -55,16 +55,17 @@
 
     public static final String KEY_PROXI_SWITCH = "proxi";
     public static final String KEY_OFF_SCREEN_GESTURE_FEEDBACK_SWITCH = "off_screen_gesture_feedback";
-    public static final String KEY_DOUBLE_SWIPE_APP = "double_swipe_gesture_app";
-    public static final String KEY_CIRCLE_APP = "circle_gesture_app";
-    public static final String KEY_DOWN_ARROW_APP = "down_arrow_gesture_app";
-    public static final String KEY_UP_ARROW_APP = "up_arrow_gesture_app";
-    public static final String KEY_LEFT_ARROW_APP = "left_arrow_gesture_app";
-    public static final String KEY_RIGHT_ARROW_APP = "right_arrow_gesture_app";
-    public static final String KEY_DOWN_SWIPE_APP = "down_swipe_gesture_app";
-    public static final String KEY_UP_SWIPE_APP = "up_swipe_gesture_app";
-    public static final String KEY_LEFT_SWIPE_APP = "left_swipe_gesture_app";
-    public static final String KEY_RIGHT_SWIPE_APP = "right_swipe_gesture_app";
+
+    public static final String KEY_C_APP = "c_gesture_app";
+    public static final String KEY_E_APP = "e_gesture_app";
+    public static final String KEY_V_APP = "v_gesture_app";
+    public static final String KEY_S_APP = "s_gesture_app";
+    public static final String KEY_W_APP = "w_gesture_app";
+    public static final String KEY_Z_APP = "z_gesture_app";
+    public static final String KEY_UP_SWIPE_APP = "up_gesture_app";
+    public static final String KEY_DOWN_SWIPE_APP = "down_gesture_app";
+    public static final String KEY_LEFT_SWIPE_APP = "left_gesture_app";
+    public static final String KEY_RIGHT_SWIPE_APP = "right_gesture_app";
     public static final String KEY_FP_GESTURE_CATEGORY = "key_fp_gesture_category";
     public static final String KEY_FP_GESTURE_DEFAULT_CATEGORY = "gesture_settings";
 
@@ -84,12 +85,12 @@
 
     private TwoStatePreference mProxiSwitch;
     private TwoStatePreference mFpSwipeDownSwitch;
-    private AppSelectListPreference mDoubleSwipeApp;
-    private AppSelectListPreference mCircleApp;
-    private AppSelectListPreference mDownArrowApp;
-    private AppSelectListPreference mUpArrowApp;
-    private AppSelectListPreference mLeftArrowApp;
-    private AppSelectListPreference mRightArrowApp;
+    private AppSelectListPreference mLetterEGesture;
+    private AppSelectListPreference mLetterCGesture;
+    private AppSelectListPreference mLetterVGesture;
+    private AppSelectListPreference mLetterSGesture;
+    private AppSelectListPreference mLetterWGesture;
+    private AppSelectListPreference mLetterZGesture;
     private AppSelectListPreference mDownSwipeApp;
     private AppSelectListPreference mUpSwipeApp;
     private AppSelectListPreference mLeftSwipeApp;
@@ -113,54 +114,54 @@
         mProxiSwitch.setChecked(Settings.System.getInt(getContext().getContentResolver(),
                 Settings.System.OMNI_DEVICE_PROXI_CHECK_ENABLED, 1) != 0);
 
-        mDoubleSwipeApp = (AppSelectListPreference) findPreference(KEY_DOUBLE_SWIPE_APP);
-        mDoubleSwipeApp.setEnabled(isGestureSupported(KEY_DOUBLE_SWIPE_APP));
+        mLetterCGesture = (AppSelectListPreference) findPreference(KEY_C_APP);
+        mLetterCGesture.setEnabled(isGestureSupported(KEY_C_APP));
         String value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_0);
-        mDoubleSwipeApp.setValue(value);
-        mDoubleSwipeApp.setOnPreferenceChangeListener(this);
+        mLetterCGesture.setValue(value);
+        mLetterCGesture.setOnPreferenceChangeListener(this);
 
-        mCircleApp = (AppSelectListPreference) findPreference(KEY_CIRCLE_APP);
-        mCircleApp.setEnabled(isGestureSupported(KEY_CIRCLE_APP));
+        mLetterEGesture = (AppSelectListPreference) findPreference(KEY_E_APP);
+        mLetterEGesture.setEnabled(isGestureSupported(KEY_E_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_1);
-        mCircleApp.setValue(value);
-        mCircleApp.setOnPreferenceChangeListener(this);
+        mLetterEGesture.setValue(value);
+        mLetterEGesture.setOnPreferenceChangeListener(this);
 
-        mDownArrowApp = (AppSelectListPreference) findPreference(KEY_DOWN_ARROW_APP);
-        mDownArrowApp.setEnabled(isGestureSupported(KEY_DOWN_ARROW_APP));
+        mLetterVGesture = (AppSelectListPreference) findPreference(KEY_V_APP);
+        mLetterVGesture.setEnabled(isGestureSupported(KEY_V_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_2);
-        mDownArrowApp.setValue(value);
-        mDownArrowApp.setOnPreferenceChangeListener(this);
+        mLetterVGesture.setValue(value);
+        mLetterVGesture.setOnPreferenceChangeListener(this);
 
-        mUpArrowApp = (AppSelectListPreference) findPreference(KEY_UP_ARROW_APP);
-        mUpArrowApp.setEnabled(isGestureSupported(KEY_UP_ARROW_APP));
+        mLetterSGesture = (AppSelectListPreference) findPreference(KEY_S_APP);
+        mLetterSGesture.setEnabled(isGestureSupported(KEY_S_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_3);
-        mUpArrowApp.setValue(value);
-        mUpArrowApp.setOnPreferenceChangeListener(this);
+        mLetterSGesture.setValue(value);
+        mLetterSGesture.setOnPreferenceChangeListener(this);
 
-        mLeftArrowApp = (AppSelectListPreference) findPreference(KEY_LEFT_ARROW_APP);
-        mLeftArrowApp.setEnabled(isGestureSupported(KEY_LEFT_ARROW_APP));
+        mLetterWGesture = (AppSelectListPreference) findPreference(KEY_W_APP);
+        mLetterWGesture.setEnabled(isGestureSupported(KEY_W_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_4);
-        mLeftArrowApp.setValue(value);
-        mLeftArrowApp.setOnPreferenceChangeListener(this);
+        mLetterWGesture.setValue(value);
+        mLetterWGesture.setOnPreferenceChangeListener(this);
 
-        mRightArrowApp = (AppSelectListPreference) findPreference(KEY_RIGHT_ARROW_APP);
-        mRightArrowApp.setEnabled(isGestureSupported(KEY_RIGHT_ARROW_APP));
+        mLetterZGesture = (AppSelectListPreference) findPreference(KEY_Z_APP);
+        mLetterZGesture.setEnabled(isGestureSupported(KEY_Z_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_5);
-        mRightArrowApp.setValue(value);
-        mRightArrowApp.setOnPreferenceChangeListener(this);
-
-        mDownSwipeApp = (AppSelectListPreference) findPreference(KEY_DOWN_SWIPE_APP);
-        mDownSwipeApp.setEnabled(isGestureSupported(KEY_DOWN_SWIPE_APP));
-        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_6);
-        mDownSwipeApp.setValue(value);
-        mDownSwipeApp.setOnPreferenceChangeListener(this);
+        mLetterZGesture.setValue(value);
+        mLetterZGesture.setOnPreferenceChangeListener(this);
 
         mUpSwipeApp = (AppSelectListPreference) findPreference(KEY_UP_SWIPE_APP);
         mUpSwipeApp.setEnabled(isGestureSupported(KEY_UP_SWIPE_APP));
-        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_7);
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_6);
         mUpSwipeApp.setValue(value);
         mUpSwipeApp.setOnPreferenceChangeListener(this);
 
+        mDownSwipeApp = (AppSelectListPreference) findPreference(KEY_DOWN_SWIPE_APP);
+        mDownSwipeApp.setEnabled(isGestureSupported(KEY_DOWN_SWIPE_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_7);
+        mDownSwipeApp.setValue(value);
+        mDownSwipeApp.setOnPreferenceChangeListener(this);
+
         mLeftSwipeApp = (AppSelectListPreference) findPreference(KEY_LEFT_SWIPE_APP);
         mLeftSwipeApp.setEnabled(isGestureSupported(KEY_LEFT_SWIPE_APP));
         value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_8);
@@ -199,45 +200,45 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
-        if (preference == mDoubleSwipeApp) {
+        if (preference == mLetterCGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_DOUBLE_SWIPE_APP, !gestureDisabled);
+            setGestureEnabled(KEY_C_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_0, value);
-        } else if (preference == mCircleApp) {
+        } else if (preference == mLetterEGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_CIRCLE_APP, !gestureDisabled);
+            setGestureEnabled(KEY_E_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_1, value);
-        } else if (preference == mDownArrowApp) {
+        } else if (preference == mLetterVGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_DOWN_ARROW_APP, !gestureDisabled);
+            setGestureEnabled(KEY_V_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_2, value);
-        } else if (preference == mUpArrowApp) {
+        } else if (preference == mLetterSGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_UP_ARROW_APP, !gestureDisabled);
+            setGestureEnabled(KEY_S_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_3, value);
-        } else if (preference == mLeftArrowApp) {
+        } else if (preference == mLetterWGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_LEFT_ARROW_APP, !gestureDisabled);
+            setGestureEnabled(KEY_W_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_4, value);
-        } else if (preference == mRightArrowApp) {
+        } else if (preference == mLetterZGesture) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_RIGHT_ARROW_APP, !gestureDisabled);
+            setGestureEnabled(KEY_Z_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_5, value);
-        } else if (preference == mDownSwipeApp) {
-            String value = (String) newValue;
-            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
-            setGestureEnabled(KEY_DOWN_SWIPE_APP, !gestureDisabled);
-            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_6, value);
         } else if (preference == mUpSwipeApp) {
             String value = (String) newValue;
             boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
             setGestureEnabled(KEY_UP_SWIPE_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_6, value);
+        } else if (preference == mDownSwipeApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_DOWN_SWIPE_APP, !gestureDisabled);
             Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_7, value);
         } else if (preference == mLeftSwipeApp) {
             String value = (String) newValue;
@@ -258,26 +259,26 @@
 
     public static String getGestureFile(String key) {
         switch(key) {
-            case KEY_CIRCLE_APP:
-                return "/proc/touchpanel/letter_o_enable";
-            case KEY_DOUBLE_SWIPE_APP:
-                return "/proc/touchpanel/double_swipe_enable";
-            case KEY_DOWN_ARROW_APP:
-                return "/proc/touchpanel/down_arrow_enable";
-            case KEY_UP_ARROW_APP:
-                return "/proc/touchpanel/up_arrow_enable";
-            case KEY_LEFT_ARROW_APP:
-                return "/proc/touchpanel/left_arrow_enable";
-            case KEY_RIGHT_ARROW_APP:
-                return "/proc/touchpanel/right_arrow_enable";
-            case KEY_DOWN_SWIPE_APP:
-                return "/proc/touchpanel/down_swipe_enable";
+            case KEY_C_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_c_mode";
+            case KEY_E_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_e_mode";
+            case KEY_V_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_v_mode";
+            case KEY_S_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_s_mode";
+            case KEY_W_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_w_mode";
+            case KEY_Z_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_z_mode";
             case KEY_UP_SWIPE_APP:
-                return "/proc/touchpanel/up_swipe_enable";
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_up_mode";
+            case KEY_DOWN_SWIPE_APP:
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_down_mode";
             case KEY_LEFT_SWIPE_APP:
-                return "/proc/touchpanel/left_swipe_enable";
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_left_mode";
             case KEY_RIGHT_SWIPE_APP:
-                return "/proc/touchpanel/right_swipe_enable";
+                return "/sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_right_mode";
         }
         return null;
     }
@@ -348,12 +349,12 @@
 
         @Override
         protected void onPostExecute(Void feed) {
-            mDoubleSwipeApp.setPackageList(mInstalledPackages);
-            mCircleApp.setPackageList(mInstalledPackages);
-            mDownArrowApp.setPackageList(mInstalledPackages);
-            mUpArrowApp.setPackageList(mInstalledPackages);
-            mLeftArrowApp.setPackageList(mInstalledPackages);
-            mRightArrowApp.setPackageList(mInstalledPackages);
+            mLetterEGesture.setPackageList(mInstalledPackages);
+            mLetterCGesture.setPackageList(mInstalledPackages);
+            mLetterVGesture.setPackageList(mInstalledPackages);
+            mLetterSGesture.setPackageList(mInstalledPackages);
+            mLetterWGesture.setPackageList(mInstalledPackages);
+            mLetterZGesture.setPackageList(mInstalledPackages);
             mDownSwipeApp.setPackageList(mInstalledPackages);
             mUpSwipeApp.setPackageList(mInstalledPackages);
             mLeftSwipeApp.setPackageList(mInstalledPackages);
diff --git a/DeviceParts/src/org/omnirom/device/KeyHandler.java b/DeviceParts/src/org/omnirom/device/KeyHandler.java
index c591afa..99466ea 100644
--- a/DeviceParts/src/org/omnirom/device/KeyHandler.java
+++ b/DeviceParts/src/org/omnirom/device/KeyHandler.java
@@ -72,63 +72,57 @@
     private static final boolean DEBUG_SENSOR = true;
 
     protected static final int GESTURE_REQUEST = 1;
-    private static final int GESTURE_WAKELOCK_DURATION = 2000;
+    private static final int GESTURE_WAKELOCK_DURATION = 1000;
 
-    private static final int GESTURE_CIRCLE_SCANCODE = 250;
-    private static final int GESTURE_V_SCANCODE = 252;
-    private static final int GESTURE_II_SCANCODE = 251;
-    private static final int GESTURE_LEFT_V_SCANCODE = 253;
-    private static final int GESTURE_RIGHT_V_SCANCODE = 254;
-    private static final int GESTURE_A_SCANCODE = 255;
-    private static final int GESTURE_RIGHT_SWIPE_SCANCODE = 63;
-    private static final int GESTURE_LEFT_SWIPE_SCANCODE = 64;
-    private static final int GESTURE_DOWN_SWIPE_SCANCODE = 65;
-    private static final int GESTURE_UP_SWIPE_SCANCODE = 66;
+    private static final int KEY_GESTURE_UP_SWIPE = 258;
+    private static final int KEY_GESTURE_DOWN_SWIPE = 259;
+    private static final int KEY_GESTURE_LEFT_SWIPE = 260;
+    private static final int KEY_GESTURE_RIGHT_SWIPE = 261;
+    private static final int KEY_GESTURE_C = 269;
+    private static final int KEY_GESTURE_E = 263;
+    private static final int KEY_GESTURE_S = 267;
+    private static final int KEY_GESTURE_V = 268;
+    private static final int KEY_GESTURE_W = 266;
+    private static final int KEY_GESTURE_Z = 270;
 
     private static final int KEY_DOUBLE_TAP = 143;
     private static final int KEY_HOME = 102;
     private static final int KEY_BACK = 158;
     private static final int KEY_RECENTS = 580;
-    private static final int KEY_SLIDER_TOP = 601;
-    private static final int KEY_SLIDER_CENTER = 602;
-    private static final int KEY_SLIDER_BOTTOM = 603;
 
     private static final int MIN_PULSE_INTERVAL_MS = 2500;
     private static final String DOZE_INTENT = "com.android.systemui.doze.pulse";
     private static final int HANDWAVE_MAX_DELTA_MS = 1000;
     private static final int POCKET_MIN_DELTA_MS = 5000;
-    private static final int FP_GESTURE_LONG_PRESS = 305;
+    private static final int FP_GESTURE_LONG_PRESS = 188;
 
     private static final int[] sSupportedGestures = new int[]{
-        GESTURE_II_SCANCODE,
-        GESTURE_CIRCLE_SCANCODE,
-        GESTURE_V_SCANCODE,
-        GESTURE_A_SCANCODE,
-        GESTURE_LEFT_V_SCANCODE,
-        GESTURE_RIGHT_V_SCANCODE,
-        GESTURE_DOWN_SWIPE_SCANCODE,
-        GESTURE_UP_SWIPE_SCANCODE,
-        GESTURE_LEFT_SWIPE_SCANCODE,
-        GESTURE_RIGHT_SWIPE_SCANCODE,
-        KEY_DOUBLE_TAP,
-        KEY_SLIDER_TOP,
-        KEY_SLIDER_CENTER,
-        KEY_SLIDER_BOTTOM,
+        KEY_GESTURE_C,
+        KEY_GESTURE_E,
+        KEY_GESTURE_V,
+        KEY_GESTURE_S,
+        KEY_GESTURE_W,
+        KEY_GESTURE_Z,
+        KEY_GESTURE_UP_SWIPE,
+        KEY_GESTURE_DOWN_SWIPE,
+        KEY_GESTURE_LEFT_SWIPE,
+        KEY_GESTURE_RIGHT_SWIPE,
+        //KEY_DOUBLE_TAP,
         FP_GESTURE_LONG_PRESS
     };
 
     private static final int[] sProxiCheckedGestures = new int[]{
-        GESTURE_II_SCANCODE,
-        GESTURE_CIRCLE_SCANCODE,
-        GESTURE_V_SCANCODE,
-        GESTURE_A_SCANCODE,
-        GESTURE_LEFT_V_SCANCODE,
-        GESTURE_RIGHT_V_SCANCODE,
-        GESTURE_DOWN_SWIPE_SCANCODE,
-        GESTURE_UP_SWIPE_SCANCODE,
-        GESTURE_LEFT_SWIPE_SCANCODE,
-        GESTURE_RIGHT_SWIPE_SCANCODE,
-        KEY_DOUBLE_TAP
+        KEY_GESTURE_C,
+        KEY_GESTURE_E,
+        KEY_GESTURE_V,
+        KEY_GESTURE_S,
+        KEY_GESTURE_W,
+        KEY_GESTURE_Z,
+        KEY_GESTURE_UP_SWIPE,
+        KEY_GESTURE_DOWN_SWIPE,
+        KEY_GESTURE_LEFT_SWIPE,
+        KEY_GESTURE_RIGHT_SWIPE
+        //KEY_DOUBLE_TAP
     };
 
     protected final Context mContext;
@@ -155,8 +149,6 @@
     private boolean isFpgesture;
     private boolean isOPCameraAvail;
     private boolean mRestoreUser;
-    private boolean mToggleTorch = false;
-    private boolean mTorchState = false;
 
     private SensorEventListener mProximitySensor = new SensorEventListener() {
         @Override
@@ -268,9 +260,7 @@
         mNoMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
         mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
-        //mTiltSensor = getSensor(mSensorManager, "oneplus.sensor.op_motion_detect");
         mTiltSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TILT_DETECTOR);
-        //mPocketSensor = getSensor(mSensorManager, "oneplus.sensor.pocket");
         mPocketSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
         IntentFilter systemStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
         systemStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
@@ -425,30 +415,6 @@
         }
     }
 
-    private void disableTorch() {
-        if (mTorchState) {
-            mToggleTorch = true;
-            mTorchState = false;
-            toggleTorch();
-        }
-    }
-
-    private void toggleTorch() {
-        IStatusBarService service = getStatusBarService();
-        if (service != null) {
-            try {
-                if (mToggleTorch) {
-                    service.toggleCameraFlashState(mTorchState);
-                    mToggleTorch = false;
-                } else {
-                    service.toggleCameraFlash();
-                }
-            } catch (RemoteException e) {
-                // do nothing.
-            }
-        }
-    }
-
     private Intent createIntent(String value) {
         ComponentName componentName = ComponentName.unflattenFromString(value);
         Intent intent = new Intent(Intent.ACTION_MAIN);
@@ -462,8 +428,15 @@
     private boolean launchSpecialActions(String value) {
         if (value.equals(AppSelectListPreference.TORCH_ENTRY)) {
             mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
-            toggleTorch();
-            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            IStatusBarService service = getStatusBarService();
+            if (service != null) {
+                try {
+                    service.toggleCameraFlash();
+                    OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+                } catch (RemoteException e) {
+                    // do nothing.
+                }
+            }
             return true;
         } else if (value.equals(AppSelectListPreference.MUSIC_PLAY_ENTRY)) {
             mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
@@ -518,34 +491,34 @@
 
     private String getGestureValueForScanCode(int scanCode) {
         switch(scanCode) {
-            case GESTURE_II_SCANCODE:
+            case KEY_GESTURE_C:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_0, UserHandle.USER_CURRENT);
-            case GESTURE_CIRCLE_SCANCODE:
+            case KEY_GESTURE_E:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_1, UserHandle.USER_CURRENT);
-            case GESTURE_V_SCANCODE:
+            case KEY_GESTURE_V:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_2, UserHandle.USER_CURRENT);
-            case GESTURE_A_SCANCODE:
+            case KEY_GESTURE_S:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_3, UserHandle.USER_CURRENT);
-            case GESTURE_LEFT_V_SCANCODE:
+            case KEY_GESTURE_W:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_4, UserHandle.USER_CURRENT);
-            case GESTURE_RIGHT_V_SCANCODE:
+            case KEY_GESTURE_Z:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_5, UserHandle.USER_CURRENT);
-            case GESTURE_DOWN_SWIPE_SCANCODE:
+            case KEY_GESTURE_UP_SWIPE:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_6, UserHandle.USER_CURRENT);
-            case GESTURE_UP_SWIPE_SCANCODE:
+            case KEY_GESTURE_DOWN_SWIPE:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_7, UserHandle.USER_CURRENT);
-            case GESTURE_LEFT_SWIPE_SCANCODE:
+            case KEY_GESTURE_LEFT_SWIPE:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_8, UserHandle.USER_CURRENT);
-            case GESTURE_RIGHT_SWIPE_SCANCODE:
+            case KEY_GESTURE_RIGHT_SWIPE:
                 return Settings.System.getStringForUser(mContext.getContentResolver(),
                     GestureSettings.DEVICE_GESTURE_MAPPING_9, UserHandle.USER_CURRENT);
         }
@@ -595,9 +568,4 @@
     IStatusBarService getStatusBarService() {
         return IStatusBarService.Stub.asInterface(ServiceManager.getService("statusbar"));
     }
-
-    @Override
-    public boolean getCustomProxiIsNear(SensorEvent event) {
-        return event.values[0] == 1;
-    }
 }
diff --git a/DeviceParts/src/org/omnirom/device/Startup.java b/DeviceParts/src/org/omnirom/device/Startup.java
index 5920134..b853564 100644
--- a/DeviceParts/src/org/omnirom/device/Startup.java
+++ b/DeviceParts/src/org/omnirom/device/Startup.java
@@ -66,7 +66,7 @@
             Settings.System.putString(context.getContentResolver(), mapping, value);
         }
         boolean enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_DOUBLE_SWIPE_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_C_APP), enabled);
 
         // circle -> camera
         mapping = GestureSettings.DEVICE_GESTURE_MAPPING_1;
@@ -76,7 +76,7 @@
             Settings.System.putString(context.getContentResolver(), mapping, value);
         }
         enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_CIRCLE_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_E_APP), enabled);
 
         // down arrow -> flashlight
         mapping = GestureSettings.DEVICE_GESTURE_MAPPING_2;
@@ -86,12 +86,17 @@
             Settings.System.putString(context.getContentResolver(), mapping, value);
         }
         enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_DOWN_ARROW_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_V_APP), enabled);
 
         // up arrow
+        mapping = GestureSettings.DEVICE_GESTURE_MAPPING_3;
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.TORCH_ENTRY;
+            Settings.System.putString(context.getContentResolver(), mapping, value);
+        }
         value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_3);
         enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_UP_ARROW_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_S_APP), enabled);
 
         // left arrow -> music prev
         mapping = GestureSettings.DEVICE_GESTURE_MAPPING_4;
@@ -101,7 +106,7 @@
             Settings.System.putString(context.getContentResolver(), mapping, value);
         }
         enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_LEFT_ARROW_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_W_APP), enabled);
 
         // right arrow -> music next
         mapping = GestureSettings.DEVICE_GESTURE_MAPPING_5;
@@ -111,18 +116,18 @@
             Settings.System.putString(context.getContentResolver(), mapping, value);
         }
         enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_RIGHT_ARROW_APP), enabled);
-
-        // down swipe
-        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_6);
-        enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
-        restore(getGestureFile(GestureSettings.KEY_DOWN_SWIPE_APP), enabled);
+        restore(getGestureFile(GestureSettings.KEY_Z_APP), enabled);
 
         // up swipe
-        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_7);
+        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_6);
         enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
         restore(getGestureFile(GestureSettings.KEY_UP_SWIPE_APP), enabled);
 
+        // down swipe
+        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_7);
+        enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_DOWN_SWIPE_APP), enabled);
+
         // left swipe
         value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_8);
         enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
diff --git a/keylayout/fts_ts.kl b/keylayout/fts_ts.kl
index 089d86e..0f8d162 100644
--- a/keylayout/fts_ts.kl
+++ b/keylayout/fts_ts.kl
@@ -1,11 +1,15 @@
-key 116    GESTURE_DOUBLE_CLICK          WAKE    VIRTUAL
-key 103    GESTURE_SWIPE_UP          WAKE    VIRTUAL
+#key 116    GESTURE_DOUBLE_CLICK          WAKE    VIRTUAL
+#key 103    GESTURE_SWIPE_UP          WAKE    VIRTUAL
 key 158    BACK               VIRTUAL
-key 139    APP_SWITCH         VIRTUAL
+#key 139    APP_SWITCH         VIRTUAL
 key 102    HOME               VIRTUAL
-key 17     GESTURE_W      WAKE    VIRTUAL
-key 31     GESTURE_S      WAKE    VIRTUAL
-key 18     GESTURE_E      WAKE    VIRTUAL
-key 46     GESTURE_C      WAKE    VIRTUAL
-key 44     GESTURE_Z      WAKE    VIRTUAL
-key 47     GESTURE_V      WAKE    VIRTUAL
+key 258     GESTURE_UP_SWIPE          WAKE    VIRTUAL
+key 259     GESTURE_DOWN_SWIPE        WAKE    VIRTUAL
+key 260     GESTURE_LEFT_SWIPE        WAKE    VIRTUAL
+key 261     GESTURE_RIGHT_SWIPE       WAKE    VIRTUAL
+key 266     GESTURE_W      WAKE    VIRTUAL
+key 267     GESTURE_S      WAKE    VIRTUAL
+key 263     GESTURE_E      WAKE    VIRTUAL
+key 269     GESTURE_C      WAKE    VIRTUAL
+key 270     GESTURE_Z      WAKE    VIRTUAL
+key 268     GESTURE_V      WAKE    VIRTUAL
\ No newline at end of file
diff --git a/keylayout/goodixfp.kl b/keylayout/goodixfp.kl
index 3ec1325..b06d453 100644
--- a/keylayout/goodixfp.kl
+++ b/keylayout/goodixfp.kl
@@ -1,10 +1,4 @@
-key 102   HOME                      VIRTUAL
-key 103   SYSTEM_NAVIGATION_UP      GESTURE
-key 105   SYSTEM_NAVIGATION_LEFT    GESTURE
-key 106   SYSTEM_NAVIGATION_RIGHT   GESTURE
-key 108   SYSTEM_NAVIGATION_DOWN    GESTURE
-
-key 187   FINGERPRINT_TAP           GESTURE
-key 188   FINGERPRINT_DTAP          GESTURE
-key 189   FINGERPRINT_LONGPRESS     GESTURE
-key 192   FINGERPRINT_EARLYWAKEUP   GESTURE
+key 103   SYSTEM_NAVIGATION_UP
+key 108   SYSTEM_NAVIGATION_DOWN
+key 105   SYSTEM_NAVIGATION_LEFT
+key 106   SYSTEM_NAVIGATION_RIGHT
\ No newline at end of file
diff --git a/prebuilt/system/etc/init/init.qcom.rc b/prebuilt/system/etc/init/init.qcom.rc
index 77d8b60..198323a 100644
--- a/prebuilt/system/etc/init/init.qcom.rc
+++ b/prebuilt/system/etc/init/init.qcom.rc
@@ -2,4 +2,39 @@
     mount none /system/etc/audio_policy_configuration.xml /vendor/etc/audio/audio_policy_configuration.xml bind
     mount none /system/etc/fstab.qcom /vendor/etc/fstab.qcom bind
     mount none /system/lib/modules/wlan.ko /vendor/lib/modules/qca_cld3_wlan.ko bind
-    mount none /system/lib64/hw/lights.msmnile.so /vendor/lib64/hw/lights.msmnile.so bind
\ No newline at end of file
+    mount none /system/lib64/hw/lights.msmnile.so /vendor/lib64/hw/lights.msmnile.so bind
+
+on boot
+    # Gestures
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_c_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_c_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_e_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_e_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_v_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_v_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_s_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_s_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_w_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_w_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_z_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_z_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_left_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_left_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_right_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_right_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_up_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_up_mode
+
+    chown system system /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_down_mode
+    chmod 0660 /sys/devices/platform/soc/c80000.i2c/i2c-4/4-0038/fts_gesture_down_mode
diff --git a/sepolicy/private/file.te b/sepolicy/private/file.te
index b99e56a..d5662e6 100644
--- a/sepolicy/private/file.te
+++ b/sepolicy/private/file.te
@@ -2,4 +2,17 @@
 type asdf_file, file_type;
 type demoapp_file, file_type;
 type voucher_file, file_type;
-type xrom_file, file_type;
\ No newline at end of file
+type xrom_file, file_type;
+
+# Offscreen Gestures
+type fts_gesture_mode, fs_type;
+type fts_gesture_c_mode, fs_type;
+type fts_gesture_e_mode, fs_type;
+type fts_gesture_v_mode, fs_type;
+type fts_gesture_s_mode, fs_type;
+type fts_gesture_w_mode, fs_type;
+type fts_gesture_z_mode, fs_type;
+type fts_gesture_left_mode, fs_type;
+type fts_gesture_right_mode, fs_type;
+type fts_gesture_up_mode, fs_type;
+type fts_gesture_down_mode, fs_type;
\ No newline at end of file
diff --git a/sepolicy/private/system_app.te b/sepolicy/private/system_app.te
new file mode 100644
index 0000000..ca8d554
--- /dev/null
+++ b/sepolicy/private/system_app.te
@@ -0,0 +1,27 @@
+allow system_app {
+  fts_gesture_mode
+  -fts_gesture_c_mode
+  -fts_gesture_e_mode
+  -fts_gesture_v_mode
+  -fts_gesture_s_mode
+  -fts_gesture_w_mode
+  -fts_gesture_z_mode
+  -fts_gesture_up_mode
+  -fts_gesture_down_mode
+  -fts_gesture_left_mode
+  -fts_gesture_right_mode
+}:file { open write };
+
+allow system_app {
+  fts_gesture_mode
+  -fts_gesture_c_mode
+  -fts_gesture_e_mode
+  -fts_gesture_v_mode
+  -fts_gesture_s_mode
+  -fts_gesture_w_mode
+  -fts_gesture_z_mode
+  -fts_gesture_up_mode
+  -fts_gesture_down_mode
+  -fts_gesture_left_mode
+  -fts_gesture_right_mode
+}:file getattr;
\ No newline at end of file