199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka/*
299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project
399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka *
499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * you may not use this file except in compliance with the License.
699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * You may obtain a copy of the License at
799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka *
899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka *
1099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
1199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
1299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * See the License for the specific language governing permissions and
1499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * limitations under the License.
1599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka */
1699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
1799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokapackage com.android.inputmethod.latin.settings;
1899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
1999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.content.Context;
2099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.content.Intent;
2199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.content.SharedPreferences;
2299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.content.res.Resources;
2399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.os.Bundle;
2499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.os.Process;
2599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.preference.Preference;
2699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.preference.Preference.OnPreferenceClickListener;
2799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.preference.PreferenceGroup;
2899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport android.preference.TwoStatePreference;
2999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
3099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport com.android.inputmethod.latin.DictionaryDumpBroadcastReceiver;
31ab6f3b36d0303bc4cc1ad0fbbc72a64ca2df0eb2Mario Tanevimport com.android.inputmethod.latin.DictionaryFacilitatorImpl;
3299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport com.android.inputmethod.latin.R;
3399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport com.android.inputmethod.latin.utils.ApplicationUtils;
3499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport com.android.inputmethod.latin.utils.ResourceUtils;
3599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
3699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokaimport java.util.Locale;
3799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
3899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka/**
3999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * "Debug mode" settings sub screen.
4099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka *
4199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka * This settings sub screen handles a several preference options for debugging.
4299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka */
4399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaokapublic final class DebugSettingsFragment extends SubScreenFragment
4499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        implements OnPreferenceClickListener {
4599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private static final String PREF_KEY_DUMP_DICTS = "pref_key_dump_dictionaries";
4699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private static final String PREF_KEY_DUMP_DICT_PREFIX = "pref_key_dump_dictionaries";
4799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
4899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private boolean mServiceNeedsRestart = false;
4999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private TwoStatePreference mDebugMode;
5099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
5199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    @Override
5299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    public void onCreate(Bundle icicle) {
5399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        super.onCreate(icicle);
5499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        addPreferencesFromResource(R.xml.prefs_screen_debug);
5599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
566fb586a527e7ffe5da187c8b345cdf897b8481c7Tadashi G. Takaoka        if (!Settings.SHOULD_SHOW_LXX_SUGGESTION_UI) {
576fb586a527e7ffe5da187c8b345cdf897b8481c7Tadashi G. Takaoka            removePreference(DebugSettings.PREF_SHOULD_SHOW_LXX_SUGGESTION_UI);
58c225d2e29cfd85fb416952daa4bcebd4df48b57cTadashi G. Takaoka        }
59c225d2e29cfd85fb416952daa4bcebd4df48b57cTadashi G. Takaoka
6099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final PreferenceGroup dictDumpPreferenceGroup =
6199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                (PreferenceGroup)findPreference(PREF_KEY_DUMP_DICTS);
62ab6f3b36d0303bc4cc1ad0fbbc72a64ca2df0eb2Mario Tanev        for (final String dictName : DictionaryFacilitatorImpl.DICT_TYPE_TO_CLASS.keySet()) {
6399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            final Preference pref = new DictDumpPreference(getActivity(), dictName);
6499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            pref.setOnPreferenceClickListener(this);
6599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            dictDumpPreferenceGroup.addPreference(pref);
6699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
6799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final Resources res = getResources();
6899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_DURATION,
6999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                res.getInteger(R.integer.config_key_preview_show_up_duration));
7099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        setupKeyPreviewAnimationDuration(DebugSettings.PREF_KEY_PREVIEW_DISMISS_DURATION,
7199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                res.getInteger(R.integer.config_key_preview_dismiss_duration));
72ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        final float defaultKeyPreviewShowUpStartScale = ResourceUtils.getFloatFromFraction(
73ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                res, R.fraction.config_key_preview_show_up_start_scale);
74ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        final float defaultKeyPreviewDismissEndScale = ResourceUtils.getFloatFromFraction(
75ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                res, R.fraction.config_key_preview_dismiss_end_scale);
76ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_X_SCALE,
77ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewShowUpStartScale);
78ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_SHOW_UP_START_Y_SCALE,
79ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewShowUpStartScale);
80ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_X_SCALE,
81ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewDismissEndScale);
82ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka        setupKeyPreviewAnimationScale(DebugSettings.PREF_KEY_PREVIEW_DISMISS_END_Y_SCALE,
83ac88f3d8459e17236654aa38debea749ecb631d1Tadashi G. Takaoka                defaultKeyPreviewDismissEndScale);
84be819dbe2b7a5c418530a2fa1182766a4d31d6d5Tadashi G. Takaoka        setupKeyboardHeight(
85bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                DebugSettings.PREF_KEYBOARD_HEIGHT_SCALE, SettingsValues.DEFAULT_SIZE_SCALE);
8699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
8799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        mServiceNeedsRestart = false;
8899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        mDebugMode = (TwoStatePreference) findPreference(DebugSettings.PREF_DEBUG_MODE);
8999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        updateDebugMode();
9099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
9199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
9299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private static class DictDumpPreference extends Preference {
9399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        public final String mDictName;
9499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
9599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        public DictDumpPreference(final Context context, final String dictName) {
9699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            super(context);
9799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            setKey(PREF_KEY_DUMP_DICT_PREFIX + dictName);
9899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            setTitle("Dump " + dictName + " dictionary");
9999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDictName = dictName;
10099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
10199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
10299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
10399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    @Override
10499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    public boolean onPreferenceClick(final Preference pref) {
10599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final Context context = getActivity();
10699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (pref instanceof DictDumpPreference) {
10799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            final DictDumpPreference dictDumpPref = (DictDumpPreference)pref;
10899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            final String dictName = dictDumpPref.mDictName;
10999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            final Intent intent = new Intent(
11099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                    DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION);
11199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            intent.putExtra(DictionaryDumpBroadcastReceiver.DICTIONARY_NAME_KEY, dictName);
11299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            context.sendBroadcast(intent);
11399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            return true;
11499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
11599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        return true;
11699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
11799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
11899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    @Override
11999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    public void onStop() {
12099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        super.onStop();
12199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (mServiceNeedsRestart) {
12299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            Process.killProcess(Process.myPid());
12399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
12499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
12599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
12699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    @Override
12799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
12899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (key.equals(DebugSettings.PREF_DEBUG_MODE) && mDebugMode != null) {
12999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDebugMode.setChecked(prefs.getBoolean(DebugSettings.PREF_DEBUG_MODE, false));
13099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            updateDebugMode();
13199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mServiceNeedsRestart = true;
13299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            return;
13399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
134f7e01e866ffa89b4dd7e66c471ed9fc275a637a2Tadashi G. Takaoka        if (key.equals(DebugSettings.PREF_FORCE_NON_DISTINCT_MULTITOUCH)) {
13599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mServiceNeedsRestart = true;
13699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            return;
13799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
13899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
13999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
14099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private void updateDebugMode() {
14199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        boolean isDebugMode = mDebugMode.isChecked();
14299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final String version = getString(
14399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                R.string.version_text, ApplicationUtils.getVersionName(getActivity()));
14499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (!isDebugMode) {
14599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDebugMode.setTitle(version);
14699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDebugMode.setSummary(null);
14799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        } else {
14899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDebugMode.setTitle(getString(R.string.prefs_debug_mode));
14999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            mDebugMode.setSummary(version);
15099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
15199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
15299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
15399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private void setupKeyPreviewAnimationScale(final String prefKey, final float defaultValue) {
15499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
15599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final Resources res = getResources();
15699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
15799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (pref == null) {
15899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            return;
15999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
16099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
16199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            private static final float PERCENTAGE_FLOAT = 100.0f;
16299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
16399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            private float getValueFromPercentage(final int percentage) {
16499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return percentage / PERCENTAGE_FLOAT;
16599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
16699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
16799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            private int getPercentageFromValue(final float floatValue) {
16899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return (int)(floatValue * PERCENTAGE_FLOAT);
16999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
17099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
17199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
17299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void writeValue(final int value, final String key) {
17399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                prefs.edit().putFloat(key, getValueFromPercentage(value)).apply();
17499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
17599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
17699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
17799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void writeDefaultValue(final String key) {
17899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                prefs.edit().remove(key).apply();
17999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
18099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
18199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
18299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public int readValue(final String key) {
18399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return getPercentageFromValue(
18499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                        Settings.readKeyPreviewAnimationScale(prefs, key, defaultValue));
18599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
18699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
18799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
18899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public int readDefaultValue(final String key) {
18999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return getPercentageFromValue(defaultValue);
19099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
19199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
19299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
19399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public String getValueText(final int value) {
19499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                if (value < 0) {
19599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                    return res.getString(R.string.settings_system_default);
19699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                }
19799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return String.format(Locale.ROOT, "%d%%", value);
19899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
19999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
20099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
20199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void feedbackValue(final int value) {}
20299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        });
20399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
20499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
20599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    private void setupKeyPreviewAnimationDuration(final String prefKey, final int defaultValue) {
20699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
20799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final Resources res = getResources();
20899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
20999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        if (pref == null) {
21099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            return;
21199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        }
21299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
21399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
21499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void writeValue(final int value, final String key) {
21599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                prefs.edit().putInt(key, value).apply();
21699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
21799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
21899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
21999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void writeDefaultValue(final String key) {
22099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                prefs.edit().remove(key).apply();
22199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
22299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
22399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
22499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public int readValue(final String key) {
22599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return Settings.readKeyPreviewAnimationDuration(prefs, key, defaultValue);
22699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
22799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
22899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
22999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public int readDefaultValue(final String key) {
23099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return defaultValue;
23199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
23299295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
23399295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
23499295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public String getValueText(final int value) {
23599295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka                return res.getString(R.string.abbreviation_unit_milliseconds, value);
23699295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            }
23799295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka
23899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            @Override
23999295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka            public void feedbackValue(final int value) {}
24099295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka        });
24199295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka    }
242bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
243be819dbe2b7a5c418530a2fa1182766a4d31d6d5Tadashi G. Takaoka    private void setupKeyboardHeight(final String prefKey, final float defaultValue) {
244bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        final SharedPreferences prefs = getSharedPreferences();
245bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(prefKey);
246bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        if (pref == null) {
247bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            return;
248bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        }
249bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
250bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            private static final float PERCENTAGE_FLOAT = 100.0f;
251bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            private float getValueFromPercentage(final int percentage) {
252bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                return percentage / PERCENTAGE_FLOAT;
253bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
254bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
255bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            private int getPercentageFromValue(final float floatValue) {
256bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                return (int)(floatValue * PERCENTAGE_FLOAT);
257bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
258bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
259bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
260bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public void writeValue(final int value, final String key) {
261bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                prefs.edit().putFloat(key, getValueFromPercentage(value)).apply();
262bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
263bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
264bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
265bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public void writeDefaultValue(final String key) {
266bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                prefs.edit().remove(key).apply();
267bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
268bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
269bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
270bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public int readValue(final String key) {
271be819dbe2b7a5c418530a2fa1182766a4d31d6d5Tadashi G. Takaoka                return getPercentageFromValue(Settings.readKeyboardHeight(prefs, defaultValue));
272bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
273bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
274bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
275bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public int readDefaultValue(final String key) {
276bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                return getPercentageFromValue(defaultValue);
277bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
278bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
279bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
280bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public String getValueText(final int value) {
281bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang                return String.format(Locale.ROOT, "%d%%", value);
282bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            }
283bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang
284bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            @Override
285bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang            public void feedbackValue(final int value) {}
286bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang        });
287bb9400aebc4cb0291b4f0208ecbc9ddc01dc79e1Andy Wang    }
28899295c8c5fe20509ef9fbd701e6c25d83d5166dfTadashi G. Takaoka}
289