Merge "Notify keyboard language on space bar when it has changed" into honeycomb

main
Tadashi G. Takaoka 2011-01-14 05:25:35 -08:00 committed by Android (Google) Code Review
commit c99c0ed939
10 changed files with 135 additions and 85 deletions

View File

@ -28,6 +28,9 @@
<bool name="config_digit_popup_characters_enabled">false</bool> <bool name="config_digit_popup_characters_enabled">false</bool>
<!-- Whether or not Popup on key press is enabled by default --> <!-- Whether or not Popup on key press is enabled by default -->
<bool name="config_default_popup_preview">false</bool> <bool name="config_default_popup_preview">false</bool>
<bool name="config_use_spacebar_language_switcher">false</bool>
<!-- The language is never displayed if == 0, always displayed if < 0 -->
<integer name="config_delay_before_fadeout_language_on_spacebar">1200</integer>
<!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. --> <!-- This configuration is the index of the array {@link KeyboardSwitcher.KEYBOARD_THEMES}. -->
<string name="config_default_keyboard_theme_id" translatable="false">5</string> <string name="config_default_keyboard_theme_id" translatable="false">5</string>
<string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string> <string name="config_text_size_of_language_on_spacebar" translatable="false">medium</string>

View File

@ -31,6 +31,10 @@
<bool name="config_digit_popup_characters_enabled">true</bool> <bool name="config_digit_popup_characters_enabled">true</bool>
<!-- Whether or not Popup on key press is enabled by default --> <!-- Whether or not Popup on key press is enabled by default -->
<bool name="config_default_popup_preview">true</bool> <bool name="config_default_popup_preview">true</bool>
<bool name="config_use_spacebar_language_switcher">true</bool>
<!-- The language is never displayed if == 0, always displayed if < 0 -->
<integer name="config_delay_before_fadeout_language_on_spacebar">-1</integer>
<integer name="config_duration_of_fadeout_language_on_spacebar">50</integer>
<integer name="config_delay_before_preview">0</integer> <integer name="config_delay_before_preview">0</integer>
<integer name="config_delay_after_preview">10</integer> <integer name="config_delay_after_preview">10</integer>
<integer name="config_preview_fadein_anim_time">0</integer> <integer name="config_preview_fadein_anim_time">0</integer>

View File

@ -57,7 +57,6 @@
<key-style <key-style
latin:styleName="nonSpecialBackgroundSpaceKeyStyle" latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
latin:code="@integer/key_space" latin:code="@integer/key_space"
latin:keyIcon="@drawable/sym_keyboard_space_holo"
latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
<key-style <key-style
latin:styleName="smileyKeyStyle" latin:styleName="smileyKeyStyle"
@ -102,12 +101,10 @@
<key-style <key-style
latin:styleName="spaceKeyStyle" latin:styleName="spaceKeyStyle"
latin:code="@integer/key_space" latin:code="@integer/key_space"
latin:keyIcon="@drawable/sym_bkeyboard_space"
latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
<key-style <key-style
latin:styleName="nonSpecialBackgroundSpaceKeyStyle" latin:styleName="nonSpecialBackgroundSpaceKeyStyle"
latin:code="@integer/key_space" latin:code="@integer/key_space"
latin:keyIcon="@drawable/sym_bkeyboard_space"
latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
<key-style <key-style
latin:styleName="smileyKeyStyle" latin:styleName="smileyKeyStyle"

View File

@ -81,7 +81,6 @@
<key-style <key-style
latin:styleName="numSpaceKeyStyle" latin:styleName="numSpaceKeyStyle"
latin:code="@integer/key_space" latin:code="@integer/key_space"
latin:keyIcon="@drawable/sym_keyboard_space_holo"
latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
</case> </case>
<case <case
@ -143,7 +142,6 @@
<key-style <key-style
latin:styleName="numSpaceKeyStyle" latin:styleName="numSpaceKeyStyle"
latin:code="@integer/key_space" latin:code="@integer/key_space"
latin:keyIcon="@drawable/sym_bkeyboard_space"
latin:iconPreview="@drawable/sym_keyboard_feedback_space" /> latin:iconPreview="@drawable/sym_keyboard_feedback_space" />
</case> </case>
</switch> </switch>

