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 17 package com.android.inputmethod.latin.settings; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.content.SharedPreferences; 22 import android.content.res.Resources; 23 import android.os.Bundle; 24 import android.os.Process; 25 import android.preference.Preference; 26 import android.preference.Preference.OnPreferenceClickListener; 27 import android.preference.PreferenceGroup; 28 import android.preference.TwoStatePreference; 29 30 import com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver; 31 import com.android.inputmethod.latin.DictionaryFacilitator; 32 import com.android.inputmethod.latin.R; 33 import com.android.inputmethod.latin.debug.ExternalDictionaryGetterForDebug; 34 import com.android.inputmethod.latin.utils.ApplicationUtils; 35 import com.android.inputmethod.latin.utils.ResourceUtils; 36 37 import 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 */ 44 public 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 onCreate(Bundle icicle)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 final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction( 82 res, R.fraction.config_key_preview_show_up_start_scale); 83 final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction( 84 res, R.fraction.config_key_preview_dismiss_end_scale); 85 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE, 86 defaultKeyPreviewShowUpStartScale); 87 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE, 88 defaultKeyPreviewShowUpStartScale); 89 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE, 90 defaultKeyPreviewDismissEndScale); 91 setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE, 92 defaultKeyPreviewDismissEndScale); 93 94 mServiceNeedsRestart = false; 95 mDebugMode = (TwoStatePreference) findPreference(DebugSettings.PREF_DEBUG_MODE); 96 updateDebugMode(); 97 } 98 99 private static class DictDumpPreference extends Preference { 100 public final String mDictName; 101 DictDumpPreference(final Context context, final String dictName)102 public DictDumpPreference(final Context context, final String dictName) { 103 super(context); 104 setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName); 105 setTitle("Dump " + dictName + " dictionary"); 106 mDictName = dictName; 107 } 108 } 109 110 @Override onPreferenceClick(final Preference pref)111 public boolean onPreferenceClick(final Preference pref) { 112 final Context context = getActivity(); 113 if (pref == mReadExternalDictionaryPref) { 114 ExternalDictionaryGetterForDebug.chooseAndInstallDictionary(context); 115 mServiceNeedsRestart = true; 116 return true; 117 } 118 if (pref instanceof DictDumpPreference) { 119 final DictDumpPreference dictDumpPref = (DictDumpPreference)pref; 120 final String dictName = dictDumpPref.mDictName; 121 final Intent intent = new Intent( 122 DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION); 123 intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName); 124 context.sendBroadcast(intent); 125 return true; 126 } 127 return true; 128 } 129 130 @Override onStop()131 public void onStop() { 132 super.onStop(); 133 if (mServiceNeedsRestart) { 134 Process.killProcess(Process.myPid()); 135 } 136 } 137 138 @Override onSharedPreferenceChanged(final SharedPreferences prefs, final String key)139 public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { 140 if (key.equals(DebugSettings.PREF_DEBUG_MODE) && mDebugMode != null) { 141 mDebugMode.setChecked(prefs.getBoolean(DebugSettings.PREF_DEBUG_MODE, false)); 142 updateDebugMode(); 143 mServiceNeedsRestart = true; 144 return; 145 } 146 if (key.equals(DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH) 147 || key.equals(DebugSettings.PREF_FORCE_PHYSICAL_KEYBOARD_SPECIAL_KEY)) { 148 mServiceNeedsRestart = true; 149 return; 150 } 151 } 152 updateDebugMode()153 private void updateDebugMode() { 154 boolean isDebugMode = mDebugMode.isChecked(); 155 final String version = getString( 156 R.string.version_text, ApplicationUtils.getVersionName(getActivity())); 157 if (!isDebugMode) { 158 mDebugMode.setTitle(version); 159 mDebugMode.setSummary(null); 160 } else { 161 mDebugMode.setTitle(getString(R.string.prefs_debug_mode)); 162 mDebugMode.setSummary(version); 163 } 164 } 165 setupKeyLongpressTimeoutSettings()166 private void setupKeyLongpressTimeoutSettings() { 167 final SharedPreferences prefs = getSharedPreferences(); 168 final Resources res = getResources(); 169 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference( 170 DebugSettings.PREF_KEY_LONGPRESS_TIMEOUT); 171 if (pref == null) { 172 return; 173 } 174 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 175 @Override 176 public void writeValue(final int value, final String key) { 177 prefs.edit().putInt(key, value).apply(); 178 } 179 180 @Override 181 public void writeDefaultValue(final String key) { 182 prefs.edit().remove(key).apply(); 183 } 184 185 @Override 186 public int readValue(final String key) { 187 return Settings.readKeyLongpressTimeout(prefs, res); 188 } 189 190 @Override 191 public int readDefaultValue(final String key) { 192 return Settings.readDefaultKeyLongpressTimeout(res); 193 } 194 195 @Override 196 public String getValueText(final int value) { 197 return res.getString(R.string.abbreviation_unit_milliseconds, value); 198 } 199 200 @Override 201 public void feedbackValue(final int value) {} 202 }); 203 } 204 setupKeyPreviewAnimationScale(final String prefKey, final float defaultValue)205 private void setupKeyPreviewAnimationScale(final String prefKey, final float defaultValue) { 206 final SharedPreferences prefs = getSharedPreferences(); 207 final Resources res = getResources(); 208 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 209 if (pref == null) { 210 return; 211 } 212 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 213 private static final float PERCENTAGE_FLOAT = 100.0f; 214 215 private float getValueFromPercentage(final int percentage) { 216 return percentage / PERCENTAGE_FLOAT; 217 } 218 219 private int getPercentageFromValue(final float floatValue) { 220 return (int)(floatValue * PERCENTAGE_FLOAT); 221 } 222 223 @Override 224 public void writeValue(final int value, final String key) { 225 prefs.edit().putFloat(key, getValueFromPercentage(value)).apply(); 226 } 227 228 @Override 229 public void writeDefaultValue(final String key) { 230 prefs.edit().remove(key).apply(); 231 } 232 233 @Override 234 public int readValue(final String key) { 235 return getPercentageFromValue( 236 Settings.readKeyPreviewAnimationScale(prefs, key, defaultValue)); 237 } 238 239 @Override 240 public int readDefaultValue(final String key) { 241 return getPercentageFromValue(defaultValue); 242 } 243 244 @Override 245 public String getValueText(final int value) { 246 if (value < 0) { 247 return res.getString(R.string.settings_system_default); 248 } 249 return String.format(Locale.ROOT, "%d%%", value); 250 } 251 252 @Override 253 public void feedbackValue(final int value) {} 254 }); 255 } 256 setupKeyPreviewAnimationDuration(final String prefKey, final int defaultValue)257 private void setupKeyPreviewAnimationDuration(final String prefKey, final int defaultValue) { 258 final SharedPreferences prefs = getSharedPreferences(); 259 final Resources res = getResources(); 260 final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey); 261 if (pref == null) { 262 return; 263 } 264 pref.setInterface(new SeekBarDialogPreference.ValueProxy() { 265 @Override 266 public void writeValue(final int value, final String key) { 267 prefs.edit().putInt(key, value).apply(); 268 } 269 270 @Override 271 public void writeDefaultValue(final String key) { 272 prefs.edit().remove(key).apply(); 273 } 274 275 @Override 276 public int readValue(final String key) { 277 return Settings.readKeyPreviewAnimationDuration(prefs, key, defaultValue); 278 } 279 280 @Override 281 public int readDefaultValue(final String key) { 282 return defaultValue; 283 } 284 285 @Override 286 public String getValueText(final int value) { 287 return res.getString(R.string.abbreviation_unit_milliseconds, value); 288 } 289 290 @Override 291 public void feedbackValue(final int value) {} 292 }); 293 } 294 } 295