DebugSettingsFragment.java revision c225d2e29cfd85fb416952daa4bcebd4df48b57c
1/* 2 * Copyright (C) 2014 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.Context; 20import android.content.Intent; 21import android.content.SharedPreferences; 22import android.content.res.Resources; 23import android.os.Bundle; 24import android.os.Process; 25import android.preference.Preference; 26import android.preference.Preference.OnPreferenceClickListener; 27import android.preference.PreferenceGroup; 28import android.preference.TwoStatePreference; 29 30import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver; 31import com.android.inputmethod.latin.DictionaryFacilitator; 32import com.android.inputmethod.latin.R; 33import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug; 34import com.android.inputmethod.latin.utils.ApplicationUtils; 35import com.android.inputmethod.latin.utils.ResourceUtils; 36 37import java.util.Locale; 38 39/** 40 * "Debug mode" settings sub screen. 41 * 42 * This settings sub screen handles a several preference options for debugging. 43 */ 44public final class DebugSettingsFragment extends SubScreenFragment 45 implements OnPreferenceClickListener { 46 private static final String PREF_READ_EXTERNAL_DICTIONARY = "read_external_dictionary"; 47 private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries"; 48 private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries"; 49 50 private boolean mServiceNeedsRestart = false; 51 private Preference mReadExternalDictionaryPref; 52 private TwoStatePreference mDebugMode; 53 54 @Override 55 public void onCreate(Bundle icicle) { 56 super.onCreate(icicle); 57 addPreferencesFromResource(R.xml.prefs_screen_debug); 58 59 if (!Settings.HAS_UI_TO_ACCEPT_TYPED_WORD) { 60 removePreference(DebugSettings.PREF_SHOW_UI_TO_ACCEPT_TYPED_WORD); 61 } 62 63 mReadExternalDictionaryPref = findPreference(PREF_READ_EXTERNAL_DICTIONARY); 64 if (mReadExternalDictionaryPref != null) { 65 mReadExternalDictionaryPref.setOnPreferenceClickListener(this); 66 } 67 68 final PreferenceGroup dictDumpPreferenceGroup = 69 (PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS); 70 for (final String dictName : DictionaryFacilitator.DICT_TYPE_TO_CLASS.keySet()) { 71 final Preference pref = new DictDumpPreference(getActivity(), dictName); 72 pref.setOnPreferenceClickListener(this); 73 dictDumpPreferenceGroup.addPreference(pref); 74 } 75 final Resources res = getResources(); 76 setupKeyLongpressTimeoutSettings(); 77 setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION, 78 res.getInteger(R.integer.config_key_preview_show_up_duration)); 79 setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION, 80 res.getInteger(R.integer.config_key_preview_dismiss_duration)); 81 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_SCALE, 82 ResourceUtils.getFloatFromFraction( 83 res, R.fraction.config_key_preview_show_up_start_scale)); 84 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_SCALE, 85 ResourceUtils.getFloatFromFraction( 86 res, R.fraction.config_key_preview_dismiss_end_scale)); 87 88 mServiceNeedsRestart = false; 89 mDebugMode = (TwoStatePreference) findPreference(DebugSettings.PREF_DEBUG_MODE); 90 updateDebugMode(); 91 } 92 93 private static class DictDumpPreference extends Preference { 94 public final String mDictName; 95 96 public DictDumpPreference(final Context context, final String dictName) { 97 super(context); 98 setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName); 99 setTitle("Dump " + dictName + " dictionary"); 100 mDictName = dictName; 101 } 102 } 103 104 @Override 105 public boolean onPreferenceClick(final Preference pref) { 106 final Context context = getActivity(); 107 if (pref == mReadExternalDictionaryPref) { 108 ExternalDictionaryGetterForDebug.chooseAndInstallDictionary(context); 109 mServiceNeedsRestart = true; 110 return true; 111 } 112 if (pref instanceof DictDumpPreference) { 113 final DictDumpPreference dictDumpPref = (DictDumpPreference)pref; 114 final String dictName = dictDumpPref.mDictName; 115 final Intent intent = new Intent( 116 DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION); 117 intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName); 118 context.sendBroadcast(intent); 119 return true; 120 } 121 return true; 122 } 123 124 @Override 125 public void onStop() { 126 super.onStop(); 127 if (mServiceNeedsRestart) { 128 Process.killProcess(Process.myPid()); 129 } 130 } 131 132 @Override 133 public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { 134 if (key.equals(DebugSettings.PREF_DEBUG_MODE) && mDebugMode != null) { 135 mDebugMode.setChecked(prefs.getBoolean(DebugSettings.PREF_DEBUG_MODE, false)); 136 updateDebugMode(); 137 mServiceNeedsRestart = true; 138 return; 139 } 140 if (key.equals(DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH) 141 || key.equals(DebugSettings.PREF_FORCE_PHYSICAL_KEYBOARD_SPECIAL_KEY)) { 142 mServiceNeedsRestart = true; 143 return; 144 } 145 } 146 147 private void updateDebugMode() { 148 boolean isDebugMode = mDebugMode.isChecked(); 149 final String version = getString( 150 R.string.version_text, ApplicationUtils.getVersionName(getActivity())); 151 if (!isDebugMode) { 152 mDebugMode.setTitle(version); 153 mDebugMode.setSummary(null); 154 } else { 155 mDebugMode.setTitle(getString(R.string.prefs_debug_mode)); 156 mDebugMode.setSummary(version); 157 } 158 } 159 160 private void setupKeyLongpressTimeoutSettings() { 161 final SharedPreferences prefs = getSharedPreferences(); 162 final Resources res = getResources(); 163 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( 164 DebugSettings.PREF_KEY_LONGPRESS_TIMEOUT); 165 if (pref == null) { 166 return; 167 } 168 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 169 @Override 170 public void writeValue(final int value, final String key) { 171 prefs.edit().putInt(key, value).apply(); 172 } 173 174 @Override 175 public void writeDefaultValue(final String key) { 176 prefs.edit().remove(key).apply(); 177 } 178 179 @Override 180 public int readValue(final String key) { 181 return Settings.readKeyLongpressTimeout(prefs, res); 182 } 183 184 @Override 185 public int readDefaultValue(final String key) { 186 return Settings.readDefaultKeyLongpressTimeout(res); 187 } 188 189 @Override 190 public String getValueText(final int value) { 191 return res.getString(R.string.abbreviation_unit_milliseconds, value); 192 } 193 194 @Override 195 public void feedbackValue(final int value) {} 196 }); 197 } 198 199 private void setupKeyPreviewAnimationScale(final String prefKey, final float defaultValue) { 200 final SharedPreferences prefs = getSharedPreferences(); 201 final Resources res = getResources(); 202 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 203 if (pref == null) { 204 return; 205 } 206 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 207 private static final float PERCENTAGE_FLOAT = 100.0f; 208 209 private float getValueFromPercentage(final int percentage) { 210 return percentage / PERCENTAGE_FLOAT; 211 } 212 213 private int getPercentageFromValue(final float floatValue) { 214 return (int)(floatValue * PERCENTAGE_FLOAT); 215 } 216 217 @Override 218 public void writeValue(final int value, final String key) { 219 prefs.edit().putFloat(key, getValueFromPercentage(value)).apply(); 220 } 221 222 @Override 223 public void writeDefaultValue(final String key) { 224 prefs.edit().remove(key).apply(); 225 } 226 227 @Override 228 public int readValue(final String key) { 229 return getPercentageFromValue( 230 Settings.readKeyPreviewAnimationScale(prefs, key, defaultValue)); 231 } 232 233 @Override 234 public int readDefaultValue(final String key) { 235 return getPercentageFromValue(defaultValue); 236 } 237 238 @Override 239 public String getValueText(final int value) { 240 if (value < 0) { 241 return res.getString(R.string.settings_system_default); 242 } 243 return String.format(Locale.ROOT, "%d%%", value); 244 } 245 246 @Override 247 public void feedbackValue(final int value) {} 248 }); 249 } 250 251 private void setupKeyPreviewAnimationDuration(final String prefKey, final int defaultValue) { 252 final SharedPreferences prefs = getSharedPreferences(); 253 final Resources res = getResources(); 254 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 255 if (pref == null) { 256 return; 257 } 258 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 259 @Override 260 public void writeValue(final int value, final String key) { 261 prefs.edit().putInt(key, value).apply(); 262 } 263 264 @Override 265 public void writeDefaultValue(final String key) { 266 prefs.edit().remove(key).apply(); 267 } 268 269 @Override 270 public int readValue(final String key) { 271 return Settings.readKeyPreviewAnimationDuration(prefs, key, defaultValue); 272 } 273 274 @Override 275 public int readDefaultValue(final String key) { 276 return defaultValue; 277 } 278 279 @Override 280 public String getValueText(final int value) { 281 return res.getString(R.string.abbreviation_unit_milliseconds, value); 282 } 283 284 @Override 285 public void feedbackValue(final int value) {} 286 }); 287 } 288} 289