View File

@ -157,7 +157,14 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
boolean voiceButtonOnPrimary) { boolean voiceButtonOnPrimary) {
mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA; mAutoModeSwitchState = AUTO_MODE_SWITCH_STATE_ALPHA;
try { try {
if (mInputView == null) return;
final Keyboard oldKeyboard = mInputView.getKeyboard();
loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary, false); loadKeyboardInternal(mode, imeOptions, voiceKeyEnabled, voiceButtonOnPrimary, false);
final Keyboard newKeyboard = mInputView.getKeyboard();
if (newKeyboard.isAlphaKeyboard() && (oldKeyboard == null
|| !newKeyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale))) {
mInputMethodService.mHandler.startDisplayLanguageOnSpacebar();
}
} catch (RuntimeException e) { } catch (RuntimeException e) {
Log.w(TAG, e); Log.w(TAG, e);
LatinImeLogger.logOnException(mode + "," + imeOptions, e); LatinImeLogger.logOnException(mode + "," + imeOptions, e);
@ -167,6 +174,11 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled, private void loadKeyboardInternal(int mode, int imeOptions, boolean voiceButtonEnabled,
boolean voiceButtonOnPrimary, boolean isSymbols) { boolean voiceButtonOnPrimary, boolean isSymbols) {
if (mInputView == null) return; if (mInputView == null) return;
final Keyboard oldKeyboard = mInputView.getKeyboard();
final KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
if (oldKeyboard != null && oldKeyboard.mId.equals(id))
return;
mInputView.setPreviewEnabled(mInputMethodService.getPopupOn()); mInputView.setPreviewEnabled(mInputMethodService.getPopupOn());
mMode = mode; mMode = mode;
@ -178,11 +190,8 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
mHasSettingsKey = getSettingsKeyMode(mPrefs, mInputMethodService); mHasSettingsKey = getSettingsKeyMode(mPrefs, mInputMethodService);
makeSymbolsKeyboardIds(); makeSymbolsKeyboardIds();
KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
LatinKeyboard keyboard = getKeyboard(id);
mCurrentId = id; mCurrentId = id;
mInputView.setKeyboard(keyboard); mInputView.setKeyboard(getKeyboard(id));
} }
private LatinKeyboard getKeyboard(KeyboardId id) { private LatinKeyboard getKeyboard(KeyboardId id) {
@ -210,6 +219,10 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive); keyboard.onAutoCorrectionStateChanged(mIsAutoCorrectionActive);
keyboard.setShifted(false); keyboard.setShifted(false);
// If the cached keyboard had been switched to another keyboard while the language was
// displayed on its spacebar, it might have had arbitrary text fade factor. In such case,
// we should reset the text fade factor.
keyboard.setSpacebarTextFadeFactor(0.0f, null);
return keyboard; return keyboard;
} }

View File

@ -912,9 +912,8 @@ public class KeyboardView extends View implements PointerTracker.UIProxy {
// We should re-draw popup preview when 1) we need to hide the preview, 2) we will show // We should re-draw popup preview when 1) we need to hide the preview, 2) we will show
// the space key preview and 3) pointer moves off the space key to other letter key, we // the space key preview and 3) pointer moves off the space key to other letter key, we
// should hide the preview of the previous key. // should hide the preview of the previous key.
@SuppressWarnings("unused")
final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null) final boolean hidePreviewOrShowSpaceKeyPreview = (tracker == null)
|| (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER || (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
&& SubtypeSwitcher.getInstance().needsToDisplayLanguage() && SubtypeSwitcher.getInstance().needsToDisplayLanguage()
&& (tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex))); && (tracker.isSpaceKey(keyIndex) || tracker.isSpaceKey(oldKeyIndex)));
// If key changed and preview is on or the key is space (language switch is enabled) // If key changed and preview is on or the key is space (language switch is enabled)

View File

