aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli B <abittin@gmail.com>2019-10-08 19:59:27 +0300
committerAli B <abittin@gmail.com>2019-10-13 17:32:06 +0200
commit04f00bd95987a5bd3ff65eb8b3f728b62b5ec9fd (patch)
tree56e20b8dc193adbfca7d073a334d62aa94b88bae
parent2c3904173ba3ed2cb1138deb0e09722260e42be7 (diff)
Revert "oppo-common: remove DeviceHandler for now"
This reverts commit fabbf44def282c67da14a4c7417aa54485e79b51. Change-Id: I7396e22a2bedc90062e66e69589032a156d3b423
-rw-r--r--DeviceHandler/Android.mk31
-rw-r--r--DeviceHandler/AndroidManifest.xml63
-rw-r--r--DeviceHandler/proguard.flags21
-rw-r--r--DeviceHandler/res/drawable-hdpi/app_icon.pngbin0 -> 5342 bytes
-rw-r--r--DeviceHandler/res/drawable-mdpi/app_icon.pngbin0 -> 3104 bytes
-rw-r--r--DeviceHandler/res/drawable-xhdpi/app_icon.pngbin0 -> 8724 bytes
-rw-r--r--DeviceHandler/res/drawable-xxhdpi/app_icon.pngbin0 -> 16599 bytes
-rw-r--r--DeviceHandler/res/drawable/ic_settings_additional_buttons.xml29
-rw-r--r--DeviceHandler/res/drawable/ic_settings_gestures.xml32
-rw-r--r--DeviceHandler/res/drawable/ic_settings_reset.xml11
-rw-r--r--DeviceHandler/res/values-af/strings.xml18
-rw-r--r--DeviceHandler/res/values-ar/strings.xml53
-rw-r--r--DeviceHandler/res/values-ca/strings.xml18
-rw-r--r--DeviceHandler/res/values-cs/strings.xml53
-rw-r--r--DeviceHandler/res/values-da/strings.xml18
-rw-r--r--DeviceHandler/res/values-de/strings.xml53
-rw-r--r--DeviceHandler/res/values-el/strings.xml18
-rw-r--r--DeviceHandler/res/values-en-rUS/strings.xml20
-rw-r--r--DeviceHandler/res/values-es/strings.xml53
-rw-r--r--DeviceHandler/res/values-fa/strings.xml18
-rw-r--r--DeviceHandler/res/values-fi/strings.xml18
-rw-r--r--DeviceHandler/res/values-fr/strings.xml18
-rw-r--r--DeviceHandler/res/values-hr/strings.xml18
-rw-r--r--DeviceHandler/res/values-hu/strings.xml53
-rw-r--r--DeviceHandler/res/values-in/strings.xml43
-rw-r--r--DeviceHandler/res/values-it/strings.xml18
-rw-r--r--DeviceHandler/res/values-iw/strings.xml18
-rw-r--r--DeviceHandler/res/values-ja/strings.xml18
-rw-r--r--DeviceHandler/res/values-ko/strings.xml18
-rw-r--r--DeviceHandler/res/values-nl/strings.xml53
-rw-r--r--DeviceHandler/res/values-no-rNO/strings.xml20
-rw-r--r--DeviceHandler/res/values-pl/strings.xml53
-rw-r--r--DeviceHandler/res/values-pt-rBR/strings.xml53
-rw-r--r--DeviceHandler/res/values-pt-rPT/strings.xml50
-rw-r--r--DeviceHandler/res/values-ro/strings.xml18
-rw-r--r--DeviceHandler/res/values-ru/strings.xml53
-rw-r--r--DeviceHandler/res/values-sk/strings.xml18
-rw-r--r--DeviceHandler/res/values-sr/strings.xml18
-rw-r--r--DeviceHandler/res/values-sv/strings.xml18
-rw-r--r--DeviceHandler/res/values-tr/strings.xml53
-rw-r--r--DeviceHandler/res/values-uk/strings.xml18
-rw-r--r--DeviceHandler/res/values-vi/strings.xml18
-rw-r--r--DeviceHandler/res/values-zh-rCN/strings.xml53
-rw-r--r--DeviceHandler/res/values-zh-rTW/strings.xml18
-rw-r--r--DeviceHandler/res/values/arrays.xml36
-rw-r--r--DeviceHandler/res/values/strings.xml63
-rw-r--r--DeviceHandler/res/values/themes.xml19
-rw-r--r--DeviceHandler/res/xml/screen_off_gesture.xml68
-rw-r--r--DeviceHandler/res/xml/slider_panel.xml54
-rw-r--r--DeviceHandler/src/com/aicp/device/preference/ListPreference.java55
-rw-r--r--DeviceHandler/src/com/aicp/device/preference/SystemSettingListPreference.java49
-rw-r--r--DeviceHandler/src/com/aicp/device/preference/SystemSettingSwitchPreference.java50
-rw-r--r--DeviceHandler/src/com/aicp/device/preference/SystemSettingsStore.java72
-rw-r--r--DeviceHandler/src/com/slim/device/BootReceiver.java99
-rw-r--r--DeviceHandler/src/com/slim/device/KernelControl.java86
-rw-r--r--DeviceHandler/src/com/slim/device/KeyHandler.java388
-rw-r--r--DeviceHandler/src/com/slim/device/settings/ScreenOffGesture.java377
-rw-r--r--DeviceHandler/src/com/slim/device/settings/ScreenOffGestureSettings.java44
-rw-r--r--DeviceHandler/src/com/slim/device/settings/SliderSettings.java94
-rw-r--r--DeviceHandler/src/com/slim/device/util/FileUtils.java76
-rw-r--r--DeviceHandler/src/com/slim/device/util/ShortcutPickerHelper.java177
-rw-r--r--common.mk7
62 files changed, 3056 insertions, 3 deletions
diff --git a/DeviceHandler/Android.mk b/DeviceHandler/Android.mk
new file mode 100644
index 0000000..9ddab8d
--- /dev/null
+++ b/DeviceHandler/Android.mk
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2014 SlimRoms 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_CERTIFICATE := platform
+LOCAL_PACKAGE_NAME := DeviceHandler
+LOCAL_PRIVATE_PLATFORM_APIS := true
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_DEX_PREOPT := false
+
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+ androidx.core_core \
+ androidx.preference_preference
+
+include $(BUILD_PACKAGE)
diff --git a/DeviceHandler/AndroidManifest.xml b/DeviceHandler/AndroidManifest.xml
new file mode 100644
index 0000000..22e3a06
--- /dev/null
+++ b/DeviceHandler/AndroidManifest.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ android:sharedUserId="android.uid.system"
+ package="com.slim.device"
+ android:versionCode="1"
+ android:versionName="1" >
+
+ <uses-permission android:name="android.permission.INJECT_EVENTS"/>
+ <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.CAMERA" />
+
+ <uses-sdk
+ android:minSdkVersion="18"
+ android:targetSdkVersion="19" />
+
+ <application
+ android:icon="@android:drawable/sym_def_app_icon"
+ android:label="DeviceHandler"
+ >
+
+ <!-- stub to ensure its loaded - DO NOT REMOVE -->
+ <activity android:name=".KeyHandler" />
+
+ <activity
+ android:name=".settings.ScreenOffGestureSettings"
+ android:label="@string/screen_off_gesture_title"
+ android:theme="@style/DeviceHandlerTheme">
+ <intent-filter>
+ <action android:name="com.android.settings.action.IA_SETTINGS" />
+ </intent-filter>
+ <meta-data
+ android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.gestures" />
+ <meta-data android:name="com.android.settings.summary"
+ android:resource="@string/screen_off_gesture_summary"/>
+ </activity>
+
+ <activity
+ android:name=".settings.SliderSettings"
+ android:theme="@style/DeviceHandlerTheme"
+ android:label="@string/notification_slider">
+ <intent-filter>
+ <action android:name="com.android.settings.action.EXTRA_SETTINGS" />
+ </intent-filter>
+ <meta-data
+ android:name="com.android.settings.icon"
+ android:resource="@drawable/ic_settings_additional_buttons" />
+ <meta-data
+ android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.system" />
+ <meta-data android:name="com.android.settings.summary"
+ android:resource="@string/notification_slider_summary"/>
+ </activity>
+
+ <receiver android:name=".BootReceiver" >
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+ </intent-filter>
+ </receiver>
+
+ </application>
+
+</manifest>
diff --git a/DeviceHandler/proguard.flags b/DeviceHandler/proguard.flags
new file mode 100644
index 0000000..8c6271d
--- /dev/null
+++ b/DeviceHandler/proguard.flags
@@ -0,0 +1,21 @@
+-keep public class com.slim.device.KeyHandler
+
+# Keep keyhandler constructor
+-keep public class * implements com.android.internal.os.DeviceKeyHandler {
+ public <init>(android.content.Context);
+}
+
+-keepclassmembers public class com.slim.device.KeyHandler {
+ *;
+}
+
+# Keep classes that may be inflated from XML.
+-keepclasseswithmembers class * {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+-keepclasseswithmembers class * {
+ public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+-keepclasseswithmembers class * {
+ public <init>(android.content.Context, android.util.AttributeSet, int, int);
+}
diff --git a/DeviceHandler/res/drawable-hdpi/app_icon.png b/DeviceHandler/res/drawable-hdpi/app_icon.png
new file mode 100644
index 0000000..5a23db4
--- /dev/null
+++ b/DeviceHandler/res/drawable-hdpi/app_icon.png
Binary files differ
diff --git a/DeviceHandler/res/drawable-mdpi/app_icon.png b/DeviceHandler/res/drawable-mdpi/app_icon.png
new file mode 100644
index 0000000..5f56b99
--- /dev/null
+++ b/DeviceHandler/res/drawable-mdpi/app_icon.png
Binary files differ
diff --git a/DeviceHandler/res/drawable-xhdpi/app_icon.png b/DeviceHandler/res/drawable-xhdpi/app_icon.png
new file mode 100644
index 0000000..896f8f3
--- /dev/null
+++ b/DeviceHandler/res/drawable-xhdpi/app_icon.png
Binary files differ
diff --git a/DeviceHandler/res/drawable-xxhdpi/app_icon.png b/DeviceHandler/res/drawable-xxhdpi/app_icon.png
new file mode 100644
index 0000000..5beb259
--- /dev/null
+++ b/DeviceHandler/res/drawable-xxhdpi/app_icon.png
Binary files differ
diff --git a/DeviceHandler/res/drawable/ic_settings_additional_buttons.xml b/DeviceHandler/res/drawable/ic_settings_additional_buttons.xml
new file mode 100644
index 0000000..baa2c3c
--- /dev/null
+++ b/DeviceHandler/res/drawable/ic_settings_additional_buttons.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The SlimRoms 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"
+ android:viewportHeight="24">
+
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M6.65625,7 A5,5,0,0,0,2,12 A5,5,0,0,0,7,17 L7.34375,17 L10.0313,17 L10.2188,17
+L19.875,17 C19.9098,17,19.9344,17.0031,19.9688,17
+C21.2447,16.8867,22.25,14.6884,22.25,12 L22.25,11.8125
+C22.2044,9.19289,21.2139,7.13663,19.9688,7.03125
+C19.9667,7.03108,19.9708,7.00016,19.9688,7 L19.875,7 L10.0625,7 L10.0313,7 L7,7
+A5,5,0,0,0,6.96875,7 A5,5,0,0,0,6.65625,7 Z M6.6875,9 A3,3,0,0,1,7,9
+A3,3,0,0,1,10,12 A3,3,0,0,1,7,15 A3,3,0,0,1,4,12 A3,3,0,0,1,6.6875,9 Z" />
+</vector>
diff --git a/DeviceHandler/res/drawable/ic_settings_gestures.xml b/DeviceHandler/res/drawable/ic_settings_gestures.xml
new file mode 100644
index 0000000..95cdede
--- /dev/null
+++ b/DeviceHandler/res/drawable/ic_settings_gestures.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2015 The CyanogenMod 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"
+ android:viewportHeight="24">
+
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M4.7,6.9c0.7-0.7,1.4-1.4,1.7-1.2c0.5,0.2,0,1-0.3,1.5c-0.2,0.4-2.8,3.9-2.8,6.3c0,1.3,0.5,2.3,1.3,3
+c0.7,0.6,1.7,0.7,2.6,0.5c1.1-0.3,1.9-1.4,3-2.8c1.2-1.5,2.8-3.4,4-3.4c1.6,0,1.6,1,1.7,1.8c-3.7,0.6-5.3,3.7-5.3,5.4
+s1.4,3.1,3.2,3.1c1.6,0,4.3-1.3,4.6-6.1H21v-2.5h-2.4c-0.1-1.7-1.1-4.2-4-4.2c-2.2,0-4.1,1.9-4.9,2.8c-0.6,0.7-2,2.5-2.3,2.7
+c-0.2,0.3-0.7,0.8-1.1,0.8c-0.4,0-0.7-0.8-0.4-1.9c0.3-1.1,1.4-2.9,1.8-3.5C8.5,8,9.1,7.2,9.1,5.9C9.1,3.7,7.4,3,6.6,3
+C5.3,3,4.1,4,3.9,4.3C3.5,4.6,3.2,4.9,3,5.2L4.7,6.9z
+M13.9,18.6c-0.3,0-0.7-0.3-0.7-0.7c0-0.6,0.7-2.2,2.8-2.8
+C15.8,17.8,14.6,18.6,13.9,18.6z" />
+</vector>
diff --git a/DeviceHandler/res/drawable/ic_settings_reset.xml b/DeviceHandler/res/drawable/ic_settings_reset.xml
new file mode 100644
index 0000000..7ab508f
--- /dev/null
+++ b/DeviceHandler/res/drawable/ic_settings_reset.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<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/colorControlNormal">
+ <path
+ android:pathData="M14 12c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm-2-9c-4.97 0-9 4.03-9 9H0l4 4 4-4H5c0-3.87 3.13-7 7-7s7 3.13 7 7-3.13 7-7 7c-1.51 0-2.91-.49-4.06-1.3l-1.42 1.44C8.04 20.3 9.94 21 12 21c4.97 0 9-4.03 9-9s-4.03-9-9-9z"
+ android:fillColor="#ffffff"/>
+</vector>
diff --git a/DeviceHandler/res/values-af/strings.xml b/DeviceHandler/res/values-af/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-af/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-ar/strings.xml b/DeviceHandler/res/values-ar/strings.xml
new file mode 100644
index 0000000..cbc5bb3
--- /dev/null
+++ b/DeviceHandler/res/values-ar/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">حسناً</string>
+ <string name="cancel">إلغاء</string>
+ <string name="reset">إعادة تعيين</string>
+ <string name="reset_message">إستعادة كافة المدخلات للإفتراضي؟</string>
+ <string name="screen_off_gesture_title">إيماءات الشاشة المقفلة</string>
+ <string name="screen_off_gesture_summary">أدارة مختلف إيماءات الجهاز المحددة</string>
+ <string name="group_applications">التطبيقات</string>
+ <string name="select_custom_app_title">حدد تطبيق مخصص</string>
+ <string name="enable_gestures_title">تمكين الإيماءات</string>
+ <string name="enable_gestures_summary">تمكين إيماءات الشاشة المقفلة</string>
+ <string name="gestures_title">الإيماءات</string>
+ <string name="gesture_arrow_down_title">سهم للاسفل</string>
+ <string name="gesture_arrow_left_title">سهم لليسار</string>
+ <string name="gesture_arrow_right_title">سهم لليمين</string>
+ <string name="gesture_arrow_up_title">سهم للأعلى</string>
+ <string name="gesture_circle_title">دائرة</string>
+ <string name="gesture_double_swipe_title">مرر إصبعين لأسفل</string>
+ <string name="gesture_double_tap_title">ضغط مزدوج</string>
+ <string name="notification_slider">ممرر الإشعارات</string>
+ <string name="notification_slider_summary">تهيئة مواضع الممرر</string>
+ <string name="action">إجراء</string>
+ <string name="top_position">الموضع العلوي</string>
+ <string name="middle_position">الموضع الأوسط</string>
+ <string name="bottom_position">الموضع السفلي</string>
+ <string name="total_silence">صمت تام</string>
+ <string name="alarms_only">التنبيهات فقط</string>
+ <string name="priority_only">الأولوية فقط</string>
+ <string name="none">جميع الإشعارات</string>
+ <string name="silent">كتم</string>
+ <string name="vibrate">إهتزاز</string>
+ <string name="ring">رنين</string>
+ <string name="notification_slider_haptic_feedback_title">رد الفعل الإهتزازي</string>
+ <string name="notification_slider_haptic_feedback_summary">إهتزاز عند إستخدام شريط التمرير</string>
+ <string name="button_swap_title">تبديل الأزرار</string>
+ <string name="button_swap_summary">تبديل ترتيب أزرار الحديثة و الرجوع</string>
+</resources>
diff --git a/DeviceHandler/res/values-ca/strings.xml b/DeviceHandler/res/values-ca/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-ca/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-cs/strings.xml b/DeviceHandler/res/values-cs/strings.xml
new file mode 100644
index 0000000..0e7abe8
--- /dev/null
+++ b/DeviceHandler/res/values-cs/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Zrušit</string>
+ <string name="reset">Obnovit</string>
+ <string name="reset_message">Obnovit všechny položky na výchozí?</string>
+ <string name="screen_off_gesture_title">Gesta při vypnuté obrazovce</string>
+ <string name="screen_off_gesture_summary">Správa různých gest specifických pro zařízení</string>
+ <string name="group_applications">Aplikace</string>
+ <string name="select_custom_app_title">Vybrat vlastní aplikaci</string>
+ <string name="enable_gestures_title">Povolit gesta</string>
+ <string name="enable_gestures_summary">Povolit gesta při vypnuté obrazovce</string>
+ <string name="gestures_title">Gesta</string>
+ <string name="gesture_arrow_down_title">Šipka dolů</string>
+ <string name="gesture_arrow_left_title">Šipka doleva</string>
+ <string name="gesture_arrow_right_title">Šipka doprava</string>
+ <string name="gesture_arrow_up_title">Šipka nahoru</string>
+ <string name="gesture_circle_title">Kruh</string>
+ <string name="gesture_double_swipe_title">Potáhnutí dvěma prsty dolů</string>
+ <string name="gesture_double_tap_title">Dvojí poklepání</string>
+ <string name="notification_slider">Posuvník oznámení</string>
+ <string name="notification_slider_summary">Nastavení pozice posuvníku</string>
+ <string name="action">Akce</string>
+ <string name="top_position">Pozice nahoře</string>
+ <string name="middle_position">Pozice uprostřed</string>
+ <string name="bottom_position">Pozice dole</string>
+ <string name="total_silence">Absolutní ticho</string>
+ <string name="alarms_only">Pouze budíky</string>
+ <string name="priority_only">Pouze prioritní</string>
+ <string name="none">Všechna oznámení</string>
+ <string name="silent">Ztlumení</string>
+ <string name="vibrate">Vibrace</string>
+ <string name="ring">Vyzvánění</string>
+ <string name="notification_slider_haptic_feedback_title">Hmatová odezva</string>
+ <string name="notification_slider_haptic_feedback_summary">Vibrovat při použití posuvníku</string>
+ <string name="button_swap_title">Prohodit tlačítka</string>
+ <string name="button_swap_summary">Prohodit pořadí tlačítek „Nedávné“ a „Zpět“</string>
+</resources>
diff --git a/DeviceHandler/res/values-da/strings.xml b/DeviceHandler/res/values-da/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-da/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-de/strings.xml b/DeviceHandler/res/values-de/strings.xml
new file mode 100644
index 0000000..40f5134
--- /dev/null
+++ b/DeviceHandler/res/values-de/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Abbrechen</string>
+ <string name="reset">Zurücksetzen</string>
+ <string name="reset_message">Alle Einträge auf die Standardwerte zurücksetzen?</string>
+ <string name="screen_off_gesture_title">Gesten bei ausgeschaltetem Bildschirm</string>
+ <string name="screen_off_gesture_summary">Verwalten Sie verschiedene Gerätespezifische Gesten</string>
+ <string name="group_applications">Anwendungen</string>
+ <string name="select_custom_app_title">Eigene Anwendung wählen</string>
+ <string name="enable_gestures_title">Gesten aktivieren</string>
+ <string name="enable_gestures_summary">Gesten bei ausgeschaltetem Bildschirm aktivieren</string>
+ <string name="gestures_title">Gesten</string>
+ <string name="gesture_arrow_down_title">Pfeil nach unten</string>
+ <string name="gesture_arrow_left_title">Pfeil nach links</string>
+ <string name="gesture_arrow_right_title">Pfeil nach rechts</string>
+ <string name="gesture_arrow_up_title">Pfeil nach oben</string>
+ <string name="gesture_circle_title">Kreis</string>
+ <string name="gesture_double_swipe_title">Mit zwei Fingern nach unten wischen</string>
+ <string name="gesture_double_tap_title">Doppelt Tippen</string>
+ <string name="notification_slider">Schieberegler für Benachrichtigungen</string>
+ <string name="notification_slider_summary">Positionen des Schiebereglers konfigurieren</string>
+ <string name="action">Aktion</string>
+ <string name="top_position">Position: oben</string>
+ <string name="middle_position">Position: Mitte</string>
+ <string name="bottom_position">Position: unten</string>
+ <string name="total_silence">Lautlos</string>
+ <string name="alarms_only">Nur Alarme</string>
+ <string name="priority_only">Nur wichtige Unterbrechungen</string>
+ <string name="none">Alle Benachrichtigungen</string>
+ <string name="silent">Stumm</string>
+ <string name="vibrate">Vibrieren</string>
+ <string name="ring">Klingeln</string>
+ <string name="notification_slider_haptic_feedback_title">Vibration</string>
+ <string name="notification_slider_haptic_feedback_summary">Vibrieren bei Änderung des Schiebereglers</string>
+ <string name="button_swap_title">Tasten tauschen</string>
+ <string name="button_swap_summary">Anordnung der Tasten für Anwendungsverlauf und Zurück tauschen</string>
+</resources>
diff --git a/DeviceHandler/res/values-el/strings.xml b/DeviceHandler/res/values-el/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-el/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-en-rUS/strings.xml b/DeviceHandler/res/values-en-rUS/strings.xml
new file mode 100644
index 0000000..b254603
--- /dev/null
+++ b/DeviceHandler/res/values-en-rUS/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- General strings -->
+ <!-- Notification slider -->
+</resources>
diff --git a/DeviceHandler/res/values-es/strings.xml b/DeviceHandler/res/values-es/strings.xml
new file mode 100644
index 0000000..daa521e
--- /dev/null
+++ b/DeviceHandler/res/values-es/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">Aceptar</string>
+ <string name="cancel">Cancelar</string>
+ <string name="reset">Restablecer</string>
+ <string name="reset_message">¿Restablecer a valores predeterminados?</string>
+ <string name="screen_off_gesture_title">Gestos con pantalla apagada</string>
+ <string name="screen_off_gesture_summary">Configurar gestos específicos del dispositivo</string>
+ <string name="group_applications">Aplicaciones</string>
+ <string name="select_custom_app_title">Elegir aplicación personalizada</string>
+ <string name="enable_gestures_title">Habilitar gestos</string>
+ <string name="enable_gestures_summary">Activar gestos con pantalla apagada</string>
+ <string name="gestures_title">Gestos</string>
+ <string name="gesture_arrow_down_title">Flecha hacia abajo</string>
+ <string name="gesture_arrow_left_title">Flecha hacia la izquierda</string>
+ <string name="gesture_arrow_right_title">Flecha hacia la derecha</string>
+ <string name="gesture_arrow_up_title">Flecha hacia arriba</string>
+ <string name="gesture_circle_title">Círculo</string>
+ <string name="gesture_double_swipe_title">Dos dedos deslizando hacia abajo</string>
+ <string name="gesture_double_tap_title">Doble toque</string>
+ <string name="notification_slider">Panel de notificaciones</string>
+ <string name="notification_slider_summary">Configurar las posiciones del interruptor</string>
+ <string name="action">Acción</string>
+ <string name="top_position">Posición superior</string>
+ <string name="middle_position">Posición central</string>
+ <string name="bottom_position">Posición inferior</string>
+ <string name="total_silence">Silencio total</string>
+ <string name="alarms_only">Solo alarmas</string>
+ <string name="priority_only">Solo prioritarias</string>
+ <string name="none">Todas las notificaciones</string>
+ <string name="silent">Silencio</string>
+ <string name="vibrate">Vibrar</string>
+ <string name="ring">Sonar</string>
+ <string name="notification_slider_haptic_feedback_title">Respuesta háptica</string>
+ <string name="notification_slider_haptic_feedback_summary">Vibrar al usar el deslizador</string>
+ <string name="button_swap_title">Intercambiar botones</string>
+ <string name="button_swap_summary">Cambiar el orden de los botones «recientes» y «atrás»</string>
+</resources>
diff --git a/DeviceHandler/res/values-fa/strings.xml b/DeviceHandler/res/values-fa/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-fa/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-fi/strings.xml b/DeviceHandler/res/values-fi/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-fi/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-fr/strings.xml b/DeviceHandler/res/values-fr/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-fr/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-hr/strings.xml b/DeviceHandler/res/values-hr/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-hr/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-hu/strings.xml b/DeviceHandler/res/values-hu/strings.xml
new file mode 100644
index 0000000..e737f78
--- /dev/null
+++ b/DeviceHandler/res/values-hu/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Mégse</string>
+ <string name="reset">Visszaállítás</string>
+ <string name="reset_message">Visszaállítja az összes beállítást alapértelmezettre?</string>
+ <string name="screen_off_gesture_title">Képernyő-kikapcsolási vezérlőmozdulatok</string>
+ <string name="screen_off_gesture_summary">A különböző készülékfüggő vezérlőmozdulatok kezelése</string>
+ <string name="group_applications">Alkalmazások</string>
+ <string name="select_custom_app_title">Egyéni alkalmazás választása</string>
+ <string name="enable_gestures_title">A gesztusvezérlés engedélyezése</string>
+ <string name="enable_gestures_summary">A képernyő-kikapcsolási gesztusvezérlés engedélyezése</string>
+ <string name="gestures_title">Mozdulatvezérlés</string>
+ <string name="gesture_arrow_down_title">Nyíl lefelé</string>
+ <string name="gesture_arrow_left_title">Nyíl balra</string>
+ <string name="gesture_arrow_right_title">Nyíl jobbra</string>
+ <string name="gesture_arrow_up_title">Nyíl felfelé</string>
+ <string name="gesture_circle_title">Kör</string>
+ <string name="gesture_double_swipe_title">Kétujjas lefelé csúsztatás</string>
+ <string name="gesture_double_tap_title">Dupla érintés</string>
+ <string name="notification_slider">Értesítési csúszka</string>
+ <string name="notification_slider_summary">Állítsa be a csúszka pozícióját</string>
+ <string name="action">Művelet</string>
+ <string name="top_position">Felső pozíció</string>
+ <string name="middle_position">Középső pozíció</string>
+ <string name="bottom_position">Alsó pozíció</string>
+ <string name="total_silence">Teljes némítás</string>
+ <string name="alarms_only">Csak az ébresztések</string>
+ <string name="priority_only">Csak a fontosak</string>
+ <string name="none">Az összes értesítés</string>
+ <string name="silent">Némítás</string>
+ <string name="vibrate">Rezgés</string>
+ <string name="ring">Csengés</string>
+ <string name="notification_slider_haptic_feedback_title">Érintési visszajelzés</string>
+ <string name="notification_slider_haptic_feedback_summary">A csúsztatás visszajelzése rezgéssel</string>
+ <string name="button_swap_title">Gombfelcserélő</string>
+ <string name="button_swap_summary">Felcseréli az Előzmények és a Visszagomb sorrendjét</string>
+</resources>
diff --git a/DeviceHandler/res/values-in/strings.xml b/DeviceHandler/res/values-in/strings.xml
new file mode 100644
index 0000000..14acda6
--- /dev/null
+++ b/DeviceHandler/res/values-in/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OKE</string>
+ <string name="cancel">Batal</string>
+ <string name="reset">Setel ulang</string>
+ <string name="reset_message">Setel ulang semua entri ke standar?</string>
+ <string name="group_applications">Aplikasi</string>
+ <string name="select_custom_app_title">Pilih aplikasi khusus</string>
+ <string name="gesture_arrow_down_title">Panah ke bawah</string>
+ <string name="gesture_arrow_left_title">Panah ke kiri</string>
+ <string name="gesture_arrow_right_title">Panah ke kanan</string>
+ <string name="gesture_arrow_up_title">Panah ke atas</string>
+ <string name="gesture_double_tap_title">Tekan dua kali</string>
+ <string name="notification_slider">Penggeser pemberitahuan</string>
+ <string name="action">Tindakan</string>
+ <string name="top_position">Posisi atas</string>
+ <string name="middle_position">Posisi tengah</string>
+ <string name="bottom_position">Posisi bawah</string>
+ <string name="total_silence">Keheningan total</string>
+ <string name="alarms_only">Hanya alarm</string>
+ <string name="priority_only">Hanya prioritas</string>
+ <string name="none">Semua pemberitahuan</string>
+ <string name="silent">Diam</string>
+ <string name="vibrate">Getar</string>
+ <string name="ring">Dering</string>
+ <string name="button_swap_title">Tukar tombol</string>
+ <string name="button_swap_summary">Tukar urutan tombol recent dan kembali</string>
+</resources>
diff --git a/DeviceHandler/res/values-it/strings.xml b/DeviceHandler/res/values-it/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-it/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-iw/strings.xml b/DeviceHandler/res/values-iw/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-iw/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-ja/strings.xml b/DeviceHandler/res/values-ja/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-ja/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-ko/strings.xml b/DeviceHandler/res/values-ko/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-ko/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-nl/strings.xml b/DeviceHandler/res/values-nl/strings.xml
new file mode 100644
index 0000000..d8c3d55
--- /dev/null
+++ b/DeviceHandler/res/values-nl/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Annuleren</string>
+ <string name="reset">Herstellen</string>
+ <string name="reset_message">Alles terugzetten naar standaardwaarden?</string>
+ <string name="screen_off_gesture_title">Scherm-uit gebaren</string>
+ <string name="screen_off_gesture_summary">Beheren van diverse apparaatspecifieke gebaren</string>
+ <string name="group_applications">Apps</string>
+ <string name="select_custom_app_title">Selecteer aangepaste app</string>
+ <string name="enable_gestures_title">Gebaren inschakelen</string>
+ <string name="enable_gestures_summary">Scherm-uit gebaren inschakelen</string>
+ <string name="gestures_title">Gebaren</string>
+ <string name="gesture_arrow_down_title">Pijl omlaag</string>
+ <string name="gesture_arrow_left_title">Pijl links</string>
+ <string name="gesture_arrow_right_title">Pijl rechts</string>
+ <string name="gesture_arrow_up_title">Pijl boven</string>
+ <string name="gesture_circle_title">Cirkel</string>
+ <string name="gesture_double_swipe_title">Met 2 vingers naar beneden vegen</string>
+ <string name="gesture_double_tap_title">Dubbel tikken</string>
+ <string name="notification_slider">Schuifregelaar voor notificaties</string>
+ <string name="notification_slider_summary">Positie van de schuifregelaar instellen</string>
+ <string name="action">Actie</string>
+ <string name="top_position">Bovenste positie</string>
+ <string name="middle_position">Middelste positie</string>
+ <string name="bottom_position">Onderste positie</string>
+ <string name="total_silence">Totale stilte</string>
+ <string name="alarms_only">Alleen alarmen</string>
+ <string name="priority_only">Alleen prioriteit</string>
+ <string name="none">Alle notificaties</string>
+ <string name="silent">Dempen</string>
+ <string name="vibrate">Trillen</string>
+ <string name="ring">Beltoon</string>
+ <string name="notification_slider_haptic_feedback_title">Haptische feedback</string>
+ <string name="notification_slider_haptic_feedback_summary">Trillen bij gebruik van de slider</string>
+ <string name="button_swap_title">Knoppen verwisselen</string>
+ <string name="button_swap_summary">Recente apps- en Terugknop omwisselen</string>
+</resources>
diff --git a/DeviceHandler/res/values-no-rNO/strings.xml b/DeviceHandler/res/values-no-rNO/strings.xml
new file mode 100644
index 0000000..b254603
--- /dev/null
+++ b/DeviceHandler/res/values-no-rNO/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- General strings -->
+ <!-- Notification slider -->
+</resources>
diff --git a/DeviceHandler/res/values-pl/strings.xml b/DeviceHandler/res/values-pl/strings.xml
new file mode 100644
index 0000000..868e331
--- /dev/null
+++ b/DeviceHandler/res/values-pl/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Anuluj</string>
+ <string name="reset">Reset</string>
+ <string name="reset_message">Przywrócić wszystkie wpisy do domyślnych?</string>
+ <string name="screen_off_gesture_title">Gesty na wyłączonym ekranie</string>
+ <string name="screen_off_gesture_summary">Zarządzaj różnymi specyficznymi gestami danego urządzenia</string>
+ <string name="group_applications">Aplikacje</string>
+ <string name="select_custom_app_title">Wybierz własną aplikację</string>
+ <string name="enable_gestures_title">Włącz gesty</string>
+ <string name="enable_gestures_summary">Włącz gesty na wyłączonym ekranie</string>
+ <string name="gestures_title">Gesty</string>
+ <string name="gesture_arrow_down_title">Strzałka w dół</string>
+ <string name="gesture_arrow_left_title">Strzałka w lewo</string>
+ <string name="gesture_arrow_right_title">Strzałka w prawo</string>
+ <string name="gesture_arrow_up_title">Strzałka w górę</string>
+ <string name="gesture_circle_title">Okrąg</string>
+ <string name="gesture_double_swipe_title">Przesunięcie dwoma palcami w dół</string>
+ <string name="gesture_double_tap_title">Podwójne naciśnięcie</string>
+ <string name="notification_slider">Panel powiadomień</string>
+ <string name="notification_slider_summary">Konfiguruj pozycję slidera</string>
+ <string name="action">Akcja</string>
+ <string name="top_position">Górna pozycja</string>
+ <string name="middle_position">Środkowa pozycja</string>
+ <string name="bottom_position">Dolna pozycja</string>
+ <string name="total_silence">Całkowite wyciszenie</string>
+ <string name="alarms_only">Tylko alarmy</string>
+ <string name="priority_only">Tylko priorytetowe</string>
+ <string name="none">Wszystkie powiadomienia</string>
+ <string name="silent">Wyciszenie</string>
+ <string name="vibrate">Wibracje</string>
+ <string name="ring">Dzwonek</string>
+ <string name="notification_slider_haptic_feedback_title">Wibracja przy dotyku</string>
+ <string name="notification_slider_haptic_feedback_summary">Wibracje przy użyciu suwaka</string>
+ <string name="button_swap_title">Zamień przyciski</string>
+ <string name="button_swap_summary">Zamień miejscami przyciski ostatnio uruchomionych aplikacji i powrotu</string>
+</resources>
diff --git a/DeviceHandler/res/values-pt-rBR/strings.xml b/DeviceHandler/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..25f62b2
--- /dev/null
+++ b/DeviceHandler/res/values-pt-rBR/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Cancelar</string>
+ <string name="reset">Redefinir</string>
+ <string name="reset_message">Redefinir todas as entradas para o padrão?</string>
+ <string name="screen_off_gesture_title">Gestos com a tela desligada</string>
+ <string name="screen_off_gesture_summary">Gerenciar vários gestos específicos do dispositivo</string>
+ <string name="group_applications">Aplicativos</string>
+ <string name="select_custom_app_title">Selecione um aplicativo personalizado</string>
+ <string name="enable_gestures_title">Ativar gestos</string>
+ <string name="enable_gestures_summary">Ativar gestos com a tela desligada</string>
+ <string name="gestures_title">Gestos</string>
+ <string name="gesture_arrow_down_title">Seta para baixo</string>
+ <string name="gesture_arrow_left_title">Seta para a esquerda</string>
+ <string name="gesture_arrow_right_title">Seta para a direita</string>
+ <string name="gesture_arrow_up_title">Seta para cima</string>
+ <string name="gesture_circle_title">Círculo</string>
+ <string name="gesture_double_swipe_title">Deslizar para baixo com dois dedos</string>
+ <string name="gesture_double_tap_title">Toque duplo</string>
+ <string name="notification_slider">Controle deslizante de notificação</string>
+ <string name="notification_slider_summary">Configurar posições do controle deslizante</string>
+ <string name="action">Ação</string>
+ <string name="top_position">Posição superior</string>
+ <string name="middle_position">No meio</string>
+ <string name="bottom_position">Posição inferior</string>
+ <string name="total_silence">Silêncio total</string>
+ <string name="alarms_only">Apenas alarmes</string>
+ <string name="priority_only">Somente prioridade</string>
+ <string name="none">Todas as notificações</string>
+ <string name="silent">Mudo</string>
+ <string name="vibrate">Vibrar</string>
+ <string name="ring">Toque</string>
+ <string name="notification_slider_haptic_feedback_title">Vibrar ao tocar</string>
+ <string name="notification_slider_haptic_feedback_summary">Vibrar no uso do controle deslizante</string>
+ <string name="button_swap_title">Inverter botões</string>
+ <string name="button_swap_summary">Inverter a ordem dos botões recentes e voltar</string>
+</resources>
diff --git a/DeviceHandler/res/values-pt-rPT/strings.xml b/DeviceHandler/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..a916002
--- /dev/null
+++ b/DeviceHandler/res/values-pt-rPT/strings.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Cancelar</string>
+ <string name="reset">Restaurar</string>
+ <string name="reset_message">Redefinir todas as entradas para o padrão?</string>
+ <string name="screen_off_gesture_title">Gestos do ecrã apagado</string>
+ <string name="screen_off_gesture_summary">Gerenciar vários gestos de específicas de dispositivo</string>
+ <string name="group_applications">Aplicações</string>
+ <string name="select_custom_app_title">Selecione a aplicação personalizada</string>
+ <string name="enable_gestures_title">Ativar gestos</string>
+ <string name="enable_gestures_summary">Habilitar tela de gestos</string>
+ <string name="gestures_title">Gestos</string>
+ <string name="gesture_arrow_down_title">Seta para baixo</string>
+ <string name="gesture_arrow_left_title">Seta para a esquerda</string>
+ <string name="gesture_arrow_right_title">Seta direita</string>
+ <string name="gesture_arrow_up_title">Seta para cima</string>
+ <string name="gesture_circle_title">Círculo</string>
+ <string name="gesture_double_swipe_title">Dedos duplos para baixo</string>
+ <string name="gesture_double_tap_title">Duplo toque</string>
+ <string name="notification_slider">Botão deslizante de notificações</string>
+ <string name="notification_slider_summary">Configurar posições controle deslizante</string>
+ <string name="action">Ação</string>
+ <string name="top_position">Posição superior</string>
+ <string name="middle_position">No meio</string>
+ <string name="bottom_position">Em baixo</string>
+ <string name="total_silence">Silêncio total</string>
+ <string name="alarms_only">Apenas alarmes</string>
+ <string name="priority_only">Somente prioridade</string>
+ <string name="none">Todas as notificações</string>
+ <string name="vibrate">Vibrar</string>
+ <string name="ring">Toque</string>
+ <string name="button_swap_title">Inverter botões</string>
+ <string name="button_swap_summary">Inverter a ordem dos botões de Visão geral e Anterior</string>
+</resources>
diff --git a/DeviceHandler/res/values-ro/strings.xml b/DeviceHandler/res/values-ro/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-ro/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-ru/strings.xml b/DeviceHandler/res/values-ru/strings.xml
new file mode 100644
index 0000000..e5d4d00
--- /dev/null
+++ b/DeviceHandler/res/values-ru/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">ОК</string>
+ <string name="cancel">Отмена</string>
+ <string name="reset">Сбросить</string>
+ <string name="reset_message">Сбросить все записи по умолчанию?</string>
+ <string name="screen_off_gesture_title">Жесты при выключенном экране</string>
+ <string name="screen_off_gesture_summary">Управление различными жестами устройства</string>
+ <string name="group_applications">Приложения</string>
+ <string name="select_custom_app_title">Выберите пользовательское приложение</string>
+ <string name="enable_gestures_title">Включить жесты</string>
+ <string name="enable_gestures_summary">Включить жесты при выключенном экране</string>
+ <string name="gestures_title">Жесты</string>
+ <string name="gesture_arrow_down_title">Стрелка вниз</string>
+ <string name="gesture_arrow_left_title">Стрелка влево</string>
+ <string name="gesture_arrow_right_title">Стрелка вправо</string>
+ <string name="gesture_arrow_up_title">Стрелка вверх</string>
+ <string name="gesture_circle_title">Круг</string>
+ <string name="gesture_double_swipe_title">Свайп двумя пальцами вниз</string>
+ <string name="gesture_double_tap_title">Двойное нажатие</string>
+ <string name="notification_slider">Слайдер уведомлений</string>
+ <string name="notification_slider_summary">Настроить положения ползунка</string>
+ <string name="action">Действие</string>
+ <string name="top_position">Верхнее положение</string>
+ <string name="middle_position">Среднее положение</string>
+ <string name="bottom_position">Нижнее положение</string>
+ <string name="total_silence">Полная тишина</string>
+ <string name="alarms_only">Только будильник</string>
+ <string name="priority_only">Только важные</string>
+ <string name="none">Все уведомления</string>
+ <string name="silent">Без звука</string>
+ <string name="vibrate">Вибрация</string>
+ <string name="ring">Звонок</string>
+ <string name="notification_slider_haptic_feedback_title">Виброотклик</string>
+ <string name="notification_slider_haptic_feedback_summary">Вибрация при использовании ползунка</string>
+ <string name="button_swap_title">Поменять кнопки местами</string>
+ <string name="button_swap_summary">Поменять местами кнопки «Недавние» и «Назад»</string>
+</resources>
diff --git a/DeviceHandler/res/values-sk/strings.xml b/DeviceHandler/res/values-sk/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-sk/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-sr/strings.xml b/DeviceHandler/res/values-sr/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-sr/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-sv/strings.xml b/DeviceHandler/res/values-sv/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-sv/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-tr/strings.xml b/DeviceHandler/res/values-tr/strings.xml
new file mode 100644
index 0000000..32d02a8
--- /dev/null
+++ b/DeviceHandler/res/values-tr/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">Tamam</string>
+ <string name="cancel">İptal</string>
+ <string name="reset">Sıfırla</string>
+ <string name="reset_message">Tüm girişler varsayılana sıfırlansın mı?</string>
+ <string name="screen_off_gesture_title">Kapalı ekran hareketleri</string>
+ <string name="screen_off_gesture_summary">Cihaza özel çeşitli hareketleri yönetin</string>
+ <string name="group_applications">Uygulamalar</string>
+ <string name="select_custom_app_title">Özel uygulama seç</string>
+ <string name="enable_gestures_title">Hareketleri etkinleştir</string>
+ <string name="enable_gestures_summary">Kapalı ekran hareketlerini etkinleştir</string>
+ <string name="gestures_title">Hareketler</string>
+ <string name="gesture_arrow_down_title">Aşağı ok</string>
+ <string name="gesture_arrow_left_title">Sol ok</string>
+ <string name="gesture_arrow_right_title">Sağ ok</string>
+ <string name="gesture_arrow_up_title">Yukarı ok</string>
+ <string name="gesture_circle_title">Daire</string>
+ <string name="gesture_double_swipe_title">İki parmağınızı aşağı kaydır</string>
+ <string name="gesture_double_tap_title">Çift dokunma</string>
+ <string name="notification_slider">Bildirim kaydırıcısı</string>
+ <string name="notification_slider_summary">Kaydırıcı konumlarını yapılandır</string>
+ <string name="action">Eylem</string>
+ <string name="top_position">Üst konum</string>
+ <string name="middle_position">Orta konum</string>
+ <string name="bottom_position">Alt konum</string>
+ <string name="total_silence">Tam sessizlik</string>
+ <string name="alarms_only">Sadece alarm</string>
+ <string name="priority_only">Sadece öncelik</string>
+ <string name="none">Tüm bildirimler</string>
+ <string name="silent">Sessiz</string>
+ <string name="vibrate">Titreşim</string>
+ <string name="ring">Zil sesi</string>
+ <string name="notification_slider_haptic_feedback_title">Dokunumsal geri bildirim</string>
+ <string name="notification_slider_haptic_feedback_summary">Kaydırma kullanımında titret</string>
+ <string name="button_swap_title">Tuşları değiştir</string>
+ <string name="button_swap_summary">Son uygulamalar ve geri tuşlarının yerini değiştir</string>
+</resources>
diff --git a/DeviceHandler/res/values-uk/strings.xml b/DeviceHandler/res/values-uk/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-uk/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-vi/strings.xml b/DeviceHandler/res/values-vi/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-vi/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values-zh-rCN/strings.xml b/DeviceHandler/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..b9f88fe
--- /dev/null
+++ b/DeviceHandler/res/values-zh-rCN/strings.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="dlg_ok">确定</string>
+ <string name="cancel">取消</string>
+ <string name="reset">重置</string>
+ <string name="reset_message">是否将所有条目重置为默认值?</string>
+ <string name="screen_off_gesture_title">息屏手势</string>
+ <string name="screen_off_gesture_summary">管理各种用于设备的手势</string>
+ <string name="group_applications">应用程序</string>
+ <string name="select_custom_app_title">选择自定义应用程序</string>
+ <string name="enable_gestures_title">启用手势</string>
+ <string name="enable_gestures_summary">启用屏幕关闭手势</string>
+ <string name="gestures_title">手势</string>
+ <string name="gesture_arrow_down_title">向下箭头</string>
+ <string name="gesture_arrow_left_title">向左箭头</string>
+ <string name="gesture_arrow_right_title">向右箭头</string>
+ <string name="gesture_arrow_up_title">向上箭头</string>
+ <string name="gesture_circle_title">环形</string>
+ <string name="gesture_double_swipe_title">双指向下滑动</string>
+ <string name="gesture_double_tap_title">双击</string>
+ <string name="notification_slider">三段式开关</string>
+ <string name="notification_slider_summary">配置滑块位置</string>
+ <string name="action">操作</string>
+ <string name="top_position">顶部位置</string>
+ <string name="middle_position">中间位置</string>
+ <string name="bottom_position">底部位置</string>
+ <string name="total_silence">完全阻止</string>
+ <string name="alarms_only">仅限闹铃</string>
+ <string name="priority_only">仅限优先</string>
+ <string name="none">所有通知</string>
+ <string name="silent">静音</string>
+ <string name="vibrate">振动</string>
+ <string name="ring">响铃</string>
+ <string name="notification_slider_haptic_feedback_title">触觉反馈</string>
+ <string name="notification_slider_haptic_feedback_summary">滑块使用时振动</string>
+ <string name="button_swap_title">交换按钮</string>
+ <string name="button_swap_summary">交换最近使用与后退按钮的顺序</string>
+</resources>
diff --git a/DeviceHandler/res/values-zh-rTW/strings.xml b/DeviceHandler/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..25bda57
--- /dev/null
+++ b/DeviceHandler/res/values-zh-rTW/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--Generated by crowdin.com-->
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+</resources>
diff --git a/DeviceHandler/res/values/arrays.xml b/DeviceHandler/res/values/arrays.xml
new file mode 100644
index 0000000..82bde98
--- /dev/null
+++ b/DeviceHandler/res/values/arrays.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The CyanogenMod 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-array name="notification_slider_action_entries" translatable="false">
+ <item>@string/total_silence</item>
+ <item>@string/alarms_only</item>
+ <item>@string/priority_only</item>
+ <item>@string/none</item>
+ <item>@string/silent</item>
+ <item>@string/vibrate</item>
+ <item>@string/ring</item>
+ </string-array>
+
+ <string-array name="notification_slider_action_entry_values" translatable="false">
+ <item>600</item>
+ <item>601</item>
+ <item>602</item>
+ <item>603</item>
+ <item>620</item>
+ <item>604</item>
+ <item>605</item>
+ </string-array>
+
+</resources>
diff --git a/DeviceHandler/res/values/strings.xml b/DeviceHandler/res/values/strings.xml
new file mode 100644
index 0000000..f2c910b
--- /dev/null
+++ b/DeviceHandler/res/values/strings.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 SlimRoms 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- General strings -->
+ <string name="dlg_ok">OK</string>
+ <string name="cancel">Cancel</string>
+ <string name="reset">Reset</string>
+ <string name="reset_message">Reset all entries to default?</string>
+
+ <string name="screen_off_gesture_title">Screen off gestures</string>
+ <string name="screen_off_gesture_summary">Manage various device specific gestures</string>
+ <string name="group_applications">Applications</string>
+ <string name="select_custom_app_title">Select custom application</string>
+
+
+ <string name="enable_gestures_title">Enable gestures</string>
+ <string name="enable_gestures_summary">Enable screen off gestures</string>
+ <string name="gestures_title">Gestures</string>
+ <string name="gesture_arrow_down_title">Arrow down</string>
+ <string name="gesture_arrow_left_title">Arrow left</string>
+ <string name="gesture_arrow_right_title">Arrow right</string>
+ <string name="gesture_arrow_up_title">Arrow up</string>
+ <string name="gesture_circle_title">Circle</string>
+ <string name="gesture_double_swipe_title">Double finger swipe down</string>
+ <string name="gesture_double_tap_title">Double tap</string>
+
+ <!-- Notification slider -->
+ <string name="notification_slider">Notification slider</string>
+ <string name="notification_slider_summary">Configure slider positions</string>
+ <string name="action">Action</string>
+
+ <string name="top_position">Top position</string>
+ <string name="middle_position">Middle position</string>
+ <string name="bottom_position">Bottom position</string>
+ <string name="total_silence">Total silence</string>
+ <string name="alarms_only">Alarms only</string>
+ <string name="priority_only">Priority only</string>
+ <string name="none">All notifications</string>
+ <string name="silent">Mute</string>
+ <string name="vibrate">Vibrate</string>
+ <string name="ring">Ring</string>
+
+ <string name="notification_slider_haptic_feedback_title">Haptic feedback</string>
+ <string name="notification_slider_haptic_feedback_summary">Vibrate on slider usage</string>
+
+ <string name="button_swap_title">Swap buttons</string>
+ <string name="button_swap_summary">Swap the order of recents and back buttons</string>
+
+</resources>
diff --git a/DeviceHandler/res/values/themes.xml b/DeviceHandler/res/values/themes.xml
new file mode 100644
index 0000000..364c9f3
--- /dev/null
+++ b/DeviceHandler/res/values/themes.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012-2013 The CyanogenMod 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 xmlns:android="http://schemas.android.com/apk/res/android">
+ <style name="DeviceHandlerTheme" parent="@android:style/Theme.DeviceDefault.Settings" />
+</resources>
+
diff --git a/DeviceHandler/res/xml/screen_off_gesture.xml b/DeviceHandler/res/xml/screen_off_gesture.xml
new file mode 100644
index 0000000..0b453c1
--- /dev/null
+++ b/DeviceHandler/res/xml/screen_off_gesture.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 Slimroms 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="enable_gestures"
+ android:title="@string/enable_gestures_title"
+ android:persistent="false"
+ android:summary="@string/enable_gestures_summary" />
+
+ <PreferenceCategory
+ android:key="gestures"
+ android:title="@string/gestures_title" >
+
+ <Preference
+ android:key="gesture_arrow_down"
+ android:title="@string/gesture_arrow_down_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ <Preference
+ android:key="gesture_arrow_left"
+ android:title="@string/gesture_arrow_left_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ <Preference
+ android:key="gesture_arrow_right"
+ android:title="@string/gesture_arrow_right_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ <Preference
+ android:key="gesture_arrow_up"
+ android:title="@string/gesture_arrow_up_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ <Preference
+ android:key="gesture_circle"
+ android:title="@string/gesture_circle_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ <Preference
+ android:key="gesture_double_swipe"
+ android:title="@string/gesture_double_swipe_title"
+ android:persistent="false"
+ android:dependency="enable_gestures" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/DeviceHandler/res/xml/slider_panel.xml b/DeviceHandler/res/xml/slider_panel.xml
new file mode 100644
index 0000000..59dd945
--- /dev/null
+++ b/DeviceHandler/res/xml/slider_panel.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The CyanogenMod 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">
+
+ <PreferenceCategory
+ android:title="@string/notification_slider">
+
+ <com.aicp.device.preference.SystemSettingListPreference
+ android:key="device_oppo_common_notification_slider_up1"
+ android:dialogTitle="@string/action"
+ android:title="@string/top_position"
+ android:entries="@array/notification_slider_action_entries"
+ android:entryValues="@array/notification_slider_action_entry_values"
+ android:defaultValue="601" />
+
+ <com.aicp.device.preference.SystemSettingListPreference
+ android:key="device_oppo_common_notification_slider_middle1"
+ android:dialogTitle="@string/action"
+ android:title="@string/middle_position"
+ android:entries="@array/notification_slider_action_entries"
+ android:entryValues="@array/notification_slider_action_entry_values"
+ android:defaultValue="602" />
+
+ <com.aicp.device.preference.SystemSettingListPreference
+ android:key="device_oppo_common_notification_slider_bottom1"
+ android:dialogTitle="@string/action"
+ android:title="@string/bottom_position"
+ android:entries="@array/notification_slider_action_entries"
+ android:entryValues="@array/notification_slider_action_entry_values"
+ android:defaultValue="603" />
+
+ <com.aicp.device.preference.SystemSettingSwitchPreference
+ android:key="device_oppo_common_notification_slider_haptic_feedback"
+ android:title="@string/notification_slider_haptic_feedback_title"
+ android:summary="@string/notification_slider_haptic_feedback_summary"
+ android:defaultValue="true" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/DeviceHandler/src/com/aicp/device/preference/ListPreference.java b/DeviceHandler/src/com/aicp/device/preference/ListPreference.java
new file mode 100644
index 0000000..3c113ab
--- /dev/null
+++ b/DeviceHandler/src/com/aicp/device/preference/ListPreference.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2017-2018 Android Ice Cold 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.
+ */
+
+package com.aicp.device.preference;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+public class ListPreference extends android.preference.ListPreference {
+ private boolean mAutoSummary = false;
+
+ public ListPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public ListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public ListPreference(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void setValue(String value) {
+ super.setValue(value);
+ if (mAutoSummary || TextUtils.isEmpty(getSummary())) {
+ setSummary(getEntry(), true);
+ }
+ }
+
+ @Override
+ public void setSummary(CharSequence summary) {
+ setSummary(summary, false);
+ }
+
+ private void setSummary(CharSequence summary, boolean autoSummary) {
+ mAutoSummary = autoSummary;
+ super.setSummary(summary);
+ }
+}
diff --git a/DeviceHandler/src/com/aicp/device/preference/SystemSettingListPreference.java b/DeviceHandler/src/com/aicp/device/preference/SystemSettingListPreference.java
new file mode 100644
index 0000000..fd8a67a
--- /dev/null
+++ b/DeviceHandler/src/com/aicp/device/preference/SystemSettingListPreference.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2017-2018 Android Ice Cold 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.
+ */
+
+package com.aicp.device.preference;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+public class SystemSettingListPreference extends ListPreference {
+
+ public SystemSettingListPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ public SystemSettingListPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ public SystemSettingListPreference(Context context) {
+ super(context);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+ // This is what default ListPreference implementation is doing without respecting
+ // real default value:
+ //setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
+ // Instead, we better do
+ setValue(restoreValue ? getPersistedString((String) defaultValue) : (String) defaultValue);
+ }
+
+}
diff --git a/DeviceHandler/src/com/aicp/device/preference/SystemSettingSwitchPreference.java b/DeviceHandler/src/com/aicp/device/preference/SystemSettingSwitchPreference.java
new file mode 100644
index 0000000..fc55fd0
--- /dev/null
+++ b/DeviceHandler/src/com/aicp/device/preference/SystemSettingSwitchPreference.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 Android Ice Cold 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.
+ */
+
+package com.aicp.device.preference;
+
+import android.content.Context;
+import android.preference.SwitchPreference;
+import android.util.AttributeSet;
+
+public class SystemSettingSwitchPreference extends SwitchPreference {
+
+ public SystemSettingSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ public SystemSettingSwitchPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ public SystemSettingSwitchPreference(Context context) {
+ super(context);
+ setPreferenceDataStore(new SystemSettingsStore(context.getContentResolver()));
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
+ // This is what default TwoStatePreference implementation is doing without respecting
+ // real default value:
+ //setChecked(restoreValue ? getPersistedBoolean(mChecked)
+ // : (Boolean) defaultValue);
+ // Instead, we better do
+ setChecked(restoreValue ? getPersistedBoolean((Boolean) defaultValue)
+ : (Boolean) defaultValue);
+ }
+}
diff --git a/DeviceHandler/src/com/aicp/device/preference/SystemSettingsStore.java b/DeviceHandler/src/com/aicp/device/preference/SystemSettingsStore.java
new file mode 100644
index 0000000..77aa8f5
--- /dev/null
+++ b/DeviceHandler/src/com/aicp/device/preference/SystemSettingsStore.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 Android Ice Cold 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.
+ */
+
+package com.aicp.device.preference;
+
+import android.content.ContentResolver;
+import android.preference.PreferenceDataStore;
+import android.provider.Settings;
+
+public class SystemSettingsStore implements PreferenceDataStore {
+
+ private ContentResolver mContentResolver;
+
+ public SystemSettingsStore(ContentResolver contentResolver) {
+ mContentResolver = contentResolver;
+ }
+
+ public boolean getBoolean(String key, boolean defValue) {
+ return getInt(key, defValue ? 1 : 0) != 0;
+ }
+
+ public float getFloat(String key, float defValue) {
+ return Settings.System.getFloat(mContentResolver, key, defValue);
+ }
+
+ public int getInt(String key, int defValue) {
+ return Settings.System.getInt(mContentResolver, key, defValue);
+ }
+
+ public long getLong(String key, long defValue) {
+ return Settings.System.getLong(mContentResolver, key, defValue);
+ }
+
+ public String getString(String key, String defValue) {
+ String result = Settings.System.getString(mContentResolver, key);
+ return result == null ? defValue : result;
+ }
+
+ public void putBoolean(String key, boolean value) {
+ putInt(key, value ? 1 : 0);
+ }
+
+ public void putFloat(String key, float value) {
+ Settings.System.putFloat(mContentResolver, key, value);
+ }
+
+ public void putInt(String key, int value) {
+ Settings.System.putInt(mContentResolver, key, value);
+ }
+
+ public void putLong(String key, long value) {
+ Settings.System.putLong(mContentResolver, key, value);
+ }
+
+ public void putString(String key, String value) {
+ Settings.System.putString(mContentResolver, key, value);
+ }
+
+}
diff --git a/DeviceHandler/src/com/slim/device/BootReceiver.java b/DeviceHandler/src/com/slim/device/BootReceiver.java
new file mode 100644
index 0000000..0821251
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/BootReceiver.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2014 SlimRoms 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.
+ */
+package com.slim.device;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.preference.PreferenceManager;
+
+import com.slim.device.KernelControl;
+import com.slim.device.settings.ScreenOffGesture;
+import com.slim.device.settings.SliderSettings;
+import com.slim.device.util.FileUtils;
+
+import static com.slim.device.KeyHandler.SLIDER_TOP;
+import static com.slim.device.KeyHandler.SLIDER_MIDDLE;
+import static com.slim.device.KeyHandler.SLIDER_BOTTOM;
+
+import java.io.File;
+
+
+public class BootReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(final Context context, final Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
+ enableComponent(context, ScreenOffGesture.class.getName());
+ SharedPreferences screenOffGestureSharedPreferences = context.getSharedPreferences(
+ ScreenOffGesture.GESTURE_SETTINGS, Activity.MODE_PRIVATE);
+ KernelControl.enableGestures(
+ screenOffGestureSharedPreferences.getBoolean(
+ ScreenOffGesture.PREF_GESTURE_ENABLE, true));
+ }
+
+ // Disable slider settings if needed
+ if (!KernelControl.hasSlider()) {
+ disableComponent(context, SliderSettings.class.getName());
+ } else {
+ enableComponent(context, SliderSettings.class.getName());
+
+ // Set keycodes as expected by our keyhandler for kernels
+ // that control keycodes using these files
+ /* EDIT: don't, can lead to wrong value sent after boot
+ String sliderTop = "" + SLIDER_TOP;
+ String sliderMiddle = "" + SLIDER_MIDDLE;
+ String sliderBottom = "" + SLIDER_BOTTOM;
+
+ FileUtils.writeLine(KernelControl.KEYCODE_SLIDER_TOP, sliderTop);
+ FileUtils.writeLine(KernelControl.KEYCODE_SLIDER_MIDDLE, sliderMiddle);
+ FileUtils.writeLine(KernelControl.KEYCODE_SLIDER_BOTTOM, sliderBottom);
+ */
+ }
+ }
+
+ private String getPreferenceString(Context context, String key, String defaultValue) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ return preferences.getString(key, defaultValue);
+ }
+
+ private boolean getPreferenceBoolean(Context context, String key, boolean defaultValue) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ return preferences.getBoolean(key, defaultValue);
+ }
+
+ private void disableComponent(Context context, String component) {
+ ComponentName name = new ComponentName(context, component);
+ PackageManager pm = context.getPackageManager();
+ pm.setComponentEnabledSetting(name,
+ PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
+ private void enableComponent(Context context, String component) {
+ ComponentName name = new ComponentName(context, component);
+ PackageManager pm = context.getPackageManager();
+ if (pm.getComponentEnabledSetting(name)
+ == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
+ pm.setComponentEnabledSetting(name,
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+ }
+}
diff --git a/DeviceHandler/src/com/slim/device/KernelControl.java b/DeviceHandler/src/com/slim/device/KernelControl.java
new file mode 100644
index 0000000..376bbca
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/KernelControl.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 SlimRoms 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.
+ */
+
+package com.slim.device;
+
+import com.slim.device.util.FileUtils;
+
+import java.io.File;
+
+/*
+ * Very ugly class which enables or disables for now
+ * all gesture controls on kernel level.
+ * We need to do it this way for now to do not break 3rd party kernel.
+ * Kernel should have a better per gesture control but as long
+ * this is not changed by the manufacture we would break gesture control on every
+ * 3rd party kernel. Hence we do it this way for now.
+ */
+
+public final class KernelControl {
+
+ private static String GESTURE_PATH = "/proc/touchpanel/";
+ private static String GESTURE_CAMERA = GESTURE_PATH + "letter_o_enable";
+ private static String GESTURE_FLASHLIGHT = GESTURE_PATH + "up_arrow_enable";
+ private static String GESTURE_MEDIA = GESTURE_PATH + "double_swipe_enable";
+ private static String GESTURE_MEDIA_PREVIOUS = GESTURE_PATH + "right_arrow_enable";
+ private static String GESTURE_MEDIA_NEXT = GESTURE_PATH + "left_arrow_enable";
+ private static String GESTURE_SILENT_VIB_SOUND = GESTURE_PATH + "down_arrow_enable";
+
+ // Notification slider
+ public static final String KEYCODE_SLIDER_TOP = "/proc/tri-state-key/keyCode_top";
+ public static final String KEYCODE_SLIDER_MIDDLE = "/proc/tri-state-key/keyCode_middle";
+ public static final String KEYCODE_SLIDER_BOTTOM = "/proc/tri-state-key/keyCode_bottom";
+
+ private static String[] GESTURE_CONTROL_NODES = {
+ GESTURE_CAMERA,
+ GESTURE_FLASHLIGHT ,
+ GESTURE_MEDIA,
+ GESTURE_MEDIA_PREVIOUS,
+ GESTURE_MEDIA_NEXT,
+ GESTURE_SILENT_VIB_SOUND
+ };
+
+ private KernelControl() {
+ // this class is not supposed to be instantiated
+ }
+
+ /**
+ * Enable or disable gesture control.
+ */
+ public static void enableGestures(boolean enable) {
+ for (int i = 0; i < GESTURE_CONTROL_NODES.length; i++) {
+ if (new File(GESTURE_CONTROL_NODES[i]).exists()) {
+ FileUtils.writeLine(GESTURE_CONTROL_NODES[i], enable ? "1" : "0");
+ }
+ }
+ }
+
+ /**
+ * Do we have touch control at all?
+ */
+ public static boolean hasTouchscreenGestures() {
+ return new File(GESTURE_CAMERA).exists()
+ && new File(GESTURE_FLASHLIGHT).exists()
+ && new File(GESTURE_MEDIA).exists();
+ }
+
+ public static boolean hasSlider() {
+ return new File(KEYCODE_SLIDER_TOP).exists() &&
+ new File(KEYCODE_SLIDER_MIDDLE).exists() &&
+ new File(KEYCODE_SLIDER_BOTTOM).exists();
+ }
+
+}
diff --git a/DeviceHandler/src/com/slim/device/KeyHandler.java b/DeviceHandler/src/com/slim/device/KeyHandler.java
new file mode 100644
index 0000000..dca57b8
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/KeyHandler.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2014 Slimroms
+ * Copyright (C) 2019 Android Ice Cold 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.
+ */
+package com.slim.device;
+
+import android.app.Activity;
+import android.app.NotificationManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.SharedPreferences;
+import android.database.ContentObserver;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import android.service.notification.ZenModeConfig;
+
+import com.slim.device.settings.ScreenOffGesture;
+
+import com.android.internal.os.DeviceKeyHandler;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.gzosp.ActionConstants;
+import com.android.internal.util.gzosp.Action;
+
+import java.util.HashSet;
+
+public class KeyHandler implements DeviceKeyHandler {
+
+ private static final String TAG = KeyHandler.class.getSimpleName();
+ private static final int GESTURE_REQUEST = 1;
+
+ public static final String SETTING_NOTIF_SLIDER_UP =
+ "device_oppo_common_notification_slider_up1";
+ public static final String SETTING_NOTIF_SLIDER_MIDDLE =
+ "device_oppo_common_notification_slider_middle1";
+ public static final String SETTING_NOTIF_SLIDER_BOTTOM =
+ "device_oppo_common_notification_slider_bottom1";
+ public static final String SETTING_NOTIF_SLIDER_HAPTIC_FEEDBACK =
+ "device_oppo_common_notification_slider_haptic_feedback";
+
+ // Supported scancodes
+ private static final int GESTURE_CIRCLE_SCANCODE = 250;
+ private static final int GESTURE_SWIPE_DOWN_SCANCODE = 251;
+ private static final int GESTURE_V_SCANCODE = 252;
+ private static final int GESTURE_LTR_SCANCODE = 253;
+ private static final int GESTURE_GTR_SCANCODE = 254;
+ private static final int GESTURE_V_UP_SCANCODE = 255;
+ // Slider
+ private static final int MODE_TOTAL_SILENCE = 600;
+ private static final int MODE_ALARMS_ONLY = 601;
+ private static final int MODE_PRIORITY_ONLY = 602;
+ private static final int MODE_NONE = 603;
+ private static final int MODE_VIBRATE = 604;
+ private static final int MODE_RING = 605;
+ // AICP additions: arbitrary value which hopefully doesn't conflict with upstream anytime soon
+ private static final int MODE_SILENT = 620;
+
+ // Keycodes from kernel found in drivers/input/misc/tri_state_key.c
+ public static final int SLIDER_TOP = 601;
+ public static final int SLIDER_MIDDLE = 602;
+ public static final int SLIDER_BOTTOM = 603;
+
+ private static final int[] sSupportedGestures = new int[]{
+ GESTURE_CIRCLE_SCANCODE,
+ GESTURE_SWIPE_DOWN_SCANCODE,
+ GESTURE_V_SCANCODE,
+ GESTURE_V_UP_SCANCODE,
+ GESTURE_LTR_SCANCODE,
+ GESTURE_GTR_SCANCODE,
+ MODE_TOTAL_SILENCE,
+ MODE_ALARMS_ONLY,
+ MODE_PRIORITY_ONLY,
+ MODE_NONE,
+ MODE_VIBRATE,
+ MODE_RING,
+ MODE_SILENT,
+ };
+
+ private static final HashSet<Integer> sSupportedSliderModes = new HashSet<>();
+ static {
+ sSupportedSliderModes.add(SLIDER_TOP);
+ sSupportedSliderModes.add(SLIDER_MIDDLE);
+ sSupportedSliderModes.add(SLIDER_BOTTOM);
+ }
+
+ private final Context mContext;
+ private final AudioManager mAudioManager;
+ private final PowerManager mPowerManager;
+ private final NotificationManager mNotificationManager;
+ private Context mGestureContext = null;
+ private EventHandler mEventHandler;
+ private SensorManager mSensorManager;
+ private Sensor mProximitySensor;
+ private Vibrator mVibrator;
+ WakeLock mProximityWakeLock;
+
+ private int mSliderUpAction;
+ private int mSliderMiddleAction;
+ private int mSliderBottomAction;
+
+ public KeyHandler(Context context) {
+ mContext = context;
+ mEventHandler = new EventHandler();
+ mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ mNotificationManager
+ = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
+ mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ mProximityWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+ "ProximityWakeLock");
+
+ try {
+ mGestureContext = mContext.createPackageContext(
+ "com.slim.device", Context.CONTEXT_IGNORE_SECURITY);
+ } catch (NameNotFoundException e) {
+ }
+
+ new SettingsObserver(new Handler()).observe();
+ }
+
+ private class EventHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ int scanCode;
+ if (msg.obj instanceof KeyEvent) {
+ KeyEvent event = (KeyEvent) msg.obj;
+ scanCode = event.getScanCode();
+ } else if (msg.obj instanceof Integer) {
+ scanCode = (Integer) msg.obj;
+ } else {
+ return;
+ }
+ String action = null;
+ switch(scanCode) {
+ case GESTURE_CIRCLE_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_CIRCLE,
+ ActionConstants.ACTION_CAMERA);
+ doHapticFeedback();
+ break;
+ case GESTURE_SWIPE_DOWN_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_DOUBLE_SWIPE,
+ ActionConstants.ACTION_MEDIA_PLAY_PAUSE);
+ doHapticFeedback();
+ break;
+ case GESTURE_V_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_ARROW_DOWN,
+ ActionConstants.ACTION_VIB_SILENT);
+ doHapticFeedback();
+ break;
+ case GESTURE_V_UP_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_ARROW_UP,
+ ActionConstants.ACTION_TORCH);
+ doHapticFeedback();
+ break;
+ case GESTURE_LTR_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_ARROW_LEFT,
+ ActionConstants.ACTION_MEDIA_PREVIOUS);
+ doHapticFeedback();
+ break;
+ case GESTURE_GTR_SCANCODE:
+ action = getGestureSharedPreferences()
+ .getString(ScreenOffGesture.PREF_GESTURE_ARROW_RIGHT,
+ ActionConstants.ACTION_MEDIA_NEXT);
+ doHapticFeedback();
+ break;
+ case MODE_TOTAL_SILENCE:
+ setZenMode(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS);
+ break;
+ case MODE_ALARMS_ONLY:
+ setZenMode(Settings.Global.ZEN_MODE_ALARMS);
+ break;
+ case MODE_PRIORITY_ONLY:
+ setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
+ setZenMode(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
+ break;
+ case MODE_NONE:
+ setZenMode(Settings.Global.ZEN_MODE_OFF);
+ setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
+ break;
+ case MODE_VIBRATE:
+ setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE);
+ break;
+ case MODE_RING:
+ setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL);
+ break;
+ case MODE_SILENT:
+ setRingerModeInternal(AudioManager.RINGER_MODE_SILENT);
+ break;
+ }
+
+ if (action == null || action != null && action.equals(ActionConstants.ACTION_NULL)) {
+ return;
+ }
+ if (action.equals(ActionConstants.ACTION_CAMERA)
+ || !action.startsWith("**")) {
+ Action.processAction(mContext, ActionConstants.ACTION_WAKE_DEVICE, false);
+ }
+ Action.processAction(mContext, action, false);
+ }
+ }
+
+ private void setZenMode(int mode) {
+ mNotificationManager.setZenMode(mode, null, TAG);
+ if (mVibrator != null) {
+ mVibrator.vibrate(50);
+ }
+ }
+
+ private void setRingerModeInternal(int mode) {
+ mAudioManager.setRingerModeInternal(mode);
+ if (mVibrator != null) {
+ mVibrator.vibrate(50);
+ }
+ }
+
+ private void doHapticFeedback() {
+ if (mVibrator == null) {
+ return;
+ }
+ mVibrator.vibrate(50);
+ }
+
+ private SharedPreferences getGestureSharedPreferences() {
+ return mGestureContext.getSharedPreferences(
+ ScreenOffGesture.GESTURE_SETTINGS,
+ Context.MODE_PRIVATE | Context.MODE_MULTI_PROCESS);
+ }
+
+ public KeyEvent handleKeyEvent(KeyEvent event) {
+ int scanCode = event.getScanCode();
+ boolean isSliderModeSupported = sSupportedSliderModes.contains(scanCode);
+ if (isSliderModeSupported) {
+ // Remap slider actions
+ if (scanCode == SLIDER_TOP) {
+ scanCode = mSliderUpAction;
+ } else if (scanCode == SLIDER_MIDDLE) {
+ scanCode = mSliderMiddleAction;
+ } else if (scanCode == SLIDER_BOTTOM) {
+ scanCode = mSliderBottomAction;
+ }
+ }
+ boolean isKeySupported = ArrayUtils.contains(sSupportedGestures, scanCode);
+ if (!isKeySupported) {
+ return event;
+ }
+ if (event.getAction() != KeyEvent.ACTION_UP) {
+ return null;
+ }
+
+ // In case we're too fast: possibly loose contact in hw button?
+ // -> discard previous, apply last update
+ mEventHandler.removeMessages(GESTURE_REQUEST);
+
+ Message msg;
+ if (scanCode != event.getScanCode()) {
+ // Overwritten action
+ msg = getMessageForScanCode(scanCode);
+ } else {
+ msg = getMessageForKeyEvent(event);
+ }
+ if (scanCode < MODE_TOTAL_SILENCE && mProximitySensor != null) {
+ mEventHandler.sendMessageDelayed(msg, 200);
+ processEvent(event);
+ } else {
+ mEventHandler.sendMessage(msg);
+ }
+ return null;
+ }
+
+ private Message getMessageForKeyEvent(KeyEvent keyEvent) {
+ Message msg = mEventHandler.obtainMessage(GESTURE_REQUEST);
+ msg.obj = keyEvent;
+ return msg;
+ }
+
+ private Message getMessageForScanCode(int scanCode) {
+ Message msg = mEventHandler.obtainMessage(GESTURE_REQUEST);
+ msg.obj = new Integer(scanCode);
+ return msg;
+ }
+
+ private void processEvent(final KeyEvent keyEvent) {
+ mProximityWakeLock.acquire();
+ mSensorManager.registerListener(new SensorEventListener() {
+
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ mProximityWakeLock.release();
+ mSensorManager.unregisterListener(this);
+ if (!mEventHandler.hasMessages(GESTURE_REQUEST)) {
+ // The sensor took to long, ignoring.
+ return;
+ }
+ mEventHandler.removeMessages(GESTURE_REQUEST);
+ if (event.values[0] == mProximitySensor.getMaximumRange()) {
+ Message msg = getMessageForKeyEvent(keyEvent);
+ mEventHandler.sendMessage(msg);
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {}
+
+ }, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST);
+ }
+
+ private class SettingsObserver extends ContentObserver {
+ SettingsObserver(Handler handler) {
+ super(handler);
+ }
+
+ void observe() {
+ ContentResolver resolver = mContext.getContentResolver();
+
+ resolver.registerContentObserver(Settings.System.getUriFor(SETTING_NOTIF_SLIDER_UP),
+ false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(SETTING_NOTIF_SLIDER_MIDDLE), false, this,
+ UserHandle.USER_ALL);
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(SETTING_NOTIF_SLIDER_BOTTOM), false, this,
+ UserHandle.USER_ALL);
+ resolver.registerContentObserver(
+ Settings.System.getUriFor(SETTING_NOTIF_SLIDER_HAPTIC_FEEDBACK), false, this,
+ UserHandle.USER_ALL);
+
+ update();
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ update();
+ }
+
+ void update() {
+ mSliderUpAction = Settings.System.getInt(mContext.getContentResolver(),
+ SETTING_NOTIF_SLIDER_UP, 601);
+ mSliderMiddleAction = Settings.System.getInt(mContext.getContentResolver(),
+ SETTING_NOTIF_SLIDER_MIDDLE, 602);
+ mSliderBottomAction = Settings.System.getInt(mContext.getContentResolver(),
+ SETTING_NOTIF_SLIDER_BOTTOM, 603);
+
+
+ if (Settings.System.getInt(mContext.getContentResolver(),
+ SETTING_NOTIF_SLIDER_HAPTIC_FEEDBACK, 1) != 0) {
+ mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+ if (mVibrator == null || !mVibrator.hasVibrator()) {
+ mVibrator = null;
+ }
+ } else {
+ mVibrator = null;
+ }
+ }
+ }
+
+}
diff --git a/DeviceHandler/src/com/slim/device/settings/ScreenOffGesture.java b/DeviceHandler/src/com/slim/device/settings/ScreenOffGesture.java
new file mode 100644
index 0000000..7846792
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/settings/ScreenOffGesture.java
@@ -0,0 +1,377 @@
+/*
+ * Copyright (C) 2014 Slimroms
+ *
+ * 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.
+ */
+
+package com.slim.device.settings;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import androidx.preference.Preference;
+import androidx.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.Preference.OnPreferenceClickListener;
+import androidx.preference.PreferenceFragment;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import com.android.internal.util.gzosp.AppHelper;
+import com.android.internal.util.gzosp.ActionConstants;
+import com.android.internal.util.gzosp.DeviceUtils;
+import com.android.internal.util.gzosp.DeviceUtils.FilteredDeviceFeaturesArray;
+
+import com.slim.device.KernelControl;
+import com.slim.device.R;
+import com.slim.device.util.ShortcutPickerHelper;
+
+public class ScreenOffGesture extends PreferenceFragment implements
+ Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener,
+ ShortcutPickerHelper.OnPickListener {
+
+ private static final String SETTINGS_METADATA_NAME = "com.android.settings";
+
+ public static final String GESTURE_SETTINGS = "screen_off_gesture_settings";
+
+ public static final String PREF_GESTURE_ENABLE = "enable_gestures";
+ public static final String PREF_GESTURE_CIRCLE = "gesture_circle";
+ public static final String PREF_GESTURE_DOUBLE_SWIPE = "gesture_double_swipe";
+ public static final String PREF_GESTURE_ARROW_UP = "gesture_arrow_up";
+ public static final String PREF_GESTURE_ARROW_DOWN = "gesture_arrow_down";
+ public static final String PREF_GESTURE_ARROW_LEFT = "gesture_arrow_left";
+ public static final String PREF_GESTURE_ARROW_RIGHT = "gesture_arrow_right";
+
+ private static final int DLG_SHOW_ACTION_DIALOG = 0;
+ private static final int DLG_RESET_TO_DEFAULT = 1;
+
+ private static final int MENU_RESET = Menu.FIRST;
+
+ private Preference mGestureCircle;
+ private Preference mGestureDoubleSwipe;
+ private Preference mGestureArrowUp;
+ private Preference mGestureArrowDown;
+ private Preference mGestureArrowLeft;
+ private Preference mGestureArrowRight;
+ private SwitchPreference mEnableGestures;
+
+ private boolean mCheckPreferences;
+ private SharedPreferences mScreenOffGestureSharedPreferences;
+
+ private ShortcutPickerHelper mPicker;
+ private String mPendingSettingsKey;
+ private static FilteredDeviceFeaturesArray sFinalActionDialogArray;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mPicker = new ShortcutPickerHelper(getActivity(), this);
+
+ mScreenOffGestureSharedPreferences = getActivity().getSharedPreferences(
+ GESTURE_SETTINGS, Activity.MODE_PRIVATE);
+
+ // Before we start filter out unsupported options on the
+ // ListPreference values and entries
+ PackageManager pm = getActivity().getPackageManager();
+ Resources settingsResources = null;
+ try {
+ settingsResources = pm.getResourcesForApplication(SETTINGS_METADATA_NAME);
+ } catch (Exception e) {
+ return;
+ }
+ sFinalActionDialogArray = new FilteredDeviceFeaturesArray();
+ sFinalActionDialogArray = DeviceUtils.filterUnsupportedDeviceFeatures(getActivity(),
+ settingsResources.getStringArray(
+ settingsResources.getIdentifier(SETTINGS_METADATA_NAME
+ + ":array/shortcut_action_screen_off_values", null, null)),
+ settingsResources.getStringArray(
+ settingsResources.getIdentifier(SETTINGS_METADATA_NAME
+ + ":array/shortcut_action_screen_off_entries", null, null)));
+
+ // Attach final settings screen.
+ reloadSettings();
+
+ setHasOptionsMenu(true);
+ }
+
+ private PreferenceScreen reloadSettings() {
+ mCheckPreferences = false;
+ PreferenceScreen prefs = getPreferenceScreen();
+ if (prefs != null) {
+ prefs.removeAll();
+ }
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.screen_off_gesture);
+ prefs = getPreferenceScreen();
+
+ mEnableGestures = (SwitchPreference) prefs.findPreference(PREF_GESTURE_ENABLE);
+
+ mGestureCircle = (Preference) prefs.findPreference(PREF_GESTURE_CIRCLE);
+ mGestureDoubleSwipe = (Preference) prefs.findPreference(PREF_GESTURE_DOUBLE_SWIPE);
+ mGestureArrowUp = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_UP);
+ mGestureArrowDown = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_DOWN);
+ mGestureArrowLeft = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_LEFT);
+ mGestureArrowRight = (Preference) prefs.findPreference(PREF_GESTURE_ARROW_RIGHT);
+
+ setupOrUpdatePreference(mGestureCircle, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_CIRCLE, ActionConstants.ACTION_CAMERA));
+ setupOrUpdatePreference(mGestureDoubleSwipe, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_DOUBLE_SWIPE, ActionConstants.ACTION_MEDIA_PLAY_PAUSE));
+ setupOrUpdatePreference(mGestureArrowUp, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_ARROW_UP, ActionConstants.ACTION_TORCH));
+ setupOrUpdatePreference(mGestureArrowDown, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_ARROW_DOWN, ActionConstants.ACTION_VIB_SILENT));
+ setupOrUpdatePreference(mGestureArrowLeft, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_ARROW_LEFT, ActionConstants.ACTION_MEDIA_PREVIOUS));
+ setupOrUpdatePreference(mGestureArrowRight, mScreenOffGestureSharedPreferences
+ .getString(PREF_GESTURE_ARROW_RIGHT, ActionConstants.ACTION_MEDIA_NEXT));
+
+ boolean enableGestures =
+ mScreenOffGestureSharedPreferences.getBoolean(PREF_GESTURE_ENABLE, true);
+ mEnableGestures.setChecked(enableGestures);
+ mEnableGestures.setOnPreferenceChangeListener(this);
+
+ mCheckPreferences = true;
+ return prefs;
+ }
+
+ private void setupOrUpdatePreference(Preference preference, String action) {
+ if (preference == null || action == null) {
+ return;
+ }
+
+ if (action.startsWith("**")) {
+ preference.setSummary(getDescription(action));
+ } else {
+ preference.setSummary(AppHelper.getFriendlyNameForUri(
+ getActivity(), getActivity().getPackageManager(), action));
+ }
+ preference.setOnPreferenceClickListener(this);
+ }
+
+ private String getDescription(String action) {
+ if (sFinalActionDialogArray == null || action == null) {
+ return null;
+ }
+ int i = 0;
+ for (String actionValue : sFinalActionDialogArray.values) {
+ if (action.equals(actionValue)) {
+ return sFinalActionDialogArray.entries[i];
+ }
+ i++;
+ }
+ return null;
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ String settingsKey = null;
+ int dialogTitle = 0;
+ if (preference == mGestureCircle) {
+ settingsKey = PREF_GESTURE_CIRCLE;
+ dialogTitle = R.string.gesture_circle_title;
+ } else if (preference == mGestureDoubleSwipe) {
+ settingsKey = PREF_GESTURE_DOUBLE_SWIPE;
+ dialogTitle = R.string.gesture_double_swipe_title;
+ } else if (preference == mGestureArrowUp) {
+ settingsKey = PREF_GESTURE_ARROW_UP;
+ dialogTitle = R.string.gesture_arrow_up_title;
+ } else if (preference == mGestureArrowDown) {
+ settingsKey = PREF_GESTURE_ARROW_DOWN;
+ dialogTitle = R.string.gesture_arrow_down_title;
+ } else if (preference == mGestureArrowLeft) {
+ settingsKey = PREF_GESTURE_ARROW_LEFT;
+ dialogTitle = R.string.gesture_arrow_left_title;
+ } else if (preference == mGestureArrowRight) {
+ settingsKey = PREF_GESTURE_ARROW_RIGHT;
+ dialogTitle = R.string.gesture_arrow_right_title;
+ }
+ if (settingsKey != null) {
+ showDialogInner(DLG_SHOW_ACTION_DIALOG, settingsKey, dialogTitle);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (!mCheckPreferences) {
+ return false;
+ }
+ if (preference == mEnableGestures) {
+ mScreenOffGestureSharedPreferences.edit()
+ .putBoolean(PREF_GESTURE_ENABLE, (Boolean) newValue).commit();
+ KernelControl.enableGestures((Boolean) newValue);
+ return true;
+ }
+ return false;
+ }
+
+ // Reset all entries to default.
+ private void resetToDefault() {
+ SharedPreferences.Editor editor = mScreenOffGestureSharedPreferences.edit();
+ mScreenOffGestureSharedPreferences.edit()
+ .putBoolean(PREF_GESTURE_ENABLE, true).commit();
+ editor.putString(PREF_GESTURE_CIRCLE,
+ ActionConstants.ACTION_CAMERA).commit();
+ editor.putString(PREF_GESTURE_DOUBLE_SWIPE,
+ ActionConstants.ACTION_MEDIA_PLAY_PAUSE).commit();
+ editor.putString(PREF_GESTURE_ARROW_UP,
+ ActionConstants.ACTION_TORCH).commit();
+ editor.putString(PREF_GESTURE_ARROW_DOWN,
+ ActionConstants.ACTION_VIB_SILENT).commit();
+ editor.putString(PREF_GESTURE_ARROW_LEFT,
+ ActionConstants.ACTION_MEDIA_PREVIOUS).commit();
+ editor.putString(PREF_GESTURE_ARROW_RIGHT,
+ ActionConstants.ACTION_MEDIA_NEXT).commit();
+ editor.commit();
+ KernelControl.enableGestures(true);
+ reloadSettings();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ }
+
+ @Override
+ public void shortcutPicked(String action,
+ String description, Bitmap bmp, boolean isApplication) {
+ if (mPendingSettingsKey == null || action == null) {
+ return;
+ }
+ mScreenOffGestureSharedPreferences.edit().putString(mPendingSettingsKey, action).commit();
+ reloadSettings();
+ mPendingSettingsKey = null;
+ }
+
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == Activity.RESULT_OK) {
+ if (requestCode == ShortcutPickerHelper.REQUEST_PICK_SHORTCUT
+ || requestCode == ShortcutPickerHelper.REQUEST_PICK_APPLICATION
+ || requestCode == ShortcutPickerHelper.REQUEST_CREATE_SHORTCUT) {
+ mPicker.onActivityResult(requestCode, resultCode, data);
+
+ }
+ } else {
+ mPendingSettingsKey = null;
+ }
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_RESET:
+ showDialogInner(DLG_RESET_TO_DEFAULT, null, 0);
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ menu.add(0, MENU_RESET, 0, R.string.reset)
+ .setIcon(R.drawable.ic_settings_reset)
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ }
+
+ private void showDialogInner(int id, String settingsKey, int dialogTitle) {
+ DialogFragment newFragment =
+ MyAlertDialogFragment.newInstance(id, settingsKey, dialogTitle);
+ newFragment.setTargetFragment(this, 0);
+ newFragment.show(getFragmentManager(), "dialog " + id);
+ }
+
+ public static class MyAlertDialogFragment extends DialogFragment {
+
+ public static MyAlertDialogFragment newInstance(
+ int id, String settingsKey, int dialogTitle) {
+ MyAlertDialogFragment frag = new MyAlertDialogFragment();
+ Bundle args = new Bundle();
+ args.putInt("id", id);
+ args.putString("settingsKey", settingsKey);
+ args.putInt("dialogTitle", dialogTitle);
+ frag.setArguments(args);
+ return frag;
+ }
+
+ ScreenOffGesture getOwner() {
+ return (ScreenOffGesture) getTargetFragment();
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ int id = getArguments().getInt("id");
+ final String settingsKey = getArguments().getString("settingsKey");
+ int dialogTitle = getArguments().getInt("dialogTitle");
+ switch (id) {
+ case DLG_SHOW_ACTION_DIALOG:
+ if (sFinalActionDialogArray == null) {
+ return null;
+ }
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(dialogTitle)
+ .setNegativeButton(R.string.cancel, null)
+ .setItems(getOwner().sFinalActionDialogArray.entries,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ if (getOwner().sFinalActionDialogArray.values[item]
+ .equals(ActionConstants.ACTION_APP)) {
+ if (getOwner().mPicker != null) {
+ getOwner().mPendingSettingsKey = settingsKey;
+ getOwner().mPicker.pickShortcut(getOwner().getId());
+ }
+ } else {
+ getOwner().mScreenOffGestureSharedPreferences.edit()
+ .putString(settingsKey,
+ getOwner().sFinalActionDialogArray.values[item]).commit();
+ getOwner().reloadSettings();
+ }
+ }
+ })
+ .create();
+ case DLG_RESET_TO_DEFAULT:
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.reset)
+ .setMessage(R.string.reset_message)
+ .setNegativeButton(R.string.cancel, null)
+ .setPositiveButton(R.string.dlg_ok,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ getOwner().resetToDefault();
+ }
+ })
+ .create();
+ }
+ throw new IllegalArgumentException("unknown id " + id);
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ }
+ }
+
+}
diff --git a/DeviceHandler/src/com/slim/device/settings/ScreenOffGestureSettings.java b/DeviceHandler/src/com/slim/device/settings/ScreenOffGestureSettings.java
new file mode 100644
index 0000000..d2276c5
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/settings/ScreenOffGestureSettings.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2014 Slimroms
+ *
+ * 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.
+ */
+
+package com.slim.device.settings;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.MenuItem;
+
+public class ScreenOffGestureSettings extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getFragmentManager().beginTransaction().replace(android.R.id.content,
+ new ScreenOffGesture()).commit();
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+}
diff --git a/DeviceHandler/src/com/slim/device/settings/SliderSettings.java b/DeviceHandler/src/com/slim/device/settings/SliderSettings.java
new file mode 100644
index 0000000..ec16387
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/settings/SliderSettings.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 The CyanogenMod 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.
+ */
+
+package com.slim.device.settings;
+
+import android.app.ActionBar;
+import android.os.Bundle;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.Preference.OnPreferenceChangeListener;
+import androidx.preference.PreferenceActivity;
+import androidx.preference.SwitchPreference;
+import android.view.MenuItem;
+
+import com.slim.device.KernelControl;
+import com.slim.device.R;
+import com.slim.device.util.FileUtils;
+
+public class SliderSettings extends PreferenceActivity
+ implements Preference.OnPreferenceChangeListener {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.slider_panel);
+
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ private void setSummary(ListPreference preference, String file) {
+ String keyCode;
+ if ((keyCode = FileUtils.readOneLine(file)) != null) {
+ preference.setValue(keyCode);
+ preference.setSummary(preference.getEntry());
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ return false;
+ /*
+ final String file;
+ if (preference == mSliderTop) {
+ file = KernelControl.KEYCODE_SLIDER_TOP;
+ } else if (preference == mSliderMiddle) {
+ file = KernelControl.KEYCODE_SLIDER_MIDDLE;
+ } else if (preference == mSliderBottom) {
+ file = KernelControl.KEYCODE_SLIDER_BOTTOM;
+ } else {
+ return false;
+ }
+
+ FileUtils.writeLine(file, (String) newValue);
+ setSummary((ListPreference) preference, file);
+
+ return true;
+ */
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Remove padding around the listview
+ getListView().setPadding(0, 0, 0, 0);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ finish();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+}
diff --git a/DeviceHandler/src/com/slim/device/util/FileUtils.java b/DeviceHandler/src/com/slim/device/util/FileUtils.java
new file mode 100644
index 0000000..18d2268
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/util/FileUtils.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2013 The CyanogenMod 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.
+ */
+
+package com.slim.device.util;
+
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+
+public final class FileUtils {
+ private static final String TAG = "FileUtils";
+
+ private FileUtils() {
+ // this class is not supposed to be instantiated
+ }
+
+ /**
+ * Reads the first line of text from the given file
+ */
+ public static String readOneLine(String fileName) {
+ String line = null;
+ BufferedReader reader = null;
+
+ try {
+ reader = new BufferedReader(new FileReader(fileName), 512);
+ line = reader.readLine();
+ } catch (IOException e) {
+ Log.e(TAG, "Could not read from file " + fileName, e);
+ } finally {
+ try {
+ if (reader != null) {
+ reader.close();
+ }
+ } catch (IOException e) {
+ // ignored, not much we can do anyway
+ }
+ }
+
+ return line;
+ }
+
+ /**
+ * Writes the given value into the given file
+ *
+ * @return true on success, false on failure
+ */
+ public static boolean writeLine(String fileName, String value) {
+ try {
+ FileOutputStream fos = new FileOutputStream(fileName);
+ fos.write(value.getBytes());
+ fos.flush();
+ fos.close();
+ } catch (IOException e) {
+ Log.e(TAG, "Could not write to file " + fileName, e);
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/DeviceHandler/src/com/slim/device/util/ShortcutPickerHelper.java b/DeviceHandler/src/com/slim/device/util/ShortcutPickerHelper.java
new file mode 100644
index 0000000..791e746
--- /dev/null
+++ b/DeviceHandler/src/com/slim/device/util/ShortcutPickerHelper.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2011 The CyanogenMod 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.
+ */
+
+package com.slim.device.util;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Intent;
+import android.content.Intent.ShortcutIconResource;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.util.Log;
+
+import com.slim.device.R;
+
+import com.android.internal.util.gzosp.AppHelper;
+
+import java.util.ArrayList;
+
+public class ShortcutPickerHelper {
+
+ public static final int REQUEST_PICK_SHORTCUT = 100;
+ public static final int REQUEST_PICK_APPLICATION = 101;
+ public static final int REQUEST_CREATE_SHORTCUT = 102;
+
+ private Activity mParent;
+ private OnPickListener mListener;
+ private PackageManager mPackageManager;
+ private int lastFragmentId;
+
+ public interface OnPickListener {
+ void shortcutPicked(String uri, String friendlyName, Bitmap bmp, boolean isApplication);
+ }
+
+ public ShortcutPickerHelper(Activity parent, OnPickListener listener) {
+ mParent = parent;
+ mPackageManager = mParent.getPackageManager();
+ mListener = listener;
+ }
+
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == Activity.RESULT_OK) {
+ switch (requestCode) {
+ case REQUEST_PICK_APPLICATION:
+ completeSetCustomApp(data);
+ break;
+ case REQUEST_CREATE_SHORTCUT:
+ completeSetCustomShortcut(data);
+ break;
+ case REQUEST_PICK_SHORTCUT:
+ processShortcut(data, REQUEST_PICK_APPLICATION, REQUEST_CREATE_SHORTCUT);
+ break;
+ }
+ }
+ }
+
+ public void pickShortcut(int fragmentId) {
+ pickShortcut(fragmentId, false);
+ }
+
+ public void pickShortcut(int fragmentId, boolean fullAppsOnly) {
+ lastFragmentId = fragmentId;
+
+ if (fullAppsOnly) {
+ Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+ mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+ Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
+ pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent);
+ startFragmentOrActivity(pickIntent, REQUEST_PICK_APPLICATION);
+ } else {
+ Bundle bundle = new Bundle();
+
+ ArrayList<String> shortcutNames = new ArrayList<String>();
+ shortcutNames.add(mParent.getString(R.string.group_applications));
+ bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames);
+
+ ArrayList<ShortcutIconResource> shortcutIcons = new ArrayList<ShortcutIconResource>();
+ shortcutIcons.add(ShortcutIconResource.fromContext(mParent,
+ android.R.drawable.sym_def_app_icon));
+ bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons);
+
+ Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
+ pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT));
+ pickIntent.putExtra(Intent.EXTRA_TITLE, mParent.getText(
+ R.string.select_custom_app_title));
+ pickIntent.putExtras(bundle);
+ startFragmentOrActivity(pickIntent, REQUEST_PICK_SHORTCUT);
+ }
+ }
+
+ private void startFragmentOrActivity(Intent pickIntent, int requestCode) {
+ if (lastFragmentId == 0) {
+ mParent.startActivityForResult(pickIntent, requestCode);
+ } else {
+ Fragment cFrag = mParent.getFragmentManager().findFragmentById(lastFragmentId);
+ if (cFrag != null) {
+ mParent.startActivityFromFragment(cFrag, pickIntent, requestCode);
+ }
+ }
+ }
+
+ private void processShortcut(Intent intent,
+ int requestCodeApplication, int requestCodeShortcut) {
+ // Handle case where user selected "Applications"
+ String applicationName = mParent.getResources().getString(R.string.group_applications);
+ String shortcutName = intent.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+
+ if (applicationName != null && applicationName.equals(shortcutName)) {
+ Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+ mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+ Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
+ pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent);
+ startFragmentOrActivity(pickIntent, requestCodeApplication);
+ } else {
+ startFragmentOrActivity(intent, requestCodeShortcut);
+ }
+ }
+
+ private void completeSetCustomApp(Intent data) {
+ mListener.shortcutPicked(data.toUri(0),
+ AppHelper.getFriendlyActivityName(mParent, mPackageManager, data, false), null, true);
+ }
+
+ private void completeSetCustomShortcut(Intent data) {
+ Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+ /* preserve shortcut name, we want to restore it later */
+ intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, data.getStringExtra(
+ Intent.EXTRA_SHORTCUT_NAME));
+ String appUri = intent.toUri(0);
+ appUri = appUri.replaceAll("com.android.contacts.action.QUICK_CONTACT",
+ "android.intent.action.VIEW");
+
+ // Check if icon is present
+ Bitmap bmp = null;
+ Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
+ if (extra != null && extra instanceof Bitmap) {
+ bmp = (Bitmap) extra;
+ }
+ // No icon till now check if icon resource is present
+ if (bmp == null) {
+ extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE);
+ if (extra != null && extra instanceof Intent.ShortcutIconResource) {
+ try {
+ Intent.ShortcutIconResource iconResource = (ShortcutIconResource) extra;
+ Resources resources =
+ mPackageManager.getResourcesForApplication(iconResource.packageName);
+ final int id = resources.getIdentifier(iconResource.resourceName, null, null);
+ bmp = BitmapFactory.decodeResource(resources, id);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ mListener.shortcutPicked(appUri,
+ AppHelper.getFriendlyShortcutName(mParent, mPackageManager, intent), bmp, false);
+ }
+
+}
diff --git a/common.mk b/common.mk
index 336d628..8b1890d 100644
--- a/common.mk
+++ b/common.mk
@@ -17,10 +17,11 @@
# overlays
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
-## DevicHandler
-#PRODUCT_PACKAGES += \
-# DeviceHandler
+# DevicHandler
+PRODUCT_PACKAGES += \
+ DeviceHandler
# Recovery
PRODUCT_PACKAGES += \
librecovery_updater_oppo
+