Add DeviceParts with most of Doze and Gestures features

Taken from oneplus6 and edit for our zenfone 6
diff --git a/DeviceParts/Android.mk b/DeviceParts/Android.mk
new file mode 100644
index 0000000..5e25f43
--- /dev/null
+++ b/DeviceParts/Android.mk
@@ -0,0 +1,40 @@
+LOCAL_PATH := $(call my-dir)
+ifeq ($(TARGET_DEVICE),$(filter $(TARGET_DEVICE),zenfone6))
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+    android-support-v14-preference \
+    android-support-v13 \
+    android-support-v7-appcompat \
+    android-support-v7-preference \
+    android-support-v7-recyclerview \
+    android-support-v4
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_PACKAGE_NAME := DeviceParts
+LOCAL_CERTIFICATE := platform
+LOCAL_PRIVILEGED_MODULE := true
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_USE_AAPT2 := true
+
+package_resource_overlays := $(strip \
+    $(wildcard $(foreach dir, $(PRODUCT_PACKAGE_OVERLAYS), \
+      $(addprefix $(dir)/, packages/apps/DeviceParts/res))) \
+    $(wildcard $(foreach dir, $(DEVICE_PACKAGE_OVERLAYS), \
+      $(addprefix $(dir)/, packages/apps/DeviceParts/res))))
+
+LOCAL_RESOURCE_DIR := $(package_resource_overlays) $(LOCAL_RESOURCE_DIR)
+
+LOCAL_JAVA_LIBRARIES := telephony-common
+
+LOCAL_PROGUARD_ENABLED := disabled
+LOCAL_DEX_PREOPT := false
+
+include frameworks/base/packages/SettingsLib/common.mk
+
+include packages/apps/OmniLib/common.mk
+
+include $(BUILD_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+endif
diff --git a/DeviceParts/AndroidManifest.xml b/DeviceParts/AndroidManifest.xml
new file mode 100644
index 0000000..c54d9d4
--- /dev/null
+++ b/DeviceParts/AndroidManifest.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.omnirom.device"
+    android:sharedUserId="android.uid.system" >
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.VIBRATE" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.INJECT_EVENTS" />
+    <uses-permission android:name="android.permission.CAMERA" />
+
+    <protected-broadcast android:name="com.android.systemui.doze.pulse" />
+
+    <uses-sdk
+        android:minSdkVersion="26"
+        android:targetSdkVersion="26" />
+    <application
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/advanced_settings"
+        android:theme="@style/AppTheme"
+        android:supportsRtl="true" >
+        <activity
+            android:name="org.omnirom.device.DeviceSettingsActivity"
+            android:exported="false"
+            android:label="@string/advanced_settings"
+            android:launchMode="singleTask" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity-alias
+            android:name="org.omnirom.device.DeviceSettings"
+            android:exported="true"
+            android:label="@string/advanced_settings"
+            android:targetActivity="DeviceSettingsActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <!--<category android:name="android.intent.category.LAUNCHER" />-->
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity-alias>
+        <activity
+            android:name="org.omnirom.device.GestureSettingsActivity"
+            android:exported="false"
+            android:label="@string/category_gestures_title"
+            android:launchMode="singleTask" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name="org.omnirom.device.DozeSettingsActivity"
+            android:exported="false"
+            android:label="@string/doze_category_title"
+            android:launchMode="singleTask" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name="com.android.settings.Settings$SwipeToNotificationSuggestionActivity"
+            android:exported="true"
+            android:label="@string/fp_swipe_down_switch_title_head"
+            android:launchMode="singleTask" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+        <receiver android:name="org.omnirom.device.Startup" >
+            <intent-filter android:priority="100" >
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+    </application>
+</manifest>
diff --git a/DeviceParts/res/drawable-v26/ic_launcher.xml b/DeviceParts/res/drawable-v26/ic_launcher.xml
new file mode 100644
index 0000000..44a0834
--- /dev/null
+++ b/DeviceParts/res/drawable-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt">
+    <background android:drawable="@drawable/asus_app_ic_background_launcher"/>
+    <foreground android:drawable="@drawable/ic_asus_app_ic_foreground_launcher"/>
+</adaptive-icon>
diff --git a/DeviceParts/res/drawable/arrow_collapse_down.xml b/DeviceParts/res/drawable/arrow_collapse_down.xml
new file mode 100644
index 0000000..8f793f3
--- /dev/null
+++ b/DeviceParts/res/drawable/arrow_collapse_down.xml
@@ -0,0 +1,9 @@
+<!-- drawable/arrow_collapse_down.xml -->

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

+    android:height="24dp"

+    android:width="24dp"

+    android:viewportWidth="24"

+    android:viewportHeight="24"

+    android:tint="?android:attr/colorAccent">

+    <path android:fillColor="#000" android:pathData="M19.92,12.08L12,20L4.08,12.08L5.5,10.67L11,16.17V2H13V16.17L18.5,10.66L19.92,12.08M12,20H2V22H22V20H12Z" />

+</vector>

diff --git a/DeviceParts/res/drawable/arrow_collapse_up.xml b/DeviceParts/res/drawable/arrow_collapse_up.xml
new file mode 100644
index 0000000..e859eb6
--- /dev/null
+++ b/DeviceParts/res/drawable/arrow_collapse_up.xml
@@ -0,0 +1,9 @@
+<!-- drawable/arrow_collapse_up.xml -->

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

+    android:height="24dp"

+    android:width="24dp"

+    android:viewportWidth="24"

+    android:viewportHeight="24"

+    android:tint="?android:attr/colorAccent">

+    <path android:fillColor="#000" android:pathData="M4.08,11.92L12,4L19.92,11.92L18.5,13.33L13,7.83V22H11V7.83L5.5,13.33L4.08,11.92M12,4H22V2H2V4H12Z" />

+</vector>

diff --git a/DeviceParts/res/drawable/asus_app_ic_background_launcher.png b/DeviceParts/res/drawable/asus_app_ic_background_launcher.png
new file mode 100644
index 0000000..0f54091
--- /dev/null
+++ b/DeviceParts/res/drawable/asus_app_ic_background_launcher.png
Binary files differ
diff --git a/DeviceParts/res/drawable/back.xml b/DeviceParts/res/drawable/back.xml
new file mode 100644
index 0000000..3345310
--- /dev/null
+++ b/DeviceParts/res/drawable/back.xml
@@ -0,0 +1,9 @@
+<!-- drawable/arrow_left.xml -->

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

+    android:height="24dp"

+    android:width="24dp"

+    android:viewportWidth="24"

+    android:viewportHeight="24"

+    android:tint="?android:attr/colorAccent">

+    <path android:fillColor="#000" android:pathData="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z" />

+</vector>

diff --git a/DeviceParts/res/drawable/home.xml b/DeviceParts/res/drawable/home.xml
new file mode 100644
index 0000000..77475c4
--- /dev/null
+++ b/DeviceParts/res/drawable/home.xml
@@ -0,0 +1,9 @@
+<!-- drawable/checkbox_blank_circle_outline.xml -->

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

+    android:height="24dp"

+    android:width="24dp"

+    android:viewportWidth="24"

+    android:viewportHeight="24"

+    android:tint="?android:attr/colorAccent">

+    <path android:fillColor="#000" android:pathData="M12,20A8,8 0 0,1 4,12A8,8 0 0,1 12,4A8,8 0 0,1 20,12A8,8 0 0,1 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" />

+</vector>

diff --git a/DeviceParts/res/drawable/ic_asus_app_ic_foreground_launcher.xml b/DeviceParts/res/drawable/ic_asus_app_ic_foreground_launcher.xml
new file mode 100644
index 0000000..de4b929
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_asus_app_ic_foreground_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:aapt="http://schemas.android.com/aapt" android:height="108dp" android:width="108dp" android:viewportWidth="108" android:viewportHeight="108">
+    <path android:fillColor="#ebebeb" android:pathData="M54,40.6L38.6,52.8v17.7c0,1.2 0.9,2 2,2h8.2V60.1H59v12.4h8.2c1.2,0 2,-0.9 2,-2V52.8L54,40.6z"/>
+    <path android:fillColor="#7fb2e8" android:pathData="M71.5,54.5l-17.5,-13.9l-17.5,13.9l-3.8,-4.1l21.3,-17l21.3,17z"/>
+</vector>
diff --git a/DeviceParts/res/drawable/ic_camera.xml b/DeviceParts/res/drawable/ic_camera.xml
new file mode 100644
index 0000000..8294f4b
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_camera.xml
@@ -0,0 +1,9 @@
+<!-- drawable/camera.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="32dp"
+    android:width="32dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M4,4H7L9,2H15L17,4H20A2,2 0 0,1 22,6V18A2,2 0 0,1 20,20H4A2,2 0 0,1 2,18V6A2,2 0 0,1 4,4M12,7A5,5 0 0,0 7,12A5,5 0 0,0 12,17A5,5 0 0,0 17,12A5,5 0 0,0 12,7M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_disabled.xml b/DeviceParts/res/drawable/ic_disabled.xml
new file mode 100644
index 0000000..1c5152b
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_disabled.xml
@@ -0,0 +1,8 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="32dp"
+        android:width="32dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24"
+        android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"/>
+</vector>
diff --git a/DeviceParts/res/drawable/ic_flashlight.xml b/DeviceParts/res/drawable/ic_flashlight.xml
new file mode 100644
index 0000000..213a7f6
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_flashlight.xml
@@ -0,0 +1,9 @@
+<!-- drawable/flashlight.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="32dp"
+    android:width="32dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M9,10L6,5H18L15,10H9M18,4H6V2H18V4M9,22V11H15V22H9M12,13A1,1 0 0,0 11,14A1,1 0 0,0 12,15A1,1 0 0,0 13,14A1,1 0 0,0 12,13Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_hbm_tile.xml b/DeviceParts/res/drawable/ic_hbm_tile.xml
new file mode 100644
index 0000000..95cf546
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_hbm_tile.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="24dp"
+        android:width="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+    <path android:fillColor="#fff" android:pathData="M7,17H4C2.38,17 0.96,15.74 0.76,14.14L0.26,11.15C0.15,10.3 0.39,9.5 0.91,8.92C1.43,8.34 2.19,8 3,8H9C9.83,8 10.58,8.35 11.06,8.96C11.17,9.11 11.27,9.27 11.35,9.45C11.78,9.36 12.22,9.36 12.64,9.45C12.72,9.27 12.82,9.11 12.94,8.96C13.41,8.35 14.16,8 15,8H21C21.81,8 22.57,8.34 23.09,8.92C23.6,9.5 23.84,10.3 23.74,11.11L23.23,14.18C23.04,15.74 21.61,17 20,17H17C15.44,17 13.92,15.81 13.54,14.3L12.64,11.59C12.26,11.31 11.73,11.31 11.35,11.59L10.43,14.37C10.07,15.82 8.56,17 7,17Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_info_outline_24dp.xml b/DeviceParts/res/drawable/ic_info_outline_24dp.xml
new file mode 100644
index 0000000..3fe1e9e
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_info_outline_24dp.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/textColorSecondary">
+    <path
+        android:fillColor="#000000"
+        android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
+</vector>
diff --git a/DeviceParts/res/drawable/ic_music_next.xml b/DeviceParts/res/drawable/ic_music_next.xml
new file mode 100644
index 0000000..baad21d
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_music_next.xml
@@ -0,0 +1,9 @@
+<!-- drawable/skip_next.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="32dp"
+    android:width="32dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M16,18H18V6H16M6,18L14.5,12L6,6V18Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_music_play.xml b/DeviceParts/res/drawable/ic_music_play.xml
new file mode 100644
index 0000000..d8c3ba8
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_music_play.xml
@@ -0,0 +1,9 @@
+<!-- drawable/play.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="32dp"
+    android:width="32dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M8,5.14V19.14L19,12.14L8,5.14Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_music_prev.xml b/DeviceParts/res/drawable/ic_music_prev.xml
new file mode 100644
index 0000000..199fcd1
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_music_prev.xml
@@ -0,0 +1,9 @@
+<!-- drawable/skip_previous.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="32dp"
+    android:width="32dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M6,18V6H8V18H6M9.5,12L18,6V18L9.5,12Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_panel_tile.xml b/DeviceParts/res/drawable/ic_panel_tile.xml
new file mode 100644
index 0000000..ee0137f
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_panel_tile.xml
@@ -0,0 +1,7 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="24dp"
+        android:width="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+    <path android:fillColor="#fff" android:pathData="M17.5,12A1.5,1.5 0 0,1 16,10.5A1.5,1.5 0 0,1 17.5,9A1.5,1.5 0 0,1 19,10.5A1.5,1.5 0 0,1 17.5,12M14.5,8A1.5,1.5 0 0,1 13,6.5A1.5,1.5 0 0,1 14.5,5A1.5,1.5 0 0,1 16,6.5A1.5,1.5 0 0,1 14.5,8M9.5,8A1.5,1.5 0 0,1 8,6.5A1.5,1.5 0 0,1 9.5,5A1.5,1.5 0 0,1 11,6.5A1.5,1.5 0 0,1 9.5,8M6.5,12A1.5,1.5 0 0,1 5,10.5A1.5,1.5 0 0,1 6.5,9A1.5,1.5 0 0,1 8,10.5A1.5,1.5 0 0,1 6.5,12M12,3A9,9 0 0,0 3,12A9,9 0 0,0 12,21A1.5,1.5 0 0,0 13.5,19.5C13.5,19.11 13.35,18.76 13.11,18.5C12.88,18.23 12.73,17.88 12.73,17.5A1.5,1.5 0 0,1 14.23,16H16A5,5 0 0,0 21,11C21,6.58 16.97,3 12,3Z" />
+</vector>
diff --git a/DeviceParts/res/drawable/ic_settings_sound.xml b/DeviceParts/res/drawable/ic_settings_sound.xml
new file mode 100644
index 0000000..7054d78
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_settings_sound.xml
@@ -0,0 +1,30 @@
+<!--
+    Copyright (C) 2016 The Android Open Source Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24.0dp"
+        android:height="24.0dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18
+1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0
+0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61
+.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85
+v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22
+.86 z"/>
+</vector>
diff --git a/DeviceParts/res/drawable/ic_wakeup.xml b/DeviceParts/res/drawable/ic_wakeup.xml
new file mode 100644
index 0000000..34209eb
--- /dev/null
+++ b/DeviceParts/res/drawable/ic_wakeup.xml
@@ -0,0 +1,8 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="32dp"
+        android:width="32dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24"
+        android:tint="?android:attr/colorAccent" >
+    <path android:fillColor="#fff" android:pathData="M16.56,5.44L15.11,6.89C16.84,7.94 18,9.83 18,12A6,6 0 0,1 12,18A6,6 0 0,1 6,12C6,9.83 7.16,7.94 8.88,6.88L7.44,5.44C5.36,6.88 4,9.28 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12C20,9.28 18.64,6.88 16.56,5.44M13,3H11V13H13" />
+</vector>
diff --git a/DeviceParts/res/drawable/recent.xml b/DeviceParts/res/drawable/recent.xml
new file mode 100644
index 0000000..e3935a3
--- /dev/null
+++ b/DeviceParts/res/drawable/recent.xml
@@ -0,0 +1,9 @@
+<!-- drawable/crop_square.xml -->

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

+    android:height="24dp"

+    android:width="24dp"

+    android:viewportWidth="24"

+    android:viewportHeight="24"

+    android:tint="?android:attr/colorAccent">

+    <path android:fillColor="#000" android:pathData="M18,18H6V6H18M18,4H6A2,2 0 0,0 4,6V18A2,2 0 0,0 6,20H18A2,2 0 0,0 20,18V6C20,4.89 19.1,4 18,4Z" />

+</vector>

diff --git a/DeviceParts/res/layout/applist_preference_icon.xml b/DeviceParts/res/layout/applist_preference_icon.xml
new file mode 100644
index 0000000..1d6425d
--- /dev/null
+++ b/DeviceParts/res/layout/applist_preference_icon.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source Project
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- Layout for a Preference in a PreferenceActivity. The
+     Preference is able to place a specific widget for its particular
+     type in the "widget_frame" layout. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/widget_frame"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:gravity="center_vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground">
+
+    <ImageView
+        android:id="@+id/icon"
+        android:layout_width="48dp"
+        android:layout_height="48dp"
+        android:layout_marginEnd="12dip"
+        android:padding="2dp"
+        android:scaleType="centerInside"
+        android:layout_gravity="center" />
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="2dip"
+        android:layout_marginEnd="6dip"
+        android:layout_marginTop="6dip"
+        android:layout_marginBottom="6dip"
+        android:layout_weight="1">
+
+        <TextView android:id="@+id/title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceListItem"
+            android:textColor="?android:attr/textColorPrimary"
+            android:ellipsize="marquee"
+            android:fadingEdge="horizontal" />
+
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/DeviceParts/res/layout/preference_app_select.xml b/DeviceParts/res/layout/preference_app_select.xml
new file mode 100644
index 0000000..e1a92f9
--- /dev/null
+++ b/DeviceParts/res/layout/preference_app_select.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground"
+    android:clipToPadding="false"
+    android:orientation="horizontal" >
+
+    <LinearLayout
+        android:id="@+id/icon_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="start|center_vertical"
+        android:orientation="horizontal"
+        android:clipToPadding="false"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp">
+        <com.android.internal.widget.PreferenceImageView
+            android:id="@android:id/icon"
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:gravity="center"
+            android:scaleType="centerInside" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:gravity="center_vertical"
+        android:layout_weight="1" >
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="6dip"
+            android:layout_marginTop="10dip"
+            android:layout_marginBottom="6dip" >
+
+            <TextView android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:ellipsize="marquee" />
+
+            <TextView android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@android:id/title"
+                android:layout_alignStart="@android:id/title"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+                android:textColor="?android:attr/textColorSecondary"
+                android:maxLines="10"
+                android:ellipsize="end" />
+
+        </RelativeLayout>
+    </LinearLayout>
+</LinearLayout>
diff --git a/DeviceParts/res/layout/preference_dialog_applist.xml b/DeviceParts/res/layout/preference_dialog_applist.xml
new file mode 100644
index 0000000..38b4fd4
--- /dev/null
+++ b/DeviceParts/res/layout/preference_dialog_applist.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:gravity="center_horizontal"
+        android:padding="24dip">
+
+     <ListView android:id="@+id/applist"
+               android:layout_width="match_parent"
+               android:layout_height="match_parent"/>
+
+</LinearLayout>
diff --git a/DeviceParts/res/layout/preference_seek_bar.xml b/DeviceParts/res/layout/preference_seek_bar.xml
new file mode 100644
index 0000000..89638f2
--- /dev/null
+++ b/DeviceParts/res/layout/preference_seek_bar.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical"
+    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:background="?android:attr/selectableItemBackground"
+    android:clipToPadding="false"
+    android:orientation="horizontal" >
+
+    <LinearLayout
+        android:id="@+id/icon_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:minWidth="56dp"
+        android:gravity="start|center_vertical"
+        android:orientation="horizontal"
+        android:clipToPadding="false"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp">
+        <com.android.internal.widget.PreferenceImageView
+            android:id="@android:id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:maxWidth="48dp"
+            android:maxHeight="48dp" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:gravity="center_vertical"
+        android:layout_weight="1" >
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="6dip"
+            android:layout_marginTop="10dip"
+            android:layout_marginBottom="6dip" >
+
+            <TextView android:id="@android:id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:singleLine="true"
+                android:textAppearance="?android:attr/textAppearanceListItem"
+                android:ellipsize="marquee" />
+
+            <TextView android:id="@android:id/summary"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@android:id/title"
+                android:layout_alignStart="@android:id/title"
+                android:textAppearance="?android:attr/textAppearanceListItemSecondary"
+                android:textColor="?android:attr/textColorSecondary"
+                android:maxLines="10"
+                android:ellipsize="end" />
+
+        </RelativeLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:layout_marginStart="10dip"
+            android:layout_marginEnd="6dip"
+            android:layout_marginTop="5dip"
+            android:layout_marginBottom="10dip">
+
+            <SeekBar android:id="@+id/seekbar"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:paddingLeft="5dp"
+                android:paddingRight="5dp" />
+
+        </LinearLayout>
+    </LinearLayout>
+</LinearLayout>
diff --git a/DeviceParts/res/values-af/strings.xml b/DeviceParts/res/values-af/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-af/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-am/strings.xml b/DeviceParts/res/values-am/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-am/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ar/strings.xml b/DeviceParts/res/values-ar/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ar/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-az-rAZ/strings.xml b/DeviceParts/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-az-rAZ/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-bg/strings.xml b/DeviceParts/res/values-bg/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-bg/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ca/strings.xml b/DeviceParts/res/values-ca/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ca/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-cs/strings.xml b/DeviceParts/res/values-cs/strings.xml
new file mode 100644
index 0000000..f2a2277
--- /dev/null
+++ b/DeviceParts/res/values-cs/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Gesta zařízení</string>
+  <string name="fp_gesture_title">Gesta snímače otisků prstů</string>
+  <string name="category_vibrator">Vibrace</string>
+  <string name="vib_strength_title_head">Intenzita</string>
+  <string name="vib_strength_summary_head">Definujte intenzitu vibrací</string>
+  <string name="vib_test">Test</string>
+  <string name="advanced_settings">Rozšířené</string>
+  <string name="category_slider">Posuvník</string>
+  <string name="slider_mode_title">Režim posuvníku</string>
+  <string name="buttons_title">Tlačítka</string>
+  <string name="swap_back_recents_title">Prohodit tlačítka Nedávné a Zpět</string>
+  <string name="graphics_title">Grafika</string>
+  <string name="srgb_mode_title">Režim sRGB</string>
+  <string name="hbm_mode_title">Režim s vysokým jasem</string>
+  <string name="proxi_summary_head">Zkontrolujte senzor přiblížení pro zachycení gesta a senzor otisků prstů</string>
+  <string name="proxi_title_head">Kontrola senzoru přiblížení</string>
+  <string name="slider_mode_off">Vypnuto</string>
+  <string name="slider_mode_vibrate">Vibrace</string>
+  <string name="slider_mode_silent">Tichý</string>
+  <string name="slider_mode_priority">Pouze prioritní</string>
+  <string name="slider_mode_alarm">Pouze budíky</string>
+  <string name="slider_mode_dnd">Absolutní ticho</string>
+  <string name="slider_mode_title_top">Pozice nahoře</string>
+  <string name="slider_mode_title_center">Pozice uprostřed</string>
+  <string name="slider_mode_title_bottom">Pozice dole</string>
+  <string name="dci_mode_title">Režim širokého spektra barev</string>
+  <string name="Night_mode_title">Noční režim</string>
+  <string name="choose_app">Vybrat aplikaci</string>
+  <string name="category_double_swipe_gesture">Gesto II</string>
+  <string name="offscreen_gesture_title">Gesta při vypnuté obrazovce</string>
+  <string name="category_circle_gesture">Gesto O</string>
+  <string name="category_down_arrow_gesture">Gesto V</string>
+  <string name="category_up_arrow_gesture">Gesto A</string>
+  <string name="category_left_arrow_gesture">Gesto &lt;</string>
+  <string name="category_right_arrow_gesture">Gesto &gt;</string>
+  <string name="category_gestures_summary">Konfigurace akcí gest</string>
+  <string name="torch_entry">Svítilna</string>
+  <string name="disabled_entry">Zakázáno</string>
+  <string name="camera_entry">Fotoaparát</string>
+  <string name="music_play_entry">Přehrát / Pozastavit hudbu</string>
+  <string name="music_prev_entry">Předchozí skladba</string>
+  <string name="music_next_entry">Další skladba</string>
+  <string name="not_ready_summary">Řešení...</string>
+  <string name="resolve_failed_summary">Řešení aplikace selhalo</string>
+  <string name="category_down_swipe_gesture">Tah dolů</string>
+  <string name="category_up_swipe_gesture">Tah nahoru</string>
+  <string name="category_left_swipe_gesture">Tah doleva</string>
+  <string name="category_right_swipe_gesture">Tah doprava</string>
+  <string name="category_fp_down_swipe_gesture">Přejetí dolů otiskem prstu</string>
+  <string name="category_fp_up_swipe_gesture">Přejetí nahoru otiskem prstu</string>
+  <string name="category_fp_right_swipe_gesture">Přejetí vpravo otiskem prstu</string>
+  <string name="category_fp_left_swipe_gesture">Přejetí vlevo otiskem prstu</string>
+  <string name="fp_swipe_down_switch_summary_head">Výchozí oznámení gesta přejetí otiskem prstu dolů</string>
+  <string name="fp_swipe_down_switch_title_head">Gesto přejetí otiskem prstu dolů</string>
+  <string name="doze_category_title">Ambientní displej</string>
+  <string name="doze_category_summary">Probudí obrazovku při příjmu oznámění</string>
+  <string name="wave_check_summary">Pulzní oznámení při mávnutí rukou</string>
+  <string name="wave_check_title">Mávnutí rukou</string>
+  <string name="tilt_check_summary">Pulzní oznámení při zvednutí zařízení</string>
+  <string name="tilt_check_title">Vyzvednutí</string>
+  <string name="pocket_check_summary">Pulzní oznámení při vyjmutí z kapsy</string>
+  <string name="pocket_check_title">Kapsa</string>
+  <string name="ambient_display_enable">Ambientní display musí být povolen v nastavení obrazovky</string>
+  <string name="panel_category_title">Režimy panelu</string>
+  <string name="panel_category_summary">Režimy korekce barev panelu</string>
+  <string name="off_mode_title">Vyp.</string>
+  <string name="tile_panel_mode">Režimy panelu</string>
+  <string name="tile_hbm_mode">Režimy s vysokým jasem</string>
+  <string name="wake_entry">Probuzení</string>
+</resources>
diff --git a/DeviceParts/res/values-da/strings.xml b/DeviceParts/res/values-da/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-da/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-de/strings.xml b/DeviceParts/res/values-de/strings.xml
new file mode 100644
index 0000000..56b0e84
--- /dev/null
+++ b/DeviceParts/res/values-de/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">OnePlus 5</string>
+  <string name="category_gestures_title">Gerätegesten</string>
+  <string name="fp_gesture_title">Fingerabdruck-Scanner-Gesten</string>
+  <string name="category_vibrator">Vibrator</string>
+  <string name="vib_strength_title_head">Stärke</string>
+  <string name="vib_strength_summary_head">Vibrationsstärke festlegen</string>
+  <string name="vib_test">Test</string>
+  <string name="advanced_settings">Erweitert</string>
+  <string name="category_slider">Regler</string>
+  <string name="slider_mode_title">Regler-Modus</string>
+  <string name="buttons_title">Tasten</string>
+  <string name="swap_back_recents_title">Zurück- und Verlauf-Taste tauschen</string>
+  <string name="graphics_title">Grafik</string>
+  <string name="srgb_mode_title">sRGB-Modus</string>
+  <string name="hbm_mode_title">Modus für max. Helligkeit</string>
+  <string name="proxi_summary_head">Näherungssensor für die Nutzung von Gesten und des Fingerabdrucksensors überprüfen</string>
+  <string name="proxi_title_head">Näherungssensor überprüfen</string>
+  <string name="slider_mode_off">Aus</string>
+  <string name="slider_mode_vibrate">Vibrieren</string>
+  <string name="slider_mode_silent">Lautlos</string>
+  <string name="slider_mode_priority">Nur Wichtige</string>
+  <string name="slider_mode_alarm">Nur Wecker</string>
+  <string name="slider_mode_dnd">Vollständige Stille</string>
+  <string name="slider_mode_title_top">Position oben</string>
+  <string name="slider_mode_title_center">Position in der Mitte</string>
+  <string name="slider_mode_title_bottom">Position unten</string>
+  <string name="dci_mode_title">Breite Farbskala-Modus</string>
+  <string name="Night_mode_title">Nachtmodus</string>
+  <string name="choose_app">App wählen</string>
+  <string name="category_double_swipe_gesture">II-Geste</string>
+  <string name="offscreen_gesture_title">Gesten bei ausgeschaltetem Bildschirm</string>
+  <string name="category_circle_gesture">O-Geste</string>
+  <string name="category_down_arrow_gesture">V-Geste</string>
+  <string name="category_up_arrow_gesture">A-Geste</string>
+  <string name="category_left_arrow_gesture">&lt;-Geste</string>
+  <string name="category_right_arrow_gesture">&gt;-Geste</string>
+  <string name="category_gestures_summary">Gestenaktionen konfigurieren</string>
+  <string name="torch_entry">Taschenlampe</string>
+  <string name="disabled_entry">Deaktiviert</string>
+  <string name="camera_entry">Kamera</string>
+  <string name="music_play_entry">Musik abspielen / pausieren</string>
+  <string name="music_prev_entry">Vorheriger Titel</string>
+  <string name="music_next_entry">Nächster Titel</string>
+  <string name="not_ready_summary">Lösen...</string>
+  <string name="resolve_failed_summary">App lösen fehlgeschlagen</string>
+  <string name="category_down_swipe_gesture">Runter wischen</string>
+  <string name="category_up_swipe_gesture">Hoch wischen</string>
+  <string name="category_left_swipe_gesture">Links wischen</string>
+  <string name="category_right_swipe_gesture">Rechts wischen</string>
+  <string name="category_fp_down_swipe_gesture">Fingerabdruck nach unten wischen</string>
+  <string name="category_fp_up_swipe_gesture">Fingerabdruck nach oben wischen</string>
+  <string name="category_fp_right_swipe_gesture">Fingerabdruck nach rechts wischen</string>
+  <string name="category_fp_left_swipe_gesture">Fingerabdruck nach links wischen</string>
+  <string name="fp_swipe_down_switch_summary_head">Standard-Fingerabdruck-Benachrichtigungswischgeste nach unten</string>
+  <string name="fp_swipe_down_switch_title_head">Fingerabdruck nach unten Wischgeste</string>
+  <string name="doze_category_title">Inaktivitätsdisplay</string>
+  <string name="doze_category_summary">Das Display einschalten, wenn eine Benachrichtigung empfangen wurde</string>
+  <string name="wave_check_summary">Benachrichtigungen pulsieren, wenn mit der Hand gewunken wird</string>
+  <string name="wave_check_title">Winken</string>
+  <string name="tilt_check_summary">Benachrichtigungen pulsieren, wenn das Gerät hochgenommen wird</string>
+  <string name="tilt_check_title">Aufheben</string>
+  <string name="pocket_check_summary">Benachrichtigungen pulsiren, wenn das Gerät aus der Tasche genommen wird</string>
+  <string name="pocket_check_title">Tasche</string>
+  <string name="ambient_display_enable">Inaktivitätsdisplay muss in den Display-Einstellungen aktiviert sein</string>
+  <string name="panel_category_title">Panel-Modi</string>
+  <string name="panel_category_summary">Modi für die Farbkorrektur des Panel</string>
+  <string name="off_mode_title">Aus</string>
+  <string name="tile_panel_mode">Panel-Modi</string>
+  <string name="tile_hbm_mode">Modus für max. Helligkeit</string>
+  <string name="wake_entry">Aufwachen</string>
+</resources>
diff --git a/DeviceParts/res/values-el/strings.xml b/DeviceParts/res/values-el/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-el/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-es/strings.xml b/DeviceParts/res/values-es/strings.xml
new file mode 100644
index 0000000..3698a0f
--- /dev/null
+++ b/DeviceParts/res/values-es/strings.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="category_vibrator">Vibrador</string>
+  <string name="vib_strength_title_head">Intensidad</string>
+  <string name="vib_strength_summary_head">Definir la intensidad del vibrador</string>
+  <string name="vib_test">Prueba</string>
+  <string name="advanced_settings">Avanzado</string>
+  <string name="category_slider">Control deslizante</string>
+  <string name="slider_mode_title">Modo de control deslizante</string>
+  <string name="buttons_title">Botones</string>
+  <string name="swap_back_recents_title">Cambiar hacia atrás y botón reciente</string>
+  <string name="graphics_title">Gráficos</string>
+  <string name="srgb_mode_title">modo sRGB</string>
+  <string name="hbm_mode_title">Modo de brillo alto</string>
+  <string name="proxi_summary_head">Compruebe el sensor de proximidad para el manejo de gesto y huella digital del sensor</string>
+  <string name="proxi_title_head">Control de proximidad</string>
+  <string name="slider_mode_off">Apagado</string>
+  <string name="slider_mode_vibrate">Vibrar</string>
+  <string name="slider_mode_silent">Silencio</string>
+  <string name="slider_mode_priority">Prioridad solamente</string>
+  <string name="slider_mode_alarm">Solo alarmas</string>
+  <string name="slider_mode_dnd">Silencio total</string>
+  <string name="slider_mode_title_top">Posición superior</string>
+  <string name="slider_mode_title_center">Posición central</string>
+  <string name="slider_mode_title_bottom">Posición del botón</string>
+  <string name="dci_mode_title">Modo de gama de colores amplia</string>
+  <string name="Night_mode_title">Modo nocturno</string>
+  <string name="choose_app">Elegir aplicación</string>
+  <string name="category_double_swipe_gesture">II gesto</string>
+  <string name="category_circle_gesture">O gesto</string>
+  <string name="category_down_arrow_gesture">V gesto</string>
+  <string name="category_up_arrow_gesture">A gesto</string>
+  <string name="category_left_arrow_gesture">&lt; gesto</string>
+  <string name="category_right_arrow_gesture">&gt; gesto</string>
+  <string name="torch_entry">Linterna</string>
+  <string name="disabled_entry">Deshabilitado</string>
+  <string name="camera_entry">Cámara</string>
+  <string name="music_play_entry">Reproducir / pausar música</string>
+  <string name="music_prev_entry">Pista anterior</string>
+  <string name="music_next_entry">Siguiente pista</string>
+  <string name="not_ready_summary">Resolviendo...</string>
+  <string name="resolve_failed_summary">Resolviendo error en la aplicación</string>
+  <string name="category_down_swipe_gesture">Deslizar abajo</string>
+  <string name="category_up_swipe_gesture">Deslizar arriba</string>
+  <string name="category_left_swipe_gesture">Deslizar a la izquierda</string>
+  <string name="category_right_swipe_gesture">Deslizar a la derecha</string>
+  <string name="doze_category_title">Pantalla ambiente</string>
+  <string name="doze_category_summary">Activar la pantalla cuando recibas notificaciones</string>
+  <string name="wave_check_summary">Notificaciones de pulso en la mano</string>
+  <string name="wave_check_title">Onda de mano</string>
+  <string name="tilt_check_summary">Notificaciones de pulso cuando se levante el dispositivo</string>
+  <string name="tilt_check_title">Recoger</string>
+  <string name="pocket_check_summary">Notificaciones de pulso al sacar del bolsillo</string>
+  <string name="pocket_check_title">Bolsillo</string>
+  <string name="ambient_display_enable">Visualización ambiental debe estar habilitada en configuración de pantalla</string>
+</resources>
diff --git a/DeviceParts/res/values-et/strings.xml b/DeviceParts/res/values-et/strings.xml
new file mode 100644
index 0000000..31bdfac
--- /dev/null
+++ b/DeviceParts/res/values-et/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">OnePlus 5</string>
+  <string name="category_gestures_title">Seadme žestid</string>
+  <string name="fp_gesture_title">Sõrmejäljelugeja žestid</string>
+  <string name="category_vibrator">Vibraator</string>
+  <string name="vib_strength_title_head">Tugevus</string>
+  <string name="vib_strength_summary_head">Määra vibraatori tugevus</string>
+  <string name="vib_test">Proovi</string>
+  <string name="advanced_settings">Täpsemad</string>
+  <string name="category_slider">Liugur</string>
+  <string name="slider_mode_title">Liuguri režiim</string>
+  <string name="buttons_title">Nupud</string>
+  <string name="swap_back_recents_title">Vaheta tagasi ja viimatiste nupud</string>
+  <string name="graphics_title">Graafika</string>
+  <string name="srgb_mode_title">sRGB-režiim</string>
+  <string name="hbm_mode_title">Kõrge heleduse režiim</string>
+  <string name="proxi_summary_head">Kontrolli lähedussensorit, haldamaks žeste ja sõrmejäljelugejat</string>
+  <string name="proxi_title_head">Läheduskontroll</string>
+  <string name="slider_mode_off">Väljas</string>
+  <string name="slider_mode_vibrate">Vibreeri</string>
+  <string name="slider_mode_silent">Hääletu</string>
+  <string name="slider_mode_priority">Ainult prioriteetsed</string>
+  <string name="slider_mode_alarm">Ainult äratused</string>
+  <string name="slider_mode_dnd">Täielik vaikus</string>
+  <string name="slider_mode_title_top">Ülapositsioon</string>
+  <string name="slider_mode_title_center">Keskpositsioon</string>
+  <string name="slider_mode_title_bottom">Allpositsioon</string>
+  <string name="dci_mode_title">Laia värviskaala režiim</string>
+  <string name="Night_mode_title">Öörežiim</string>
+  <string name="choose_app">Vali rakendus</string>
+  <string name="category_double_swipe_gesture">II žest</string>
+  <string name="offscreen_gesture_title">Väljas ekraani žestid</string>
+  <string name="category_circle_gesture">O žest</string>
+  <string name="category_down_arrow_gesture">V žest</string>
+  <string name="category_up_arrow_gesture">A žest</string>
+  <string name="category_left_arrow_gesture">&lt; žest</string>
+  <string name="category_right_arrow_gesture">&gt; žest</string>
+  <string name="category_gestures_summary">Seadista žestitegevusi</string>
+  <string name="torch_entry">Taskulamp</string>
+  <string name="disabled_entry">Keelatud</string>
+  <string name="camera_entry">Kaamera</string>
+  <string name="music_play_entry">Mängi/peata muusikat</string>
+  <string name="music_prev_entry">Eelmine lugu</string>
+  <string name="music_next_entry">Järgmine lugu</string>
+  <string name="not_ready_summary">Lahendan...</string>
+  <string name="resolve_failed_summary">Rakenduse lahendamine ebaõnnestus</string>
+  <string name="category_down_swipe_gesture">Alla libistamine</string>
+  <string name="category_up_swipe_gesture">Üles libistamine</string>
+  <string name="category_left_swipe_gesture">Vasakule libistamine</string>
+  <string name="category_right_swipe_gesture">Paremale libistamine</string>
+  <string name="category_fp_down_swipe_gesture">Sõrmejälje alla libistamine</string>
+  <string name="category_fp_up_swipe_gesture">Sõrmejälje üles libistamine</string>
+  <string name="category_fp_right_swipe_gesture">Sõrmejälje paremale libistamine</string>
+  <string name="category_fp_left_swipe_gesture">Sõrmejälje vasakule libistamine</string>
+  <string name="fp_swipe_down_switch_summary_head">Vaikimisi sõrmejälje teate alla libistamise žest</string>
+  <string name="fp_swipe_down_switch_title_head">Sõrmejälje alla libistamise žest</string>
+  <string name="doze_category_title">Ambientne ekraan</string>
+  <string name="doze_category_summary">Ärata ekraan, kui saad teateid</string>
+  <string name="wave_check_summary">Pulseeri teateid käeviibutusel</string>
+  <string name="wave_check_title">Käeviibutus</string>
+  <string name="tilt_check_summary">Pulseeri teateid, kui seade tõstetakse</string>
+  <string name="tilt_check_title">Tõstmine</string>
+  <string name="pocket_check_summary">Pulseeri teateid, kui seade võetakse taskust välja</string>
+  <string name="pocket_check_title">Tasku</string>
+  <string name="ambient_display_enable">Ambientne ekraan peab olema lubatud kuvaseadetes</string>
+  <string name="panel_category_title">Paneelirežiimid</string>
+  <string name="panel_category_summary">Režiimid paneeli värviparanduseks</string>
+  <string name="off_mode_title">Väljas</string>
+  <string name="tile_panel_mode">Paneelirežiimid</string>
+  <string name="tile_hbm_mode">Kõrge heleduse režiimid</string>
+  <string name="wake_entry">Ärkamine</string>
+</resources>
diff --git a/DeviceParts/res/values-fa/strings.xml b/DeviceParts/res/values-fa/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-fa/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-fi/strings.xml b/DeviceParts/res/values-fi/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-fi/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-fr/strings.xml b/DeviceParts/res/values-fr/strings.xml
new file mode 100644
index 0000000..7a5b916
--- /dev/null
+++ b/DeviceParts/res/values-fr/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Mouvements du terminal</string>
+  <string name="fp_gesture_title">Mouvement du lecteur d\'empreintes digitales</string>
+  <string name="category_vibrator">Vibreur</string>
+  <string name="vib_strength_title_head">Intensité</string>
+  <string name="vib_strength_summary_head">Définir l’intensité du vibreur</string>
+  <string name="vib_test">Tester</string>
+  <string name="advanced_settings">Paramètres avancés</string>
+  <string name="category_slider">Curseur</string>
+  <string name="slider_mode_title">Mode curseur</string>
+  <string name="buttons_title">Boutons</string>
+  <string name="swap_back_recents_title">Permuter le bouton retour et le bouton app. récents</string>
+  <string name="srgb_mode_title">mode sRGB</string>
+  <string name="proxi_summary_head">Vérifier le capteur de proximité pour les gestes tactiles et le capteur d\'empreinte</string>
+  <string name="proxi_title_head">Contrôle de proximité</string>
+  <string name="slider_mode_off">Désactivé</string>
+  <string name="slider_mode_vibrate">Vibreur</string>
+  <string name="slider_mode_silent">Mode silencieux</string>
+  <string name="slider_mode_dnd">Silence total</string>
+  <string name="Night_mode_title">Mode nuit</string>
+  <string name="choose_app">Choisir l\'app</string>
+  <string name="category_double_swipe_gesture">Geste II</string>
+  <string name="category_circle_gesture">Geste O</string>
+  <string name="category_down_arrow_gesture">Geste V</string>
+  <string name="category_up_arrow_gesture">Geste A</string>
+  <string name="torch_entry">Lampe de poche</string>
+  <string name="disabled_entry">Désactivé</string>
+  <string name="camera_entry">Appareil photo</string>
+  <string name="music_play_entry">Lecture / pause de la musique</string>
+  <string name="music_prev_entry">Piste précédente</string>
+  <string name="music_next_entry">Piste suivante</string>
+  <string name="category_down_swipe_gesture">Glissement vers le bas</string>
+  <string name="off_mode_title">Off</string>
+</resources>
diff --git a/DeviceParts/res/values-hi/strings.xml b/DeviceParts/res/values-hi/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-hi/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-hr/strings.xml b/DeviceParts/res/values-hr/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-hr/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-hu/strings.xml b/DeviceParts/res/values-hu/strings.xml
new file mode 100644
index 0000000..4c5dd0f
--- /dev/null
+++ b/DeviceParts/res/values-hu/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Eszköz gesztusok</string>
+  <string name="fp_gesture_title">Ujjlenyomat szkenner gesztusok</string>
+  <string name="category_vibrator">Rezgés</string>
+  <string name="vib_strength_title_head">Erősség</string>
+  <string name="vib_strength_summary_head">Rezgés erősségének meghatározása</string>
+  <string name="vib_test">Teszt</string>
+  <string name="advanced_settings">Haladó</string>
+  <string name="category_slider">Csúszka</string>
+  <string name="slider_mode_title">Csúszka üzemmód</string>
+  <string name="buttons_title">Gombok</string>
+  <string name="swap_back_recents_title">Vissza és előzmények gomb felcserélése</string>
+  <string name="graphics_title">Grafika</string>
+  <string name="srgb_mode_title">sRGB üzemmód</string>
+  <string name="hbm_mode_title">Nagy fényerő mód</string>
+  <string name="proxi_summary_head">Ellenőrizze a közelség érzékelőt a gesztus és az ujjlenyomat érzékelő kezeléséhez</string>
+  <string name="proxi_title_head">Közelség ellenőrzés</string>
+  <string name="slider_mode_off">Ki</string>
+  <string name="slider_mode_vibrate">Rezgés</string>
+  <string name="slider_mode_silent">Néma</string>
+  <string name="slider_mode_priority">Csak prioritásos</string>
+  <string name="slider_mode_alarm">Csak riasztás</string>
+  <string name="slider_mode_dnd">Teljes csend</string>
+  <string name="slider_mode_title_top">Felső pozíció</string>
+  <string name="slider_mode_title_center">Közép pozíció</string>
+  <string name="slider_mode_title_bottom">Alsó pozíció</string>
+  <string name="dci_mode_title">Széles színskála üzemmód</string>
+  <string name="Night_mode_title">Éjszakai mód</string>
+  <string name="choose_app">Válasszon alkalmazást</string>
+  <string name="category_double_swipe_gesture">II gesztus</string>
+  <string name="offscreen_gesture_title">Kikapcsolt képernyős gesztusok</string>
+  <string name="category_circle_gesture">O gesztus</string>
+  <string name="category_down_arrow_gesture">V gesztus</string>
+  <string name="category_up_arrow_gesture">A gesztus</string>
+  <string name="category_left_arrow_gesture">&lt; gesztus</string>
+  <string name="category_right_arrow_gesture">&gt; gesztus</string>
+  <string name="category_gestures_summary">Gesztus műveletek konfigurálása</string>
+  <string name="torch_entry">Zseblámpa</string>
+  <string name="disabled_entry">Kikapcsolva</string>
+  <string name="camera_entry">Kamera</string>
+  <string name="music_play_entry">Zene indítása / szüneteltetése</string>
+  <string name="music_prev_entry">Előző szám</string>
+  <string name="music_next_entry">Következő szám</string>
+  <string name="not_ready_summary">Elemzés...</string>
+  <string name="resolve_failed_summary">Alkalmazás elemzése sikertelen</string>
+  <string name="category_down_swipe_gesture">Lefelé húzás</string>
+  <string name="category_up_swipe_gesture">Felfelé húzás</string>
+  <string name="category_left_swipe_gesture">Balra húzás</string>
+  <string name="category_right_swipe_gesture">Jobbra húzás</string>
+  <string name="category_fp_down_swipe_gesture">Ujjlenyomat lefelé csúsztatás</string>
+  <string name="category_fp_up_swipe_gesture">Ujjlenyomat felfelé csúsztatás</string>
+  <string name="category_fp_right_swipe_gesture">Ujjlenyomat jobbra csúsztatás</string>
+  <string name="category_fp_left_swipe_gesture">Ujjlenyomat balra csúsztatás</string>
+  <string name="fp_swipe_down_switch_summary_head">Alapértelmezett ujjlenyomat értesítés lefelé csúsztatás gesztushoz</string>
+  <string name="fp_swipe_down_switch_title_head">Ujjlenyomat lefelé csúsztatás gesztus</string>
+  <string name="doze_category_title">Környezeti kijelző</string>
+  <string name="doze_category_summary">Képernyő felébresztése értesítés esetén</string>
+  <string name="wave_check_summary">Értesítések pulzálása lebegő simításkor</string>
+  <string name="wave_check_title">Lebegő simítás</string>
+  <string name="tilt_check_summary">Értesítések pulzálása készülék felemelésekor</string>
+  <string name="tilt_check_title">Felemelés</string>
+  <string name="pocket_check_summary">Értesítések pulzálása zsebből való kivétel után</string>
+  <string name="pocket_check_title">Zseb</string>
+  <string name="ambient_display_enable">A környezeti kijelzőt engedélyezni kell a képernyő beállításokban</string>
+  <string name="panel_category_title">Panel módok</string>
+  <string name="panel_category_summary">Panel színkorrekciós módjai</string>
+  <string name="off_mode_title">Ki</string>
+  <string name="tile_panel_mode">Panel módok</string>
+  <string name="tile_hbm_mode">Nagy fényerő módok</string>
+  <string name="wake_entry">Ébresztés</string>
+</resources>
diff --git a/DeviceParts/res/values-hy/strings.xml b/DeviceParts/res/values-hy/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-hy/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-in/strings.xml b/DeviceParts/res/values-in/strings.xml
new file mode 100644
index 0000000..5193a74
--- /dev/null
+++ b/DeviceParts/res/values-in/strings.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_vibrator">Vibrator</string>
+  <string name="vib_strength_title_head">Kekuatan</string>
+  <string name="vib_strength_summary_head">Tentukan kekuatan vibrator</string>
+  <string name="vib_test">Uji</string>
+  <string name="advanced_settings">Maju</string>
+  <string name="category_slider">Slider</string>
+  <string name="slider_mode_title">Mode slider</string>
+  <string name="buttons_title">Tombol</string>
+  <string name="swap_back_recents_title">Tukar kembali dan tekan tombol</string>
+  <string name="graphics_title">Grafis</string>
+  <string name="srgb_mode_title">mode sRGB</string>
+  <string name="hbm_mode_title">Mode kecerahan tinggi</string>
+  <string name="proxi_summary_head">Periksa sensor jarak untuk penanganan isyarat dan sensor sidik jari</string>
+  <string name="proxi_title_head">Cek jarak</string>
+  <string name="slider_mode_off">Mati</string>
+  <string name="slider_mode_vibrate">Bergetar</string>
+  <string name="slider_mode_silent">Diam</string>
+  <string name="slider_mode_priority">Hanya prioritas</string>
+  <string name="slider_mode_alarm">Hanya alarm</string>
+  <string name="slider_mode_dnd">Keheningan total</string>
+  <string name="slider_mode_title_top">Posisi teratas</string>
+  <string name="slider_mode_title_center">Posisi pusat</string>
+  <string name="slider_mode_title_bottom">Posisi bawah</string>
+  <string name="dci_mode_title">Mode gammut warna yang lebar</string>
+  <string name="Night_mode_title">Mode malam</string>
+  <string name="choose_app">Pilih aplikasi</string>
+  <string name="category_double_swipe_gesture">Gerakan kedua</string>
+  <string name="category_circle_gesture">O isyarat</string>
+  <string name="category_down_arrow_gesture">Gerakan V</string>
+  <string name="category_up_arrow_gesture">Sebuah isyarat</string>
+  <string name="category_left_arrow_gesture">&lt; sikap</string>
+  <string name="category_right_arrow_gesture">&gt; sikap</string>
+  <string name="torch_entry">Senter</string>
+  <string name="disabled_entry">Cacat</string>
+  <string name="camera_entry">Kamera</string>
+  <string name="music_play_entry">Putar / jeda musik</string>
+  <string name="music_prev_entry">Lintasan sebelumnya</string>
+  <string name="music_next_entry">Lagu berikutnya</string>
+  <string name="not_ready_summary">Menyelesaikan...</string>
+  <string name="resolve_failed_summary">Gagal menyelesaikan aplikasi</string>
+  <string name="category_down_swipe_gesture">Gesek ke bawah</string>
+  <string name="category_up_swipe_gesture">Gesek</string>
+  <string name="category_left_swipe_gesture">Gesek ke kiri</string>
+  <string name="category_right_swipe_gesture">Gesek kanan</string>
+  <string name="doze_category_title">Tampilan sekitar</string>
+  <string name="doze_category_summary">Nyalakan layar saat Anda menerima notifikasi</string>
+  <string name="wave_check_summary">Kedipkan pemberitahuan pada gelombang tangan</string>
+  <string name="wave_check_title">Gelombang tangan</string>
+  <string name="tilt_check_summary">Kesipkan pemberitahuan saat perangkat diambil</string>
+  <string name="tilt_check_title">Angkat</string>
+  <string name="pocket_check_summary">Kedipkan pemberitahuan untuk dihapus dari saku</string>
+  <string name="pocket_check_title">Saku</string>
+  <string name="ambient_display_enable">Tampilan sekeliling harus diaktifkan pada pengaturan tampilan</string>
+</resources>
diff --git a/DeviceParts/res/values-it/strings.xml b/DeviceParts/res/values-it/strings.xml
new file mode 100644
index 0000000..eec8d16
--- /dev/null
+++ b/DeviceParts/res/values-it/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Gesture del dispositivo</string>
+  <string name="fp_gesture_title">Gesture sul sensore d\'impronte</string>
+  <string name="category_vibrator">Vibrazione</string>
+  <string name="vib_strength_title_head">Intensità</string>
+  <string name="vib_strength_summary_head">Definisci l\'intensità della vibrazione</string>
+  <string name="vib_test">Prova</string>
+  <string name="advanced_settings">Avanzato</string>
+  <string name="category_slider">Slider</string>
+  <string name="slider_mode_title">Modalità slider</string>
+  <string name="buttons_title">Pulsanti</string>
+  <string name="swap_back_recents_title">Scambia il pulsante indietro e recenti</string>
+  <string name="graphics_title">Grafica</string>
+  <string name="srgb_mode_title">Modalità sRGB</string>
+  <string name="hbm_mode_title">Modalità alta luminosità</string>
+  <string name="proxi_summary_head">Controlla il sensore di prossimità per eventuali gesture e il sensore di impronte digitali</string>
+  <string name="proxi_title_head">Controllo di prossimità</string>
+  <string name="slider_mode_off">Disattivo</string>
+  <string name="slider_mode_vibrate">Vibrazione</string>
+  <string name="slider_mode_silent">Silenzioso</string>
+  <string name="slider_mode_priority">Solo con priorità</string>
+  <string name="slider_mode_alarm">Solo sveglie</string>
+  <string name="slider_mode_dnd">Silenzio totale</string>
+  <string name="slider_mode_title_top">Posizione superiore</string>
+  <string name="slider_mode_title_center">Posizione centrale</string>
+  <string name="slider_mode_title_bottom">Posizione inferiore</string>
+  <string name="dci_mode_title">Modalità di colore larga gammut</string>
+  <string name="Night_mode_title">Modalità notte</string>
+  <string name="choose_app">Scegli app</string>
+  <string name="category_double_swipe_gesture">Gesture doppio swipe</string>
+  <string name="offscreen_gesture_title">Gesture a schermo spento</string>
+  <string name="category_circle_gesture">Gesture disegna un cerchio</string>
+  <string name="category_down_arrow_gesture">Gesture disegna una V</string>
+  <string name="category_up_arrow_gesture">Gesture disegna una A</string>
+  <string name="category_left_arrow_gesture">&lt; gesture</string>
+  <string name="category_right_arrow_gesture">&gt; gesture</string>
+  <string name="category_gestures_summary">Configura le azioni delle gesture</string>
+  <string name="torch_entry">Torcia</string>
+  <string name="disabled_entry">Disabilitato</string>
+  <string name="camera_entry">Fotocamera</string>
+  <string name="music_play_entry">Riproduci o metti in pausa la musica</string>
+  <string name="music_prev_entry">Brano precedente</string>
+  <string name="music_next_entry">Brano successivo</string>
+  <string name="not_ready_summary">Risolvendo...</string>
+  <string name="resolve_failed_summary">Risoluzione di app non riuscita</string>
+  <string name="category_down_swipe_gesture">Swipe in basso</string>
+  <string name="category_up_swipe_gesture">Swipe in alto</string>
+  <string name="category_left_swipe_gesture">Swipe a sinistra</string>
+  <string name="category_right_swipe_gesture">Swipe a destra</string>
+  <string name="category_fp_down_swipe_gesture">Scorrimento verso il basso</string>
+  <string name="category_fp_up_swipe_gesture">Scorrimento verso l\'alto</string>
+  <string name="category_fp_right_swipe_gesture">Scorrimento verso destra</string>
+  <string name="category_fp_left_swipe_gesture">Scorrimento verso sinistra</string>
+  <string name="fp_swipe_down_switch_summary_head">Scorrimento verso il basso per le notifiche</string>
+  <string name="fp_swipe_down_switch_title_head">Scorrimento verso il basso</string>
+  <string name="doze_category_title">Display ambient</string>
+  <string name="doze_category_summary">Riattiva lo schermo quando ricevi le notifiche</string>
+  <string name="wave_check_summary">Mostra le notifiche al passaggio della mano</string>
+  <string name="wave_check_title">Movimento della mano</string>
+  <string name="tilt_check_summary">Mostra le notifiche al sollevamento</string>
+  <string name="tilt_check_title">Sollevamento</string>
+  <string name="pocket_check_summary">Mostra le notifiche quando togli dalla tasca</string>
+  <string name="pocket_check_title">Tasca</string>
+  <string name="ambient_display_enable">Il display ambient deve essere abilitato dalle impostazioni del display</string>
+  <string name="panel_category_title">Modalità schermo</string>
+  <string name="panel_category_summary">Modalità per la correzione dei colori</string>
+  <string name="off_mode_title">Disattivo</string>
+  <string name="tile_panel_mode">Modalità schermo</string>
+  <string name="tile_hbm_mode">Modalità alta luminosità</string>
+  <string name="wake_entry">Sveglia</string>
+</resources>
diff --git a/DeviceParts/res/values-iw/strings.xml b/DeviceParts/res/values-iw/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-iw/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ja/strings.xml b/DeviceParts/res/values-ja/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ja/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ka/strings.xml b/DeviceParts/res/values-ka/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ka/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-km/strings.xml b/DeviceParts/res/values-km/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-km/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ko/strings.xml b/DeviceParts/res/values-ko/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ko/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-lo-rLA/strings.xml b/DeviceParts/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-lo-rLA/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-lt/strings.xml b/DeviceParts/res/values-lt/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-lt/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-lv/strings.xml b/DeviceParts/res/values-lv/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-lv/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-mn/strings.xml b/DeviceParts/res/values-mn/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-mn/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ms/strings.xml b/DeviceParts/res/values-ms/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ms/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-nb/strings.xml b/DeviceParts/res/values-nb/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-nb/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ne/strings.xml b/DeviceParts/res/values-ne/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ne/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-nl/strings.xml b/DeviceParts/res/values-nl/strings.xml
new file mode 100644
index 0000000..b4925c3
--- /dev/null
+++ b/DeviceParts/res/values-nl/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="category_vibrator">Vibrator</string>
+  <string name="vib_strength_title_head">Sterkte</string>
+  <string name="vib_strength_summary_head">De sterkte van de vibrator aanpassen</string>
+  <string name="vib_test">Test</string>
+  <string name="advanced_settings">Geavanceerd</string>
+  <string name="buttons_title">Knoppen</string>
+</resources>
diff --git a/DeviceParts/res/values-pl/strings.xml b/DeviceParts/res/values-pl/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-pl/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-pt-rBR/strings.xml b/DeviceParts/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..ce304d6
--- /dev/null
+++ b/DeviceParts/res/values-pt-rBR/strings.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="category_vibrator">Vibração</string>
+  <string name="vib_strength_title_head">Intensidade</string>
+  <string name="vib_strength_summary_head">Definir a intensidade da vibração</string>
+  <string name="vib_test">Testar</string>
+  <string name="advanced_settings">Avançado</string>
+  <string name="category_slider">Interruptor</string>
+  <string name="slider_mode_title">Modo do interruptor</string>
+  <string name="buttons_title">Botões</string>
+  <string name="swap_back_recents_title">Inverter botões \"voltar\" e \"aplicativos recentes\"</string>
+  <string name="graphics_title">Gráficos</string>
+  <string name="srgb_mode_title">Modo sRGB</string>
+  <string name="hbm_mode_title">Modo de alto brilho</string>
+  <string name="proxi_summary_head">Verifique o sensor de proximidade para manusear o gesto e sensor de impressão digital</string>
+  <string name="proxi_title_head">Verificação de proximidade</string>
+  <string name="slider_mode_off">Desligado</string>
+  <string name="slider_mode_vibrate">Vibrar</string>
+  <string name="slider_mode_silent">Silencioso</string>
+  <string name="slider_mode_priority">Prioridade apenas</string>
+  <string name="slider_mode_alarm">Somente alarmes</string>
+  <string name="slider_mode_dnd">Silêncio total</string>
+  <string name="slider_mode_title_top">Posição superior</string>
+  <string name="slider_mode_title_center">Posição central</string>
+  <string name="slider_mode_title_bottom">Posição inferior</string>
+  <string name="choose_app">Selecionar aplicativo</string>
+  <string name="category_up_arrow_gesture">Gesto A</string>
+  <string name="category_left_arrow_gesture">Gesto &lt;</string>
+  <string name="category_right_arrow_gesture">Gesto &gt;</string>
+</resources>
diff --git a/DeviceParts/res/values-pt-rPT/strings.xml b/DeviceParts/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..3e3ca2a
--- /dev/null
+++ b/DeviceParts/res/values-pt-rPT/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Gestos de dispositivo</string>
+  <string name="fp_gesture_title">Gestos de scanner de impressão digital</string>
+  <string name="category_vibrator">Vibração</string>
+  <string name="vib_strength_title_head">Intensidade</string>
+  <string name="vib_strength_summary_head">Definir a intensidade da vibração</string>
+  <string name="vib_test">Testar</string>
+  <string name="advanced_settings">Preferências Avançadas</string>
+  <string name="category_slider">Menu deslizante</string>
+  <string name="slider_mode_title">Modo menu deslizante</string>
+  <string name="buttons_title">Botões</string>
+  <string name="swap_back_recents_title">Trocar o botão de voltar e recentes</string>
+  <string name="graphics_title">Gráficos</string>
+  <string name="srgb_mode_title">modo sRGB</string>
+  <string name="hbm_mode_title">Modo de brilho alto</string>
+  <string name="proxi_summary_head">Verifique o sensor de proximidade para a manipulação de gesto e sensor de impressão digital</string>
+  <string name="proxi_title_head">Verificação de proximidade</string>
+  <string name="slider_mode_off">Desligado</string>
+  <string name="slider_mode_vibrate">Vibração</string>
+  <string name="slider_mode_silent">Silêncio</string>
+  <string name="slider_mode_priority">Apenas prioridade</string>
+  <string name="slider_mode_alarm">Só alarmes</string>
+  <string name="slider_mode_dnd">Silêncio total</string>
+  <string name="slider_mode_title_top">Posição superior</string>
+  <string name="slider_mode_title_center">Posição central</string>
+  <string name="slider_mode_title_bottom">Posição inferior</string>
+  <string name="dci_mode_title">Modo de cor (DCI-P3)</string>
+  <string name="Night_mode_title">Modo nocturno</string>
+  <string name="choose_app">Escolher aplicação</string>
+  <string name="category_double_swipe_gesture">II gesto</string>
+  <string name="offscreen_gesture_title">Gestos com ecrã desligado</string>
+  <string name="category_circle_gesture">O gesto</string>
+  <string name="category_down_arrow_gesture">V gesto</string>
+  <string name="category_up_arrow_gesture">A gesto</string>
+  <string name="category_left_arrow_gesture">&lt; gesto</string>
+  <string name="category_right_arrow_gesture">&gt; gesto</string>
+  <string name="category_gestures_summary">Configurar ações de gesto</string>
+  <string name="torch_entry">Lanterna</string>
+  <string name="disabled_entry">Desligado</string>
+  <string name="camera_entry">Câmara</string>
+  <string name="music_play_entry">Reproduzir/pausar música</string>
+  <string name="music_prev_entry">Faixa anterior</string>
+  <string name="music_next_entry">Próxima faixa</string>
+  <string name="not_ready_summary">A resolver...</string>
+  <string name="resolve_failed_summary">Resolver aplicação falhou</string>
+  <string name="category_down_swipe_gesture">Deslizar para baixo</string>
+  <string name="category_up_swipe_gesture">Deslizar para cima</string>
+  <string name="category_left_swipe_gesture">Deslizar para a esquerda</string>
+  <string name="category_right_swipe_gesture">Deslizar para a direita</string>
+  <string name="category_fp_down_swipe_gesture">Deslizar para baixo na impressão digital</string>
+  <string name="category_fp_up_swipe_gesture">Deslizar para cima na impressão digital</string>
+  <string name="category_fp_right_swipe_gesture">Deslizar para a direita na impressão digital</string>
+  <string name="category_fp_left_swipe_gesture">Deslizar para a esquerda na impressão digital</string>
+  <string name="fp_swipe_down_switch_summary_head">Notificação padrão de impressões digitais ao deslizar para baixo</string>
+  <string name="fp_swipe_down_switch_title_head">Gesto deslizante para baixo na impressão digital</string>
+  <string name="doze_category_title">Ambient Display</string>
+  <string name="doze_category_summary">Acordar o ecrã quando receber notificações</string>
+  <string name="wave_check_summary">Mostrar notificações ao passar a mão</string>
+  <string name="wave_check_title">Passar a mão</string>
+  <string name="tilt_check_summary">Mostrar notificações quando se levanta o dispositivo</string>
+  <string name="tilt_check_title">Levantamento</string>
+  <string name="pocket_check_summary">Mostrar notificações ao retirar do bolso</string>
+  <string name="pocket_check_title">Bolso</string>
+  <string name="ambient_display_enable">Ambient display deve ser habilitada nas configurações de exibição</string>
+  <string name="panel_category_title">Modos do painel</string>
+  <string name="panel_category_summary">Correcção de côr para os modos do painel</string>
+  <string name="off_mode_title">Desligada</string>
+  <string name="tile_panel_mode">Modos do painel</string>
+  <string name="tile_hbm_mode">Modos de luminosidade alta</string>
+  <string name="wake_entry">Acordar</string>
+</resources>
diff --git a/DeviceParts/res/values-rm/strings.xml b/DeviceParts/res/values-rm/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-rm/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ro/strings.xml b/DeviceParts/res/values-ro/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-ro/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-ru/strings.xml b/DeviceParts/res/values-ru/strings.xml
new file mode 100644
index 0000000..f1cc45e
--- /dev/null
+++ b/DeviceParts/res/values-ru/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">OnePlus 5</string>
+  <string name="category_gestures_title">Жесты устройства</string>
+  <string name="fp_gesture_title">Жесты сканера отпечатков пальцев</string>
+  <string name="category_vibrator">Вибрация</string>
+  <string name="vib_strength_title_head">Сила</string>
+  <string name="vib_strength_summary_head">Настройте силу вибрации</string>
+  <string name="vib_test">Проверить</string>
+  <string name="advanced_settings">Дополнительно</string>
+  <string name="category_slider">Ползунок</string>
+  <string name="slider_mode_title">Режим ползунка</string>
+  <string name="buttons_title">Кнопки</string>
+  <string name="swap_back_recents_title">Поменять местами кнопки \"Назад\" и \"Недавние\"</string>
+  <string name="graphics_title">Оформление</string>
+  <string name="srgb_mode_title">Режим sRGB</string>
+  <string name="hbm_mode_title">Режим повышенной яркости</string>
+  <string name="proxi_summary_head">Проверить датчики жестов и отпечатков пальцев</string>
+  <string name="proxi_title_head">Проверка датчика приближения</string>
+  <string name="slider_mode_off">Выкл.</string>
+  <string name="slider_mode_vibrate">Вибрация</string>
+  <string name="slider_mode_silent">Без звука</string>
+  <string name="slider_mode_priority">Только важные</string>
+  <string name="slider_mode_alarm">Только будильники</string>
+  <string name="slider_mode_dnd">Полная тишина</string>
+  <string name="slider_mode_title_top">Верхнее положение</string>
+  <string name="slider_mode_title_center">Среднее положение</string>
+  <string name="slider_mode_title_bottom">Нижнее положение</string>
+  <string name="dci_mode_title">Режим широкой цветовой гаммы</string>
+  <string name="Night_mode_title">Ночной режим</string>
+  <string name="choose_app">Выбрать приложение</string>
+  <string name="category_double_swipe_gesture">Жест ll</string>
+  <string name="offscreen_gesture_title">Жесты на выключенном экране</string>
+  <string name="category_circle_gesture">Жест O</string>
+  <string name="category_down_arrow_gesture">Жест V</string>
+  <string name="category_up_arrow_gesture">Жест A</string>
+  <string name="category_left_arrow_gesture">Жест &lt;</string>
+  <string name="category_right_arrow_gesture">Жест &gt;</string>
+  <string name="category_gestures_summary">Настроить действия жестов</string>
+  <string name="torch_entry">Фонарик</string>
+  <string name="disabled_entry">Выключено</string>
+  <string name="camera_entry">Камера</string>
+  <string name="music_play_entry">Воспр. или остановка музыки</string>
+  <string name="music_prev_entry">Предыдущий трек</string>
+  <string name="music_next_entry">Следующий трек</string>
+  <string name="not_ready_summary">Получение разрешения...</string>
+  <string name="resolve_failed_summary">Ошибка получения разрешения приложения</string>
+  <string name="category_down_swipe_gesture">Провести вниз</string>
+  <string name="category_up_swipe_gesture">Провести вверх</string>
+  <string name="category_left_swipe_gesture">Провести влево</string>
+  <string name="category_right_swipe_gesture">Провести вправо</string>
+  <string name="category_fp_down_swipe_gesture">Отпечаток пальца вниз</string>
+  <string name="category_fp_up_swipe_gesture">Отпечаток пальца вверх</string>
+  <string name="category_fp_right_swipe_gesture">Отпечаток пальца вправо</string>
+  <string name="category_fp_left_swipe_gesture">Отпечаток пальца влево</string>
+  <string name="fp_swipe_down_switch_summary_head">Уведомление по умолчанию при свайпе вниз по сканеру отпечатков пальцев</string>
+  <string name="fp_swipe_down_switch_title_head">Свайп вниз по сканеру отпечатков пальцев</string>
+  <string name="doze_category_title">Активный экран</string>
+  <string name="doze_category_summary">Включение экрана при получении уведомлений</string>
+  <string name="wave_check_summary">Пульсирующие уведомления при проведении рукой над телефоном</string>
+  <string name="wave_check_title">Провести рукой над телефоном</string>
+  <string name="tilt_check_summary">Пульсирующие уведомления при поднятии телефона</string>
+  <string name="tilt_check_title">Поднятие</string>
+  <string name="pocket_check_summary">Пульсирующие уведомления при извлечении из кармана</string>
+  <string name="pocket_check_title">Карман</string>
+  <string name="ambient_display_enable">Активный экран должен быть включен в настройках экрана</string>
+  <string name="panel_category_title">Режимы панели</string>
+  <string name="panel_category_summary">Режимы цветокоррекции панели</string>
+  <string name="off_mode_title">Выкл.</string>
+  <string name="tile_panel_mode">Режимы панели</string>
+  <string name="tile_hbm_mode">Режимы повышенной яркости</string>
+  <string name="wake_entry">Пробуждение</string>
+</resources>
diff --git a/DeviceParts/res/values-si/strings.xml b/DeviceParts/res/values-si/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-si/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-sk/strings.xml b/DeviceParts/res/values-sk/strings.xml
new file mode 100644
index 0000000..014c0f6
--- /dev/null
+++ b/DeviceParts/res/values-sk/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Gestá zariadenia</string>
+  <string name="fp_gesture_title">Gestá skeneru odtlačkov prstov</string>
+  <string name="category_vibrator">Vibrovanie</string>
+  <string name="vib_strength_title_head">Sila</string>
+  <string name="vib_strength_summary_head">Určenie sily vibrovania</string>
+  <string name="vib_test">Skúška</string>
+  <string name="advanced_settings">Rozšírené</string>
+  <string name="category_slider">Posuvník</string>
+  <string name="slider_mode_title">Režim posuvníka</string>
+  <string name="buttons_title">Tlačidlá</string>
+  <string name="swap_back_recents_title">Prehodiť tlačidlá späť a nedávne</string>
+  <string name="graphics_title">Grafika</string>
+  <string name="srgb_mode_title">Režim sRGB</string>
+  <string name="hbm_mode_title">Režim vysokého jasu</string>
+  <string name="proxi_summary_head">Kontrola senzoru priblíženia na ovládanie gest a snímača odtlačkov prstov</string>
+  <string name="proxi_title_head">Kontrola senzora priblíženia</string>
+  <string name="slider_mode_off">Vypnutý</string>
+  <string name="slider_mode_vibrate">Vibrovanie</string>
+  <string name="slider_mode_silent">Tichý</string>
+  <string name="slider_mode_priority">Iba prioritné</string>
+  <string name="slider_mode_alarm">Iba budíky</string>
+  <string name="slider_mode_dnd">Úplné ticho</string>
+  <string name="slider_mode_title_top">Horná pozícia</string>
+  <string name="slider_mode_title_center">Stredná pozícia</string>
+  <string name="slider_mode_title_bottom">Spodná pozícia</string>
+  <string name="dci_mode_title">Režim širokého spektra farieb</string>
+  <string name="Night_mode_title">Nočný režim</string>
+  <string name="choose_app">Zvoliť aplikáciu</string>
+  <string name="category_double_swipe_gesture">Gesto II</string>
+  <string name="offscreen_gesture_title">Gestá pri vypnutej obrazovke</string>
+  <string name="category_circle_gesture">Gesto O</string>
+  <string name="category_down_arrow_gesture">Gesto V</string>
+  <string name="category_up_arrow_gesture">Gesto A</string>
+  <string name="category_left_arrow_gesture">Gesto &lt;</string>
+  <string name="category_right_arrow_gesture">Gesto &gt;</string>
+  <string name="category_gestures_summary">Konfigurácia akcií gest</string>
+  <string name="torch_entry">Baterka</string>
+  <string name="disabled_entry">Vypnuté</string>
+  <string name="camera_entry">Fotoaparát</string>
+  <string name="music_play_entry">Prehrávanie / pozastavenie hudby</string>
+  <string name="music_prev_entry">Predchádzajúca skladba</string>
+  <string name="music_next_entry">Ďalšia skladba</string>
+  <string name="not_ready_summary">Riešenie...</string>
+  <string name="resolve_failed_summary">Riešenie aplikácie zlyhalo</string>
+  <string name="category_down_swipe_gesture">Potiahnutie dolu</string>
+  <string name="category_up_swipe_gesture">Potiahnutie nahor</string>
+  <string name="category_left_swipe_gesture">Potiahnutie vľavo</string>
+  <string name="category_right_swipe_gesture">Potiahnutie vpravo</string>
+  <string name="category_fp_down_swipe_gesture">Odtlačok prsta potiahnutie dolu</string>
+  <string name="category_fp_up_swipe_gesture">Odtlačok prsta potiahnutie nahor</string>
+  <string name="category_fp_right_swipe_gesture">Odtlačok prsta potiahnutie vpravo</string>
+  <string name="category_fp_left_swipe_gesture">Odtlačok prsta potiahnutie vľavo</string>
+  <string name="fp_swipe_down_switch_summary_head">Predvolené upozornenie odtlačku prsta pri potiahnutí prstom nadol</string>
+  <string name="fp_swipe_down_switch_title_head">Odtlačok prsta gesto potiahnutia dolu</string>
+  <string name="doze_category_title">Ambientny displej</string>
+  <string name="doze_category_summary">Prebudiť obrazovku po prijatí upozornenia</string>
+  <string name="wave_check_summary">Zobraziť upozornenia pri mávnutí rukou</string>
+  <string name="wave_check_title">Mávnutie rukou</string>
+  <string name="tilt_check_summary">Zobraziť upozornenia pri zdvihnutí zariadenia</string>
+  <string name="tilt_check_title">Zdvihnutie zariadenia</string>
+  <string name="pocket_check_summary">Zobraziť upozornenia pri vybratí zariadenia z vrecka</string>
+  <string name="pocket_check_title">Vrecko</string>
+  <string name="ambient_display_enable">V nastaveniach obrazovky musí byť zapnutý Ambientny displej</string>
+  <string name="panel_category_title">Režimy panelu</string>
+  <string name="panel_category_summary">Režimy korekcie farieb panelu</string>
+  <string name="off_mode_title">Vyp.</string>
+  <string name="tile_panel_mode">Režimy panelu</string>
+  <string name="tile_hbm_mode">Režimy vysokého jasu</string>
+  <string name="wake_entry">Prebudenie</string>
+</resources>
diff --git a/DeviceParts/res/values-sl/strings.xml b/DeviceParts/res/values-sl/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-sl/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-sr/strings.xml b/DeviceParts/res/values-sr/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-sr/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-sv/strings.xml b/DeviceParts/res/values-sv/strings.xml
new file mode 100644
index 0000000..63a1c69
--- /dev/null
+++ b/DeviceParts/res/values-sv/strings.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="category_vibrator">Vibrator</string>
+  <string name="vib_strength_title_head">Styrka</string>
+  <string name="vib_strength_summary_head">Definiera styrkan på vibratorn</string>
+  <string name="vib_test">Test</string>
+  <string name="advanced_settings">Avancerad</string>
+  <string name="buttons_title">Knappar</string>
+  <string name="swap_back_recents_title">Växla tillbaka och senaste-knappar</string>
+  <string name="graphics_title">Grafik</string>
+  <string name="srgb_mode_title">sRGB-läge</string>
+  <string name="slider_mode_off">Av</string>
+  <string name="slider_mode_vibrate">Vibrera</string>
+  <string name="slider_mode_silent">Tyst</string>
+  <string name="slider_mode_alarm">Endast alarm</string>
+  <string name="slider_mode_dnd">Total tystnad</string>
+  <string name="slider_mode_title_top">Topp-placering</string>
+  <string name="slider_mode_title_bottom">Bottenläget</string>
+  <string name="choose_app">Välj app</string>
+  <string name="category_up_arrow_gesture">En gest</string>
+  <string name="category_left_arrow_gesture">&lt; gest</string>
+  <string name="category_right_arrow_gesture">&gt; gest</string>
+</resources>
diff --git a/DeviceParts/res/values-sw/strings.xml b/DeviceParts/res/values-sw/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-sw/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-th/strings.xml b/DeviceParts/res/values-th/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-th/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-tl/strings.xml b/DeviceParts/res/values-tl/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-tl/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-tr/strings.xml b/DeviceParts/res/values-tr/strings.xml
new file mode 100644
index 0000000..9d43e6c
--- /dev/null
+++ b/DeviceParts/res/values-tr/strings.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">Cihaz hareketleri</string>
+  <string name="fp_gesture_title">Parmak izi tarayıcı hareketleri</string>
+  <string name="category_vibrator">Titreşim motoru</string>
+  <string name="vib_strength_title_head">Kuvvet</string>
+  <string name="vib_strength_summary_head">Titreşim motorunun kuvvetini tayin edin</string>
+  <string name="vib_test">Tecrübe et</string>
+  <string name="advanced_settings">İleri seviye</string>
+  <string name="category_slider">Kaydırma çubuğu</string>
+  <string name="slider_mode_title">Kaydırma çubuğu modu</string>
+  <string name="buttons_title">Düğmeler</string>
+  <string name="swap_back_recents_title">Geri ve son uygulamalar düğmesini mübadele edin</string>
+  <string name="graphics_title">Grafikler</string>
+  <string name="srgb_mode_title">sRGB modu</string>
+  <string name="hbm_mode_title">Yüksek parlaklık modu</string>
+  <string name="proxi_summary_head">Hareketi ve parmak izi sensörünü idare etmek için yakınlık sensörünü denetle</string>
+  <string name="proxi_title_head">Yakınlık denetimi</string>
+  <string name="slider_mode_off">Kapalı</string>
+  <string name="slider_mode_vibrate">Titreşim</string>
+  <string name="slider_mode_silent">Sessiz</string>
+  <string name="slider_mode_priority">Sadece öncelik</string>
+  <string name="slider_mode_alarm">Sadece alarmlar</string>
+  <string name="slider_mode_dnd">Tamamen sessiz</string>
+  <string name="slider_mode_title_top">Üst konum</string>
+  <string name="slider_mode_title_center">Merkezî konum</string>
+  <string name="slider_mode_title_bottom">Alt konum</string>
+  <string name="dci_mode_title">Geniş renk gamutu modu</string>
+  <string name="Night_mode_title">Gece modu</string>
+  <string name="choose_app">Uygulama seçin</string>
+  <string name="category_double_swipe_gesture">II hareketi</string>
+  <string name="offscreen_gesture_title">Kapalı ekran hareketleri</string>
+  <string name="category_circle_gesture">O hareketi</string>
+  <string name="category_down_arrow_gesture">V hareketi</string>
+  <string name="category_up_arrow_gesture">A hareketi</string>
+  <string name="category_left_arrow_gesture">&lt; hareketi</string>
+  <string name="category_right_arrow_gesture">&gt; hareketi</string>
+  <string name="category_gestures_summary">Hareket eylemlerini ayarlayın</string>
+  <string name="torch_entry">Fener</string>
+  <string name="disabled_entry">Devre dışı</string>
+  <string name="camera_entry">Kamera</string>
+  <string name="music_play_entry">Müziği oynat veyâ duraklat</string>
+  <string name="music_prev_entry">Evvelki parça</string>
+  <string name="music_next_entry">Sonraki parça</string>
+  <string name="not_ready_summary">Tahlil ediliyor...</string>
+  <string name="resolve_failed_summary">Uygulama tahlil edilemedi</string>
+  <string name="category_down_swipe_gesture">Aşağı kaydır</string>
+  <string name="category_up_swipe_gesture">Yukarı kaydır</string>
+  <string name="category_left_swipe_gesture">Sola kaydır</string>
+  <string name="category_right_swipe_gesture">Sağa kaydır</string>
+  <string name="category_fp_down_swipe_gesture">Parmağı Aşağı Kaydırma</string>
+  <string name="category_fp_up_swipe_gesture">Parmağı Yukarı Kaydırma</string>
+  <string name="category_fp_right_swipe_gesture">Parmağı Sağa Kaydırma</string>
+  <string name="category_fp_left_swipe_gesture">Parmağı Sola Kaydırma</string>
+  <string name="fp_swipe_down_switch_summary_head">Varsayılan parmağı aşağı kaydırma hareketi bildirimi</string>
+  <string name="fp_swipe_down_switch_title_head">Parmağı aşağı kaydırma hareketi</string>
+  <string name="doze_category_title">Ortam ekranı</string>
+  <string name="doze_category_summary">Bildirim aldığınızda ekranı uyandırın</string>
+  <string name="wave_check_summary">Bildirimleri elimi salladığımda göster</string>
+  <string name="wave_check_title">El sallama</string>
+  <string name="tilt_check_summary">Bildirimleri cihazı elime aldığımda göster</string>
+  <string name="tilt_check_title">Ele alma</string>
+  <string name="pocket_check_summary">Bildirimleri cihazı cebimdem çıkardığımda göster</string>
+  <string name="pocket_check_title">Cep</string>
+  <string name="ambient_display_enable">Ekran ayarlarındaki ortam ekranı etkinleştirilmelidir</string>
+  <string name="panel_category_title">Panel modları</string>
+  <string name="panel_category_summary">Panel rengini düzeltme modları</string>
+  <string name="off_mode_title">Kapalı</string>
+  <string name="tile_panel_mode">Panel modları</string>
+  <string name="tile_hbm_mode">Yüksek parlaklık modları</string>
+  <string name="wake_entry">Uyanma</string>
+</resources>
diff --git a/DeviceParts/res/values-uk/strings.xml b/DeviceParts/res/values-uk/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-uk/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-vi/strings.xml b/DeviceParts/res/values-vi/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-vi/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-zh-rCN/strings.xml b/DeviceParts/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..cc95305
--- /dev/null
+++ b/DeviceParts/res/values-zh-rCN/strings.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+  <string name="app_name">Oneplus 5</string>
+  <string name="category_gestures_title">设备手势</string>
+  <string name="fp_gesture_title">指纹扫描手势</string>
+  <string name="category_vibrator">振动</string>
+  <string name="vib_strength_title_head">强度</string>
+  <string name="vib_strength_summary_head">设置振动强度</string>
+  <string name="vib_test">测试</string>
+  <string name="advanced_settings">高级选项</string>
+  <string name="category_slider">滑块</string>
+  <string name="slider_mode_title">滑块模式</string>
+  <string name="buttons_title">按钮</string>
+  <string name="swap_back_recents_title">交换 返回/最近任务 按键</string>
+  <string name="graphics_title">图形</string>
+  <string name="srgb_mode_title">sRGB 模式</string>
+  <string name="hbm_mode_title">高亮模式</string>
+  <string name="proxi_summary_head">处理手势和指纹传感器前检查近距离感器</string>
+  <string name="proxi_title_head">接近检查</string>
+  <string name="slider_mode_off">关闭</string>
+  <string name="slider_mode_vibrate">振动</string>
+  <string name="slider_mode_silent">静音</string>
+  <string name="slider_mode_priority">仅优先打扰</string>
+  <string name="slider_mode_alarm">仅闹钟</string>
+  <string name="slider_mode_dnd">完全静音</string>
+  <string name="slider_mode_title_top">顶部位置</string>
+  <string name="slider_mode_title_center">中心位置</string>
+  <string name="slider_mode_title_bottom">底部位置</string>
+  <string name="dci_mode_title">广色域模式</string>
+  <string name="Night_mode_title">夜间模式</string>
+  <string name="choose_app">选择应用</string>
+  <string name="category_double_swipe_gesture">II 手势</string>
+  <string name="offscreen_gesture_title">熄屏手势</string>
+  <string name="category_circle_gesture">O 手势</string>
+  <string name="category_down_arrow_gesture">V 手势</string>
+  <string name="category_up_arrow_gesture">A 手势</string>
+  <string name="category_left_arrow_gesture">&lt; 手势</string>
+  <string name="category_right_arrow_gesture">&gt; 手势</string>
+  <string name="category_gestures_summary">配置手势操作</string>
+  <string name="torch_entry">手电筒</string>
+  <string name="disabled_entry">禁用</string>
+  <string name="camera_entry">相机</string>
+  <string name="music_play_entry">播放/暂停音乐</string>
+  <string name="music_prev_entry">上一首</string>
+  <string name="music_next_entry">下一首</string>
+  <string name="not_ready_summary">处理中...</string>
+  <string name="resolve_failed_summary">处理应用程序失败</string>
+  <string name="category_down_swipe_gesture">向下滑动</string>
+  <string name="category_up_swipe_gesture">向上滑动</string>
+  <string name="category_left_swipe_gesture">向左滑动</string>
+  <string name="category_right_swipe_gesture">向右滑动</string>
+  <string name="category_fp_down_swipe_gesture">指纹向下滑动</string>
+  <string name="category_fp_up_swipe_gesture">指纹向上滑动</string>
+  <string name="category_fp_right_swipe_gesture">指纹向右滑动</string>
+  <string name="category_fp_left_swipe_gesture">指纹向左滑动</string>
+  <string name="fp_swipe_down_switch_summary_head">向下滑动时默认的指纹通知</string>
+  <string name="fp_swipe_down_switch_title_head">向下滑动指纹的手势</string>
+  <string name="doze_category_title">主动显示</string>
+  <string name="doze_category_summary">收到通知时点亮屏幕</string>
+  <string name="wave_check_summary">手电波脉冲通知</string>
+  <string name="tilt_check_summary">设备拾取时的脉冲通知</string>
+  <string name="tilt_check_title">拿起</string>
+  <string name="pocket_check_summary">从口袋里取出时的脉冲通知</string>
+  <string name="pocket_check_title">口袋</string>
+  <string name="ambient_display_enable">在显示设置中必须启用Ambient display</string>
+  <string name="panel_category_title">面板模式</string>
+  <string name="panel_category_summary">面板颜色校正模式</string>
+  <string name="off_mode_title">关闭</string>
+  <string name="tile_panel_mode">面板模式</string>
+  <string name="tile_hbm_mode">高亮模式</string>
+  <string name="wake_entry">唤醒</string>
+</resources>
diff --git a/DeviceParts/res/values-zh-rHK/strings.xml b/DeviceParts/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-zh-rHK/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-zh-rTW/strings.xml b/DeviceParts/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-zh-rTW/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values-zu/strings.xml b/DeviceParts/res/values-zu/strings.xml
new file mode 100644
index 0000000..b622661
--- /dev/null
+++ b/DeviceParts/res/values-zu/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources></resources>
diff --git a/DeviceParts/res/values/config.xml b/DeviceParts/res/values/config.xml
new file mode 100644
index 0000000..d396095
--- /dev/null
+++ b/DeviceParts/res/values/config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2016 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <bool name="config_device_has_hw_nav_buttons">false</bool>
+
+</resources>
diff --git a/DeviceParts/res/values/strings.xml b/DeviceParts/res/values/strings.xml
new file mode 100644
index 0000000..b8caa3f
--- /dev/null
+++ b/DeviceParts/res/values/strings.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <string name="app_name">Oneplus 5</string>
+    <string name="category_gestures_title">Device gestures</string>
+    <string name="fp_gesture_title">Fingerprint scanner gestures</string>
+    <string name="category_vibrator">Vibrator</string>
+    <string name="vib_strength_title_head">Strength</string>
+    <string name="vib_strength_summary_head">Define the strength of the vibrator</string>
+    <string name="vib_test">Test</string>
+    <string name="advanced_settings">Advanced</string>
+    <string name="category_slider">Slider</string>
+    <string name="slider_mode_title">Slider mode</string>
+    <string name="buttons_title">Buttons</string>
+    <string name="swap_back_recents_summary"></string>
+    <string name="swap_back_recents_title">Swap back and recents button</string>
+    <string name="graphics_title">Graphics</string>
+    <string name="srgb_mode_summary"></string>
+    <string name="srgb_mode_title">sRGB mode</string>
+    <string name="hbm_mode_summary"></string>
+    <string name="hbm_mode_title">High brightness mode</string>
+    <string name="adaptive_mode_title">Adaptive mode</string>
+    <string name="oneplus_mode_title">OnePlus mode</string>
+    <string name="proxi_summary_head">Check proximity sensor for handling gesture and fingerprint sensor</string>
+    <string name="proxi_title_head">Proximity check</string>
+    <string name="off_screen_gesture_feedback_summary_head">Enable haptic feedback for gestures</string>
+    <string name="off_screen_gesture_feedback_title_head">Haptic feedback</string>
+    <string name="slider_mode_off">Off</string>
+    <string name="slider_mode_flashlight">Flashlight</string>
+    <string name="slider_mode_vibrate">Vibrate</string>
+    <string name="slider_mode_silent">Silent</string>
+    <string name="slider_mode_priority">Priority only</string>
+    <string name="slider_mode_alarm">Alarms only</string>
+    <string name="slider_mode_zen">Do not disturb</string>
+    <string name="slider_mode_title_top">Top position</string>
+    <string name="slider_mode_title_center">Center position</string>
+    <string name="slider_mode_title_bottom">Bottom position</string>
+    <string name="dci_mode_summary"></string>
+    <string name="dci_mode_title">Wide color gammut mode</string>
+    <string name="Night_mode_summary"></string>
+    <string name="Night_mode_title">Night mode</string>
+    <string name="otg_switch_summary">Enable/Disable USB-OTG support</string>
+    <string name="otg_switch_title">USB-OTG support</string>
+
+    <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_circle_gesture">O gesture</string>
+    <string name="category_down_arrow_gesture">V gesture</string>
+    <string name="category_up_arrow_gesture">A gesture</string>
+    <string name="category_left_arrow_gesture">&lt; gesture</string>
+    <string name="category_right_arrow_gesture">&gt; gesture</string>
+    <string name="category_gestures_summary">Configure gesture actions</string>
+    <string name="torch_entry">Flashlight</string>
+    <string name="disabled_entry">Disabled</string>
+    <string name="camera_entry">Camera</string>
+    <string name="music_play_entry">Play / pause music</string>
+    <string name="music_prev_entry">Prev track</string>
+    <string name="music_next_entry">Next track</string>
+    <string name="volume_up">Raise volume</string>
+    <string name="volume_down">Lower volume</string>
+    <string name="browse_scroll_up">Scroll up</string>
+    <string name="browse_scroll_down">Scroll down</string>
+    <string name="navigate_back">Back</string>
+    <string name="navigate_home">Home</string>
+    <string name="navigate_recent">Recent</string>
+    <string name="not_ready_summary">Resolving...</string>
+    <string name="resolve_failed_summary">Resolving app failed</string>
+    <string name="category_down_swipe_gesture">Down swipe</string>
+    <string name="category_up_swipe_gesture">Up swipe</string>
+    <string name="category_left_swipe_gesture">Left swipe</string>
+    <string name="category_right_swipe_gesture">Right swipe</string>
+    <string name="category_fp_down_swipe_gesture">Fingerprint down swipe</string>
+    <string name="category_fp_up_swipe_gesture">Fingerprint up swipe</string>
+    <string name="category_fp_right_swipe_gesture">Fingerprint right swipe</string>
+    <string name="category_fp_left_swipe_gesture">Fingerprint left swipe</string>
+    <string name="category_fp_long_press_gesture">Fingerprint long press</string>
+    <string name="fp_swipe_down_switch_summary_head">Use long press gesture to expand notifications</string>
+    <string name="fp_swipe_down_switch_title_head">Fingerprint long press gesture</string>
+
+    <string name="doze_category_title">Ambient display</string>
+    <string name="doze_category_summary">Wake screen when you receive notifications</string>
+    <string name="wave_check_summary">Pulse notifications on hand wave</string>
+    <string name="wave_check_title">Hand wave</string>
+    <string name="tilt_check_summary">Pulse notifications when device is picked up</string>
+    <string name="tilt_check_title">Pick up</string>
+    <string name="pocket_check_summary">Pulse notifications on removal from pocket</string>
+    <string name="pocket_check_title">Pocket</string>
+    <string name="ambient_display_enable">Ambient display must be enabled in display settings</string>
+
+    <string name="panel_category_title">Panel modes</string>
+    <string name="panel_category_summary">Modes for panel color correction</string>
+    <string name="off_mode_title">Off</string>
+    <string name="tile_panel_mode">Panel modes</string>
+    <string name="tile_hbm_mode">High brightness modes</string>
+    <string name="wake_entry">Wakeup</string>
+</resources>
diff --git a/DeviceParts/res/values/styles.xml b/DeviceParts/res/values/styles.xml
new file mode 100644
index 0000000..ae909bd
--- /dev/null
+++ b/DeviceParts/res/values/styles.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014-2017 The OmniROM Project
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<resources>
+    <style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Settings">
+        <item name="preferenceTheme">@style/PreferenceTheme</item>
+    </style>
+
+    <style name="PreferenceTheme" parent="@style/PreferenceThemeOverlay.SettingsBase">
+    </style>
+</resources>
diff --git a/DeviceParts/res/xml/doze_settings.xml b/DeviceParts/res/xml/doze_settings.xml
new file mode 100644
index 0000000..13c2037
--- /dev/null
+++ b/DeviceParts/res/xml/doze_settings.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014-2016 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <SwitchPreference
+        android:key="wave_check"
+        android:summary="@string/wave_check_summary"
+        android:title="@string/wave_check_title"
+        android:persistent="false" />
+    <SwitchPreference
+        android:key="pocket_check"
+        android:summary="@string/pocket_check_summary"
+        android:title="@string/pocket_check_title"
+        android:persistent="false" />
+    <SwitchPreference
+        android:key="tilt_check"
+        android:summary="@string/tilt_check_summary"
+        android:title="@string/tilt_check_title"
+        android:persistent="false" />
+    <Preference
+        android:key="footer"
+        android:summary="@string/ambient_display_enable"
+        android:persistent="false"
+        android:icon="@drawable/ic_info_outline_24dp" />
+</PreferenceScreen>
diff --git a/DeviceParts/res/xml/gesture_settings.xml b/DeviceParts/res/xml/gesture_settings.xml
new file mode 100644
index 0000000..c7ef445
--- /dev/null
+++ b/DeviceParts/res/xml/gesture_settings.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <SwitchPreference
+        android:key="proxi"
+        android:summary="@string/proxi_summary_head"
+        android:title="@string/proxi_title_head"
+        android:persistent="false"
+        android:defaultValue="true" />
+
+    <PreferenceCategory
+        android:title="@string/fp_gesture_title"
+        android:key="key_fp_gesture_category" >
+
+        <Preference
+            android:key="gesture_settings"
+            android:title="@string/fp_swipe_down_switch_title_head"
+            android:summary="@string/fp_swipe_down_switch_summary_head" >
+            <intent android:action="android.intent.action.MAIN"
+                    android:targetPackage="com.android.settings"
+                    android:targetClass="com.android.settings.Settings$SwipeToNotificationSuggestionActivity" />
+        </Preference>
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="fp_long_press_gesture_app"
+            android:title="@string/category_fp_long_press_gesture"
+            android:persistent="false"/>
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/offscreen_gesture_title">
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="circle_gesture_app"
+            android:title="@string/category_circle_gesture"
+            android:persistent="false" />
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="double_swipe_gesture_app"
+            android:title="@string/category_double_swipe_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:persistent="false" />
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="down_arrow_gesture_app"
+            android:title="@string/category_down_arrow_gesture"
+            android:persistent="false"/>
+
+        <org.omnirom.device.AppSelectListPreference
+            android:key="down_swipe_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: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:persistent="false"/>
+
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/DeviceParts/res/xml/main.xml b/DeviceParts/res/xml/main.xml
new file mode 100644
index 0000000..58377c4
--- /dev/null
+++ b/DeviceParts/res/xml/main.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2014-2016 The OmniROM Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <Preference
+        android:key="gesture_category"
+        android:title="@string/category_gestures_title"
+        android:summary="@string/category_gestures_summary"
+        android:persistent="false" >
+        <intent android:action="android.intent.action.MAIN"
+                android:targetPackage="org.omnirom.device"
+                android:targetClass="org.omnirom.device.GestureSettingsActivity" />
+    </Preference>
+
+    <Preference
+        android:key="doze_category"
+        android:title="@string/doze_category_title"
+        android:summary="@string/doze_category_summary"
+        android:persistent="false" >
+        <intent android:action="android.intent.action.MAIN"
+                android:targetPackage="org.omnirom.device"
+                android:targetClass="org.omnirom.device.DozeSettingsActivity" />
+    </Preference>
+
+</PreferenceScreen>
diff --git a/DeviceParts/src/org/omnirom/device/AppSelectListPreference.java b/DeviceParts/src/org/omnirom/device/AppSelectListPreference.java
new file mode 100644
index 0000000..984afa8
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/AppSelectListPreference.java
@@ -0,0 +1,422 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.support.v14.preference.PreferenceDialogFragment;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.android.settingslib.CustomDialogPreference;
+
+public class AppSelectListPreference extends CustomDialogPreference {
+
+    private static String TAG = "AppSelectListPreference";
+
+    public static final String TORCH_ENTRY = "torch";
+    public static final String DISABLED_ENTRY = "disabled";
+    public static final String CAMERA_ENTRY = "camera";
+    public static final String MUSIC_PLAY_ENTRY = "music_play";
+    public static final String MUSIC_PREV_ENTRY = "music_prev";
+    public static final String MUSIC_NEXT_ENTRY = "music_next";
+    public static final String WAKE_ENTRY = "wake";
+    public static final String VOLUME_UP_ENTRY = "volume_up";
+    public static final String VOLUME_DOWN_ENTRY = "volume_down";
+    public static final String BROWSE_SCROLL_DOWN_ENTRY = "browse_scroll_down";
+    public static final String BROWSE_SCROLL_UP_ENTRY = "browse_scroll_up";
+    public static final String NAVIGATE_BACK_ENTRY = "navigate_back";
+    public static final String NAVIGATE_HOME_ENTRY = "navigate_home";
+    public static final String NAVIGATE_RECENT_ENTRY = "navigate_recent";
+
+    private AppSelectListAdapter mAdapter;
+    private Drawable mAppIconDrawable;
+    private int mAppIconResourceId;
+    private CharSequence mTitle;
+    private String mValue;
+    private PackageManager mPm;
+    private List<PackageItem> mInstalledPackages = new LinkedList<PackageItem>();
+
+    public static class PackageItem implements Comparable<PackageItem> {
+        public final CharSequence mTitle;
+        public final int mAppIconResourceId;
+        public final ComponentName mComponentName;
+        public final String mValue;
+
+        PackageItem(CharSequence title, int iconResourceId, ComponentName componentName) {
+            mTitle = title;
+            mAppIconResourceId = iconResourceId;
+            mComponentName = componentName;
+            mValue = componentName.flattenToString();
+        }
+
+        PackageItem(CharSequence title, int iconResourceId, String value) {
+            mTitle = title;
+            mAppIconResourceId = iconResourceId;
+            mComponentName = null;
+            mValue = value;
+        }
+
+        @Override
+        public int compareTo(PackageItem another) {
+            return mTitle.toString().toUpperCase().compareTo(another.mTitle.toString().toUpperCase());
+        }
+
+        @Override
+        public int hashCode() {
+            return mValue.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object another) {
+            if (another == null || !(another instanceof PackageItem)) {
+                return false;
+            }
+            return mValue.equals(((PackageItem) another).mValue);
+        }
+    }
+
+    public class AppSelectListAdapter extends BaseAdapter {
+        private LayoutInflater mInflater;
+
+        public AppSelectListAdapter(Context context) {
+            mInflater = LayoutInflater.from(context);
+        }
+
+        @Override
+        public int getCount() {
+            return mInstalledPackages.size();
+        }
+
+        @Override
+        public PackageItem getItem(int position) {
+            return mInstalledPackages.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return mInstalledPackages.get(position).hashCode();
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ViewHolder holder;
+            if (convertView != null) {
+                holder = (ViewHolder) convertView.getTag();
+            } else {
+                convertView = mInflater.inflate(R.layout.applist_preference_icon, null, false);
+                holder = new ViewHolder();
+                convertView.setTag(holder);
+                holder.title = (TextView) convertView.findViewById(R.id.title);
+                holder.icon = (ImageView) convertView.findViewById(R.id.icon);
+            }
+
+            PackageItem applicationInfo = getItem(position);
+            holder.title.setText(applicationInfo.mTitle);
+            if (applicationInfo.mAppIconResourceId != 0) {
+                holder.icon.setImageResource(applicationInfo.mAppIconResourceId);
+            } else {
+                Drawable d = resolveAppIcon(applicationInfo);
+                holder.icon.setImageDrawable(d);
+            }
+            return convertView;
+        }
+
+        private PackageItem resolveApplication(ComponentName componentName) {
+            for (PackageItem item : mInstalledPackages) {
+                if (item.mComponentName != null && item.mComponentName.equals(componentName)) {
+                    return item;
+                }
+            }
+            return null;
+        }
+
+        private class ViewHolder {
+            TextView title;
+            TextView summary;
+            ImageView icon;
+        }
+    }
+
+    public AppSelectListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public AppSelectListPreference(Context context, int color) {
+        super(context, null);
+        init();
+    }
+
+    public void setPackageList(List<PackageItem> installedPackages) {
+        mInstalledPackages.clear();
+        mInstalledPackages.addAll(installedPackages);
+        addSpecialApps();
+        mAdapter.notifyDataSetChanged();
+        updatePreferenceViews();
+    }
+
+    private void init() {
+        mPm = getContext().getPackageManager();
+        setDialogLayoutResource(R.layout.preference_dialog_applist);
+        setLayoutResource(R.layout.preference_app_select);
+        setNegativeButtonText(android.R.string.cancel);
+        setPositiveButtonText(null);
+        setDialogTitle(R.string.choose_app);
+        setDialogIcon(null);
+        mAdapter = new AppSelectListAdapter(getContext());
+    }
+
+    private void addSpecialApps() {
+        PackageItem cameraItem = new PackageItem(getContext().getResources().getString(R.string.camera_entry),
+                R.drawable.ic_camera, CAMERA_ENTRY);
+        mInstalledPackages.add(0, cameraItem);
+
+        PackageItem torchItem = new PackageItem(getContext().getResources().getString(R.string.torch_entry),
+                R.drawable.ic_flashlight, TORCH_ENTRY);
+        mInstalledPackages.add(0, torchItem);
+
+        PackageItem musicNextItem = new PackageItem(getContext().getResources().getString(R.string.music_next_entry),
+                R.drawable.ic_music_next, MUSIC_NEXT_ENTRY);
+        mInstalledPackages.add(0, musicNextItem);
+
+        PackageItem musicPrevItem = new PackageItem(getContext().getResources().getString(R.string.music_prev_entry),
+                R.drawable.ic_music_prev, MUSIC_PREV_ENTRY);
+        mInstalledPackages.add(0, musicPrevItem);
+
+        PackageItem musicPlayItem = new PackageItem(getContext().getResources().getString(R.string.music_play_entry),
+                R.drawable.ic_music_play, MUSIC_PLAY_ENTRY);
+        mInstalledPackages.add(0, musicPlayItem);
+
+        PackageItem wakeItem = new PackageItem(getContext().getResources().getString(R.string.wake_entry),
+                R.drawable.ic_wakeup, WAKE_ENTRY);
+        mInstalledPackages.add(0, wakeItem);
+
+        PackageItem volumeUpItem = new PackageItem(
+                getContext().getResources().getString(R.string.volume_up),
+                R.drawable.ic_settings_sound, VOLUME_UP_ENTRY);
+        mInstalledPackages.add(0, volumeUpItem);
+
+        PackageItem volumeDownItem = new PackageItem(
+                getContext().getResources().getString(R.string.volume_down),
+                R.drawable.ic_settings_sound, VOLUME_DOWN_ENTRY);
+        mInstalledPackages.add(0, volumeDownItem);
+
+        PackageItem browseScrollDownItem = new PackageItem(
+                getContext().getResources().getString(R.string.browse_scroll_down),
+                R.drawable.arrow_collapse_down, BROWSE_SCROLL_DOWN_ENTRY);
+        mInstalledPackages.add(0, browseScrollDownItem);
+
+        PackageItem browseScrollUpItem = new PackageItem(
+                getContext().getResources().getString(R.string.browse_scroll_up),
+                R.drawable.arrow_collapse_up, BROWSE_SCROLL_UP_ENTRY);
+        mInstalledPackages.add(0, browseScrollUpItem);
+
+        PackageItem navigateBackItem = new PackageItem(
+                getContext().getResources().getString(R.string.navigate_back),
+                R.drawable.back, NAVIGATE_BACK_ENTRY);
+        mInstalledPackages.add(0, navigateBackItem);
+
+        PackageItem navigateHomeItem = new PackageItem(
+                getContext().getResources().getString(R.string.navigate_home),
+                R.drawable.home, NAVIGATE_HOME_ENTRY);
+        mInstalledPackages.add(0, navigateHomeItem);
+
+        PackageItem navigateRecentItem = new PackageItem(
+                getContext().getResources().getString(R.string.navigate_recent),
+                R.drawable.recent, NAVIGATE_RECENT_ENTRY);
+        mInstalledPackages.add(0, navigateRecentItem);
+        
+        PackageItem disabledItem = new PackageItem(getContext().getResources().getString(R.string.disabled_entry),
+                R.drawable.ic_disabled, DISABLED_ENTRY);
+        mInstalledPackages.add(0, disabledItem);
+    }
+
+    @Override
+    protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
+        super.onSetInitialValue(restorePersistedValue, defaultValue);
+        if (mTitle != null) {
+            setSummary(mTitle);
+        } else {
+            setSummary(getContext().getResources().getString(R.string.not_ready_summary));
+        }
+        mAppIconResourceId = R.drawable.ic_disabled;
+        setIcon(mAppIconResourceId);
+    }
+
+    @Override
+    protected void onBindDialogView(View view) {
+        super.onBindDialogView(view);
+
+        final ListView list = (ListView) view.findViewById(R.id.applist);
+        list.setAdapter(mAdapter);
+        list.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                PackageItem info = (PackageItem) parent.getItemAtPosition(position);
+                mValue = info.mValue;
+                if (shouldPersist()) {
+                    persistString(mValue);
+                }
+                mTitle = info.mTitle;
+                mAppIconDrawable = null;
+                mAppIconResourceId = 0;
+                if (info.mComponentName != null) {
+                    mAppIconDrawable = resolveAppIcon(info);
+                } else {
+                    mAppIconResourceId = info.mAppIconResourceId;
+                }
+
+                updatePreferenceViews();
+                callChangeListener(mValue);
+                getDialog().dismiss();
+            }
+        });
+    }
+
+    private void updatePreferenceViews() {
+        String name = null;
+        if (shouldPersist()) {
+            name = getPersistedString(null);
+        } else {
+            name = mValue;
+        }
+        mAppIconResourceId = R.drawable.ic_disabled;
+
+        if (name != null) {
+            mAppIconDrawable = null;
+            if (name.equals(DISABLED_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.disabled_entry);
+                mAppIconResourceId = R.drawable.ic_disabled;
+            } else if (name.equals(TORCH_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.torch_entry);
+                mAppIconResourceId = R.drawable.ic_flashlight;
+            } else if (name.equals(CAMERA_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.camera_entry);
+                mAppIconResourceId = R.drawable.ic_camera;
+            } else if (name.equals(MUSIC_PLAY_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.music_play_entry);
+                mAppIconResourceId = R.drawable.ic_music_play;
+            } else if (name.equals(MUSIC_NEXT_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.music_next_entry);
+                mAppIconResourceId = R.drawable.ic_music_next;
+            } else if (name.equals(MUSIC_PREV_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.music_prev_entry);
+                mAppIconResourceId = R.drawable.ic_music_prev;
+            } else if (name.equals(WAKE_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.wake_entry);
+                mAppIconResourceId = R.drawable.ic_wakeup;
+            } else if (name.equals(VOLUME_UP_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.volume_up);
+                mAppIconResourceId = R.drawable.ic_settings_sound;
+            } else if (name.equals(VOLUME_DOWN_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.volume_down);
+                mAppIconResourceId = R.drawable.ic_settings_sound;
+            } else if (name.equals(BROWSE_SCROLL_DOWN_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.browse_scroll_down);
+                mAppIconResourceId = R.drawable.arrow_collapse_down;
+            } else if (name.equals(BROWSE_SCROLL_UP_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.browse_scroll_up);
+                mAppIconResourceId = R.drawable.arrow_collapse_up;
+            } else if (name.equals(NAVIGATE_BACK_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.navigate_back);
+                mAppIconResourceId = R.drawable.back;
+            } else if (name.equals(NAVIGATE_HOME_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.navigate_home);
+                mAppIconResourceId = R.drawable.home;
+            } else if (name.equals(NAVIGATE_RECENT_ENTRY)) {
+                mTitle = getContext().getResources().getString(R.string.navigate_recent);
+                mAppIconResourceId = R.drawable.recent;
+            } else {
+                ComponentName componentName = ComponentName.unflattenFromString(name);
+                PackageItem item = mAdapter.resolveApplication(componentName);
+                if (item != null) {
+                    mTitle = item.mTitle;
+                    mAppIconDrawable = resolveAppIcon(item);
+                } else {
+                    mTitle = getContext().getResources().getString(R.string.resolve_failed_summary);
+                }
+            }
+        } else {
+            mTitle = getContext().getResources().getString(R.string.disabled_entry);
+            mAppIconResourceId = R.drawable.ic_disabled;
+        }
+
+        setSummary(mTitle);
+        if (mAppIconDrawable != null) {
+            setIcon(mAppIconDrawable);
+        } else {
+            setIcon(mAppIconResourceId);
+        }
+    }
+
+    private Drawable getDefaultActivityIcon() {
+        return getContext().getResources().getDrawable(android.R.drawable.sym_def_app_icon);
+    }
+
+    public String getValue() {
+        return mValue;
+    }
+
+    public void setValue(String value) {
+        mValue = value;
+    }
+
+    private Drawable resolveAppIcon(PackageItem item) {
+        Drawable appIcon = null;
+        try {
+            appIcon = mPm.getActivityIcon(item.mComponentName);
+        } catch (PackageManager.NameNotFoundException e) {
+        }
+        if (appIcon == null) {
+            appIcon = getDefaultActivityIcon();
+        }
+        return appIcon;
+    }
+
+    public static class AppSelectListPreferenceDialogFragment
+            extends CustomDialogPreference.CustomPreferenceDialogFragment {
+        public static CustomDialogPreference.CustomPreferenceDialogFragment
+                newInstance(String key) {
+            return CustomDialogPreference.CustomPreferenceDialogFragment.newInstance(key);
+        }
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/DeviceSettings.java b/DeviceParts/src/org/omnirom/device/DeviceSettings.java
new file mode 100644
index 0000000..e14b291
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/DeviceSettings.java
@@ -0,0 +1,62 @@
+/*
+* Copyright (C) 2016 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.res.Resources;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+import android.util.Log;
+
+public class DeviceSettings extends PreferenceFragment implements
+        Preference.OnPreferenceChangeListener {
+
+    public static final String SLIDER_DEFAULT_VALUE = "2,1,0";
+
+    public static final String KEY_SETTINGS_PREFIX = "device_setting_";
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.main, rootKey);
+
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        return super.onPreferenceTreeClick(preference);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        return true;
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/DeviceSettingsActivity.java b/DeviceParts/src/org/omnirom/device/DeviceSettingsActivity.java
new file mode 100644
index 0000000..b3ab2ff
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/DeviceSettingsActivity.java
@@ -0,0 +1,65 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceManager;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+public class DeviceSettingsActivity extends Activity {
+
+    private DeviceSettings mDeviceSettingsFragment;
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        if (fragment == null) {
+            mDeviceSettingsFragment = new DeviceSettings();
+            getFragmentManager().beginTransaction()
+                .add(android.R.id.content, mDeviceSettingsFragment)
+                .commit();
+        } else {
+            mDeviceSettingsFragment = (DeviceSettings) fragment;
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            finish();
+            return true;
+        default:
+            break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/DozeSettings.java b/DeviceParts/src/org/omnirom/device/DozeSettings.java
new file mode 100644
index 0000000..4721e85
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/DozeSettings.java
@@ -0,0 +1,112 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.res.Resources;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+import android.util.Log;
+
+public class DozeSettings extends PreferenceFragment  {
+
+    private static final String KEY_WAVE_CHECK = "wave_check";
+    private static final String KEY_POCKET_CHECK = "pocket_check";
+    private static final String KEY_TILT_CHECK = "tilt_check";
+    private static final String KEY_FOOTER = "footer";
+
+    private boolean mUseTiltCheck;
+    private boolean mUseWaveCheck;
+    private boolean mUsePocketCheck;
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.doze_settings, rootKey);
+
+        getDozeSettings();
+
+        TwoStatePreference waveSwitch = (TwoStatePreference) findPreference(KEY_WAVE_CHECK);
+        waveSwitch.setChecked(mUseWaveCheck);
+        waveSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                mUseWaveCheck = (Boolean) newValue;
+                setDozeSettings();
+                return true;
+            }
+        });
+        TwoStatePreference pocketSwitch = (TwoStatePreference) findPreference(KEY_POCKET_CHECK);
+        pocketSwitch.setChecked(mUsePocketCheck);
+        pocketSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                mUsePocketCheck = (Boolean) newValue;
+                setDozeSettings();
+                return true;
+            }
+        });
+        TwoStatePreference tiltSwitch = (TwoStatePreference) findPreference(KEY_TILT_CHECK);
+        tiltSwitch.setChecked(mUseTiltCheck);
+        tiltSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+            @Override
+            public boolean onPreferenceChange(Preference preference, Object newValue) {
+                mUseTiltCheck = (Boolean) newValue;
+                setDozeSettings();
+                return true;
+            }
+        });
+        Preference footer = findPreference(KEY_FOOTER);
+        if (isAmbientDisplayEnabled()) {
+            getPreferenceScreen().removePreference(footer);
+        }
+    }
+
+    private void getDozeSettings() {
+        String value = Settings.System.getString(getContext().getContentResolver(),
+                    Settings.System.OMNI_DEVICE_FEATURE_SETTINGS);
+        if (!TextUtils.isEmpty(value)) {
+            String[] parts = value.split(":");
+            mUseWaveCheck = Boolean.valueOf(parts[0]);
+            mUsePocketCheck = Boolean.valueOf(parts[1]);
+            mUseTiltCheck = Boolean.valueOf(parts[2]);
+        }
+    }
+
+    private void setDozeSettings() {
+        String newValue = String.valueOf(mUseWaveCheck) + ":" + String.valueOf(mUsePocketCheck) + ":" + String.valueOf(mUseTiltCheck);
+        Settings.System.putString(getContext().getContentResolver(), Settings.System.OMNI_DEVICE_FEATURE_SETTINGS, newValue);
+    }
+
+    private boolean isAmbientDisplayEnabled() {
+        return Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.DOZE_ENABLED, 1) == 1;
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/DozeSettingsActivity.java b/DeviceParts/src/org/omnirom/device/DozeSettingsActivity.java
new file mode 100644
index 0000000..dae6ce8
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/DozeSettingsActivity.java
@@ -0,0 +1,65 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceManager;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+public class DozeSettingsActivity extends Activity {
+
+    private DozeSettings mDozeSettingsFragment;
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        if (fragment == null) {
+            mDozeSettingsFragment = new DozeSettings();
+            getFragmentManager().beginTransaction()
+                .add(android.R.id.content, mDozeSettingsFragment)
+                .commit();
+        } else {
+            mDozeSettingsFragment = (DozeSettings) fragment;
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            finish();
+            return true;
+        default:
+            break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/GestureSettings.java b/DeviceParts/src/org/omnirom/device/GestureSettings.java
new file mode 100644
index 0000000..00e1d99
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/GestureSettings.java
@@ -0,0 +1,364 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceCategory;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.TwoStatePreference;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ListView;
+import android.util.Log;
+import static android.provider.Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED;
+import android.os.UserHandle;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+public class GestureSettings extends PreferenceFragment implements
+        Preference.OnPreferenceChangeListener {
+
+    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_FP_GESTURE_CATEGORY = "key_fp_gesture_category";
+    public static final String KEY_FP_GESTURE_DEFAULT_CATEGORY = "gesture_settings";
+
+    public static final String FP_GESTURE_LONG_PRESS_APP = "fp_long_press_gesture_app";
+
+    public static final String DEVICE_GESTURE_MAPPING_0 = "device_gesture_mapping_0_0";
+    public static final String DEVICE_GESTURE_MAPPING_1 = "device_gesture_mapping_1_0";
+    public static final String DEVICE_GESTURE_MAPPING_2 = "device_gesture_mapping_2_0";
+    public static final String DEVICE_GESTURE_MAPPING_3 = "device_gesture_mapping_3_0";
+    public static final String DEVICE_GESTURE_MAPPING_4 = "device_gesture_mapping_4_0";
+    public static final String DEVICE_GESTURE_MAPPING_5 = "device_gesture_mapping_5_0";
+    public static final String DEVICE_GESTURE_MAPPING_6 = "device_gesture_mapping_6_0";
+    public static final String DEVICE_GESTURE_MAPPING_7 = "device_gesture_mapping_7_0";
+    public static final String DEVICE_GESTURE_MAPPING_8 = "device_gesture_mapping_8_0";
+    public static final String DEVICE_GESTURE_MAPPING_9 = "device_gesture_mapping_9_0";
+    public static final String DEVICE_GESTURE_MAPPING_10 = "device_gesture_mapping_10_0";
+
+    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 mDownSwipeApp;
+    private AppSelectListPreference mUpSwipeApp;
+    private AppSelectListPreference mLeftSwipeApp;
+    private AppSelectListPreference mRightSwipeApp;
+    private AppSelectListPreference mFPDownSwipeApp;
+    private AppSelectListPreference mFPUpSwipeApp;
+    private AppSelectListPreference mFPRightSwipeApp;
+    private AppSelectListPreference mFPLeftSwipeApp;
+    private AppSelectListPreference mFPLongPressApp;
+    private PreferenceCategory fpGestures;
+    private boolean mFpDownSwipe;
+    private List<AppSelectListPreference.PackageItem> mInstalledPackages = new LinkedList<AppSelectListPreference.PackageItem>();
+    private PackageManager mPm;
+
+    @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        setPreferencesFromResource(R.xml.gesture_settings, rootKey);
+        mPm = getContext().getPackageManager();
+
+        mProxiSwitch = (TwoStatePreference) findPreference(KEY_PROXI_SWITCH);
+        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));
+        String value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_0);
+        mDoubleSwipeApp.setValue(value);
+        mDoubleSwipeApp.setOnPreferenceChangeListener(this);
+
+        mCircleApp = (AppSelectListPreference) findPreference(KEY_CIRCLE_APP);
+        mCircleApp.setEnabled(isGestureSupported(KEY_CIRCLE_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_1);
+        mCircleApp.setValue(value);
+        mCircleApp.setOnPreferenceChangeListener(this);
+
+        mDownArrowApp = (AppSelectListPreference) findPreference(KEY_DOWN_ARROW_APP);
+        mDownArrowApp.setEnabled(isGestureSupported(KEY_DOWN_ARROW_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_2);
+        mDownArrowApp.setValue(value);
+        mDownArrowApp.setOnPreferenceChangeListener(this);
+
+        mUpArrowApp = (AppSelectListPreference) findPreference(KEY_UP_ARROW_APP);
+        mUpArrowApp.setEnabled(isGestureSupported(KEY_UP_ARROW_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_3);
+        mUpArrowApp.setValue(value);
+        mUpArrowApp.setOnPreferenceChangeListener(this);
+
+        mLeftArrowApp = (AppSelectListPreference) findPreference(KEY_LEFT_ARROW_APP);
+        mLeftArrowApp.setEnabled(isGestureSupported(KEY_LEFT_ARROW_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_4);
+        mLeftArrowApp.setValue(value);
+        mLeftArrowApp.setOnPreferenceChangeListener(this);
+
+        mRightArrowApp = (AppSelectListPreference) findPreference(KEY_RIGHT_ARROW_APP);
+        mRightArrowApp.setEnabled(isGestureSupported(KEY_RIGHT_ARROW_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);
+
+        mUpSwipeApp = (AppSelectListPreference) findPreference(KEY_UP_SWIPE_APP);
+        mUpSwipeApp.setEnabled(isGestureSupported(KEY_UP_SWIPE_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_7);
+        mUpSwipeApp.setValue(value);
+        mUpSwipeApp.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);
+        mLeftSwipeApp.setValue(value);
+        mLeftSwipeApp.setOnPreferenceChangeListener(this);
+
+        mRightSwipeApp = (AppSelectListPreference) findPreference(KEY_RIGHT_SWIPE_APP);
+        mRightSwipeApp.setEnabled(isGestureSupported(KEY_RIGHT_SWIPE_APP));
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_9);
+        mRightSwipeApp.setValue(value);
+        mRightSwipeApp.setOnPreferenceChangeListener(this);
+
+        mFPLongPressApp = (AppSelectListPreference) findPreference(FP_GESTURE_LONG_PRESS_APP);
+        mFPLongPressApp.setEnabled(true);
+        value = Settings.System.getString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_10);
+        mFPLongPressApp.setValue(value);
+        mFPLongPressApp.setOnPreferenceChangeListener(this);
+
+        new FetchPackageInformationTask().execute();
+    }
+
+    private boolean areSystemNavigationKeysEnabled() {
+        return Settings.Secure.getInt(getContext().getContentResolver(),
+               Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0) == 1;
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (preference == mProxiSwitch) {
+            Settings.System.putInt(getContext().getContentResolver(),
+                    Settings.System.OMNI_DEVICE_PROXI_CHECK_ENABLED, mProxiSwitch.isChecked() ? 1 : 0);
+            return true;
+        }
+        return super.onPreferenceTreeClick(preference);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (preference == mDoubleSwipeApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_DOUBLE_SWIPE_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_0, value);
+        } else if (preference == mCircleApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_CIRCLE_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_1, value);
+        } else if (preference == mDownArrowApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_DOWN_ARROW_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_2, value);
+        } else if (preference == mUpArrowApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_UP_ARROW_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_3, value);
+        } else if (preference == mLeftArrowApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_LEFT_ARROW_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_4, value);
+        } else if (preference == mRightArrowApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_RIGHT_ARROW_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_7, value);
+        } else if (preference == mLeftSwipeApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_LEFT_SWIPE_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_8, value);
+        } else if (preference == mRightSwipeApp) {
+            String value = (String) newValue;
+            boolean gestureDisabled = value.equals(AppSelectListPreference.DISABLED_ENTRY);
+            setGestureEnabled(KEY_RIGHT_SWIPE_APP, !gestureDisabled);
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_9, value);
+        } else if (preference == mFPLongPressApp) {
+            String value = (String) newValue;
+            Settings.System.putString(getContext().getContentResolver(), DEVICE_GESTURE_MAPPING_10, value);
+        }
+        return true;
+    }
+
+    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_UP_SWIPE_APP:
+                return "/proc/touchpanel/up_swipe_enable";
+            case KEY_LEFT_SWIPE_APP:
+                return "/proc/touchpanel/left_swipe_enable";
+            case KEY_RIGHT_SWIPE_APP:
+                return "/proc/touchpanel/right_swipe_enable";
+        }
+        return null;
+    }
+
+    private boolean isGestureSupported(String key) {
+        return Utils.fileWritable(getGestureFile(key));
+    }
+
+    private void setGestureEnabled(String key, boolean enabled) {
+        Utils.writeValue(getGestureFile(key), enabled ? "1" : "0");
+    }
+
+    @Override
+    public void onDisplayPreferenceDialog(Preference preference) {
+        if (!(preference instanceof AppSelectListPreference)) {
+            super.onDisplayPreferenceDialog(preference);
+            return;
+        }
+        DialogFragment fragment =
+                AppSelectListPreference.AppSelectListPreferenceDialogFragment
+                        .newInstance(preference.getKey());
+        fragment.setTargetFragment(this, 0);
+        fragment.show(getFragmentManager(), "dialog_preference");
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (mFPDownSwipeApp != null) {
+            mFPDownSwipeApp.setEnabled(!areSystemNavigationKeysEnabled());
+        }
+        if (mFPUpSwipeApp != null) {
+            mFPUpSwipeApp.setEnabled(!areSystemNavigationKeysEnabled());
+        }
+    }
+
+    private void loadInstalledPackages() {
+        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+        List<ResolveInfo> installedAppsInfo = mPm.queryIntentActivities(mainIntent, 0);
+
+        for (ResolveInfo info : installedAppsInfo) {
+            ActivityInfo activity = info.activityInfo;
+            ApplicationInfo appInfo = activity.applicationInfo;
+            ComponentName componentName = new ComponentName(appInfo.packageName, activity.name);
+            CharSequence label = null;
+            try {
+                label = activity.loadLabel(mPm);
+            } catch (Exception e) {
+            }
+            if (label != null) {
+                final AppSelectListPreference.PackageItem item = new AppSelectListPreference.PackageItem(activity.loadLabel(mPm), 0, componentName);
+                mInstalledPackages.add(item);
+            }
+        }
+        Collections.sort(mInstalledPackages);
+    }
+
+    private class FetchPackageInformationTask extends AsyncTask<Void, Void, Void> {
+        public FetchPackageInformationTask() {
+        }
+
+        @Override
+        protected Void doInBackground(Void... params) {
+            loadInstalledPackages();
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void feed) {
+            mDoubleSwipeApp.setPackageList(mInstalledPackages);
+            mCircleApp.setPackageList(mInstalledPackages);
+            mDownArrowApp.setPackageList(mInstalledPackages);
+            mUpArrowApp.setPackageList(mInstalledPackages);
+            mLeftArrowApp.setPackageList(mInstalledPackages);
+            mRightArrowApp.setPackageList(mInstalledPackages);
+            mDownSwipeApp.setPackageList(mInstalledPackages);
+            mUpSwipeApp.setPackageList(mInstalledPackages);
+            mLeftSwipeApp.setPackageList(mInstalledPackages);
+            mRightSwipeApp.setPackageList(mInstalledPackages);
+            mFPLongPressApp.setPackageList(mInstalledPackages);
+        }
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/GestureSettingsActivity.java b/DeviceParts/src/org/omnirom/device/GestureSettingsActivity.java
new file mode 100644
index 0000000..7d744ad
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/GestureSettingsActivity.java
@@ -0,0 +1,66 @@
+/*
+* Copyright (C) 2017 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceManager;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+public class GestureSettingsActivity extends Activity {
+
+    private GestureSettings mGestureSettingsFragment;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+
+        Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content);
+        if (fragment == null) {
+            mGestureSettingsFragment = new GestureSettings();
+            getFragmentManager().beginTransaction()
+                .add(android.R.id.content, mGestureSettingsFragment)
+                .commit();
+        } else {
+            mGestureSettingsFragment = (GestureSettings) fragment;
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+        case android.R.id.home:
+            finish();
+            return true;
+        default:
+            break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/KeyHandler.java b/DeviceParts/src/org/omnirom/device/KeyHandler.java
new file mode 100644
index 0000000..c591afa
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/KeyHandler.java
@@ -0,0 +1,603 @@
+/*
+* Copyright (C) 2016 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.app.ActivityManagerNative;
+import android.app.NotificationManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.ContentObserver;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.IAudioService;
+import android.media.AudioManager;
+import android.media.session.MediaSessionLegacyHelper;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.os.FileObserver;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.os.UEventObserver;
+import android.os.UserHandle;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.provider.Settings.Global;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.HapticFeedbackConstants;
+import android.view.WindowManagerGlobal;
+
+import com.android.internal.util.omni.DeviceKeyHandler;
+import com.android.internal.util.omni.PackageUtils;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.omni.OmniUtils;
+import org.omnirom.omnilib.utils.OmniVibe;
+import com.android.internal.statusbar.IStatusBarService;
+
+public class KeyHandler implements DeviceKeyHandler {
+
+    private static final String TAG = "KeyHandler";
+    private static final boolean DEBUG = true;
+    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_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_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[] 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,
+        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
+    };
+
+    protected final Context mContext;
+    private final PowerManager mPowerManager;
+    private EventHandler mEventHandler;
+    private WakeLock mGestureWakeLock;
+    private Handler mHandler = new Handler();
+    private SettingsObserver mSettingsObserver;
+    private static boolean mButtonDisabled;
+    private final NotificationManager mNoMan;
+    private final AudioManager mAudioManager;
+    private SensorManager mSensorManager;
+    private boolean mProxyIsNear;
+    private boolean mUseProxiCheck;
+    private Sensor mTiltSensor;
+    private boolean mUseTiltCheck;
+    private boolean mProxyWasNear;
+    private long mProxySensorTimestamp;
+    private boolean mUseWaveCheck;
+    private Sensor mPocketSensor;
+    private boolean mUsePocketCheck;
+    private boolean mFPcheck;
+    private boolean mDispOn;
+    private boolean isFpgesture;
+    private boolean isOPCameraAvail;
+    private boolean mRestoreUser;
+    private boolean mToggleTorch = false;
+    private boolean mTorchState = false;
+
+    private SensorEventListener mProximitySensor = new SensorEventListener() {
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            mProxyIsNear = event.values[0] == 1;
+            if (DEBUG_SENSOR) Log.i(TAG, "mProxyIsNear = " + mProxyIsNear + " mProxyWasNear = " + mProxyWasNear);
+            if (mUseWaveCheck || mUsePocketCheck) {
+                if (mProxyWasNear && !mProxyIsNear) {
+                    long delta = SystemClock.elapsedRealtime() - mProxySensorTimestamp;
+                    if (DEBUG_SENSOR) Log.i(TAG, "delta = " + delta);
+                    if (mUseWaveCheck && delta < HANDWAVE_MAX_DELTA_MS) {
+                        launchDozePulse();
+                    }
+                    if (mUsePocketCheck && delta > POCKET_MIN_DELTA_MS) {
+                        launchDozePulse();
+                    }
+                }
+                mProxySensorTimestamp = SystemClock.elapsedRealtime();
+                mProxyWasNear = mProxyIsNear;
+            }
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+        }
+    };
+
+    private SensorEventListener mTiltSensorListener = new SensorEventListener() {
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            if (event.values[0] == 1) {
+                launchDozePulse();
+            }
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+        }
+    };
+
+    private class SettingsObserver extends ContentObserver {
+        SettingsObserver(Handler handler) {
+            super(handler);
+        }
+
+        void observe() {
+            mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(
+                    Settings.System.OMNI_DEVICE_PROXI_CHECK_ENABLED),
+                    false, this);
+            mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(
+                    Settings.System.OMNI_DEVICE_FEATURE_SETTINGS),
+                    false, this);
+            update();
+            updateDozeSettings();
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            update();
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (uri.equals(Settings.System.getUriFor(
+                    Settings.System.OMNI_DEVICE_FEATURE_SETTINGS))){
+                updateDozeSettings();
+                return;
+            }
+            update();
+        }
+
+        public void update() {
+            mUseProxiCheck = Settings.System.getIntForUser(
+                    mContext.getContentResolver(), Settings.System.OMNI_DEVICE_PROXI_CHECK_ENABLED, 1,
+                    UserHandle.USER_CURRENT) == 1;
+        }
+    }
+
+    private BroadcastReceiver mSystemStateReceiver = new BroadcastReceiver() {
+         @Override
+         public void onReceive(Context context, Intent intent) {
+             if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
+                 mDispOn = true;
+                 onDisplayOn();
+             } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
+                 mDispOn = false;
+                 onDisplayOff();
+             } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)) {
+                int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+                if (userId == UserHandle.USER_SYSTEM && mRestoreUser) {
+                    if (DEBUG) Log.i(TAG, "ACTION_USER_SWITCHED to system");
+                    Startup.restoreAfterUserSwitch(context);
+                } else {
+                    mRestoreUser = true;
+                }
+             }
+         }
+    };
+
+    public KeyHandler(Context context) {
+        mContext = context;
+        mDispOn = true;
+        mEventHandler = new EventHandler();
+        mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+        mGestureWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+                "GestureWakeLock");
+        mSettingsObserver = new SettingsObserver(mHandler);
+        mSettingsObserver.observe();
+        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);
+        systemStateFilter.addAction(Intent.ACTION_USER_SWITCHED);
+        mContext.registerReceiver(mSystemStateReceiver, systemStateFilter);
+    }
+
+    private class EventHandler extends Handler {
+        @Override
+        public void handleMessage(Message msg) {
+        }
+    }
+
+    @Override
+    public boolean handleKeyEvent(KeyEvent event) {
+        if (event.getAction() != KeyEvent.ACTION_UP) {
+            return false;
+        }
+
+        isFpgesture = false;
+
+        if (DEBUG) Log.i(TAG, "nav_code= " + event.getScanCode());
+        int fpcode = event.getScanCode();
+        mFPcheck = canHandleKeyEvent(event);
+        String value = getGestureValueForFPScanCode(fpcode);
+        if (mFPcheck && mDispOn && !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY)){
+            isFpgesture = true;
+            if (!launchSpecialActions(value) && !isCameraLaunchEvent(event)) {
+                    OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+                    Intent intent = createIntent(value);
+                    if (DEBUG) Log.i(TAG, "intent = " + intent);
+                    mContext.startActivity(intent);
+            }
+        }
+        return isFpgesture;
+    }
+
+    @Override
+    public boolean canHandleKeyEvent(KeyEvent event) {
+        return ArrayUtils.contains(sSupportedGestures, event.getScanCode());
+    }
+
+    @Override
+    public boolean isDisabledKeyEvent(KeyEvent event) {
+        boolean isProxyCheckRequired = mUseProxiCheck &&
+                ArrayUtils.contains(sProxiCheckedGestures, event.getScanCode());
+        if (mProxyIsNear && isProxyCheckRequired) {
+            if (DEBUG) Log.i(TAG, "isDisabledKeyEvent: blocked by proxi sensor - scanCode=" + event.getScanCode());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean isCameraLaunchEvent(KeyEvent event) {
+        if (event.getAction() != KeyEvent.ACTION_UP) {
+            return false;
+        }
+        if (mFPcheck) {
+            String value = getGestureValueForFPScanCode(event.getScanCode());
+            return !TextUtils.isEmpty(value) && value.equals(AppSelectListPreference.CAMERA_ENTRY);
+        } else {
+            String value = getGestureValueForScanCode(event.getScanCode());
+            return !TextUtils.isEmpty(value) && value.equals(AppSelectListPreference.CAMERA_ENTRY);
+        }
+    }
+
+    @Override
+    public boolean isWakeEvent(KeyEvent event){
+        if (event.getAction() != KeyEvent.ACTION_UP) {
+            return false;
+        }
+        String value = getGestureValueForScanCode(event.getScanCode());
+        if (!TextUtils.isEmpty(value) && value.equals(AppSelectListPreference.WAKE_ENTRY)) {
+            if (DEBUG) Log.i(TAG, "isWakeEvent " + event.getScanCode() + value);
+            return true;
+        }
+        return event.getScanCode() == KEY_DOUBLE_TAP;
+    }
+
+    @Override
+    public Intent isActivityLaunchEvent(KeyEvent event) {
+        if (event.getAction() != KeyEvent.ACTION_UP) {
+            return null;
+        }
+        String value = getGestureValueForScanCode(event.getScanCode());
+        if (!TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY)) {
+            if (DEBUG) Log.i(TAG, "isActivityLaunchEvent " + event.getScanCode() + value);
+            if (!launchSpecialActions(value)) {
+                OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+                Intent intent = createIntent(value);
+                return intent;
+            }
+        }
+        return null;
+    }
+
+    private IAudioService getAudioService() {
+        IAudioService audioService = IAudioService.Stub
+                .asInterface(ServiceManager.checkService(Context.AUDIO_SERVICE));
+        if (audioService == null) {
+            Log.w(TAG, "Unable to find IAudioService interface.");
+        }
+        return audioService;
+    }
+
+    boolean isMusicActive() {
+        return mAudioManager.isMusicActive();
+    }
+
+    private void dispatchMediaKeyWithWakeLockToAudioService(int keycode) {
+        if (ActivityManagerNative.isSystemReady()) {
+            IAudioService audioService = getAudioService();
+            if (audioService != null) {
+                KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(),
+                        SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN,
+                        keycode, 0);
+                dispatchMediaKeyEventUnderWakelock(event);
+                event = KeyEvent.changeAction(event, KeyEvent.ACTION_UP);
+                dispatchMediaKeyEventUnderWakelock(event);
+            }
+        }
+    }
+
+    private void dispatchMediaKeyEventUnderWakelock(KeyEvent event) {
+        if (ActivityManagerNative.isSystemReady()) {
+            MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(event, true);
+        }
+    }
+
+    private void onDisplayOn() {
+        if (DEBUG) Log.i(TAG, "Display on");
+        if (enableProxiSensor()) {
+            mSensorManager.unregisterListener(mProximitySensor, mPocketSensor);
+        }
+        if (mUseTiltCheck) {
+            mSensorManager.unregisterListener(mTiltSensorListener, mTiltSensor);
+        }
+    }
+
+    private void onDisplayOff() {
+        if (DEBUG) Log.i(TAG, "Display off");
+        if (enableProxiSensor()) {
+            mProxyWasNear = false;
+            mSensorManager.registerListener(mProximitySensor, mPocketSensor,
+                    SensorManager.SENSOR_DELAY_NORMAL);
+            mProxySensorTimestamp = SystemClock.elapsedRealtime();
+        }
+        if (mUseTiltCheck) {
+            mSensorManager.registerListener(mTiltSensorListener, mTiltSensor,
+                    SensorManager.SENSOR_DELAY_NORMAL);
+        }
+    }
+
+    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);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+        intent.setComponent(componentName);
+        return intent;
+    }
+
+    private boolean launchSpecialActions(String value) {
+        if (value.equals(AppSelectListPreference.TORCH_ENTRY)) {
+            mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
+            toggleTorch();
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            return true;
+        } else if (value.equals(AppSelectListPreference.MUSIC_PLAY_ENTRY)) {
+            mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            dispatchMediaKeyWithWakeLockToAudioService(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
+            return true;
+        } else if (value.equals(AppSelectListPreference.MUSIC_NEXT_ENTRY)) {
+            if (isMusicActive()) {
+                mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
+                OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+                dispatchMediaKeyWithWakeLockToAudioService(KeyEvent.KEYCODE_MEDIA_NEXT);
+            }
+            return true;
+        } else if (value.equals(AppSelectListPreference.MUSIC_PREV_ENTRY)) {
+            if (isMusicActive()) {
+                mGestureWakeLock.acquire(GESTURE_WAKELOCK_DURATION);
+                OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+                dispatchMediaKeyWithWakeLockToAudioService(KeyEvent.KEYCODE_MEDIA_PREVIOUS);
+            }
+            return true;
+        } else if (value.equals(AppSelectListPreference.VOLUME_UP_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            mAudioManager.adjustSuggestedStreamVolume(AudioManager.ADJUST_RAISE,AudioManager.USE_DEFAULT_STREAM_TYPE,AudioManager.FLAG_SHOW_UI);
+            return true;
+        } else if (value.equals(AppSelectListPreference.VOLUME_DOWN_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            mAudioManager.adjustSuggestedStreamVolume(AudioManager.ADJUST_LOWER,AudioManager.USE_DEFAULT_STREAM_TYPE,AudioManager.FLAG_SHOW_UI);
+            return true;
+        } else if (value.equals(AppSelectListPreference.BROWSE_SCROLL_DOWN_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            OmniUtils.sendKeycode(KeyEvent.KEYCODE_PAGE_DOWN);
+            return true;
+        } else if (value.equals(AppSelectListPreference.BROWSE_SCROLL_UP_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            OmniUtils.sendKeycode(KeyEvent.KEYCODE_PAGE_UP);
+            return true;
+        } else if (value.equals(AppSelectListPreference.NAVIGATE_BACK_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            OmniUtils.sendKeycode(KeyEvent.KEYCODE_BACK);
+            return true;
+        } else if (value.equals(AppSelectListPreference.NAVIGATE_HOME_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            OmniUtils.sendKeycode(KeyEvent.KEYCODE_HOME);
+            return true;
+        } else if (value.equals(AppSelectListPreference.NAVIGATE_RECENT_ENTRY)) {
+            OmniVibe.performHapticFeedbackLw(HapticFeedbackConstants.LONG_PRESS, false, mContext);
+            OmniUtils.sendKeycode(KeyEvent.KEYCODE_APP_SWITCH);
+            return true;
+        }
+        return false;
+    }
+
+    private String getGestureValueForScanCode(int scanCode) {
+        switch(scanCode) {
+            case GESTURE_II_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_0, UserHandle.USER_CURRENT);
+            case GESTURE_CIRCLE_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_1, UserHandle.USER_CURRENT);
+            case GESTURE_V_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_2, UserHandle.USER_CURRENT);
+            case GESTURE_A_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_3, UserHandle.USER_CURRENT);
+            case GESTURE_LEFT_V_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_4, UserHandle.USER_CURRENT);
+            case GESTURE_RIGHT_V_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_5, UserHandle.USER_CURRENT);
+            case GESTURE_DOWN_SWIPE_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_6, UserHandle.USER_CURRENT);
+            case GESTURE_UP_SWIPE_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_7, UserHandle.USER_CURRENT);
+            case GESTURE_LEFT_SWIPE_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_8, UserHandle.USER_CURRENT);
+            case GESTURE_RIGHT_SWIPE_SCANCODE:
+                return Settings.System.getStringForUser(mContext.getContentResolver(),
+                    GestureSettings.DEVICE_GESTURE_MAPPING_9, UserHandle.USER_CURRENT);
+        }
+        return null;
+    }
+
+    private String getGestureValueForFPScanCode(int scanCode) {
+        if (FP_GESTURE_LONG_PRESS == scanCode) {
+            return Settings.System.getStringForUser(mContext.getContentResolver(),
+                   GestureSettings.DEVICE_GESTURE_MAPPING_10, UserHandle.USER_CURRENT);
+        }
+        return null;
+    }
+
+    private void launchDozePulse() {
+        if (DEBUG) Log.i(TAG, "Doze pulse");
+        mContext.sendBroadcastAsUser(new Intent(DOZE_INTENT),
+                new UserHandle(UserHandle.USER_CURRENT));
+    }
+
+    private boolean enableProxiSensor() {
+        return mUsePocketCheck || mUseWaveCheck || mUseProxiCheck;
+    }
+
+    private void updateDozeSettings() {
+        String value = Settings.System.getStringForUser(mContext.getContentResolver(),
+                    Settings.System.OMNI_DEVICE_FEATURE_SETTINGS,
+                    UserHandle.USER_CURRENT);
+        if (DEBUG) Log.i(TAG, "Doze settings = " + value);
+        if (!TextUtils.isEmpty(value)) {
+            String[] parts = value.split(":");
+            mUseWaveCheck = Boolean.valueOf(parts[0]);
+            mUsePocketCheck = Boolean.valueOf(parts[1]);
+            mUseTiltCheck = Boolean.valueOf(parts[2]);
+        }
+    }
+
+    protected static Sensor getSensor(SensorManager sm, String type) {
+        for (Sensor sensor : sm.getSensorList(Sensor.TYPE_ALL)) {
+            if (type.equals(sensor.getStringType())) {
+                return sensor;
+            }
+        }
+        return null;
+    }
+
+    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
new file mode 100644
index 0000000..5920134
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/Startup.java
@@ -0,0 +1,141 @@
+/*
+* Copyright (C) 2013 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.support.v7.preference.PreferenceManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+public class Startup extends BroadcastReceiver {
+    private static void restore(String file, boolean enabled) {
+        if (file == null) {
+            return;
+        }
+        Utils.writeValue(file, enabled ? "1" : "0");
+    }
+
+    private static void restore(String file, String value) {
+        if (file == null) {
+            return;
+        }
+        Utils.writeValue(file, value);
+    }
+
+    private static String getGestureFile(String key) {
+        return GestureSettings.getGestureFile(key);
+    }
+
+    private void maybeImportOldSettings(Context context) {
+        boolean imported = Settings.System.getInt(context.getContentResolver(), "omni_device_setting_imported", 0) != 0;
+        if (!imported) {
+            Settings.System.putInt(context.getContentResolver(), "omni_device_setting_imported", 1);
+        }
+    }
+
+    @Override
+    public void onReceive(final Context context, final Intent bootintent) {
+        maybeImportOldSettings(context);
+        restoreAfterUserSwitch(context);
+    }
+
+    public static void restoreAfterUserSwitch(Context context) {
+        // double swipe -> music play
+        String mapping = GestureSettings.DEVICE_GESTURE_MAPPING_0;
+        String value = Settings.System.getString(context.getContentResolver(), mapping);
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.MUSIC_PLAY_ENTRY;
+            Settings.System.putString(context.getContentResolver(), mapping, value);
+        }
+        boolean enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_DOUBLE_SWIPE_APP), enabled);
+
+        // circle -> camera
+        mapping = GestureSettings.DEVICE_GESTURE_MAPPING_1;
+        value = Settings.System.getString(context.getContentResolver(), mapping);
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.CAMERA_ENTRY;
+            Settings.System.putString(context.getContentResolver(), mapping, value);
+        }
+        enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_CIRCLE_APP), enabled);
+
+        // down arrow -> flashlight
+        mapping = GestureSettings.DEVICE_GESTURE_MAPPING_2;
+        value = Settings.System.getString(context.getContentResolver(), mapping);
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.TORCH_ENTRY;
+            Settings.System.putString(context.getContentResolver(), mapping, value);
+        }
+        enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_DOWN_ARROW_APP), enabled);
+
+        // up arrow
+        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);
+
+        // left arrow -> music prev
+        mapping = GestureSettings.DEVICE_GESTURE_MAPPING_4;
+        value = Settings.System.getString(context.getContentResolver(), mapping);
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.MUSIC_PREV_ENTRY;
+            Settings.System.putString(context.getContentResolver(), mapping, value);
+        }
+        enabled = !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_LEFT_ARROW_APP), enabled);
+
+        // right arrow -> music next
+        mapping = GestureSettings.DEVICE_GESTURE_MAPPING_5;
+        value = Settings.System.getString(context.getContentResolver(), mapping);
+        if (TextUtils.isEmpty(value)) {
+            value = AppSelectListPreference.MUSIC_NEXT_ENTRY;
+            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);
+
+        // up 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_UP_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);
+        restore(getGestureFile(GestureSettings.KEY_LEFT_SWIPE_APP), enabled);
+
+        // right swipe
+        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_9);
+        enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.KEY_RIGHT_SWIPE_APP), enabled);
+
+        // fp down swipe
+        value = Settings.System.getString(context.getContentResolver(), GestureSettings.DEVICE_GESTURE_MAPPING_10);
+        enabled = !TextUtils.isEmpty(value) && !value.equals(AppSelectListPreference.DISABLED_ENTRY);
+        restore(getGestureFile(GestureSettings.FP_GESTURE_LONG_PRESS_APP), enabled);
+    }
+}
diff --git a/DeviceParts/src/org/omnirom/device/Utils.java b/DeviceParts/src/org/omnirom/device/Utils.java
new file mode 100644
index 0000000..389246f
--- /dev/null
+++ b/DeviceParts/src/org/omnirom/device/Utils.java
@@ -0,0 +1,104 @@
+/*
+* Copyright (C) 2013 The OmniROM Project
+*
+* This program is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+package org.omnirom.device;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.FileReader;
+
+public class Utils {
+
+    /**
+     * Write a string value to the specified file.
+     * @param filename      The filename
+     * @param value         The value
+     */
+    public static void writeValue(String filename, String value) {
+        if (filename == null) {
+            return;
+        }
+        try {
+            FileOutputStream fos = new FileOutputStream(new File(filename));
+            fos.write(value.getBytes());
+            fos.flush();
+            fos.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Check if the specified file exists.
+     * @param filename      The filename
+     * @return              Whether the file exists or not
+     */
+    public static boolean fileExists(String filename) {
+        if (filename == null) {
+            return false;
+        }
+        return new File(filename).exists();
+    }
+
+    public static boolean fileWritable(String filename) {
+        return fileExists(filename) && new File(filename).canWrite();
+    }
+
+    public static String readLine(String filename) {
+        if (filename == null) {
+            return null;
+        }
+        BufferedReader br = null;
+        String line = null;
+        try {
+            br = new BufferedReader(new FileReader(filename), 1024);
+            line = br.readLine();
+        } catch (IOException e) {
+            return null;
+        } finally {
+            if (br != null) {
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+        return line;
+    }
+
+    public static boolean getFileValueAsBoolean(String filename, boolean defValue) {
+        String fileValue = readLine(filename);
+        if(fileValue!=null){
+            return (fileValue.equals("0")?false:true);
+        }
+        return defValue;
+    }
+
+    public static String getFileValue(String filename, String defValue) {
+        String fileValue = readLine(filename);
+        if(fileValue!=null){
+            return fileValue;
+        }
+        return defValue;
+    }
+}
diff --git a/device.mk b/device.mk
index 998b3de..95a8964 100755
--- a/device.mk
+++ b/device.mk
@@ -72,6 +72,10 @@
     animation.txt \
     font_charger.png
 
+# DeviceParts
+PRODUCT_PACKAGES += \
+    DeviceParts
+
 # Display
 PRODUCT_PACKAGES += \
     libion \
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index 7cf588f..09e7f1b 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -315,6 +315,10 @@
     <!-- enable doze powersaving mode -->
     <bool name="config_enableAutoPowerModes">true</bool>
 
+    <!-- Control whether the always on display mode is enabled by default. This value will be used
+         during initialization when the setting is still null. -->
+    <bool name="config_dozeAlwaysOnEnabled">false</bool>
+
     <!-- Control the behavior when the user long presses the home button.
         0 - Nothing
         1 - Recent apps view in SystemUI
@@ -394,4 +398,11 @@
 
     <!-- Is the notification LED intrusive? Used to decide if there should be a disable option -->
     <bool name="config_intrusiveNotificationLed">true</bool>
+
+    <!-- The list absolute paths of jar/apk files containing the device specific handlers,
+        delimited by File.pathSeparator, which defaults to ":" on Android  -->
+    <string name="config_deviceKeyHandlerLib" translatable="false">/system/priv-app/DeviceParts/DeviceParts.apk</string>
+    <!-- Full qualified name of the class that implements
+        com.android.internal.os.DeviceKeyHandler interface. -->
+    <string name="config_deviceKeyHandlerClass" translatable="false">org.omnirom.device.KeyHandler</string>
 </resources>