@ -24,6 +24,7 @@ import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Paint.Align; import android.graphics.Paint.Align;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
@ -47,7 +48,9 @@ public class LatinKeyboard extends Keyboard {
private final Drawable mSpaceAutoCorrectionIndicator; private final Drawable mSpaceAutoCorrectionIndicator;
private final Drawable mButtonArrowLeftIcon; private final Drawable mButtonArrowLeftIcon;
private final Drawable mButtonArrowRightIcon; private final Drawable mButtonArrowRightIcon;
private final int mSpaceBarTextShadowColor; private final int mSpacebarTextColor;
private final int mSpacebarTextShadowColor;
private float mSpacebarTextFadeFactor = 0.0f;
private final int[] mSpaceKeyIndexArray; private final int[] mSpaceKeyIndexArray;
private int mSpaceDragStartX; private int mSpaceDragStartX;
private int mSpaceDragLastDiff; private int mSpaceDragLastDiff;
@ -67,6 +70,7 @@ public class LatinKeyboard extends Keyboard {
private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f; private static final float SPACEBAR_POPUP_MIN_RATIO = 0.4f;
// Height in space key the language name will be drawn. (proportional to space key height) // Height in space key the language name will be drawn. (proportional to space key height)
public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f; public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
private static final float SPACEBAR_LANGUAGE_BASELINE_WITHOUT_ICON = 0.65f;
// If the full language name needs to be smaller than this value to be drawn on space key, // If the full language name needs to be smaller than this value to be drawn on space key,
// its short language name will be used instead. // its short language name will be used instead.
private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f; private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
@ -80,11 +84,12 @@ public class LatinKeyboard extends Keyboard {
super(context, id.getXmlId(), id); super(context, id.getXmlId(), id);
final Resources res = context.getResources(); final Resources res = context.getResources();
mContext = context; mContext = context;
mSpacebarTextColor = res.getColor(R.color.latinkeyboard_bar_language_text);
if (id.mColorScheme == KeyboardView.COLOR_SCHEME_BLACK) { if (id.mColorScheme == KeyboardView.COLOR_SCHEME_BLACK) {
mSpaceBarTextShadowColor = res.getColor( mSpacebarTextShadowColor = res.getColor(
R.color.latinkeyboard_bar_language_shadow_black); R.color.latinkeyboard_bar_language_shadow_black);
} else { // default color scheme is KeyboardView.COLOR_SCHEME_WHITE } else { // default color scheme is KeyboardView.COLOR_SCHEME_WHITE
mSpaceBarTextShadowColor = res.getColor( mSpacebarTextShadowColor = res.getColor(
R.color.latinkeyboard_bar_language_shadow_white); R.color.latinkeyboard_bar_language_shadow_white);
} }
mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led); mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
@ -96,25 +101,38 @@ public class LatinKeyboard extends Keyboard {
mSpaceKeyIndexArray = new int[] { indexOf(CODE_SPACE) }; mSpaceKeyIndexArray = new int[] { indexOf(CODE_SPACE) };
} }
public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) {
mSpacebarTextFadeFactor = fadeFactor;
updateSpacebarForLocale(false);
if (view != null)
view.invalidateKey(mSpaceKey);
}
private static int getSpacebarTextColor(int color, float fadeFactor) {
final int newColor = Color.argb((int)(Color.alpha(color) * fadeFactor),
Color.red(color), Color.green(color), Color.blue(color));
return newColor;
}
/** /**
* @return a key which should be invalidated. * @return a key which should be invalidated.
*/ */
public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) { public Key onAutoCorrectionStateChanged(boolean isAutoCorrection) {
updateSpaceBarForLocale(isAutoCorrection); updateSpacebarForLocale(isAutoCorrection);
return mSpaceKey; return mSpaceKey;
} }
private void updateSpaceBarForLocale(boolean isAutoCorrection) { private void updateSpacebarForLocale(boolean isAutoCorrection) {
final Resources res = mContext.getResources(); final Resources res = mContext.getResources();
// If application locales are explicitly selected. // If application locales are explicitly selected.
if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) { if (SubtypeSwitcher.getInstance().needsToDisplayLanguage()) {
mSpaceKey.setIcon(new BitmapDrawable(res, mSpaceKey.setIcon(new BitmapDrawable(res,
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCorrection))); drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
} else { } else {
// sym_keyboard_space_led can be shared with Black and White symbol themes. // sym_keyboard_space_led can be shared with Black and White symbol themes.
if (isAutoCorrection) { if (isAutoCorrection) {
mSpaceKey.setIcon(new BitmapDrawable(res, mSpaceKey.setIcon(new BitmapDrawable(res,
drawSpaceBar(OPACITY_FULLY_OPAQUE, isAutoCorrection))); drawSpacebar(OPACITY_FULLY_OPAQUE, isAutoCorrection)));
} else { } else {
mSpaceKey.setIcon(mSpaceIcon); mSpaceKey.setIcon(mSpaceIcon);
} }
@ -128,8 +146,8 @@ public class LatinKeyboard extends Keyboard {
return bounds.width(); return bounds.width();
} }
// Layout local language name and left and right arrow on space bar. // Layout local language name and left and right arrow on spacebar.
private static String layoutSpaceBar(Paint paint, Locale locale, Drawable lArrow, private static String layoutSpacebar(Paint paint, Locale locale, Drawable lArrow,
Drawable rArrow, int width, int height, float origTextSize, Drawable rArrow, int width, int height, float origTextSize,
boolean allowVariableTextSize) { boolean allowVariableTextSize) {
final float arrowWidth = lArrow.getIntrinsicWidth(); final float arrowWidth = lArrow.getIntrinsicWidth();
@ -138,7 +156,7 @@ public class LatinKeyboard extends Keyboard {
final Rect bounds = new Rect(); final Rect bounds = new Rect();
// Estimate appropriate language name text size to fit in maxTextWidth. // Estimate appropriate language name text size to fit in maxTextWidth.
String language = SubtypeSwitcher.getDisplayLanguage(locale); String language = SubtypeSwitcher.getFullDisplayName(locale, true);
int textWidth = getTextWidth(paint, language, origTextSize, bounds); int textWidth = getTextWidth(paint, language, origTextSize, bounds);
// Assuming text width and text size are proportional to each other. // Assuming text width and text size are proportional to each other.
float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f); float textSize = origTextSize * Math.min(maxTextWidth / textWidth, 1.0f);
@ -171,8 +189,7 @@ public class LatinKeyboard extends Keyboard {
return language; return language;
} }
@SuppressWarnings("unused") private Bitmap drawSpacebar(int opacity, boolean isAutoCorrection) {
private Bitmap drawSpaceBar(int opacity, boolean isAutoCorrection) {
final int width = mSpaceKey.mWidth; final int width = mSpaceKey.mWidth;
final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight; final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight;
final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
@ -202,21 +219,22 @@ public class LatinKeyboard extends Keyboard {
} }
final boolean allowVariableTextSize = true; final boolean allowVariableTextSize = true;
final String language = layoutSpaceBar(paint, subtypeSwitcher.getInputLocale(), final String language = layoutSpacebar(paint, subtypeSwitcher.getInputLocale(),
mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height, mButtonArrowLeftIcon, mButtonArrowRightIcon, width, height,
getTextSizeFromTheme(textStyle, defaultTextSize), getTextSizeFromTheme(textStyle, defaultTextSize),
allowVariableTextSize); allowVariableTextSize);
// Draw language text with shadow // Draw language text with shadow
final float baseline = height * SPACEBAR_LANGUAGE_BASELINE; final float baseline = height * (mSpaceIcon != null ? SPACEBAR_LANGUAGE_BASELINE
: SPACEBAR_LANGUAGE_BASELINE_WITHOUT_ICON);
final float descent = paint.descent(); final float descent = paint.descent();
paint.setColor(mSpaceBarTextShadowColor); paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, mSpacebarTextFadeFactor));
canvas.drawText(language, width / 2, baseline - descent - 1, paint); canvas.drawText(language, width / 2, baseline - descent - 1, paint);
paint.setColor(res.getColor(R.color.latinkeyboard_bar_language_text)); paint.setColor(getSpacebarTextColor(mSpacebarTextColor, mSpacebarTextFadeFactor));
canvas.drawText(language, width / 2, baseline - descent, paint); canvas.drawText(language, width / 2, baseline - descent, paint);
// Put arrows that are already layed out on either side of the text // Put arrows that are already layed out on either side of the text
if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
&& subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) { && subtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) {
mButtonArrowLeftIcon.draw(canvas); mButtonArrowLeftIcon.draw(canvas);
mButtonArrowRightIcon.draw(canvas); mButtonArrowRightIcon.draw(canvas);
@ -291,7 +309,6 @@ public class LatinKeyboard extends Keyboard {
* switching input languages. * switching input languages.
*/ */
@Override @Override
@SuppressWarnings("unused") // SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER is constant
public boolean isInside(Key key, int pointX, int pointY) { public boolean isInside(Key key, int pointX, int pointY) {
int x = pointX; int x = pointX;
int y = pointY; int y = pointY;
@ -302,7 +319,7 @@ public class LatinKeyboard extends Keyboard {
if (code == CODE_DELETE) x -= key.mWidth / 6; if (code == CODE_DELETE) x -= key.mWidth / 6;
} else if (code == CODE_SPACE) { } else if (code == CODE_SPACE) {
y += LatinKeyboard.sSpacebarVerticalCorrection; y += LatinKeyboard.sSpacebarVerticalCorrection;
if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
&& SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) { && SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) {
if (mCurrentlyInSpace) { if (mCurrentlyInSpace) {
int diff = x - mSpaceDragStartX; int diff = x - mSpaceDragStartX;

View File

@ -85,6 +85,14 @@ public class LatinKeyboardView extends KeyboardView {
} }
} }
public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboard oldKeyboard) {
final LatinKeyboard currentKeyboard = getLatinKeyboard();
// We should not set text fade factor to the keyboard which does not display the language on
// its spacebar.
if (currentKeyboard != null && currentKeyboard == oldKeyboard)
currentKeyboard.setSpacebarTextFadeFactor(fadeFactor, this);
}
@Override @Override
protected boolean onLongPress(Key key) { protected boolean onLongPress(Key key) {
int primaryCode = key.mCode; int primaryCode = key.mCode;

View File

@ -21,6 +21,7 @@ import com.android.inputmethod.keyboard.KeyboardActionListener;
import com.android.inputmethod.keyboard.KeyboardId; import com.android.inputmethod.keyboard.KeyboardId;
import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.keyboard.KeyboardView; import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.keyboard.LatinKeyboard;
import com.android.inputmethod.keyboard.LatinKeyboardView; import com.android.inputmethod.keyboard.LatinKeyboardView;
import com.android.inputmethod.latin.Utils.RingCharBuffer; import com.android.inputmethod.latin.Utils.RingCharBuffer;
import com.android.inputmethod.voice.VoiceIMEConnector; import com.android.inputmethod.voice.VoiceIMEConnector;
@ -151,6 +152,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private boolean mAutoCap; private boolean mAutoCap;
private boolean mQuickFixes; private boolean mQuickFixes;
private boolean mConfigSwipeDownDismissKeyboardEnabled; private boolean mConfigSwipeDownDismissKeyboardEnabled;
private int mConfigDelayBeforeFadeoutLanguageOnSpacebar;
private int mConfigDurationOfFadeoutLanguageOnSpacebar;
private int mCorrectionMode; private int mCorrectionMode;
private int mCommittedLength; private int mCommittedLength;
@ -241,9 +244,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private static final int MSG_UPDATE_OLD_SUGGESTIONS = 1; private static final int MSG_UPDATE_OLD_SUGGESTIONS = 1;
private static final int MSG_UPDATE_SHIFT_STATE = 2; private static final int MSG_UPDATE_SHIFT_STATE = 2;
private static final int MSG_VOICE_RESULTS = 3; private static final int MSG_VOICE_RESULTS = 3;
private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4;
private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
final KeyboardSwitcher switcher = mKeyboardSwitcher;
final LatinKeyboardView inputView = switcher.getInputView();
switch (msg.what) { switch (msg.what) {
case MSG_UPDATE_SUGGESTIONS: case MSG_UPDATE_SUGGESTIONS:
updateSuggestions(); updateSuggestions();
@ -252,12 +259,21 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
setOldSuggestions(); setOldSuggestions();
break; break;
case MSG_UPDATE_SHIFT_STATE: case MSG_UPDATE_SHIFT_STATE:
mKeyboardSwitcher.updateShiftState(); switcher.updateShiftState();
break; break;
case MSG_VOICE_RESULTS: case MSG_VOICE_RESULTS:
mVoiceConnector.handleVoiceResults(preferCapitalization() mVoiceConnector.handleVoiceResults(preferCapitalization()
|| (mKeyboardSwitcher.isAlphabetMode() || (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked()));
&& mKeyboardSwitcher.isShiftedOrShiftLocked())); break;
case MSG_FADEOUT_LANGUAGE_ON_SPACEBAR:
if (inputView != null)
inputView.setSpacebarTextFadeFactor(0.5f, (LatinKeyboard)msg.obj);
sendMessageDelayed(obtainMessage(MSG_DISMISS_LANGUAGE_ON_SPACEBAR, msg.obj),
mConfigDurationOfFadeoutLanguageOnSpacebar);
break;
case MSG_DISMISS_LANGUAGE_ON_SPACEBAR:
if (inputView != null)
inputView.setSpacebarTextFadeFactor(0.0f, (LatinKeyboard)msg.obj);
break; break;
} }
} }
@ -297,6 +313,23 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
public void updateVoiceResults() { public void updateVoiceResults() {
sendMessage(obtainMessage(MSG_VOICE_RESULTS)); sendMessage(obtainMessage(MSG_VOICE_RESULTS));
} }
public void startDisplayLanguageOnSpacebar() {
removeMessages(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR);
removeMessages(MSG_DISMISS_LANGUAGE_ON_SPACEBAR);
final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
if (inputView != null) {
final LatinKeyboard keyboard = inputView.getLatinKeyboard();
// The language is never displayed when the delay is zero.
if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0)
inputView.setSpacebarTextFadeFactor(1.0f, keyboard);
// The language is always displayed when the delay is negative.
if (mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) {
sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard),
mConfigDelayBeforeFadeoutLanguageOnSpacebar);
}
}
}
} }
@Override @Override
@ -319,6 +352,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
res.getBoolean(R.bool.default_recorrection_enabled)); res.getBoolean(R.bool.default_recorrection_enabled));
mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean( mConfigSwipeDownDismissKeyboardEnabled = res.getBoolean(
R.bool.config_swipe_down_dismiss_keyboard_enabled); R.bool.config_swipe_down_dismiss_keyboard_enabled);
mConfigDelayBeforeFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_delay_before_fadeout_language_on_spacebar);
mConfigDurationOfFadeoutLanguageOnSpacebar = res.getInteger(
R.integer.config_duration_of_fadeout_language_on_spacebar);
Utils.GCUtils.getInstance().reset(); Utils.GCUtils.getInstance().reset();
boolean tryGC = true; boolean tryGC = true;
@ -401,23 +438,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
@Override @Override
public void onConfigurationChanged(Configuration conf) { public void onConfigurationChanged(Configuration conf) {
mSubtypeSwitcher.onConfigurationChanged(conf);
if (mSubtypeSwitcher.isKeyboardMode())
onKeyboardLanguageChanged();
updateAutoTextEnabled();
// If orientation changed while predicting, commit the change // If orientation changed while predicting, commit the change
if (conf.orientation != mOrientation) { if (conf.orientation != mOrientation) {
InputConnection ic = getCurrentInputConnection(); InputConnection ic = getCurrentInputConnection();
commitTyped(ic); commitTyped(ic);
if (ic != null) ic.finishComposingText(); // For voice input if (ic != null) ic.finishComposingText(); // For voice input
mOrientation = conf.orientation; mOrientation = conf.orientation;
final int mode = mKeyboardSwitcher.getKeyboardMode();
final EditorInfo attribute = getCurrentInputEditorInfo();
final int imeOptions = (attribute != null) ? attribute.imeOptions : 0;
mKeyboardSwitcher.loadKeyboard(mode, imeOptions,
mVoiceConnector.isVoiceButtonEnabled(),
mVoiceConnector.isVoiceButtonOnPrimary());
} }
mConfigurationChanging = true; mConfigurationChanging = true;
@ -1817,7 +1843,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER. // "reset" and "next" are used only for USE_SPACEBAR_LANGUAGE_SWITCHER.
private void toggleLanguage(boolean reset, boolean next) { private void toggleLanguage(boolean reset, boolean next) {
if (SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()) {
mSubtypeSwitcher.toggleLanguage(reset, next); mSubtypeSwitcher.toggleLanguage(reset, next);
} }
// Reload keyboard because the current language has been changed. // Reload keyboard because the current language has been changed.

View File

@ -41,10 +41,6 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
public class SubtypeSwitcher { public class SubtypeSwitcher {
// TODO: This should be configurable by resource
// This flag indicates if we support language switching by swipe on space bar.
// We may or may not draw the current language on space bar regardless of this flag.
public static final boolean USE_SPACEBAR_LANGUAGE_SWITCHER = false;
private static final boolean DBG = false; private static final boolean DBG = false;
private static final String TAG = "SubtypeSwitcher"; private static final String TAG = "SubtypeSwitcher";
@ -63,6 +59,8 @@ public class SubtypeSwitcher {
new ArrayList<InputMethodSubtype>(); new ArrayList<InputMethodSubtype>();
private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>(); private final ArrayList<String> mEnabledLanguagesOfCurrentInputMethod = new ArrayList<String>();
private boolean mConfigUseSpacebarLanguageSwitcher;
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
// Variants which should be changed only by reload functions. // Variants which should be changed only by reload functions.
private boolean mNeedsToDisplayLanguage; private boolean mNeedsToDisplayLanguage;
@ -84,10 +82,6 @@ public class SubtypeSwitcher {
public static void init(LatinIME service, SharedPreferences prefs) { public static void init(LatinIME service, SharedPreferences prefs) {
sInstance.mPrefs = prefs; sInstance.mPrefs = prefs;
sInstance.resetParams(service); sInstance.resetParams(service);
if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
sInstance.initLanguageSwitcher(service);
}
sInstance.updateAllParameters(); sInstance.updateAllParameters();
} }
@ -109,6 +103,10 @@ public class SubtypeSwitcher {
mAllEnabledSubtypesOfCurrentInputMethod = null; mAllEnabledSubtypesOfCurrentInputMethod = null;
// TODO: Voice input should be created here // TODO: Voice input should be created here
mVoiceInput = null; mVoiceInput = null;
mConfigUseSpacebarLanguageSwitcher = mResources.getBoolean(
R.bool.config_use_spacebar_language_switcher);
if (mConfigUseSpacebarLanguageSwitcher)
initLanguageSwitcher(service);
} }
// Update all parameters stored in SubtypeSwitcher. // Update all parameters stored in SubtypeSwitcher.
@ -122,8 +120,8 @@ public class SubtypeSwitcher {
// Update parameters which are changed outside LatinIME. This parameters affect UI so they // Update parameters which are changed outside LatinIME. This parameters affect UI so they
// should be updated every time onStartInputview. // should be updated every time onStartInputview.
public void updateParametersOnStartInputView() { public void updateParametersOnStartInputView() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
updateForSpaceBarLanguageSwitch(); updateForSpacebarLanguageSwitch();
} else { } else {
updateEnabledSubtypes(); updateEnabledSubtypes();
} }
@ -307,19 +305,23 @@ public class SubtypeSwitcher {
////////////////////////////////// //////////////////////////////////
public int getEnabledKeyboardLocaleCount() { public int getEnabledKeyboardLocaleCount() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getLocaleCount(); return mLanguageSwitcher.getLocaleCount();
} else { } else {
return mEnabledKeyboardSubtypesOfCurrentInputMethod.size(); return mEnabledKeyboardSubtypesOfCurrentInputMethod.size();
} }
} }
public boolean useSpacebarLanguageSwitcher() {
return mConfigUseSpacebarLanguageSwitcher;
}
public boolean needsToDisplayLanguage() { public boolean needsToDisplayLanguage() {
return mNeedsToDisplayLanguage; return mNeedsToDisplayLanguage;
} }
public Locale getInputLocale() { public Locale getInputLocale() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getInputLocale(); return mLanguageSwitcher.getInputLocale();
} else { } else {
return mInputLocale; return mInputLocale;
@ -327,7 +329,7 @@ public class SubtypeSwitcher {
} }
public String getInputLocaleStr() { public String getInputLocaleStr() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
String inputLanguage = null; String inputLanguage = null;
inputLanguage = mLanguageSwitcher.getInputLanguage(); inputLanguage = mLanguageSwitcher.getInputLanguage();
// Should return system locale if there is no Language available. // Should return system locale if there is no Language available.
@ -341,7 +343,7 @@ public class SubtypeSwitcher {
} }
public String[] getEnabledLanguages() { public String[] getEnabledLanguages() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getEnabledLanguages(); return mLanguageSwitcher.getEnabledLanguages();
} else { } else {
return mEnabledLanguagesOfCurrentInputMethod.toArray( return mEnabledLanguagesOfCurrentInputMethod.toArray(
@ -350,7 +352,7 @@ public class SubtypeSwitcher {
} }
public Locale getSystemLocale() { public Locale getSystemLocale() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return mLanguageSwitcher.getSystemLocale(); return mLanguageSwitcher.getSystemLocale();
} else { } else {
return mSystemLocale; return mSystemLocale;
@ -358,7 +360,7 @@ public class SubtypeSwitcher {
} }
public boolean isSystemLanguageSameAsInputLanguage() { public boolean isSystemLanguageSameAsInputLanguage() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return getSystemLocale().getLanguage().equalsIgnoreCase( return getSystemLocale().getLanguage().equalsIgnoreCase(
getInputLocaleStr().substring(0, 2)); getInputLocaleStr().substring(0, 2));
} else { } else {
@ -366,25 +368,8 @@ public class SubtypeSwitcher {
} }
} }
public void onConfigurationChanged(Configuration conf) {
final Locale systemLocale = conf.locale;
// If system configuration was changed, update all parameters.
if (!TextUtils.equals(systemLocale.toString(), mSystemLocale.toString())) {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) {
// If the system locale changes and is different from the saved
// locale (mSystemLocale), then reload the input locale list from the
// latin ime settings (shared prefs) and reset the input locale
// to the first one.
mLanguageSwitcher.loadLocales(mPrefs);
mLanguageSwitcher.setSystemLocale(systemLocale);
} else {
updateAllParameters();
}
}
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) { if (Settings.PREF_SELECTED_LANGUAGES.equals(key)) {
mLanguageSwitcher.loadLocales(sharedPreferences); mLanguageSwitcher.loadLocales(sharedPreferences);
} }
@ -438,7 +423,7 @@ public class SubtypeSwitcher {
} }
////////////////////////////////////// //////////////////////////////////////
// SpaceBar Language Switch support // // Spacebar Language Switch support //
////////////////////////////////////// //////////////////////////////////////
private LanguageSwitcher mLanguageSwitcher; private LanguageSwitcher mLanguageSwitcher;
@ -466,7 +451,7 @@ public class SubtypeSwitcher {
return Character.toUpperCase(s.charAt(0)) + s.substring(1); return Character.toUpperCase(s.charAt(0)) + s.substring(1);
} }
private void updateForSpaceBarLanguageSwitch() { private void updateForSpacebarLanguageSwitch() {
// We need to update mNeedsToDisplayLanguage in onStartInputView because // We need to update mNeedsToDisplayLanguage in onStartInputView because
// getEnabledKeyboardLocaleCount could have been changed. // getEnabledKeyboardLocaleCount could have been changed.
mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1 mNeedsToDisplayLanguage = !(getEnabledKeyboardLocaleCount() <= 1
@ -479,7 +464,7 @@ public class SubtypeSwitcher {
} }
public String getNextInputLanguageName() { public String getNextInputLanguageName() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale()); return getDisplayLanguage(mLanguageSwitcher.getNextInputLocale());
} else { } else {
return ""; return "";
@ -487,7 +472,7 @@ public class SubtypeSwitcher {
} }
public String getPreviousInputLanguageName() { public String getPreviousInputLanguageName() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale()); return getDisplayLanguage(mLanguageSwitcher.getPrevInputLocale());
} else { } else {
return ""; return "";
@ -524,13 +509,13 @@ public class SubtypeSwitcher {
} }
public void loadSettings() { public void loadSettings() {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
mLanguageSwitcher.loadLocales(mPrefs); mLanguageSwitcher.loadLocales(mPrefs);
} }
} }
public void toggleLanguage(boolean reset, boolean next) { public void toggleLanguage(boolean reset, boolean next) {
if (USE_SPACEBAR_LANGUAGE_SWITCHER) { if (mConfigUseSpacebarLanguageSwitcher) {
if (reset) { if (reset) {
mLanguageSwitcher.reset(); mLanguageSwitcher.reset();
} else { } else {