From b1cd7016028f5770da2688f1ec51e0601fc5b9eb Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Thu, 28 Jan 2010 07:33:27 -0800 Subject: [PATCH] Setting to move microphone to secondary keyboard. Microphone button can be optionally moved to the symbols keyboard to get your comma back. You can also completely disable voice input. Now you can get your comma back but still use the swipe gesture to activate voice input. --- res/values/strings.xml | 6 ++ res/xml-de/kbd_qwerty.xml | 97 +---------------- res/xml-fr/kbd_qwerty.xml | 95 ----------------- res/xml-ru/kbd_qwerty.xml | 96 ----------------- res/xml/kbd_qwerty.xml | 100 +----------------- res/xml/kbd_symbols.xml | 5 +- res/xml/prefs.xml | 10 ++ .../inputmethod/latin/KeyboardSwitcher.java | 83 +++++++-------- .../android/inputmethod/latin/LatinIME.java | 33 +++--- .../inputmethod/latin/LatinKeyboard.java | 48 ++++----- 10 files changed, 107 insertions(+), 466 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 90cd6d429..85de32207 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -252,6 +252,12 @@ Voice input + + Mic on primary + + + Show the microphone on the primary keyboard + Auto submit after voice diff --git a/res/xml-de/kbd_qwerty.xml b/res/xml-de/kbd_qwerty.xml index 9e2f5841d..4e57c6067 100755 --- a/res/xml-de/kbd_qwerty.xml +++ b/res/xml-de/kbd_qwerty.xml @@ -100,7 +100,7 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="_" android:keyWidth="20%p" android:keyEdgeFlags="left"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/xml-fr/kbd_qwerty.xml b/res/xml-fr/kbd_qwerty.xml index 7abe18eb2..1b20c0438 100644 --- a/res/xml-fr/kbd_qwerty.xml +++ b/res/xml-fr/kbd_qwerty.xml @@ -114,24 +114,6 @@ android:keyWidth="20%p" android:keyEdgeFlags="right"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/xml-ru/kbd_qwerty.xml b/res/xml-ru/kbd_qwerty.xml index 8a3a59229..45d355b0f 100755 --- a/res/xml-ru/kbd_qwerty.xml +++ b/res/xml-ru/kbd_qwerty.xml @@ -96,24 +96,6 @@ android:keyWidth="20%p" android:keyEdgeFlags="right"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/xml/kbd_qwerty.xml b/res/xml/kbd_qwerty.xml index e0fe5cdc3..4aa476136 100755 --- a/res/xml/kbd_qwerty.xml +++ b/res/xml/kbd_qwerty.xml @@ -111,7 +111,8 @@ android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="_" android:keyWidth="20%p" android:keyEdgeFlags="left"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + mKeyboards; - /** - * Maps keyboard mode to the equivalent mode with voice. - */ - private Map mModeToVoice; - private int mMode; /** One of the MODE_XXX values */ private int mImeOptions; private int mTextMode = MODE_TEXT_QWERTY; private boolean mIsSymbols; private boolean mHasVoice; + private boolean mVoiceOnPrimary; private boolean mPreferSymbols; private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; @@ -87,14 +83,8 @@ public class KeyboardSwitcher { KeyboardSwitcher(Context context, InputMethodService ims) { mContext = context; mKeyboards = new HashMap(); - mSymbolsId = new KeyboardId(R.xml.kbd_symbols); - mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift); - mModeToVoice = new HashMap(); - mModeToVoice.put(R.id.mode_normal, R.id.mode_normal_voice); - mModeToVoice.put(R.id.mode_url, R.id.mode_url_voice); - mModeToVoice.put(R.id.mode_email, R.id.mode_email_voice); - mModeToVoice.put(R.id.mode_im, R.id.mode_im_voice); - mModeToVoice.put(R.id.mode_webentry, R.id.mode_webentry_voice); + mSymbolsId = new KeyboardId(R.xml.kbd_symbols, false); + mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift, false); mInputMethodService = ims; } @@ -122,8 +112,9 @@ public class KeyboardSwitcher { if (displayWidth == mLastDisplayWidth) return; mLastDisplayWidth = displayWidth; if (!forceCreate) mKeyboards.clear(); - mSymbolsId = new KeyboardId(R.xml.kbd_symbols); - mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift); + mSymbolsId = new KeyboardId(R.xml.kbd_symbols, mHasVoice && !mVoiceOnPrimary); + mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift, + mHasVoice && !mVoiceOnPrimary); } /** @@ -134,15 +125,17 @@ public class KeyboardSwitcher { public int mXml; public int mKeyboardMode; /** A KEYBOARDMODE_XXX value */ public boolean mEnableShiftLock; + public boolean mHasVoice; - public KeyboardId(int xml, int mode, boolean enableShiftLock) { + public KeyboardId(int xml, int mode, boolean enableShiftLock, boolean hasVoice) { this.mXml = xml; this.mKeyboardMode = mode; this.mEnableShiftLock = enableShiftLock; + this.mHasVoice = hasVoice; } - public KeyboardId(int xml) { - this(xml, 0, false); + public KeyboardId(int xml, boolean hasVoice) { + this(xml, 0, false, hasVoice); } public boolean equals(Object other) { @@ -152,16 +145,29 @@ public class KeyboardSwitcher { public boolean equals(KeyboardId other) { return other.mXml == this.mXml && other.mKeyboardMode == this.mKeyboardMode - && other.mEnableShiftLock == this.mEnableShiftLock; + && other.mEnableShiftLock == this.mEnableShiftLock + && other.mHasVoice == this.mHasVoice; } public int hashCode() { - return (mXml + 1) * (mKeyboardMode + 1) * (mEnableShiftLock ? 2 : 1); + return (mXml + 1) * (mKeyboardMode + 1) * (mEnableShiftLock ? 2 : 1) + * (mHasVoice ? 4 : 8); } } - void setVoiceMode(boolean enableVoice) { - setKeyboardMode(mMode, mImeOptions, enableVoice, mIsSymbols); + void setVoiceMode(boolean enableVoice, boolean voiceOnPrimary) { + if (enableVoice != mHasVoice || voiceOnPrimary != mVoiceOnPrimary) { + System.err.println("Clearing keyboards"); + mKeyboards.clear(); + } + mHasVoice = enableVoice; + mVoiceOnPrimary = voiceOnPrimary; + setKeyboardMode(mMode, mImeOptions, mHasVoice, + mIsSymbols); + } + + boolean hasVoiceButton(boolean isSymbols) { + return mHasVoice && (isSymbols != mVoiceOnPrimary); } void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { @@ -181,9 +187,6 @@ public class KeyboardSwitcher { mInputView.setPreviewEnabled(true); KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols); - if (enableVoice && mModeToVoice.containsKey(id.mKeyboardMode)) { - id.mKeyboardMode = mModeToVoice.get(id.mKeyboardMode); - } LatinKeyboard keyboard = getKeyboard(id); if (mode == MODE_PHONE) { @@ -211,17 +214,12 @@ public class KeyboardSwitcher { conf.locale = mInputLocale; orig.updateConfiguration(conf, null); LatinKeyboard keyboard = new LatinKeyboard( - mContext, id.mXml, id.mKeyboardMode); + mContext, id.mXml, id.mKeyboardMode, id.mHasVoice); if (id.mKeyboardMode == KEYBOARDMODE_NORMAL || id.mKeyboardMode == KEYBOARDMODE_URL || id.mKeyboardMode == KEYBOARDMODE_IM || id.mKeyboardMode == KEYBOARDMODE_EMAIL || id.mKeyboardMode == KEYBOARDMODE_WEB - || id.mKeyboardMode == R.id.mode_normal_voice - || id.mKeyboardMode == R.id.mode_url_voice - || id.mKeyboardMode == R.id.mode_im_voice - || id.mKeyboardMode == R.id.mode_email_voice - || id.mKeyboardMode == R.id.mode_webentry_voice ) { keyboard.setExtension(R.xml.kbd_extension); } @@ -238,31 +236,32 @@ public class KeyboardSwitcher { } private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { + boolean hasVoice = hasVoiceButton(isSymbols); if (isSymbols) { return (mode == MODE_PHONE) - ? new KeyboardId(R.xml.kbd_phone_symbols) : new KeyboardId(R.xml.kbd_symbols); + ? new KeyboardId(R.xml.kbd_phone_symbols, hasVoice) + : new KeyboardId(R.xml.kbd_symbols, hasVoice); } - switch (mode) { case MODE_TEXT: if (mTextMode == MODE_TEXT_QWERTY) { - return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_NORMAL, true); + return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_NORMAL, true, hasVoice); } else if (mTextMode == MODE_TEXT_ALPHA) { - return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true); + return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true, hasVoice); } break; case MODE_SYMBOLS: - return new KeyboardId(R.xml.kbd_symbols); + return new KeyboardId(R.xml.kbd_symbols, hasVoice); case MODE_PHONE: - return new KeyboardId(R.xml.kbd_phone); + return new KeyboardId(R.xml.kbd_phone, hasVoice); case MODE_URL: - return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_URL, true); + return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_URL, true, hasVoice); case MODE_EMAIL: - return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL, true); + return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL, true, hasVoice); case MODE_IM: - return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_IM, true); + return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_IM, true, hasVoice); case MODE_WEB: - return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_WEB, true); + return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_WEB, true, hasVoice); } return null; } @@ -295,7 +294,7 @@ public class KeyboardSwitcher { boolean isAlphabetMode() { int currentMode = mCurrentId.mKeyboardMode; for (Integer mode : ALPHABET_MODES) { - if (currentMode == mode || currentMode == mModeToVoice.get(mode)) { + if (currentMode == mode) { return true; } } diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java index 7eecfb9b9..5faac5fae 100644 --- a/src/com/android/inputmethod/latin/LatinIME.java +++ b/src/com/android/inputmethod/latin/LatinIME.java @@ -92,7 +92,8 @@ public class LatinIME extends InputMethodService private static final String PREF_AUTO_COMPLETE = "auto_complete"; private static final String PREF_ENABLE_VOICE = "enable_voice_input"; private static final String PREF_VOICE_SERVER_URL = "voice_server_url"; - + private static final String PREF_VOICE_MAIN = "voice_on_main"; + // Whether or not the user has used voice input before (and thus, whether to show the // first-run warning dialog or not). private static final String PREF_HAS_USED_VOICE_INPUT = "has_used_voice_input"; @@ -211,6 +212,7 @@ public class LatinIME extends InputMethodService private boolean mIsShowingHint; private int mCorrectionMode; private boolean mEnableVoice = true; + private boolean mVoiceOnPrimary; private int mOrientation; // Indicates whether the suggestion strip is to be on in landscape @@ -445,6 +447,7 @@ public class LatinIME extends InputMethodService } mEnableVoiceButton = shouldShowVoiceButton(makeFieldContext(), attribute); + final boolean enableVoiceButton = mEnableVoiceButton && mEnableVoice; mAfterVoiceInput = false; mImmediatelyAfterVoiceInput = false; @@ -463,15 +466,15 @@ public class LatinIME extends InputMethodService case EditorInfo.TYPE_CLASS_NUMBER: case EditorInfo.TYPE_CLASS_DATETIME: mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_SYMBOLS, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); break; case EditorInfo.TYPE_CLASS_PHONE: mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_PHONE, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); break; case EditorInfo.TYPE_CLASS_TEXT: mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); //startPrediction(); mPredictionOn = true; // Make sure that passwords are not displayed in candidate view @@ -491,19 +494,19 @@ public class LatinIME extends InputMethodService if (variation == EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) { mPredictionOn = false; mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_EMAIL, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_URI) { mPredictionOn = false; mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_URL, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE) { mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_IM, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_FILTER) { mPredictionOn = false; } else if (variation == EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT) { mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_WEB, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); // If it's a browser edit field and auto correct is not ON explicitly, then // disable auto correction, but keep suggestions on. if ((attribute.inputType & EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT) == 0) { @@ -529,7 +532,7 @@ public class LatinIME extends InputMethodService break; default: mKeyboardSwitcher.setKeyboardMode(KeyboardSwitcher.MODE_TEXT, - attribute.imeOptions, mEnableVoiceButton); + attribute.imeOptions, enableVoiceButton); updateShiftKeyState(attribute); } mInputView.closing(); @@ -790,6 +793,7 @@ public class LatinIME extends InputMethodService } mKeyboardSwitcher.setInputLocale(new Locale(mInputLanguage), getSelectedInputLanguages() != null); + mKeyboardSwitcher.setVoiceMode(mEnableVoice, mVoiceOnPrimary); mKeyboardSwitcher.makeKeyboards(true); } @@ -1504,7 +1508,8 @@ public class LatinIME extends InputMethodService int currentKeyboardMode = mKeyboardSwitcher.getKeyboardMode(); reloadKeyboards(); mKeyboardSwitcher.makeKeyboards(true); - mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0, mEnableVoiceButton); + mKeyboardSwitcher.setKeyboardMode(currentKeyboardMode, 0, + mEnableVoiceButton && mEnableVoice); initSuggest(mInputLanguage); persistInputLanguage(mInputLanguage); updateShiftKeyState(getCurrentInputEditorInfo()); @@ -1555,7 +1560,6 @@ public class LatinIME extends InputMethodService private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { return ENABLE_VOICE_BUTTON - && mEnableVoice && fieldCanDoVoice(fieldContext) && !(attribute != null && attribute.privateImeOptions != null && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE)); @@ -1719,10 +1723,13 @@ public class LatinIME extends InputMethodService if (VOICE_INSTALLED) { boolean enableVoice = sp.getBoolean(PREF_ENABLE_VOICE, true); - if (enableVoice != mEnableVoice && mKeyboardSwitcher != null) { - mKeyboardSwitcher.setVoiceMode(enableVoice); + boolean voiceOnPrimary = sp.getBoolean(PREF_VOICE_MAIN, true); + if (mKeyboardSwitcher != null && + (enableVoice != mEnableVoice || voiceOnPrimary != mVoiceOnPrimary)) { + mKeyboardSwitcher.setVoiceMode(enableVoice, voiceOnPrimary); } mEnableVoice = enableVoice; + mVoiceOnPrimary = voiceOnPrimary; } mAutoCorrectEnabled = sp.getBoolean(PREF_AUTO_COMPLETE, mResources.getBoolean(R.bool.enable_autocorrect)) & mShowSuggestions; diff --git a/src/com/android/inputmethod/latin/LatinKeyboard.java b/src/com/android/inputmethod/latin/LatinKeyboard.java index df38358d6..f876af709 100644 --- a/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -38,6 +38,10 @@ public class LatinKeyboard extends Keyboard { private Drawable mOldShiftIcon; private Drawable mOldShiftPreviewIcon; private Drawable mSpaceIcon; + private Drawable mMicIcon; + private Drawable mMicPreviewIcon; + private Drawable m123MicIcon; + private Drawable m123MicPreviewIcon; private Key mShiftKey; private Key mEnterKey; private Key mF1Key; @@ -45,6 +49,7 @@ public class LatinKeyboard extends Keyboard { /* package */ Locale mLocale; private Resources mRes; private int mMode; + private boolean mHasVoice; private int mExtensionResId; @@ -57,22 +62,26 @@ public class LatinKeyboard extends Keyboard { static int sSpacebarVerticalCorrection; public LatinKeyboard(Context context, int xmlLayoutResId) { - this(context, xmlLayoutResId, 0); + this(context, xmlLayoutResId, 0, false); } - public LatinKeyboard(Context context, int xmlLayoutResId, int mode) { + public LatinKeyboard(Context context, int xmlLayoutResId, int mode, boolean hasVoice) { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mMode = mode; mRes = res; + mHasVoice = hasVoice; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); mShiftLockPreviewIcon.setBounds(0, 0, mShiftLockPreviewIcon.getIntrinsicWidth(), mShiftLockPreviewIcon.getIntrinsicHeight()); mSpaceIcon = res.getDrawable(R.drawable.sym_keyboard_space); + mMicIcon = res.getDrawable(R.drawable.sym_keyboard_mic); + mMicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_mic); sSpacebarVerticalCorrection = res.getDimensionPixelOffset( R.dimen.spacebar_vertical_correction); + setF1Key(); } public LatinKeyboard(Context context, int layoutTemplateResId, @@ -227,28 +236,19 @@ public class LatinKeyboard extends Keyboard { } private void setF1Key() { - // TODO -// else { -// mSpaceKey.icon = mRes.getDrawable(R.drawable.sym_keyboard_space); -// switch (mMode) { -// case KeyboardSwitcher.KEYBOARDMODE_NORMAL: -// case KeyboardSwitcher.KEYBOARDMODE_IM: -// mF1Key.label = ","; -// mF1Key.codes = new int[] { ',' }; -// mF1Key.icon = null; -// mF1Key.iconPreview = null; -// break; -// case KeyboardSwitcher.KEYBOARDMODE_EMAIL: -// case KeyboardSwitcher.KEYBOARDMODE_URL: -// mF1Key.label = mRes.getString(R.string.popular_domain_0); -// mF1Key.codes = new int[] { '.' }; -// mF1Key.text = mF1Key.label; -// mF1Key.icon = null; -// mF1Key.iconPreview = null; -// mF1Key.popupResId = R.xml.popup_domains; -// break; -// } -// } + if (mF1Key == null) return; + System.err.println("Setting F1 key"); + if (!mHasVoice) { + mF1Key.label = ","; + mF1Key.codes = new int[] { ',' }; + mF1Key.icon = null; + mF1Key.iconPreview = null; + } else { + mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; + mF1Key.label = null; + mF1Key.icon = mMicIcon; + mF1Key.iconPreview = mMicPreviewIcon; + } } private void updateSpaceBarForLocale() {