diff --git a/java/res/drawable-hdpi/hint_popup.9.png b/java/res/drawable-hdpi/hint_popup.9.png new file mode 100644 index 000000000..b5ec003e6 Binary files /dev/null and b/java/res/drawable-hdpi/hint_popup.9.png differ diff --git a/java/res/drawable-mdpi/hint_popup.9.png b/java/res/drawable-mdpi/hint_popup.9.png new file mode 100644 index 000000000..444cc26ee Binary files /dev/null and b/java/res/drawable-mdpi/hint_popup.9.png differ diff --git a/java/res/xml/kbd_popup_narrow_template.xml b/java/res/xml/kbd_popup_narrow_template.xml index 23c686e8b..9b78711a0 100644 --- a/java/res/xml/kbd_popup_narrow_template.xml +++ b/java/res/xml/kbd_popup_narrow_template.xml @@ -18,10 +18,10 @@ */ --> - diff --git a/java/res/xml/kbd_qwerty_black_row4.xml b/java/res/xml/kbd_qwerty_black_row4.xml index 1718603fd..330ddda42 100644 --- a/java/res/xml/kbd_qwerty_black_row4.xml +++ b/java/res/xml/kbd_qwerty_black_row4.xml @@ -40,6 +40,7 @@ latin:keyWidth="40%p" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_f1" /> @@ -153,6 +158,7 @@ latin:keyWidth="20%p" /> + latin:codes="@integer/key_f1" /> + latin:codes="@integer/key_f1" /> @@ -312,6 +323,7 @@ latin:iconPreview="@drawable/sym_keyboard_feedback_tab" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black.xml b/java/res/xml/kbd_symbols_black.xml index b6a069c25..9e401a1cd 100644 --- a/java/res/xml/kbd_symbols_black.xml +++ b/java/res/xml/kbd_symbols_black.xml @@ -142,59 +142,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_common.xml b/java/res/xml/kbd_symbols_black_row4_common.xml new file mode 100644 index 000000000..7433eca7f --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_common.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml new file mode 100644 index 000000000..bbb169919 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_common_with_settings_key.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_im.xml b/java/res/xml/kbd_symbols_black_row4_im.xml new file mode 100644 index 000000000..a1546b7b5 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_im.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml new file mode 100644 index 000000000..4cab461e7 --- /dev/null +++ b/java/res/xml/kbd_symbols_black_row4_im_with_settings_key.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_common.xml b/java/res/xml/kbd_symbols_row4_common.xml new file mode 100644 index 000000000..ef7cdcaff --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_common.xml @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml new file mode 100644 index 000000000..54b85429c --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_common_with_settings_key.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_im.xml b/java/res/xml/kbd_symbols_row4_im.xml new file mode 100644 index 000000000..c7d679bc4 --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_im.xml @@ -0,0 +1,52 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml new file mode 100644 index 000000000..7cc209b6b --- /dev/null +++ b/java/res/xml/kbd_symbols_row4_im_with_settings_key.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift.xml b/java/res/xml/kbd_symbols_shift.xml index d83706b5c..b8f8faeb2 100644 --- a/java/res/xml/kbd_symbols_shift.xml +++ b/java/res/xml/kbd_symbols_shift.xml @@ -122,68 +122,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black.xml b/java/res/xml/kbd_symbols_shift_black.xml index e5f8abf6e..34684a65b 100644 --- a/java/res/xml/kbd_symbols_shift_black.xml +++ b/java/res/xml/kbd_symbols_shift_black.xml @@ -121,57 +121,63 @@ latin:keyEdgeFlags="right" /> - - - - - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_common.xml b/java/res/xml/kbd_symbols_shift_black_row4_common.xml new file mode 100644 index 000000000..beb5b3d67 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_common.xml @@ -0,0 +1,44 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml new file mode 100644 index 000000000..97f882a5a --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_common_with_settings_key.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_im.xml b/java/res/xml/kbd_symbols_shift_black_row4_im.xml new file mode 100644 index 000000000..c0263c215 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_im.xml @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml new file mode 100644 index 000000000..14d6a0b51 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_black_row4_im_with_settings_key.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_common.xml b/java/res/xml/kbd_symbols_shift_row4_common.xml new file mode 100644 index 000000000..4d5199e88 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_common.xml @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml new file mode 100644 index 000000000..df570ea1b --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_common_with_settings_key.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_im.xml b/java/res/xml/kbd_symbols_shift_row4_im.xml new file mode 100644 index 000000000..69c609254 --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_im.xml @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml b/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml new file mode 100644 index 000000000..aad6e400b --- /dev/null +++ b/java/res/xml/kbd_symbols_shift_row4_im_with_settings_key.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + diff --git a/java/res/xml/popup_at.xml b/java/res/xml/popup_at.xml new file mode 100644 index 000000000..4b19d4fd4 --- /dev/null +++ b/java/res/xml/popup_at.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/java/res/xml/popup_slash.xml b/java/res/xml/popup_slash.xml new file mode 100644 index 000000000..1ace909ef --- /dev/null +++ b/java/res/xml/popup_slash.xml @@ -0,0 +1,39 @@ + + + + + + + + + diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java index 86dbf1f60..ec422174d 100644 --- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java @@ -29,14 +29,14 @@ import java.util.Locale; public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceChangeListener { - public static final int MODE_NONE = 0; - public static final int MODE_TEXT = 1; - public static final int MODE_SYMBOLS = 2; - public static final int MODE_PHONE = 3; - public static final int MODE_URL = 4; - public static final int MODE_EMAIL = 5; - public static final int MODE_IM = 6; - public static final int MODE_WEB = 7; + public static final int MODE_TEXT = 0; + public static final int MODE_URL = 1; + public static final int MODE_EMAIL = 2; + public static final int MODE_IM = 3; + public static final int MODE_WEB = 4; + public static final int MODE_PHONE = 5; + + public static final int MODE_NONE = -1; // Main keyboard layouts without the settings key public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal; @@ -44,6 +44,13 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public static final int KEYBOARDMODE_EMAIL = R.id.mode_email; public static final int KEYBOARDMODE_IM = R.id.mode_im; public static final int KEYBOARDMODE_WEB = R.id.mode_webentry; + public static final int[] QWERTY_MODES = { + KEYBOARDMODE_NORMAL, + KEYBOARDMODE_URL, + KEYBOARDMODE_EMAIL, + KEYBOARDMODE_IM, + KEYBOARDMODE_WEB, + 0 /* for MODE_PHONE */ }; // Main keyboard layouts with the settings key public static final int KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY = R.id.mode_normal_with_settings_key; @@ -55,12 +62,45 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha R.id.mode_im_with_settings_key; public static final int KEYBOARDMODE_WEB_WITH_SETTINGS_KEY = R.id.mode_webentry_with_settings_key; + public static final int[] QWERTY_WITH_SETTINGS_KEY_MODES = { + KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY, + KEYBOARDMODE_URL_WITH_SETTINGS_KEY, + KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY, + KEYBOARDMODE_IM_WITH_SETTINGS_KEY, + KEYBOARDMODE_WEB_WITH_SETTINGS_KEY, + 0 /* for MODE_PHONE */ }; - // Symbols keyboard layout without the settings key - public static final int KEYBOARDMODE_SYMBOLS = R.id.mode_symbols; - // Symbols keyboard layout with the settings key - public static final int KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY = - R.id.mode_symbols_with_settings_key; + // Symbols keyboard layouts without the settings key + public static final int KEYBOARDMODE_SYMBOLS_NORMAL = R.id.mode_symbols_normal; + public static final int KEYBOARDMODE_SYMBOLS_URL = R.id.mode_symbols_url; + public static final int KEYBOARDMODE_SYMBOLS_EMAIL = R.id.mode_symbols_email; + public static final int KEYBOARDMODE_SYMBOLS_IM = R.id.mode_symbols_im; + public static final int KEYBOARDMODE_SYMBOLS_WEB = R.id.mode_symbols_webentry; + public static final int[] SYMBOLS_MODES = { + KEYBOARDMODE_SYMBOLS_NORMAL, + KEYBOARDMODE_SYMBOLS_URL, + KEYBOARDMODE_SYMBOLS_EMAIL, + KEYBOARDMODE_SYMBOLS_IM, + KEYBOARDMODE_SYMBOLS_WEB, + 0 /* for MODE_PHONE */ }; + // Symbols keyboard layouts with the settings key + public static final int KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY = + R.id.mode_symbols_normal_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY = + R.id.mode_symbols_url_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY = + R.id.mode_symbols_email_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY = + R.id.mode_symbols_im_with_settings_key; + public static final int KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY = + R.id.mode_symbols_webentry_with_settings_key; + public static final int[] SYMBOLS_WITH_SETTINGS_KEY_MODES = { + KEYBOARDMODE_SYMBOLS_NORMAL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_URL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_EMAIL_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_IM_WITH_SETTINGS_KEY, + KEYBOARDMODE_SYMBOLS_WEB_WITH_SETTINGS_KEY, + 0 /* for MODE_PHONE */ }; public static final String DEFAULT_LAYOUT_ID = "4"; public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20100902"; @@ -115,7 +155,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha private boolean mIsAutoCompletionActive; private boolean mHasVoice; private boolean mVoiceOnPrimary; - private boolean mPreferSymbols; private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; // Indicates whether or not we have the settings key @@ -158,21 +197,26 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId makeSymbolsId(boolean hasVoice) { + final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; return new KeyboardId(KBD_SYMBOLS[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, + SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], false, hasVoice); } private KeyboardId makeSymbolsShiftedId(boolean hasVoice) { + final int mode = mMode == MODE_NONE ? MODE_TEXT : mMode; return new KeyboardId(KBD_SYMBOLS_SHIFT[getCharColorId()], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, + SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode], false, hasVoice); } - public void makeKeyboards(boolean forceCreate) { + private void makeSymbolsKeyboardIds() { mSymbolsId = makeSymbolsId(mHasVoice && !mVoiceOnPrimary); mSymbolsShiftedId = makeSymbolsShiftedId(mHasVoice && !mVoiceOnPrimary); + } + public void makeKeyboards(boolean forceCreate) { + makeSymbolsKeyboardIds(); if (forceCreate) mKeyboards.clear(); // Configuration change is coming after the keyboard gets recreated. So don't rely on that. // If keyboards have already been made, check if we have a screen width change and @@ -207,10 +251,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha }); } - public KeyboardId(int xml, boolean hasVoice) { - this(xml, 0, false, hasVoice); - } - @Override public boolean equals(Object other) { return other instanceof KeyboardId && equals((KeyboardId) other); @@ -244,14 +284,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public void setKeyboardMode(int mode, int imeOptions, boolean enableVoice) { mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; - mPreferSymbols = mode == MODE_SYMBOLS; - if (mode == MODE_SYMBOLS) { - mode = MODE_TEXT; - } try { - setKeyboardMode(mode, imeOptions, enableVoice, mPreferSymbols); + setKeyboardMode(mode, imeOptions, enableVoice, false); } catch (RuntimeException e) { - LatinImeLogger.logOnException(mode + "," + imeOptions + "," + mPreferSymbols, e); + LatinImeLogger.logOnException(mode + "," + imeOptions, e); } } @@ -259,8 +295,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha if (mInputView == null) return; mMode = mode; mImeOptions = imeOptions; + makeSymbolsKeyboardIds(); if (enableVoice != mHasVoice) { - setVoiceMode(mHasVoice, mVoiceOnPrimary); + // TODO clean up this unnecessary recursive call. + setVoiceMode(enableVoice, mVoiceOnPrimary); } mIsSymbols = isSymbols; @@ -277,7 +315,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha mInputView.setKeyboard(keyboard); keyboard.setShifted(false); keyboard.setShiftLocked(keyboard.isShiftLocked()); - keyboard.setImeOptions(mInputMethodService.getResources(), mMode, imeOptions); + keyboard.setImeOptions(mInputMethodService.getResources(), mode, imeOptions); keyboard.setColorOfSymbolIcons(mIsAutoCompletionActive, isBlackSym()); // Update the settings key state because number of enabled IMEs could have been changed updateSettingsKeyState(PreferenceManager.getDefaultSharedPreferences(mInputMethodService)); @@ -309,48 +347,31 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha } private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) { - boolean hasVoice = hasVoiceButton(isSymbols); - int charColorId = getCharColorId(); - // TODO: generalize for any KeyboardId - int keyboardRowsResId = KBD_QWERTY[charColorId]; + final boolean hasVoice = hasVoiceButton(isSymbols); + final int charColorId = getCharColorId(); + final int keyboardRowsResId; + final boolean enableShiftLock; + final int keyboardMode; + + if (mode == MODE_NONE) { + LatinImeLogger.logOnWarning( + "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); + mode = MODE_TEXT; + } if (isSymbols) { - if (mode == MODE_PHONE) { - return new KeyboardId(KBD_PHONE_SYMBOLS[charColorId], hasVoice); - } else { - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - } + keyboardRowsResId = mode == MODE_PHONE + ? KBD_PHONE_SYMBOLS[charColorId] : KBD_SYMBOLS[charColorId]; + enableShiftLock = false; + keyboardMode = mHasSettingsKey + ? SYMBOLS_WITH_SETTINGS_KEY_MODES[mode] : SYMBOLS_MODES[mode]; + } else { // QWERTY + keyboardRowsResId = mode == MODE_PHONE + ? KBD_PHONE[charColorId] : KBD_QWERTY[charColorId]; + enableShiftLock = mode == MODE_PHONE ? false : true; + keyboardMode = mHasSettingsKey + ? QWERTY_WITH_SETTINGS_KEY_MODES[mode] : QWERTY_MODES[mode]; } - switch (mode) { - case MODE_NONE: - LatinImeLogger.logOnWarning( - "getKeyboardId:" + mode + "," + imeOptions + "," + isSymbols); - /* fall through */ - case MODE_TEXT: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_NORMAL_WITH_SETTINGS_KEY : KEYBOARDMODE_NORMAL, - true, hasVoice); - case MODE_SYMBOLS: - return new KeyboardId(KBD_SYMBOLS[charColorId], mHasSettingsKey ? - KEYBOARDMODE_SYMBOLS_WITH_SETTINGS_KEY : KEYBOARDMODE_SYMBOLS, - false, hasVoice); - case MODE_PHONE: - return new KeyboardId(KBD_PHONE[charColorId], hasVoice); - case MODE_URL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_URL_WITH_SETTINGS_KEY : KEYBOARDMODE_URL, true, hasVoice); - case MODE_EMAIL: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_EMAIL_WITH_SETTINGS_KEY : KEYBOARDMODE_EMAIL, true, hasVoice); - case MODE_IM: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_IM_WITH_SETTINGS_KEY : KEYBOARDMODE_IM, true, hasVoice); - case MODE_WEB: - return new KeyboardId(keyboardRowsResId, mHasSettingsKey ? - KEYBOARDMODE_WEB_WITH_SETTINGS_KEY : KEYBOARDMODE_WEB, true, hasVoice); - } - return null; + return new KeyboardId(keyboardRowsResId, keyboardMode, enableShiftLock, hasVoice); } public int getKeyboardMode() { @@ -411,7 +432,7 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha public void toggleSymbols() { setKeyboardMode(mMode, mImeOptions, mHasVoice, !mIsSymbols); - if (mIsSymbols && !mPreferSymbols) { + if (mIsSymbols) { mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN; } else { mSymbolsModeState = SYMBOLS_MODE_STATE_NONE; diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index edda9e866..bb29e6367 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -2333,8 +2333,8 @@ public class LatinIME extends InputMethodService private boolean shouldShowVoiceButton(FieldContext fieldContext, EditorInfo attribute) { return ENABLE_VOICE_BUTTON && fieldCanDoVoice(fieldContext) - && !(attribute != null && attribute.privateImeOptions != null - && attribute.privateImeOptions.equals(IME_OPTION_NO_MICROPHONE)) + && !(attribute != null + && IME_OPTION_NO_MICROPHONE.equals(attribute.privateImeOptions)) && SpeechRecognizer.isRecognitionAvailable(this); } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboard.java b/java/src/com/android/inputmethod/latin/LatinKeyboard.java index 3ca85c5d0..fcbada191 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboard.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboard.java @@ -60,6 +60,7 @@ public class LatinKeyboard extends BaseKeyboard { private final Drawable mButtonArrowRightIcon; private Key mEnterKey; private Key mF1Key; + private final Drawable mHintIcon; private Key mSpaceKey; private Key m123Key; private int mSpaceKeyIndex = -1; @@ -69,6 +70,7 @@ public class LatinKeyboard extends BaseKeyboard { private LanguageSwitcher mLanguageSwitcher; private final Resources mRes; private final Context mContext; + private int mMode; // TODO: remove this and use the corresponding mode in the parent class // Whether this keyboard has voice icon on it private boolean mHasVoiceButton; // Whether voice icon is enabled at all @@ -119,6 +121,7 @@ public class LatinKeyboard extends BaseKeyboard { super(context, xmlLayoutResId, mode); final Resources res = context.getResources(); mContext = context; + mMode = mode; mRes = res; mShiftLockIcon = res.getDrawable(R.drawable.sym_keyboard_shift_locked); mShiftLockPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_shift_locked); @@ -133,6 +136,7 @@ public class LatinKeyboard extends BaseKeyboard { mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right); m123MicIcon = res.getDrawable(R.drawable.sym_keyboard_123_mic); m123MicPreviewIcon = res.getDrawable(R.drawable.sym_keyboard_feedback_123_mic); + mHintIcon = res.getDrawable(R.drawable.hint_popup); setDefaultBounds(m123MicPreviewIcon); sSpacebarVerticalCorrection = res.getDimensionPixelOffset( R.dimen.spacebar_vertical_correction); @@ -180,10 +184,12 @@ public class LatinKeyboard extends BaseKeyboard { key.text = null; key.iconPreview = null; key.icon = null; + key.hintIcon = null; key.label = label; } public void setImeOptions(Resources res, int mode, int options) { + mMode = mode; if (mEnterKey == null) return; switch (options & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION)) { @@ -292,7 +298,7 @@ public class LatinKeyboard extends BaseKeyboard { mMicIcon = mRes.getDrawable(R.drawable.sym_keyboard_mic); m123MicIcon = mRes.getDrawable(R.drawable.sym_keyboard_123_mic); } - updateF1Key(); + updateDynamicKeys(); if (mSpaceKey != null) { updateSpaceBarForLocale(isAutoCompletion, isBlack); } @@ -301,11 +307,16 @@ public class LatinKeyboard extends BaseKeyboard { public void setVoiceMode(boolean hasVoiceButton, boolean hasVoice) { mHasVoiceButton = hasVoiceButton; mVoiceEnabled = hasVoice; + updateDynamicKeys(); + } + + private void updateDynamicKeys() { + update123Key(); updateF1Key(); } - private void updateF1Key() { - if (mF1Key == null) return; + private void update123Key() { + // Update KEYCODE_MODE_CHANGE key only on alphabet mode, not on symbol mode. if (m123Key != null && mIsAlphaKeyboard) { if (mVoiceEnabled && !mHasVoiceButton) { m123Key.icon = m123MicIcon; @@ -317,22 +328,52 @@ public class LatinKeyboard extends BaseKeyboard { m123Key.label = m123Label; } } + } - if (mHasVoiceButton && mVoiceEnabled) { - mF1Key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; - mF1Key.label = null; - mF1Key.icon = mMicIcon; - mF1Key.iconPreview = mMicPreviewIcon; - mF1Key.popupResId = R.xml.popup_mic; - } else { - mF1Key.label = ","; - mF1Key.codes = new int[] { ',' }; - mF1Key.icon = null; - mF1Key.iconPreview = null; - mF1Key.popupResId = R.xml.popup_comma; + private void updateF1Key() { + // Update KEYCODE_F1 key. Please note that some keyboard layouts have no F1 key. + if (mF1Key == null) + return; + + if (mIsAlphaKeyboard) { + if (mMode == KeyboardSwitcher.MODE_URL) { + setNonMicF1Key(mF1Key, "/", R.xml.popup_slash); + } else if (mMode == KeyboardSwitcher.MODE_EMAIL) { + setNonMicF1Key(mF1Key, "@", R.xml.popup_at); + } else { + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); + } + } + } else { // Symbols keyboard + if (mVoiceEnabled && mHasVoiceButton) { + setMicF1Key(mF1Key); + } else { + setNonMicF1Key(mF1Key, ",", R.xml.popup_comma); + } } } + private void setMicF1Key(Key key) { + key.label = null; + key.codes = new int[] { LatinKeyboardView.KEYCODE_VOICE }; + key.popupResId = R.xml.popup_mic; + key.icon = mMicIcon; + key.hintIcon = mHintIcon; + key.iconPreview = mMicPreviewIcon; + } + + private void setNonMicF1Key(Key key, String label, int popupResId) { + key.label = label; + key.codes = new int[] { label.charAt(0) }; + key.popupResId = popupResId; + key.icon = null; + key.hintIcon = mHintIcon; + key.iconPreview = null; + } + /** * @return a key which should be invalidated. */ diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index b02780bf6..4e264e853 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -57,6 +57,8 @@ import java.util.WeakHashMap; * A view that renders a virtual {@link LatinKeyboard}. It handles rendering of keys and * detecting key presses and touch movements. * + * TODO: References to LatinKeyboard in this class should be replaced with ones to its base class. + * * @attr ref R.styleable#LatinKeyboardBaseView_keyBackground * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewLayout * @attr ref R.styleable#LatinKeyboardBaseView_keyPreviewOffset @@ -160,7 +162,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Miscellaneous constants /* package */ static final int NOT_A_KEY = -1; private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable }; - private static final int NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL = -1; + private static final int HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL = -1; // XML attribute private int mKeyTextSize; @@ -861,32 +863,20 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // Turn off drop shadow paint.setShadowLayer(0, 0, 0, 0); } - Drawable icon = null; - if (key.label == null && key.icon != null) - icon = key.icon; - if (icon == null && key.hintIcon != null && drawHintIcon) - icon = key.hintIcon; - if (icon != null) { - // Special handing for the upper-right number hint icons - final int drawableWidth; - final int drawableHeight; - final int drawableX; - final int drawableY; - if (icon == key.hintIcon) { - drawableWidth = key.width; - drawableHeight = key.height; - drawableX = 0; - drawableY = NUMBER_HINT_VERTICAL_ADJUSTMENT_PIXEL; - } else { - drawableWidth = key.icon.getIntrinsicWidth(); - drawableHeight = key.icon.getIntrinsicHeight(); - drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2; - drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2; - } - canvas.translate(drawableX, drawableY); - icon.setBounds(0, 0, drawableWidth, drawableHeight); - icon.draw(canvas); - canvas.translate(-drawableX, -drawableY); + if (key.label == null && key.icon != null) { + int drawableWidth = key.icon.getIntrinsicWidth(); + int drawableHeight = key.icon.getIntrinsicHeight(); + int drawableX = (key.width + padding.left - padding.right - drawableWidth) / 2; + int drawableY = (key.height + padding.top - padding.bottom - drawableHeight) / 2; + drawIcon(canvas, key.icon, drawableX, drawableY, drawableWidth, drawableHeight); + + } + if (key.hintIcon != null && drawHintIcon) { + int drawableWidth = key.width; + int drawableHeight = key.height; + int drawableX = 0; + int drawableY = HINT_ICON_VERTICAL_ADJUSTMENT_PIXEL; + drawIcon(canvas, key.hintIcon, drawableX, drawableY, drawableWidth, drawableHeight); } canvas.translate(-key.x - kbdPaddingLeft, -key.y - kbdPaddingTop); } @@ -920,6 +910,13 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx mDirtyRect.setEmpty(); } + private void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width, int height) { + canvas.translate(x, y); + icon.setBounds(0, 0, width, height); + icon.draw(canvas); + canvas.translate(-x, -y); + } + public void setForeground(boolean foreground) { mInForeground = foreground; } @@ -962,8 +959,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx // WindowManager.BadTokenException. if (key == null || !mInForeground) return; - // Should not draw number hint icons - if (key.icon != null && key.label == null) { + if (key.icon != null) { mPreviewText.setCompoundDrawables(null, null, null, key.iconPreview != null ? key.iconPreview : key.icon); mPreviewText.setText(null);