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