summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/arrays.xml19
-rw-r--r--res/values/strings.xml31
-rw-r--r--res/xml/gestures_prefs.xml72
-rw-r--r--res/xml/language_settings.xml5
-rw-r--r--src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java8
-rw-r--r--src/com/android/settings/inputmethod/StylusGestures.java220
6 files changed, 355 insertions, 0 deletions
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index c70cf13..fe91287 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1282,5 +1282,24 @@
<item>2</item>
</string-array>
+ <!-- Stylus Gestures -->
+ <string-array name="gestures_entries" translatable="false">
+ <item>@string/gestures_action_empty</item>
+ <item>@string/gestures_action_home</item>
+ <item>@string/gestures_action_back</item>
+ <item>@string/gestures_action_menu</item>
+ <item>@string/gestures_action_search</item>
+ <item>@string/gestures_action_recent</item>
+ </string-array>
+
+ <string-array name="gestures_values" translatable="false">
+ <item>1000</item>
+ <item>1001</item>
+ <item>1002</item>
+ <item>1003</item>
+ <item>1004</item>
+ <item>1005</item>
+ </string-array>
+
<!-- **** CYANOGENMOD ADDITIONS END **** -->
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7314c6a..e2c5260 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5216,5 +5216,36 @@
<string name="pie_control_trigger_top">Top screen border</string>
<string name="pie_control_trigger_top_summary">Only navigation will be displayed at top</string>
+ <!-- Stylus Gestures -->
+ <string name="gestures_settings_title">Stylus gestures</string>
+ <string name="category_spen_title">Stylus gestures</string>
+ <string name="enable_subcat_title">Stylus</string>
+ <string name="enable_spen_title_head">Enable stylus gestures</string>
+ <string name="enable_spen_summary_head">Launch custom actions with stylus button swipe gestures. Warning: apps will not be able to receive input fired by holding the stylus button</string>
+ <string name="gestures_subcat_title">Gestures</string>
+ <string name="gestures_left_spen_title_head">Left swipe</string>
+ <string name="gestures_left_spen_summary_head">Launch custom action on left swipe</string>
+ <string name="gestures_right_spen_title_head">Right swipe</string>
+ <string name="gestures_right_spen_summary_head">Launch custom action on right swipe</string>
+ <string name="gestures_up_spen_title_head">Up swipe</string>
+ <string name="gestures_up_spen_summary_head">Launch custom action on up swipe</string>
+ <string name="gestures_down_spen_title_head">Down swipe</string>
+ <string name="gestures_down_spen_summary_head">Launch custom action on down swipe</string>
+ <string name="gestures_long_spen_title_head">Long press</string>
+ <string name="gestures_long_spen_summary_head">Launch custom action on long press</string>
+ <string name="gestures_double_spen_title_head">Double tap</string>
+ <string name="gestures_double_spen_summary_head">Launch custom action on double tap</string>
+
+ <!-- Gestures Options -->
+ <string name="gestures_action_empty">No action</string>
+ <string name="gestures_action_home">Emulate home key</string>
+ <string name="gestures_action_back">Emulate back key</string>
+ <string name="gestures_action_menu">Emulate menu key</string>
+ <string name="gestures_action_search">Invoke search</string>
+ <string name="gestures_action_recent">Recent apps</string>
+
+ <!-- stylus gestures support -->
+ <string name="stylus_app_not_installed">%s is not installed</string>
+
<!-- **** CYANOGENMOD ADDITIONS END **** -->
</resources>
diff --git a/res/xml/gestures_prefs.xml b/res/xml/gestures_prefs.xml
new file mode 100644
index 0000000..7e3df8d
--- /dev/null
+++ b/res/xml/gestures_prefs.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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/enable_subcat_title" >
+
+ <!-- Enable -->
+ <CheckBoxPreference
+ android:key="enable_spen"
+ android:summary="@string/enable_spen_summary_head"
+ android:title="@string/enable_spen_title_head" />
+ </PreferenceCategory>
+ <!-- Gesture Actions -->
+ <PreferenceCategory android:title="@string/gestures_subcat_title" >
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_left"
+ android:persistent="false"
+ android:title="@string/gestures_left_spen_title_head" />
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_right"
+ android:persistent="false"
+ android:title="@string/gestures_right_spen_title_head" />
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_up"
+ android:persistent="false"
+ android:title="@string/gestures_up_spen_title_head" />
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_down"
+ android:persistent="false"
+ android:title="@string/gestures_down_spen_title_head" />
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_long"
+ android:persistent="false"
+ android:title="@string/gestures_long_spen_title_head" />
+ <ListPreference
+ android:dependency="enable_spen"
+ android:entries="@array/gestures_entries"
+ android:entryValues="@array/gestures_values"
+ android:key="gestures_double"
+ android:persistent="false"
+ android:title="@string/gestures_double_spen_title_head" />
+ </PreferenceCategory>
+
+</PreferenceScreen> \ No newline at end of file
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index fafca6d..a1050ac 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -101,6 +101,11 @@
<PreferenceCategory android:key="pointer_settings_category"
android:title="@string/pointer_settings_category">
+ <PreferenceScreen
+ android:fragment="com.android.settings.inputmethod.StylusGestures"
+ android:key="stylus_gestures"
+ android:title="@string/gestures_settings_title" />
+
<com.android.settings.PointerSpeedPreference
android:key="pointer_speed"
android:title="@string/pointer_speed"
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 146562e..dcbe1d3 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -63,6 +63,9 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
private static final String KEY_IME_SWITCHER = "status_bar_ime_switcher";
private static final String KEY_VOLUME_KEY_CURSOR_CONTROL = "volume_key_cursor_control";
private static final String KEY_STYLUS_ICON_ENABLED = "stylus_icon_enabled";
+ private static final String VOLUME_KEY_CURSOR_CONTROL = "volume_key_cursor_control";
+ private static final String KEY_STYLUS_GESTURES = "stylus_gestures";
+
// false: on ICS or later
private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false;
@@ -186,6 +189,11 @@ public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
}
mStylusIconEnabled = (CheckBoxPreference) findPreference(KEY_STYLUS_ICON_ENABLED);
+ // remove stylus preference for non stylus devices
+ if (!getResources().getBoolean(com.android.internal.R.bool.config_stylusGestures)) {
+ getPreferenceScreen().removePreference(findPreference(KEY_STYLUS_GESTURES));
+ mStylusIconEnabled = null;
+ }
// Spell Checker
final Intent intent = new Intent(Intent.ACTION_MAIN);
diff --git a/src/com/android/settings/inputmethod/StylusGestures.java b/src/com/android/settings/inputmethod/StylusGestures.java
new file mode 100644
index 0000000..908d7ea
--- /dev/null
+++ b/src/com/android/settings/inputmethod/StylusGestures.java
@@ -0,0 +1,220 @@
+/* Copyright (C) 2012 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.android.settings.inputmethod;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import java.util.Collections;
+import java.util.List;
+
+public class StylusGestures extends SettingsPreferenceFragment implements
+ Preference.OnPreferenceChangeListener {
+
+ public static final String TAG = "Stylus Gestures";
+ public static final String KEY_SPEN_ENABLE = "enable_spen";
+ public static final String KEY_SPEN_LEFT = "gestures_left";
+ public static final String KEY_SPEN_RIGHT = "gestures_right";
+ public static final String KEY_SPEN_UP = "gestures_up";
+ public static final String KEY_SPEN_DOWN = "gestures_down";
+ public static final String KEY_SPEN_LONG = "gestures_long";
+ public static final String KEY_SPEN_DOUBLE = "gestures_double";
+ public static final int KEY_NO_ACTION = 1000;
+ public static final String TEXT_NO_ACTION = "No Action";
+
+ private CheckBoxPreference mEnableGestures;
+ private ListPreference mSwipeLeft;
+ private ListPreference mSwipeRight;
+ private ListPreference mSwipeUp;
+ private ListPreference mSwipeDown;
+ private ListPreference mSwipeLong;
+ private ListPreference mSwipeDouble;
+
+ private Context mContext;
+ private ContentResolver mResolver;
+
+ private String[] mActionNames;
+ private String[] mActionValues;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.gestures_prefs);
+ mContext = getActivity();
+ mResolver = getContentResolver();
+
+ Resources resources = mContext.getResources();
+ mActionNames = resources.getStringArray(R.array.gestures_entries);
+ mActionValues = resources.getStringArray(R.array.gestures_values);
+
+ // Setup the preferences
+ mEnableGestures = (CheckBoxPreference) findPreference(KEY_SPEN_ENABLE);
+ mEnableGestures.setChecked(Settings.System.getInt(mResolver,
+ Settings.System.ENABLE_STYLUS_GESTURES, 0) == 1);
+
+ // Setup the gestures
+ mSwipeLeft = setupGesturePref(KEY_SPEN_LEFT, Settings.System.GESTURES_LEFT_SWIPE);
+ mSwipeRight = setupGesturePref(KEY_SPEN_RIGHT, Settings.System.GESTURES_RIGHT_SWIPE);
+ mSwipeUp = setupGesturePref(KEY_SPEN_UP, Settings.System.GESTURES_UP_SWIPE);
+ mSwipeDown = setupGesturePref(KEY_SPEN_DOWN, Settings.System.GESTURES_DOWN_SWIPE);
+ mSwipeLong = setupGesturePref(KEY_SPEN_LONG, Settings.System.GESTURES_LONG_PRESS);
+ mSwipeDouble = setupGesturePref(KEY_SPEN_DOUBLE, Settings.System.GESTURES_DOUBLE_TAP);
+ }
+
+ private ListPreference setupGesturePref(String key, String settingName) {
+ ListPreference pref = (ListPreference) findPreference(key);
+ String setting = Settings.System.getString(mResolver, settingName);
+ addApplicationEntries(pref, setting);
+ pref.setOnPreferenceChangeListener(this);
+ return pref;
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+ if (preference == mEnableGestures) {
+ Settings.System.putInt(mResolver,
+ Settings.System.ENABLE_STYLUS_GESTURES,
+ ((CheckBoxPreference) preference).isChecked() ? 1 : 0);
+ return true;
+ }
+ return super.onPreferenceTreeClick(preferenceScreen, preference);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ String settingName = null;
+
+ if (preference == mSwipeLeft) {
+ settingName = Settings.System.GESTURES_LEFT_SWIPE;
+ } else if (preference == mSwipeRight) {
+ settingName = Settings.System.GESTURES_RIGHT_SWIPE;
+ } else if (preference == mSwipeUp) {
+ settingName = Settings.System.GESTURES_UP_SWIPE;
+ } else if (preference == mSwipeDown) {
+ settingName = Settings.System.GESTURES_DOWN_SWIPE;
+ } else if (preference == mSwipeLong) {
+ settingName = Settings.System.GESTURES_LONG_PRESS;
+ } else if (preference == mSwipeDouble) {
+ settingName = Settings.System.GESTURES_DOUBLE_TAP;
+ } else {
+ return false;
+ }
+
+ String packageName = newValue.toString();
+ Settings.System.putString(mResolver, settingName, packageName);
+ setPrefValue((ListPreference)preference, packageName);
+ return true;
+ }
+
+ private String mapUpdateValue(String time) {
+ for (int i = 0; i < mActionValues.length; i++) {
+ if (mActionValues[i].equalsIgnoreCase(time)) {
+ return mActionNames[i];
+ }
+ }
+ return null;
+ }
+
+ private void setPrefValue(ListPreference pref, String packageName) {
+ if (packageName == null) {
+ return;
+ }
+ String text = mapUpdateValue(packageName);
+ if (text != null) {
+ pref.setValue(packageName);
+ pref.setSummary(text);
+ } else {
+ CharSequence appName = getAppName(packageName);
+ if (appName != null) {
+ pref.setValue(packageName);
+ pref.setSummary(appName);
+ } else {
+ pref.setSummary(mContext.getString(R.string.stylus_app_not_installed,
+ packageName));
+ }
+ }
+
+ }
+
+ private void addApplicationEntries(ListPreference pref, String packageName) {
+ PackageManager pm = getPackageManager();
+
+ Intent intent = new Intent(Intent.ACTION_MAIN, null);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ List<ResolveInfo> list = pm.queryIntentActivities(intent,
+ PackageManager.PERMISSION_GRANTED);
+
+ Collections.sort(list, new ResolveInfo.DisplayNameComparator(pm));
+
+ int count = list.size() + mActionValues.length;
+ CharSequence[] entries = new CharSequence[count];
+ CharSequence[] values = new CharSequence[count];
+
+ // Step 1: copy in predefined actions
+ for (int i = 0; i < mActionValues.length; i++) {
+ entries[i] = mActionNames[i];
+ values[i] = mActionValues[i];
+ }
+
+ // Step 2: copy in resolved activities
+ for (int i = mActionValues.length; i < count; i++) {
+ ResolveInfo info = list.get(i - mActionValues.length);
+ CharSequence label = info.loadLabel(pm);
+ if (label == null) {
+ label = info.activityInfo.name;
+ }
+
+ entries[i] = label;
+ values[i] = info.activityInfo.applicationInfo.packageName;
+ }
+
+ pref.setEntries(entries);
+ pref.setEntryValues(values);
+ setPrefValue(pref, packageName);
+ }
+
+ private CharSequence getAppName(String packageName) {
+ final PackageManager pm = mContext.getPackageManager();
+ ApplicationInfo ai;
+
+ try {
+ ai = pm.getApplicationInfo(packageName, 0);
+ } catch (final NameNotFoundException e) {
+ ai = null;
+ }
+
+ if (ai != null) {
+ return pm.getApplicationLabel(ai);
+ }
+ return null;
+ }
+}