Home | History | Annotate | Download | only in settings
      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.SharedPreferences;
     21 import android.content.res.Resources;
     22 import android.media.AudioManager;
     23 import android.os.Bundle;
     24 import android.preference.ListPreference;
     25 import android.preference.Preference;
     26 
     27 import com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
     28 import com.android.inputmethod.latin.R;
     29 import com.android.inputmethod.latin.SystemBroadcastReceiver;
     30 import com.android.inputmethod.latin.define.ProductionFlags;
     31 
     32 /**
     33  * "Advanced" settings sub screen.
     34  *
     35  * This settings sub screen handles the following advanced preferences.
     36  * - Key popup dismiss delay
     37  * - Keypress vibration duration
     38  * - Keypress sound volume
     39  * - Show app icon
     40  * - Improve keyboard
     41  * - Debug settings
     42  */
     43 public final class AdvancedSettingsFragment extends SubScreenFragment {
     44     @Override
     45     public void onCreate(final Bundle icicle) {
     46         super.onCreate(icicle);
     47         addPreferencesFromResource(R.xml.prefs_screen_advanced);
     48 
     49         final Resources res = getResources();
     50         final Context context = getActivity();
     51 
     52         // When we are called from the Settings application but we are not already running, some
     53         // singleton and utility classes may not have been initialized.  We have to call
     54         // initialization method of these classes here. See {@link LatinIME#onCreate()}.
     55         AudioAndHapticFeedbackManager.init(context);
     56 
     57         final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
     58 
     59         if (!Settings.isInternal(prefs)) {
     60             removePreference(Settings.SCREEN_DEBUG);
     61         }
     62 
     63         if (!AudioAndHapticFeedbackManager.getInstance().hasVibrator()) {
     64             removePreference(Settings.PREF_VIBRATION_DURATION_SETTINGS);
     65         }
     66 
     67         // TODO: consolidate key preview dismiss delay with the key preview animation parameters.
     68         if (!Settings.readFromBuildConfigIfToShowKeyPreviewPopupOption(res)) {
     69             removePreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
     70         } else {
     71             // TODO: Cleanup this setup.
     72             final ListPreference keyPreviewPopupDismissDelay =
     73                     (ListPreference) findPreference(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
     74             final String popupDismissDelayDefaultValue = Integer.toString(res.getInteger(
     75                     R.integer.config_key_preview_linger_timeout));
     76             keyPreviewPopupDismissDelay.setEntries(new String[] {
     77                     res.getString(R.string.key_preview_popup_dismiss_no_delay),
     78                     res.getString(R.string.key_preview_popup_dismiss_default_delay),
     79             });
     80             keyPreviewPopupDismissDelay.setEntryValues(new String[] {
     81                     "0",
     82                     popupDismissDelayDefaultValue
     83             });
     84             if (null == keyPreviewPopupDismissDelay.getValue()) {
     85                 keyPreviewPopupDismissDelay.setValue(popupDismissDelayDefaultValue);
     86             }
     87             keyPreviewPopupDismissDelay.setEnabled(
     88                     Settings.readKeyPreviewPopupEnabled(prefs, res));
     89         }
     90 
     91         setupKeypressVibrationDurationSettings();
     92         setupKeypressSoundVolumeSettings();
     93         setupKeyLongpressTimeoutSettings();
     94         refreshEnablingsOfKeypressSoundAndVibrationSettings();
     95     }
     96 
     97     @Override
     98     public void onResume() {
     99         super.onResume();
    100         final SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    101         updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
    102     }
    103 
    104     @Override
    105     public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) {
    106         final Resources res = getResources();
    107         if (key.equals(Settings.PREF_POPUP_ON)) {
    108             setPreferenceEnabled(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY,
    109                     Settings.readKeyPreviewPopupEnabled(prefs, res));
    110         } else if (key.equals(Settings.PREF_SHOW_SETUP_WIZARD_ICON)) {
    111             SystemBroadcastReceiver.toggleAppIcon(getActivity());
    112         }
    113         updateListPreferenceSummaryToCurrentValue(Settings.PREF_KEY_PREVIEW_POPUP_DISMISS_DELAY);
    114         refreshEnablingsOfKeypressSoundAndVibrationSettings();
    115     }
    116 
    117     private void refreshEnablingsOfKeypressSoundAndVibrationSettings() {
    118         final SharedPreferences prefs = getSharedPreferences();
    119         final Resources res = getResources();
    120         setPreferenceEnabled(Settings.PREF_VIBRATION_DURATION_SETTINGS,
    121                 Settings.readVibrationEnabled(prefs, res));
    122         setPreferenceEnabled(Settings.PREF_KEYPRESS_SOUND_VOLUME,
    123                 Settings.readKeypressSoundEnabled(prefs, res));
    124     }
    125 
    126     private void setupKeypressVibrationDurationSettings() {
    127         final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
    128                 Settings.PREF_VIBRATION_DURATION_SETTINGS);
    129         if (pref == null) {
    130             return;
    131         }
    132         final SharedPreferences prefs = getSharedPreferences();
    133         final Resources res = getResources();
    134         pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
    135             @Override
    136             public void writeValue(final int value, final String key) {
    137                 prefs.edit().putInt(key, value).apply();
    138             }
    139 
    140             @Override
    141             public void writeDefaultValue(final String key) {
    142                 prefs.edit().remove(key).apply();
    143             }
    144 
    145             @Override
    146             public int readValue(final String key) {
    147                 return Settings.readKeypressVibrationDuration(prefs, res);
    148             }
    149 
    150             @Override
    151             public int readDefaultValue(final String key) {
    152                 return Settings.readDefaultKeypressVibrationDuration(res);
    153             }
    154 
    155             @Override
    156             public void feedbackValue(final int value) {
    157                 AudioAndHapticFeedbackManager.getInstance().vibrate(value);
    158             }
    159 
    160             @Override
    161             public String getValueText(final int value) {
    162                 if (value < 0) {
    163                     return res.getString(R.string.settings_system_default);
    164                 }
    165                 return res.getString(R.string.abbreviation_unit_milliseconds, value);
    166             }
    167         });
    168     }
    169 
    170     private void setupKeypressSoundVolumeSettings() {
    171         final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
    172                 Settings.PREF_KEYPRESS_SOUND_VOLUME);
    173         if (pref == null) {
    174             return;
    175         }
    176         final SharedPreferences prefs = getSharedPreferences();
    177         final Resources res = getResources();
    178         final AudioManager am = (AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE);
    179         pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
    180             private static final float PERCENTAGE_FLOAT = 100.0f;
    181 
    182             private float getValueFromPercentage(final int percentage) {
    183                 return percentage / PERCENTAGE_FLOAT;
    184             }
    185 
    186             private int getPercentageFromValue(final float floatValue) {
    187                 return (int)(floatValue * PERCENTAGE_FLOAT);
    188             }
    189 
    190             @Override
    191             public void writeValue(final int value, final String key) {
    192                 prefs.edit().putFloat(key, getValueFromPercentage(value)).apply();
    193             }
    194 
    195             @Override
    196             public void writeDefaultValue(final String key) {
    197                 prefs.edit().remove(key).apply();
    198             }
    199 
    200             @Override
    201             public int readValue(final String key) {
    202                 return getPercentageFromValue(Settings.readKeypressSoundVolume(prefs, res));
    203             }
    204 
    205             @Override
    206             public int readDefaultValue(final String key) {
    207                 return getPercentageFromValue(Settings.readDefaultKeypressSoundVolume(res));
    208             }
    209 
    210             @Override
    211             public String getValueText(final int value) {
    212                 if (value < 0) {
    213                     return res.getString(R.string.settings_system_default);
    214                 }
    215                 return Integer.toString(value);
    216             }
    217 
    218             @Override
    219             public void feedbackValue(final int value) {
    220                 am.playSoundEffect(
    221                         AudioManager.FX_KEYPRESS_STANDARD, getValueFromPercentage(value));
    222             }
    223         });
    224     }
    225 
    226     private void setupKeyLongpressTimeoutSettings() {
    227         final SharedPreferences prefs = getSharedPreferences();
    228         final Resources res = getResources();
    229         final SeekBarDialogPreference pref = (SeekBarDialogPreference)findPreference(
    230                 Settings.PREF_KEY_LONGPRESS_TIMEOUT);
    231         if (pref == null) {
    232             return;
    233         }
    234         pref.setInterface(new SeekBarDialogPreference.ValueProxy() {
    235             @Override
    236             public void writeValue(final int value, final String key) {
    237                 prefs.edit().putInt(key, value).apply();
    238             }
    239 
    240             @Override
    241             public void writeDefaultValue(final String key) {
    242                 prefs.edit().remove(key).apply();
    243             }
    244 
    245             @Override
    246             public int readValue(final String key) {
    247                 return Settings.readKeyLongpressTimeout(prefs, res);
    248             }
    249 
    250             @Override
    251             public int readDefaultValue(final String key) {
    252                 return Settings.readDefaultKeyLongpressTimeout(res);
    253             }
    254 
    255             @Override
    256             public String getValueText(final int value) {
    257                 return res.getString(R.string.abbreviation_unit_milliseconds, value);
    258             }
    259 
    260             @Override
    261             public void feedbackValue(final int value) {}
    262         });
    263     }
    264 }
    265