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