diff options
-rw-r--r-- | res/values/arrays.xml | 19 | ||||
-rw-r--r-- | res/values/strings.xml | 31 | ||||
-rw-r--r-- | res/xml/gestures_prefs.xml | 72 | ||||
-rw-r--r-- | res/xml/language_settings.xml | 5 | ||||
-rw-r--r-- | src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java | 8 | ||||
-rw-r--r-- | src/com/android/settings/inputmethod/StylusGestures.java | 220 |
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; + } +} |