DebugSettings.java revision a270ac4a61ff64f5d262a212b0bf4c128d3ce8d7
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.inputmethod.latin.settings; 18 19import android.content.Intent; 20import android.content.SharedPreferences; 21import android.content.res.Resources; 22import android.os.Bundle; 23import android.os.Process; 24import android.preference.Preference; 25import android.preference.Preference.OnPreferenceClickListener; 26import android.preference.PreferenceFragment; 27import android.preference.PreferenceGroup; 28import android.preference.PreferenceScreen; 29import android.preference.TwoStatePreference; 30 31import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver; 32import com.android.inputmethod.latin.DictionaryFacilitator; 33import com.android.inputmethod.latin.R; 34import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug; 35import com.android.inputmethod.latin.utils.ApplicationUtils; 36import com.android.inputmethod.latin.utils.ResourceUtils; 37 38public final class DebugSettings extends PreferenceFragment 39 implements SharedPreferences.OnSharedPreferenceChangeListener { 40 41 public static final String PREF_DEBUG_MODE = "debug_mode"; 42 public static final String PREF_FORCE_NON_DISTINCT_MULTITOUCH = "force_non_distinct_multitouch"; 43 public static final String PREF_KEY_PREVIEW_SHOW_UP_START_SCALE = 44 "pref_key_preview_show_up_start_scale"; 45 public static final String PREF_KEY_PREVIEW_DISMISS_END_SCALE = 46 "pref_key_preview_dismiss_end_scale"; 47 public static final String PREF_KEY_PREVIEW_SHOW_UP_DURATION = 48 "pref_key_preview_show_up_duration"; 49 public static final String PREF_KEY_PREVIEW_DISMISS_DURATION = 50 "pref_key_preview_dismiss_duration"; 51 private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary"; 52 private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries"; 53 private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries"; 54 private static final String DICT_NAME_KEY_FOR_EXTRAS = "dict_name"; 55 public static final String PREF_SLIDING_KEY_INPUT_PREVIEW = "pref_sliding_key_input_preview"; 56 public static final String PREF_KEY_LONGPRESS_TIMEOUT = "pref_key_longpress_timeout"; 57 58 private boolean mServiceNeedsRestart = false; 59 private TwoStatePreference mDebugMode; 60 61 @Override 62 public void onCreate(Bundle icicle) { 63 super.onCreate(icicle); 64 addPreferencesFromResource(R.xml.prefs_screen_debug); 65 TwoStatePreferenceHelper.replaceCheckBoxPreferencesBySwitchPreferences( 66 getPreferenceScreen()); 67 SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 68 prefs.registerOnSharedPreferenceChangeListener(this); 69 70 final PreferenceScreen readExternalDictionary = 71 (PreferenceScreen) findPreference(PREF_READ_EXTERNAL_DICTIONARY); 72 if (null != readExternalDictionary) { 73 readExternalDictionary.setOnPreferenceClickListener( 74 new Preference.OnPreferenceClickListener() { 75 @Override 76 public boolean onPreferenceClick(final Preference arg0) { 77 ExternalDictionaryGetterForDebug.chooseAndInstallDictionary( 78 getActivity()); 79 mServiceNeedsRestart = true; 80 return true; 81 } 82 }); 83 } 84 85 final PreferenceGroup dictDumpPreferenceGroup = 86 (PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS); 87 final OnPreferenceClickListener dictDumpPrefClickListener = 88 new DictDumpPrefClickListener(this); 89 for (final String dictName : DictionaryFacilitator.DICT_TYPE_TO_CLASS.keySet()) { 90 final Preference preference = new Preference(getActivity()); 91 preference.setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName); 92 preference.setTitle("Dump " + dictName + " dictionary"); 93 preference.setOnPreferenceClickListener(dictDumpPrefClickListener); 94 preference.getExtras().putString(DICT_NAME_KEY_FOR_EXTRAS, dictName); 95 dictDumpPreferenceGroup.addPreference(preference); 96 } 97 final Resources res = getResources(); 98 setupKeyLongpressTimeoutSettings(prefs, res); 99 setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_DURATION, 100 res.getInteger(R.integer.config_key_preview_show_up_duration)); 101 setupKeyPreviewAnimationDuration(prefs, res, PREF_KEY_PREVIEW_DISMISS_DURATION, 102 res.getInteger(R.integer.config_key_preview_dismiss_duration)); 103 setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_SHOW_UP_START_SCALE, 104 ResourceUtils.getFloatFromFraction( 105 res, R.fraction.config_key_preview_show_up_start_scale)); 106 setupKeyPreviewAnimationScale(prefs, res, PREF_KEY_PREVIEW_DISMISS_END_SCALE, 107 ResourceUtils.getFloatFromFraction( 108 res, R.fraction.config_key_preview_dismiss_end_scale)); 109 110 mServiceNeedsRestart = false; 111 mDebugMode = (TwoStatePreference) findPreference(PREF_DEBUG_MODE); 112 updateDebugMode(); 113 } 114 115 private static class DictDumpPrefClickListener implements OnPreferenceClickListener { 116 final PreferenceFragment mPreferenceFragment; 117 118 public DictDumpPrefClickListener(final PreferenceFragment preferenceFragment) { 119 mPreferenceFragment = preferenceFragment; 120 } 121 122 @Override 123 public boolean onPreferenceClick(final Preference arg0) { 124 final String dictName = arg0.getExtras().getString(DICT_NAME_KEY_FOR_EXTRAS); 125 if (dictName != null) { 126 final Intent intent = 127 new Intent(DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION); 128 intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName); 129 mPreferenceFragment.getActivity().sendBroadcast(intent); 130 } 131 return true; 132 } 133 } 134 135 @Override 136 public void onStop() { 137 super.onStop(); 138 if (mServiceNeedsRestart) { 139 Process.killProcess(Process.myPid()); 140 } 141 } 142 143 @Override 144 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 145 if (key.equals(PREF_DEBUG_MODE) && mDebugMode != null) { 146 mDebugMode.setChecked(prefs.getBoolean(PREF_DEBUG_MODE, false)); 147 updateDebugMode(); 148 mServiceNeedsRestart = true; 149 return; 150 } 151 if (key.equals(PREF_FORCE_NON_DISTINCT_MULTITOUCH)) { 152 mServiceNeedsRestart = true; 153 return; 154 } 155 } 156 157 private void updateDebugMode() { 158 if (mDebugMode == null) { 159 return; 160 } 161 boolean isDebugMode = mDebugMode.isChecked(); 162 final String version = getResources().getString( 163 R.string.version_text, ApplicationUtils.getVersionName(getActivity())); 164 if (!isDebugMode) { 165 mDebugMode.setTitle(version); 166 mDebugMode.setSummary(""); 167 } else { 168 mDebugMode.setTitle(getResources().getString(R.string.prefs_debug_mode)); 169 mDebugMode.setSummary(version); 170 } 171 } 172 173 private void setupKeyLongpressTimeoutSettings(final SharedPreferences sp, 174 final Resources res) { 175 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( 176 PREF_KEY_LONGPRESS_TIMEOUT); 177 if (pref == null) { 178 return; 179 } 180 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 181 @Override 182 public void writeValue(final int value, final String key) { 183 sp.edit().putInt(key, value).apply(); 184 } 185 186 @Override 187 public void writeDefaultValue(final String key) { 188 sp.edit().remove(key).apply(); 189 } 190 191 @Override 192 public int readValue(final String key) { 193 return Settings.readKeyLongpressTimeout(sp, res); 194 } 195 196 @Override 197 public int readDefaultValue(final String key) { 198 return Settings.readDefaultKeyLongpressTimeout(res); 199 } 200 201 @Override 202 public String getValueText(final int value) { 203 return res.getString(R.string.abbreviation_unit_milliseconds, value); 204 } 205 206 @Override 207 public void feedbackValue(final int value) {} 208 }); 209 } 210 211 private void setupKeyPreviewAnimationScale(final SharedPreferences sp, final Resources res, 212 final String prefKey, final float defaultValue) { 213 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 214 if (pref == null) { 215 return; 216 } 217 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 218 private static final float PERCENTAGE_FLOAT = 100.0f; 219 220 private float getValueFromPercentage(final int percentage) { 221 return percentage / PERCENTAGE_FLOAT; 222 } 223 224 private int getPercentageFromValue(final float floatValue) { 225 return (int)(floatValue * PERCENTAGE_FLOAT); 226 } 227 228 @Override 229 public void writeValue(final int value, final String key) { 230 sp.edit().putFloat(key, getValueFromPercentage(value)).apply(); 231 } 232 233 @Override 234 public void writeDefaultValue(final String key) { 235 sp.edit().remove(key).apply(); 236 } 237 238 @Override 239 public int readValue(final String key) { 240 return getPercentageFromValue( 241 Settings.readKeyPreviewAnimationScale(sp, key, defaultValue)); 242 } 243 244 @Override 245 public int readDefaultValue(final String key) { 246 return getPercentageFromValue(defaultValue); 247 } 248 249 @Override 250 public String getValueText(final int value) { 251 if (value < 0) { 252 return res.getString(R.string.settings_system_default); 253 } 254 return String.format("%d%%", value); 255 } 256 257 @Override 258 public void feedbackValue(final int value) {} 259 }); 260 } 261 262 private void setupKeyPreviewAnimationDuration(final SharedPreferences sp, final Resources res, 263 final String prefKey, final int defaultValue) { 264 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 265 if (pref == null) { 266 return; 267 } 268 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 269 @Override 270 public void writeValue(final int value, final String key) { 271 sp.edit().putInt(key, value).apply(); 272 } 273 274 @Override 275 public void writeDefaultValue(final String key) { 276 sp.edit().remove(key).apply(); 277 } 278 279 @Override 280 public int readValue(final String key) { 281 return Settings.readKeyPreviewAnimationDuration(sp, key, defaultValue); 282 } 283 284 @Override 285 public int readDefaultValue(final String key) { 286 return defaultValue; 287 } 288 289 @Override 290 public String getValueText(final int value) { 291 return res.getString(R.string.abbreviation_unit_milliseconds, value); 292 } 293 294 @Override 295 public void feedbackValue(final int value) {} 296 }); 297 } 298} 299