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