1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * 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, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 package com.android.inputmethod.latin; 18 19 import java.util.ArrayList; 20 import java.util.Locale; 21 22 import android.app.AlertDialog; 23 import android.app.Dialog; 24 import android.app.backup.BackupManager; 25 import android.content.DialogInterface; 26 import android.content.SharedPreferences; 27 import android.os.Bundle; 28 import android.preference.CheckBoxPreference; 29 import android.preference.ListPreference; 30 import android.preference.PreferenceActivity; 31 import android.preference.PreferenceGroup; 32 import android.speech.SpeechRecognizer; 33 import android.text.AutoText; 34 import android.util.Log; 35 36 import com.android.inputmethod.voice.SettingsUtil; 37 import com.android.inputmethod.voice.VoiceInputLogger; 38 39 public class LatinIMESettings extends PreferenceActivity 40 implements SharedPreferences.OnSharedPreferenceChangeListener, 41 DialogInterface.OnDismissListener { 42 43 private static final String QUICK_FIXES_KEY = "quick_fixes"; 44 private static final String PREDICTION_SETTINGS_KEY = "prediction_settings"; 45 private static final String VOICE_SETTINGS_KEY = "voice_mode"; 46 /* package */ static final String PREF_SETTINGS_KEY = "settings_key"; 47 48 private static final String TAG = "LatinIMESettings"; 49 50 // Dialog ids 51 private static final int VOICE_INPUT_CONFIRM_DIALOG = 0; 52 53 private CheckBoxPreference mQuickFixes; 54 private ListPreference mVoicePreference; 55 private ListPreference mSettingsKeyPreference; 56 private boolean mVoiceOn; 57 58 private VoiceInputLogger mLogger; 59 60 private boolean mOkClicked = false; 61 private String mVoiceModeOff; 62 63 @Override 64 protected void onCreate(Bundle icicle) { 65 super.onCreate(icicle); 66 addPreferencesFromResource(R.xml.prefs); 67 mQuickFixes = (CheckBoxPreference) findPreference(QUICK_FIXES_KEY); 68 mVoicePreference = (ListPreference) findPreference(VOICE_SETTINGS_KEY); 69 mSettingsKeyPreference = (ListPreference) findPreference(PREF_SETTINGS_KEY); 70 SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 71 prefs.registerOnSharedPreferenceChangeListener(this); 72 73 mVoiceModeOff = getString(R.string.voice_mode_off); 74 mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); 75 mLogger = VoiceInputLogger.getLogger(this); 76 } 77 78 @Override 79 protected void onResume() { 80 super.onResume(); 81 int autoTextSize = AutoText.getSize(getListView()); 82 if (autoTextSize < 1) { 83 ((PreferenceGroup) findPreference(PREDICTION_SETTINGS_KEY)) 84 .removePreference(mQuickFixes); 85 } 86 if (!LatinIME.VOICE_INSTALLED 87 || !SpeechRecognizer.isRecognitionAvailable(this)) { 88 getPreferenceScreen().removePreference(mVoicePreference); 89 } else { 90 updateVoiceModeSummary(); 91 } 92 updateSettingsKeySummary(); 93 } 94 95 @Override 96 protected void onDestroy() { 97 getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener( 98 this); 99 super.onDestroy(); 100 } 101 102 public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 103 (new BackupManager(this)).dataChanged(); 104 // If turning on voice input, show dialog 105 if (key.equals(VOICE_SETTINGS_KEY) && !mVoiceOn) { 106 if (!prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff) 107 .equals(mVoiceModeOff)) { 108 showVoiceConfirmation(); 109 } 110 } 111 mVoiceOn = !(prefs.getString(VOICE_SETTINGS_KEY, mVoiceModeOff).equals(mVoiceModeOff)); 112 updateVoiceModeSummary(); 113 updateSettingsKeySummary(); 114 } 115 116 private void updateSettingsKeySummary() { 117 mSettingsKeyPreference.setSummary( 118 getResources().getStringArray(R.array.settings_key_modes) 119 [mSettingsKeyPreference.findIndexOfValue(mSettingsKeyPreference.getValue())]); 120 } 121 122 private void showVoiceConfirmation() { 123 mOkClicked = false; 124 showDialog(VOICE_INPUT_CONFIRM_DIALOG); 125 } 126 127 private void updateVoiceModeSummary() { 128 mVoicePreference.setSummary( 129 getResources().getStringArray(R.array.voice_input_modes_summary) 130 [mVoicePreference.findIndexOfValue(mVoicePreference.getValue())]); 131 } 132 133 @Override 134 protected Dialog onCreateDialog(int id) { 135 switch (id) { 136 case VOICE_INPUT_CONFIRM_DIALOG: 137 DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { 138 public void onClick(DialogInterface dialog, int whichButton) { 139 if (whichButton == DialogInterface.BUTTON_NEGATIVE) { 140 mVoicePreference.setValue(mVoiceModeOff); 141 mLogger.settingsWarningDialogCancel(); 142 } else if (whichButton == DialogInterface.BUTTON_POSITIVE) { 143 mOkClicked = true; 144 mLogger.settingsWarningDialogOk(); 145 } 146 updateVoicePreference(); 147 } 148 }; 149 AlertDialog.Builder builder = new AlertDialog.Builder(this) 150 .setTitle(R.string.voice_warning_title) 151 .setPositiveButton(android.R.string.ok, listener) 152 .setNegativeButton(android.R.string.cancel, listener); 153 154 // Get the current list of supported locales and check the current locale against 155 // that list, to decide whether to put a warning that voice input will not work in 156 // the current language as part of the pop-up confirmation dialog. 157 String supportedLocalesString = SettingsUtil.getSettingsString( 158 getContentResolver(), 159 SettingsUtil.LATIN_IME_VOICE_INPUT_SUPPORTED_LOCALES, 160 LatinIME.DEFAULT_VOICE_INPUT_SUPPORTED_LOCALES); 161 ArrayList<String> voiceInputSupportedLocales = 162 LatinIME.newArrayList(supportedLocalesString.split("\\s+")); 163 boolean localeSupported = voiceInputSupportedLocales.contains( 164 Locale.getDefault().toString()); 165 166 if (localeSupported) { 167 String message = getString(R.string.voice_warning_may_not_understand) + "\n\n" + 168 getString(R.string.voice_hint_dialog_message); 169 builder.setMessage(message); 170 } else { 171 String message = getString(R.string.voice_warning_locale_not_supported) + 172 "\n\n" + getString(R.string.voice_warning_may_not_understand) + "\n\n" + 173 getString(R.string.voice_hint_dialog_message); 174 builder.setMessage(message); 175 } 176 177 AlertDialog dialog = builder.create(); 178 dialog.setOnDismissListener(this); 179 mLogger.settingsWarningDialogShown(); 180 return dialog; 181 default: 182 Log.e(TAG, "unknown dialog " + id); 183 return null; 184 } 185 } 186 187 public void onDismiss(DialogInterface dialog) { 188 mLogger.settingsWarningDialogDismissed(); 189 if (!mOkClicked) { 190 // This assumes that onPreferenceClick gets called first, and this if the user 191 // agreed after the warning, we set the mOkClicked value to true. 192 mVoicePreference.setValue(mVoiceModeOff); 193 } 194 } 195 196 private void updateVoicePreference() { 197 boolean isChecked = !mVoicePreference.getValue().equals(mVoiceModeOff); 198 if (isChecked) { 199 mLogger.voiceInputSettingEnabled(); 200 } else { 201 mLogger.voiceInputSettingDisabled(); 202 } 203 } 204 } 205