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