19bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka/*
29bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * Copyright (C) 2014 The Android Open Source Project
39bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka *
49bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
59bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * you may not use this file except in compliance with the License.
69bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * You may obtain a copy of the License at
79bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka *
89bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
99bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka *
109bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
119bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
129bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * See the License for the specific language governing permissions and
149bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * limitations under the License.
159bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka */
169bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
179bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokapackage com.android.inputmethod.latin.settings;
189bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
199bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.content.Context;
209bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.content.SharedPreferences;
219bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.content.res.Resources;
229bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.media.AudioManager;
239bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.os.Bundle;
249bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.preference.ListPreference;
259bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport android.preference.Preference;
269bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
279bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
289bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport com.android.inputmethod.latin.R;
29767c0bf71b9c0af7f8451d7d355f6efad21a6e5bChieu Nguyenimport com.android.inputmethod.latin.SystemBroadcastReceiver;
309bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokaimport com.android.inputmethod.latin.define.ProductionFlags;
319bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
329bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka/**
339bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * "Advanced" settings sub screen.
349bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka *
359bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * This settings sub screen handles the following advanced preferences.
369bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Key popup dismiss delay
379bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Keypress vibration duration
389bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Keypress sound volume
399bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Show app icon
409bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Improve keyboard
419bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka * - Debug settings
429bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka */
439bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaokapublic final class AdvancedSettingsFragment extends SubScreenFragment {
449bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    @Override
459bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    public void onCreate(final Bundle icicle) {
469bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        super.onCreate(icicle);
479bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        addPreferencesFromResource(R.xml.prefs_screen_advanced);
489bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
499bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Resources res = getResources();
509bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Context context = getActivity();
519bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
529bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        // When we are called from the Settings application but we are not already running, some
539bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        // singleton and utility classes may not have been initialized.  We have to call
549bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        // initialization method of these classes here. See {@link LatinIME#onCreate()}.
559bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        AudioAndHapticFeedbackManager.init(context);
569bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
579bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
589bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
599bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (!Settings.isInternal(prefs)) {
609bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            removePreference(Settings.SCREEN_DEBUG);
619bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
629bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
639bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (!AudioAndHapticFeedbackManager.getInstance().hasVibrator()) {
649bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS);
659bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
669bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
679bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        // TODO: consolidate key preview dismiss delay with the key preview animation parameters.
689bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) {
699bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
709bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        } else {
719bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            // TODO: Cleanup this setup.
729bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            final ListPreference keyPreviewPopupDismissDelay =
739bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    (ListPreference) findPreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
749bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger(
759bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    R.integer.config_key_preview_linger_timeout));
769bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            keyPreviewPopupDismissDelay.setEntries(new String[] {
779bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    res.getString(R.string.key_preview_popup_dismiss_no_delay),
789bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    res.getString(R.string.key_preview_popup_dismiss_default_delay),
799bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            });
809bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            keyPreviewPopupDismissDelay.setEntryValues(new String[] {
819bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    "0",
829bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    popupDismissDelayDefaultValue
839bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            });
849bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            if (null == keyPreviewPopupDismissDelay.getValue()) {
859bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                keyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue);
869bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
879bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            keyPreviewPopupDismissDelay.setEnabled(
889bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    Settings.readKeyPreviewPopupEnabled(prefs, res));
899bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
909bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
919bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        setupKeypressVibrationDurationSettings();
929bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        setupKeypressSoundVolumeSettings();
93ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        setupKeyLongpressTimeoutSettings();
949bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        refreshEnablingsOfKeypressSoundAndVibrationSettings();
959bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
969bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
979bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    @Override
989bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    public void onResume() {
999bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        super.onResume();
1009bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
1019bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
1029bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
1039bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1049bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    @Override
1059bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
1069bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Resources res = getResources();
1079bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (key.equals(Settings.PREF_POPUP_ON)) {
1089bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            setPreferenceEnabled(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY,
1099bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    Settings.readKeyPreviewPopupEnabled(prefs, res));
110767c0bf71b9c0af7f8451d7d355f6efad21a6e5bChieu Nguyen        } else if (key.equals(Settings.PREF_SHOW_SETUP_WIZARD_ICON)) {
111767c0bf71b9c0af7f8451d7d355f6efad21a6e5bChieu Nguyen            SystemBroadcastReceiver.toggleAppIcon(getActivity());
1129bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
1139bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
1149bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        refreshEnablingsOfKeypressSoundAndVibrationSettings();
1159bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
1169bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1179bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    private void refreshEnablingsOfKeypressSoundAndVibrationSettings() {
1189bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
1199bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Resources res = getResources();
1209bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        setPreferenceEnabled(Settings.PREF_VIBRATION_DURATION_SETTINGS,
1219bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                Settings.readVibrationEnabled(prefs, res));
1229bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        setPreferenceEnabled(Settings.PREF_KEYPRESS_SOUND_VOLUME,
1239bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                Settings.readKeypressSoundEnabled(prefs, res));
1249bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
1259bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1269bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    private void setupKeypressVibrationDurationSettings() {
1279bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
1289bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                Settings.PREF_VIBRATION_DURATION_SETTINGS);
1299bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (pref == null) {
1309bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            return;
1319bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
1329bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
1339bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Resources res = getResources();
1349bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
1359bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1369bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void writeValue(final int value, final String key) {
1379bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                prefs.edit().putInt(key, value).apply();
1389bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1399bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1409bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1419bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void writeDefaultValue(final String key) {
1429bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                prefs.edit().remove(key).apply();
1439bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1449bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1459bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1469bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public int readValue(final String key) {
1479bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return Settings.readKeypressVibrationDuration(prefs, res);
1489bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1499bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1509bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1519bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public int readDefaultValue(final String key) {
1529bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return Settings.readDefaultKeypressVibrationDuration(res);
1539bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1549bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1559bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1569bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void feedbackValue(final int value) {
1579bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                AudioAndHapticFeedbackManager.getInstance().vibrate(value);
1589bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1599bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1609bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1619bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public String getValueText(final int value) {
1629bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                if (value < 0) {
1639bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    return res.getString(R.string.settings_system_default);
1649bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                }
1659bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return res.getString(R.string.abbreviation_unit_milliseconds, value);
1669bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1679bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        });
1689bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
1699bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1709bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    private void setupKeypressSoundVolumeSettings() {
1719bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
1729bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                Settings.PREF_KEYPRESS_SOUND_VOLUME);
1739bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        if (pref == null) {
1749bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            return;
1759bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        }
1769bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
1779bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final Resources res = getResources();
1789bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        final AudioManager am = (AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE);
1799bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
1809bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            private static final float PERCENTAGE_FLOAT = 100.0f;
1819bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1829bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            private float getValueFromPercentage(final int percentage) {
1839bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return percentage / PERCENTAGE_FLOAT;
1849bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1859bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1869bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            private int getPercentageFromValue(final float floatValue) {
1879bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return (int)(floatValue * PERCENTAGE_FLOAT);
1889bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1899bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1909bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1919bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void writeValue(final int value, final String key) {
1929bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                prefs.edit().putFloat(key, getValueFromPercentage(value)).apply();
1939bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1949bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
1959bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
1969bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void writeDefaultValue(final String key) {
1979bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                prefs.edit().remove(key).apply();
1989bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
1999bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
2009bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
2019bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public int readValue(final String key) {
2029bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return getPercentageFromValue(Settings.readKeypressSoundVolume(prefs, res));
2039bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
2049bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
2059bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
2069bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public int readDefaultValue(final String key) {
2079bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return getPercentageFromValue(Settings.readDefaultKeypressSoundVolume(res));
2089bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
2099bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
2109bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
2119bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public String getValueText(final int value) {
2129bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                if (value < 0) {
2139bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                    return res.getString(R.string.settings_system_default);
2149bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                }
2159bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                return Integer.toString(value);
2169bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
2179bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka
2189bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            @Override
2199bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            public void feedbackValue(final int value) {
2209bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                am.playSoundEffect(
2219bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka                        AudioManager.FX_KEYPRESS_STANDARD, getValueFromPercentage(value));
2229bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka            }
2239bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka        });
2249bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka    }
225ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
226ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka    private void setupKeyLongpressTimeoutSettings() {
227ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        final SharedPreferences prefs = getSharedPreferences();
228ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        final Resources res = getResources();
229ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
230ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                Settings.PREF_KEY_LONGPRESS_TIMEOUT);
231ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        if (pref == null) {
232ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            return;
233ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        }
234ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
235ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
236ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public void writeValue(final int value, final String key) {
237ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                prefs.edit().putInt(key, value).apply();
238ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            }
239ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
240ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
241ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public void writeDefaultValue(final String key) {
242ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                prefs.edit().remove(key).apply();
243ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            }
244ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
245ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
246ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public int readValue(final String key) {
247ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                return Settings.readKeyLongpressTimeout(prefs, res);
248ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            }
249ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
250ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
251ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public int readDefaultValue(final String key) {
252ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                return Settings.readDefaultKeyLongpressTimeout(res);
253ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            }
254ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
255ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
256ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public String getValueText(final int value) {
257ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka                return res.getString(R.string.abbreviation_unit_milliseconds, value);
258ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            }
259ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka
260ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            @Override
261ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka            public void feedbackValue(final int value) {}
262ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka        });
263ad2f695083ce8495f99ab52bfc6abf17e1e3b5ddTadashi G. Takaoka    }
2649bdcb131602aa614db37d817d7fe1220ab6271b8Tadashi G. Takaoka}
265