Move spacebar drawing code from LatinKeyboard to LatinKeyboardView
Also this change moves LatinKeyboard attributes, autoCorrectionSpacebarLedEnabled, autoCorrectionSpacebarLedIcon, spacebarTextRatio, spacebarTextColor, and spacebarTextShadowColor to LatinKeyboardView. Change-Id: I7cc27ce1fc550e9f620a9ed0fbe4b8172902d5a1
This commit is contained in:
parent
7bd714c086
commit
4112dc0500
12 changed files with 261 additions and 279 deletions
|
@ -124,6 +124,12 @@
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="LatinKeyboardView">
|
<declare-styleable name="LatinKeyboardView">
|
||||||
|
<attr name="autoCorrectionSpacebarLedEnabled" format="boolean" />
|
||||||
|
<attr name="autoCorrectionSpacebarLedIcon" format="reference" />
|
||||||
|
<!-- Size of the text for spacebar language label, in the proportion of key height. -->
|
||||||
|
<attr name="spacebarTextRatio" format="fraction" />
|
||||||
|
<attr name="spacebarTextColor" format="color" />
|
||||||
|
<attr name="spacebarTextShadowColor" format="color" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="SuggestionsView">
|
<declare-styleable name="SuggestionsView">
|
||||||
|
@ -327,16 +333,6 @@
|
||||||
<attr name="parentStyle" format="string" />
|
<attr name="parentStyle" format="string" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<!-- TODO: Move these attributes to LatinKeyboardView -->
|
|
||||||
<declare-styleable name="LatinKeyboard">
|
|
||||||
<attr name="autoCorrectionSpacebarLedEnabled" format="boolean" />
|
|
||||||
<attr name="autoCorrectionSpacebarLedIcon" format="reference" />
|
|
||||||
<!-- Size of the text for spacebar language label, in the proportion of key height. -->
|
|
||||||
<attr name="spacebarTextRatio" format="fraction" />
|
|
||||||
<attr name="spacebarTextColor" format="color" />
|
|
||||||
<attr name="spacebarTextShadowColor" format="color" />
|
|
||||||
</declare-styleable>
|
|
||||||
|
|
||||||
<declare-styleable name="KeyboardSet">
|
<declare-styleable name="KeyboardSet">
|
||||||
<!-- Locale of the keyboard layouts -->
|
<!-- Locale of the keyboard layouts -->
|
||||||
<attr name="keyboardLocale" format="string" />
|
<attr name="keyboardLocale" format="string" />
|
||||||
|
|
|
@ -31,13 +31,6 @@
|
||||||
<item name="verticalGap">@fraction/key_bottom_gap</item>
|
<item name="verticalGap">@fraction/key_bottom_gap</item>
|
||||||
<item name="maxMoreKeysColumn">@integer/config_max_more_keys_column</item>
|
<item name="maxMoreKeysColumn">@integer/config_max_more_keys_column</item>
|
||||||
</style>
|
</style>
|
||||||
<style name="LatinKeyboard">
|
|
||||||
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
|
||||||
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
|
||||||
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
|
||||||
<item name="spacebarTextColor">#FFC0C0C0</item>
|
|
||||||
<item name="spacebarTextShadowColor">#80000000</item>
|
|
||||||
</style>
|
|
||||||
<style name="KeyboardView">
|
<style name="KeyboardView">
|
||||||
<item name="android:background">@drawable/keyboard_background</item>
|
<item name="android:background">@drawable/keyboard_background</item>
|
||||||
<item name="keyBackground">@drawable/btn_keyboard_key</item>
|
<item name="keyBackground">@drawable/btn_keyboard_key</item>
|
||||||
|
@ -75,6 +68,11 @@
|
||||||
<style
|
<style
|
||||||
name="LatinKeyboardView"
|
name="LatinKeyboardView"
|
||||||
parent="KeyboardView">
|
parent="KeyboardView">
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FFC0C0C0</item>
|
||||||
|
<item name="spacebarTextShadowColor">#80000000</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
<style
|
||||||
name="MiniKeyboard"
|
name="MiniKeyboard"
|
||||||
|
@ -143,6 +141,11 @@
|
||||||
name="LatinKeyboardView.HighContrast"
|
name="LatinKeyboardView.HighContrast"
|
||||||
parent="KeyboardView.HighContrast"
|
parent="KeyboardView.HighContrast"
|
||||||
>
|
>
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FFC0C0C0</item>
|
||||||
|
<item name="spacebarTextShadowColor">#80000000</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme "Stone" -->
|
<!-- Theme "Stone" -->
|
||||||
<style
|
<style
|
||||||
|
@ -156,13 +159,6 @@
|
||||||
<item name="horizontalGap">@fraction/key_horizontal_gap_stone</item>
|
<item name="horizontalGap">@fraction/key_horizontal_gap_stone</item>
|
||||||
<item name="verticalGap">@fraction/key_bottom_gap_stone</item>
|
<item name="verticalGap">@fraction/key_bottom_gap_stone</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
|
||||||
name="LatinKeyboard.Stone"
|
|
||||||
parent="LatinKeyboard"
|
|
||||||
>
|
|
||||||
<item name="spacebarTextColor">#FF000000</item>
|
|
||||||
<item name="spacebarTextShadowColor">#D0FFFFFF</item>
|
|
||||||
</style>
|
|
||||||
<style
|
<style
|
||||||
name="KeyboardView.Stone"
|
name="KeyboardView.Stone"
|
||||||
parent="KeyboardView"
|
parent="KeyboardView"
|
||||||
|
@ -180,6 +176,11 @@
|
||||||
name="LatinKeyboardView.Stone"
|
name="LatinKeyboardView.Stone"
|
||||||
parent="KeyboardView.Stone"
|
parent="KeyboardView.Stone"
|
||||||
>
|
>
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FF000000</item>
|
||||||
|
<item name="spacebarTextShadowColor">#D0FFFFFF</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
<style
|
||||||
name="MiniKeyboard.Stone"
|
name="MiniKeyboard.Stone"
|
||||||
|
@ -214,6 +215,11 @@
|
||||||
name="LatinKeyboardView.Stone.Bold"
|
name="LatinKeyboardView.Stone.Bold"
|
||||||
parent="KeyboardView.Stone.Bold"
|
parent="KeyboardView.Stone.Bold"
|
||||||
>
|
>
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FF000000</item>
|
||||||
|
<item name="spacebarTextShadowColor">#D0FFFFFF</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme "Gingerbread" -->
|
<!-- Theme "Gingerbread" -->
|
||||||
<style
|
<style
|
||||||
|
@ -237,6 +243,11 @@
|
||||||
name="LatinKeyboardView.Gingerbread"
|
name="LatinKeyboardView.Gingerbread"
|
||||||
parent="KeyboardView.Gingerbread"
|
parent="KeyboardView.Gingerbread"
|
||||||
>
|
>
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">true</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FFC0C0C0</item>
|
||||||
|
<item name="spacebarTextShadowColor">#80000000</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
<style
|
||||||
name="MiniKeyboard.Gingerbread"
|
name="MiniKeyboard.Gingerbread"
|
||||||
|
@ -264,13 +275,6 @@
|
||||||
<item name="verticalGap">@fraction/key_bottom_gap_ics</item>
|
<item name="verticalGap">@fraction/key_bottom_gap_ics</item>
|
||||||
<item name="touchPositionCorrectionData">@array/touch_position_correction_data_ice_cream_sandwich</item>
|
<item name="touchPositionCorrectionData">@array/touch_position_correction_data_ice_cream_sandwich</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
|
||||||
name="LatinKeyboard.IceCreamSandwich"
|
|
||||||
parent="LatinKeyboard"
|
|
||||||
>
|
|
||||||
<item name="autoCorrectionSpacebarLedEnabled">false</item>
|
|
||||||
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item>
|
|
||||||
</style>
|
|
||||||
<style
|
<style
|
||||||
name="KeyboardView.IceCreamSandwich"
|
name="KeyboardView.IceCreamSandwich"
|
||||||
parent="KeyboardView"
|
parent="KeyboardView"
|
||||||
|
@ -298,6 +302,11 @@
|
||||||
name="LatinKeyboardView.IceCreamSandwich"
|
name="LatinKeyboardView.IceCreamSandwich"
|
||||||
parent="KeyboardView.IceCreamSandwich"
|
parent="KeyboardView.IceCreamSandwich"
|
||||||
>
|
>
|
||||||
|
<item name="autoCorrectionSpacebarLedEnabled">false</item>
|
||||||
|
<item name="autoCorrectionSpacebarLedIcon">@drawable/sym_keyboard_space_led_holo</item>
|
||||||
|
<item name="spacebarTextRatio">@fraction/spacebar_text_ratio</item>
|
||||||
|
<item name="spacebarTextColor">#FFC0C0C0</item>
|
||||||
|
<item name="spacebarTextShadowColor">#80000000</item>
|
||||||
</style>
|
</style>
|
||||||
<style
|
<style
|
||||||
name="MiniKeyboard.IceCreamSandwich"
|
name="MiniKeyboard.IceCreamSandwich"
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme.HighContrast" parent="KeyboardIcons">
|
<style name="KeyboardTheme.HighContrast" parent="KeyboardIcons">
|
||||||
<item name="keyboardStyle">@style/Keyboard.HighContrast</item>
|
<item name="keyboardStyle">@style/Keyboard.HighContrast</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
|
<item name="keyboardViewStyle">@style/KeyboardView.HighContrast</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.HighContrast</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.HighContrast</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard</item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme" parent="KeyboardIcons">
|
<style name="KeyboardTheme" parent="KeyboardIcons">
|
||||||
<item name="keyboardStyle">@style/Keyboard</item>
|
<item name="keyboardStyle">@style/Keyboard</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView</item>
|
<item name="keyboardViewStyle">@style/KeyboardView</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard</item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme.Gingerbread" parent="KeyboardIcons">
|
<style name="KeyboardTheme.Gingerbread" parent="KeyboardIcons">
|
||||||
<item name="keyboardStyle">@style/Keyboard.Gingerbread</item>
|
<item name="keyboardStyle">@style/Keyboard.Gingerbread</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
|
<item name="keyboardViewStyle">@style/KeyboardView.Gingerbread</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Gingerbread</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Gingerbread</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard.Gingerbread</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard.Gingerbread</item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme.IceCreamSandwich" parent="KeyboardIcons.IceCreamSandwich">
|
<style name="KeyboardTheme.IceCreamSandwich" parent="KeyboardIcons.IceCreamSandwich">
|
||||||
<item name="keyboardStyle">@style/Keyboard.IceCreamSandwich</item>
|
<item name="keyboardStyle">@style/Keyboard.IceCreamSandwich</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard.IceCreamSandwich</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView.IceCreamSandwich</item>
|
<item name="keyboardViewStyle">@style/KeyboardView.IceCreamSandwich</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.IceCreamSandwich</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.IceCreamSandwich</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard.IceCreamSandwich</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard.IceCreamSandwich</item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme.Stone.Bold" parent="KeyboardIcons.Black">
|
<style name="KeyboardTheme.Stone.Bold" parent="KeyboardIcons.Black">
|
||||||
<item name="keyboardStyle">@style/Keyboard.Stone.Bold</item>
|
<item name="keyboardStyle">@style/Keyboard.Stone.Bold</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
|
<item name="keyboardViewStyle">@style/KeyboardView.Stone.Bold</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone.Bold</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone.Bold</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard.Stone</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard.Stone</item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
<resources>
|
<resources>
|
||||||
<style name="KeyboardTheme.Stone" parent="KeyboardIcons.Black">
|
<style name="KeyboardTheme.Stone" parent="KeyboardIcons.Black">
|
||||||
<item name="keyboardStyle">@style/Keyboard.Stone</item>
|
<item name="keyboardStyle">@style/Keyboard.Stone</item>
|
||||||
<item name="latinKeyboardStyle">@style/LatinKeyboard.Stone</item>
|
|
||||||
<item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
|
<item name="keyboardViewStyle">@style/KeyboardView.Stone</item>
|
||||||
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone</item>
|
<item name="latinKeyboardViewStyle">@style/LatinKeyboardView.Stone</item>
|
||||||
<item name="miniKeyboardStyle">@style/MiniKeyboard.Stone</item>
|
<item name="miniKeyboardStyle">@style/MiniKeyboard.Stone</item>
|
||||||
|
|
|
@ -157,20 +157,16 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
|
||||||
mKeyboardView.setKeyPreviewPopupEnabled(
|
mKeyboardView.setKeyPreviewPopupEnabled(
|
||||||
SettingsValues.isKeyPreviewPopupEnabled(mPrefs, mResources),
|
SettingsValues.isKeyPreviewPopupEnabled(mPrefs, mResources),
|
||||||
SettingsValues.getKeyPreviewPopupDismissDelay(mPrefs, mResources));
|
SettingsValues.getKeyPreviewPopupDismissDelay(mPrefs, mResources));
|
||||||
|
mKeyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
|
||||||
|
// 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. It is also applicable to shortcut key.
|
||||||
|
mKeyboardView.updateSpacebar(0.0f,
|
||||||
|
mSubtypeSwitcher.needsToDisplayLanguage(keyboard.mId.mLocale));
|
||||||
mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
|
mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
|
||||||
|
updateShiftState();
|
||||||
final boolean localeChanged = (oldKeyboard == null)
|
final boolean localeChanged = (oldKeyboard == null)
|
||||||
|| !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
|
|| !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
|
||||||
if (keyboard instanceof LatinKeyboard) {
|
|
||||||
final LatinKeyboard latinKeyboard = (LatinKeyboard)keyboard;
|
|
||||||
latinKeyboard.updateAutoCorrectionState(mIsAutoCorrectionActive);
|
|
||||||
// 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. It is also applicable to shortcut key.
|
|
||||||
mKeyboardView.updateSpacebar();
|
|
||||||
latinKeyboard.updateSpacebarLanguage(0.0f,
|
|
||||||
mSubtypeSwitcher.needsToDisplayLanguage(latinKeyboard.mId.mLocale));
|
|
||||||
}
|
|
||||||
updateShiftState();
|
|
||||||
mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
|
mInputMethodService.mHandler.startDisplayLanguageOnSpacebar(localeChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,12 +415,8 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
|
||||||
public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
|
public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
|
||||||
if (mIsAutoCorrectionActive != isAutoCorrection) {
|
if (mIsAutoCorrectionActive != isAutoCorrection) {
|
||||||
mIsAutoCorrectionActive = isAutoCorrection;
|
mIsAutoCorrectionActive = isAutoCorrection;
|
||||||
final LatinKeyboard keyboard = getLatinKeyboard();
|
if (mKeyboardView != null) {
|
||||||
if (keyboard != null && keyboard.needsAutoCorrectionSpacebarLed()) {
|
mKeyboardView.updateAutoCorrectionState(isAutoCorrection);
|
||||||
final Key invalidatedKey = keyboard.updateAutoCorrectionState(isAutoCorrection);
|
|
||||||
final LatinKeyboardView keyboardView = getKeyboardView();
|
|
||||||
if (keyboardView != null)
|
|
||||||
keyboardView.invalidateKey(invalidatedKey);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,77 +17,14 @@
|
||||||
package com.android.inputmethod.keyboard;
|
package com.android.inputmethod.keyboard;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.TypedArray;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.Paint.Align;
|
|
||||||
import android.graphics.PorterDuff;
|
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
|
|
||||||
import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
|
import com.android.inputmethod.keyboard.internal.KeyboardBuilder;
|
||||||
import com.android.inputmethod.keyboard.internal.KeyboardParams;
|
import com.android.inputmethod.keyboard.internal.KeyboardParams;
|
||||||
import com.android.inputmethod.latin.R;
|
|
||||||
import com.android.inputmethod.latin.Utils;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
// TODO: We should remove this class
|
// TODO: We should remove this class
|
||||||
public class LatinKeyboard extends Keyboard {
|
public class LatinKeyboard extends Keyboard {
|
||||||
private static final int SPACE_LED_LENGTH_PERCENT = 80;
|
private LatinKeyboard(KeyboardParams params) {
|
||||||
|
|
||||||
private final Resources mRes;
|
|
||||||
|
|
||||||
/* Space key and its icons, drawables and colors. */
|
|
||||||
private final Key mSpaceKey;
|
|
||||||
private final Drawable mSpaceIcon;
|
|
||||||
private final boolean mAutoCorrectionSpacebarLedEnabled;
|
|
||||||
private final Drawable mAutoCorrectionSpacebarLedIcon;
|
|
||||||
private final float mSpacebarTextSize;
|
|
||||||
private final int mSpacebarTextColor;
|
|
||||||
private final int mSpacebarTextShadowColor;
|
|
||||||
private final HashMap<Integer, BitmapDrawable> mSpaceDrawableCache =
|
|
||||||
new HashMap<Integer, BitmapDrawable>();
|
|
||||||
|
|
||||||
private boolean mAutoCorrectionSpacebarLedOn;
|
|
||||||
private boolean mNeedsToDisplayLanguage;
|
|
||||||
private float mSpacebarTextFadeFactor = 0.0f;
|
|
||||||
|
|
||||||
// Height in space key the language name will be drawn. (proportional to space key height)
|
|
||||||
public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
|
|
||||||
// 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.
|
|
||||||
private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
|
|
||||||
|
|
||||||
private LatinKeyboard(Context context, KeyboardParams params) {
|
|
||||||
super(params);
|
super(params);
|
||||||
mRes = context.getResources();
|
|
||||||
|
|
||||||
// The index of space key is available only after Keyboard constructor has finished.
|
|
||||||
mSpaceKey = getKey(CODE_SPACE);
|
|
||||||
mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null;
|
|
||||||
|
|
||||||
// TODO: Move these to LatinKeyboardView attributes.
|
|
||||||
final TypedArray a = context.obtainStyledAttributes(
|
|
||||||
null, R.styleable.LatinKeyboard, R.attr.latinKeyboardStyle, R.style.LatinKeyboard);
|
|
||||||
mAutoCorrectionSpacebarLedEnabled = a.getBoolean(
|
|
||||||
R.styleable.LatinKeyboard_autoCorrectionSpacebarLedEnabled, false);
|
|
||||||
mAutoCorrectionSpacebarLedIcon = a.getDrawable(
|
|
||||||
R.styleable.LatinKeyboard_autoCorrectionSpacebarLedIcon);
|
|
||||||
final float spacebarTextRatio = a.getFraction(R.styleable.LatinKeyboard_spacebarTextRatio,
|
|
||||||
1000, 1000, 1) / 1000.0f;
|
|
||||||
final int keyHeight = mMostCommonKeyHeight - mVerticalGap;
|
|
||||||
mSpacebarTextSize = keyHeight * spacebarTextRatio;
|
|
||||||
mSpacebarTextColor = a.getColor(R.styleable.LatinKeyboard_spacebarTextColor, 0);
|
|
||||||
mSpacebarTextShadowColor = a.getColor(
|
|
||||||
R.styleable.LatinKeyboard_spacebarTextShadowColor, 0);
|
|
||||||
a.recycle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder extends KeyboardBuilder<KeyboardParams> {
|
public static class Builder extends KeyboardBuilder<KeyboardParams> {
|
||||||
|
@ -103,156 +40,10 @@ public class LatinKeyboard extends Keyboard {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LatinKeyboard build() {
|
public LatinKeyboard build() {
|
||||||
return new LatinKeyboard(mContext, mParams);
|
return new LatinKeyboard(mParams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Move this drawing method to LatinKeyboardView.
|
|
||||||
// TODO: Use Key.keyLabel to draw language name of spacebar.
|
|
||||||
public Key updateSpacebarLanguage(float fadeFactor, boolean needsToDisplayLanguage) {
|
|
||||||
mSpacebarTextFadeFactor = fadeFactor;
|
|
||||||
mNeedsToDisplayLanguage = needsToDisplayLanguage;
|
|
||||||
updateSpacebarIcon();
|
|
||||||
return 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Get rid of this method
|
|
||||||
public boolean needsAutoCorrectionSpacebarLed() {
|
|
||||||
return mAutoCorrectionSpacebarLedEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Move this drawing method to LatinKeyboardView.
|
|
||||||
/**
|
|
||||||
* @return a key which should be invalidated.
|
|
||||||
*/
|
|
||||||
public Key updateAutoCorrectionState(boolean isAutoCorrection) {
|
|
||||||
mAutoCorrectionSpacebarLedOn = isAutoCorrection;
|
|
||||||
updateSpacebarIcon();
|
|
||||||
return mSpaceKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSpacebarIcon() {
|
|
||||||
if (mSpaceKey == null) return;
|
|
||||||
if (mNeedsToDisplayLanguage) {
|
|
||||||
mSpaceKey.setIcon(getSpaceDrawable(mId.mLocale));
|
|
||||||
} else if (mAutoCorrectionSpacebarLedOn) {
|
|
||||||
mSpaceKey.setIcon(getSpaceDrawable(null));
|
|
||||||
} else {
|
|
||||||
mSpaceKey.setIcon(mSpaceIcon);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute width of text with specified text size using paint.
|
|
||||||
private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
|
|
||||||
paint.setTextSize(textSize);
|
|
||||||
paint.getTextBounds(text, 0, text.length(), bounds);
|
|
||||||
return bounds.width();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layout local language name and left and right arrow on spacebar.
|
|
||||||
private static String layoutSpacebar(Paint paint, Locale locale, int width,
|
|
||||||
float origTextSize) {
|
|
||||||
final Rect bounds = new Rect();
|
|
||||||
|
|
||||||
// Estimate appropriate language name text size to fit in maxTextWidth.
|
|
||||||
String language = Utils.getFullDisplayName(locale, true);
|
|
||||||
int textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
|
||||||
// Assuming text width and text size are proportional to each other.
|
|
||||||
float textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
|
||||||
// allow variable text size
|
|
||||||
textWidth = getTextWidth(paint, language, textSize, bounds);
|
|
||||||
// If text size goes too small or text does not fit, use middle or short name
|
|
||||||
final boolean useMiddleName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|
|
||||||
|| (textWidth > width);
|
|
||||||
|
|
||||||
final boolean useShortName;
|
|
||||||
if (useMiddleName) {
|
|
||||||
language = Utils.getMiddleDisplayLanguage(locale);
|
|
||||||
textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
|
||||||
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
|
||||||
useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|
|
||||||
|| (textWidth > width);
|
|
||||||
} else {
|
|
||||||
useShortName = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (useShortName) {
|
|
||||||
language = Utils.getShortDisplayLanguage(locale);
|
|
||||||
textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
|
||||||
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
|
||||||
}
|
|
||||||
paint.setTextSize(textSize);
|
|
||||||
|
|
||||||
return language;
|
|
||||||
}
|
|
||||||
|
|
||||||
private BitmapDrawable getSpaceDrawable(Locale locale) {
|
|
||||||
final Integer hashCode = Arrays.hashCode(
|
|
||||||
new Object[] { locale, mAutoCorrectionSpacebarLedOn, mSpacebarTextFadeFactor });
|
|
||||||
final BitmapDrawable cached = mSpaceDrawableCache.get(hashCode);
|
|
||||||
if (cached != null) {
|
|
||||||
return cached;
|
|
||||||
}
|
|
||||||
final BitmapDrawable drawable = new BitmapDrawable(mRes, drawSpacebar(
|
|
||||||
locale, mAutoCorrectionSpacebarLedOn, mSpacebarTextFadeFactor));
|
|
||||||
mSpaceDrawableCache.put(hashCode, drawable);
|
|
||||||
return drawable;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Bitmap drawSpacebar(Locale inputLocale, boolean isAutoCorrection,
|
|
||||||
float textFadeFactor) {
|
|
||||||
final int width = mSpaceKey.mWidth;
|
|
||||||
final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight;
|
|
||||||
final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
||||||
final Canvas canvas = new Canvas(buffer);
|
|
||||||
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
|
|
||||||
|
|
||||||
// If application locales are explicitly selected.
|
|
||||||
if (inputLocale != null) {
|
|
||||||
final Paint paint = new Paint();
|
|
||||||
paint.setAntiAlias(true);
|
|
||||||
paint.setTextAlign(Align.CENTER);
|
|
||||||
|
|
||||||
final String language = layoutSpacebar(paint, inputLocale, width, mSpacebarTextSize);
|
|
||||||
|
|
||||||
// Draw language text with shadow
|
|
||||||
// In case there is no space icon, we will place the language text at the center of
|
|
||||||
// spacebar.
|
|
||||||
final float descent = paint.descent();
|
|
||||||
final float textHeight = -paint.ascent() + descent;
|
|
||||||
final float baseline = (mSpaceIcon != null) ? height * SPACEBAR_LANGUAGE_BASELINE
|
|
||||||
: height / 2 + textHeight / 2;
|
|
||||||
paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, textFadeFactor));
|
|
||||||
canvas.drawText(language, width / 2, baseline - descent - 1, paint);
|
|
||||||
paint.setColor(getSpacebarTextColor(mSpacebarTextColor, textFadeFactor));
|
|
||||||
canvas.drawText(language, width / 2, baseline - descent, paint);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the spacebar icon at the bottom
|
|
||||||
if (isAutoCorrection) {
|
|
||||||
final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100;
|
|
||||||
final int iconHeight = mAutoCorrectionSpacebarLedIcon.getIntrinsicHeight();
|
|
||||||
int x = (width - iconWidth) / 2;
|
|
||||||
int y = height - iconHeight;
|
|
||||||
mAutoCorrectionSpacebarLedIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
|
|
||||||
mAutoCorrectionSpacebarLedIcon.draw(canvas);
|
|
||||||
} else if (mSpaceIcon != null) {
|
|
||||||
final int iconWidth = mSpaceIcon.getIntrinsicWidth();
|
|
||||||
final int iconHeight = mSpaceIcon.getIntrinsicHeight();
|
|
||||||
int x = (width - iconWidth) / 2;
|
|
||||||
int y = height - iconHeight;
|
|
||||||
mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
|
|
||||||
mSpaceIcon.draw(canvas);
|
|
||||||
}
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Key[] getNearestKeys(int x, int y) {
|
public Key[] getNearestKeys(int x, int y) {
|
||||||
// Avoid dead pixels at edges of the keyboard
|
// Avoid dead pixels at edges of the keyboard
|
||||||
|
|
|
@ -19,8 +19,16 @@ package com.android.inputmethod.keyboard;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
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.PorterDuff;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
|
@ -47,6 +55,9 @@ import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
|
||||||
import com.android.inputmethod.latin.Utils;
|
import com.android.inputmethod.latin.Utils;
|
||||||
import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
|
import com.android.inputmethod.latin.Utils.UsabilityStudyLogUtils;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -62,9 +73,30 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
||||||
|
|
||||||
private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true;
|
private static final boolean ENABLE_CAPSLOCK_BY_DOUBLETAP = true;
|
||||||
|
|
||||||
// For drawing spacebar.
|
/* Space key and its icons, drawables and colors. */
|
||||||
|
private Key mSpaceKey;
|
||||||
|
private Drawable mSpaceIcon;
|
||||||
private final boolean mIsSpacebarTriggeringPopupByLongPress;
|
private final boolean mIsSpacebarTriggeringPopupByLongPress;
|
||||||
private boolean mMultipleEnabledIMEsOrSubtypes;
|
private static final int SPACE_LED_LENGTH_PERCENT = 80;
|
||||||
|
private final boolean mAutoCorrectionSpacebarLedEnabled;
|
||||||
|
private final Drawable mAutoCorrectionSpacebarLedIcon;
|
||||||
|
private final float mSpacebarTextRatio;
|
||||||
|
private float mSpacebarTextSize;
|
||||||
|
private final int mSpacebarTextColor;
|
||||||
|
private final int mSpacebarTextShadowColor;
|
||||||
|
private final HashMap<Integer, BitmapDrawable> mSpacebarDrawableCache =
|
||||||
|
new HashMap<Integer, BitmapDrawable>();
|
||||||
|
|
||||||
|
private boolean mAutoCorrectionSpacebarLedOn;
|
||||||
|
private boolean mNeedsToDisplayLanguage;
|
||||||
|
private Locale mSpacebarLocale;
|
||||||
|
private float mSpacebarTextFadeFactor = 0.0f;
|
||||||
|
|
||||||
|
// Height in space key the language name will be drawn. (proportional to space key height)
|
||||||
|
public static final float SPACEBAR_LANGUAGE_BASELINE = 0.6f;
|
||||||
|
// 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.
|
||||||
|
private static final float MINIMUM_SCALE_OF_LANGUAGE_NAME = 0.8f;
|
||||||
|
|
||||||
private final SuddenJumpingTouchEventHandler mTouchScreenRegulator;
|
private final SuddenJumpingTouchEventHandler mTouchScreenRegulator;
|
||||||
|
|
||||||
|
@ -257,6 +289,19 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
||||||
final int longPressSpaceKeyTimeout =
|
final int longPressSpaceKeyTimeout =
|
||||||
res.getInteger(R.integer.config_long_press_space_key_timeout);
|
res.getInteger(R.integer.config_long_press_space_key_timeout);
|
||||||
mIsSpacebarTriggeringPopupByLongPress = (longPressSpaceKeyTimeout > 0);
|
mIsSpacebarTriggeringPopupByLongPress = (longPressSpaceKeyTimeout > 0);
|
||||||
|
|
||||||
|
final TypedArray a = context.obtainStyledAttributes(
|
||||||
|
attrs, R.styleable.LatinKeyboardView, defStyle, R.style.LatinKeyboardView);
|
||||||
|
mAutoCorrectionSpacebarLedEnabled = a.getBoolean(
|
||||||
|
R.styleable.LatinKeyboardView_autoCorrectionSpacebarLedEnabled, false);
|
||||||
|
mAutoCorrectionSpacebarLedIcon = a.getDrawable(
|
||||||
|
R.styleable.LatinKeyboardView_autoCorrectionSpacebarLedIcon);
|
||||||
|
mSpacebarTextRatio = a.getFraction(R.styleable.LatinKeyboardView_spacebarTextRatio,
|
||||||
|
1000, 1000, 1) / 1000.0f;
|
||||||
|
mSpacebarTextColor = a.getColor(R.styleable.LatinKeyboardView_spacebarTextColor, 0);
|
||||||
|
mSpacebarTextShadowColor = a.getColor(
|
||||||
|
R.styleable.LatinKeyboardView_spacebarTextShadowColor, 0);
|
||||||
|
a.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startIgnoringDoubleTap() {
|
public void startIgnoringDoubleTap() {
|
||||||
|
@ -311,6 +356,13 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
||||||
PointerTracker.setKeyDetector(mKeyDetector);
|
PointerTracker.setKeyDetector(mKeyDetector);
|
||||||
mTouchScreenRegulator.setKeyboard(keyboard);
|
mTouchScreenRegulator.setKeyboard(keyboard);
|
||||||
mMoreKeysPanelCache.clear();
|
mMoreKeysPanelCache.clear();
|
||||||
|
|
||||||
|
mSpaceKey = keyboard.getKey(Keyboard.CODE_SPACE);
|
||||||
|
mSpaceIcon = keyboard.mIconsSet.getIcon(KeyboardIconsSet.ICON_SPACE_KEY);
|
||||||
|
final int keyHeight = keyboard.mMostCommonKeyHeight - keyboard.mVerticalGap;
|
||||||
|
mSpacebarTextSize = keyHeight * mSpacebarTextRatio;
|
||||||
|
mSpacebarLocale = keyboard.mId.mLocale;
|
||||||
|
clearSpacebarDrawableCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -708,9 +760,18 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
||||||
invalidateKey(shortcutKey);
|
invalidateKey(shortcutKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateSpacebar() {
|
public void updateSpacebar(float fadeFactor, boolean needsToDisplayLanguage) {
|
||||||
mMultipleEnabledIMEsOrSubtypes = Utils.hasMultipleEnabledIMEsOrSubtypes(
|
mSpacebarTextFadeFactor = fadeFactor;
|
||||||
true /* include aux subtypes */);
|
mNeedsToDisplayLanguage = needsToDisplayLanguage;
|
||||||
|
updateSpacebarIcon();
|
||||||
|
invalidateKey(mSpaceKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateAutoCorrectionState(boolean isAutoCorrection) {
|
||||||
|
if (!mAutoCorrectionSpacebarLedEnabled) return;
|
||||||
|
mAutoCorrectionSpacebarLedOn = isAutoCorrection;
|
||||||
|
updateSpacebarIcon();
|
||||||
|
invalidateKey(mSpaceKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -718,10 +779,151 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
|
||||||
KeyDrawParams params) {
|
KeyDrawParams params) {
|
||||||
super.onDrawKeyTopVisuals(key, canvas, paint, params);
|
super.onDrawKeyTopVisuals(key, canvas, paint, params);
|
||||||
|
|
||||||
// Whether space key needs to show the "..." popup hint for special purposes
|
if (key.mCode == Keyboard.CODE_SPACE) {
|
||||||
if (key.mCode == Keyboard.CODE_SPACE && mIsSpacebarTriggeringPopupByLongPress
|
// Whether space key needs to show the "..." popup hint for special purposes
|
||||||
&& mMultipleEnabledIMEsOrSubtypes) {
|
if (mIsSpacebarTriggeringPopupByLongPress
|
||||||
super.drawKeyPopupHint(key, canvas, paint, params);
|
&& Utils.hasMultipleEnabledIMEsOrSubtypes(true /* include aux subtypes */)) {
|
||||||
|
super.drawKeyPopupHint(key, canvas, paint, params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Get rid of this method and draw spacebar locale and auto correction spacebar LED
|
||||||
|
// in onDrawKeyTopVisuals.
|
||||||
|
private void updateSpacebarIcon() {
|
||||||
|
if (mSpaceKey == null) return;
|
||||||
|
if (mNeedsToDisplayLanguage) {
|
||||||
|
mSpaceKey.setIcon(getSpaceDrawable(mSpacebarLocale));
|
||||||
|
} else if (mAutoCorrectionSpacebarLedOn) {
|
||||||
|
mSpaceKey.setIcon(getSpaceDrawable(null));
|
||||||
|
} else {
|
||||||
|
mSpaceKey.setIcon(mSpaceIcon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute width of text with specified text size using paint.
|
||||||
|
private static int getTextWidth(Paint paint, String text, float textSize, Rect bounds) {
|
||||||
|
paint.setTextSize(textSize);
|
||||||
|
paint.getTextBounds(text, 0, text.length(), bounds);
|
||||||
|
return bounds.width();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Layout local language name and left and right arrow on spacebar.
|
||||||
|
private static String layoutSpacebar(Paint paint, Locale locale, int width,
|
||||||
|
float origTextSize) {
|
||||||
|
final Rect bounds = new Rect();
|
||||||
|
|
||||||
|
// Estimate appropriate language name text size to fit in maxTextWidth.
|
||||||
|
String language = Utils.getFullDisplayName(locale, true);
|
||||||
|
int textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
||||||
|
// Assuming text width and text size are proportional to each other.
|
||||||
|
float textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
||||||
|
// allow variable text size
|
||||||
|
textWidth = getTextWidth(paint, language, textSize, bounds);
|
||||||
|
// If text size goes too small or text does not fit, use middle or short name
|
||||||
|
final boolean useMiddleName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|
||||||
|
|| (textWidth > width);
|
||||||
|
|
||||||
|
final boolean useShortName;
|
||||||
|
if (useMiddleName) {
|
||||||
|
language = Utils.getMiddleDisplayLanguage(locale);
|
||||||
|
textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
||||||
|
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
||||||
|
useShortName = (textSize / origTextSize < MINIMUM_SCALE_OF_LANGUAGE_NAME)
|
||||||
|
|| (textWidth > width);
|
||||||
|
} else {
|
||||||
|
useShortName = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useShortName) {
|
||||||
|
language = Utils.getShortDisplayLanguage(locale);
|
||||||
|
textWidth = getTextWidth(paint, language, origTextSize, bounds);
|
||||||
|
textSize = origTextSize * Math.min(width / textWidth, 1.0f);
|
||||||
|
}
|
||||||
|
paint.setTextSize(textSize);
|
||||||
|
|
||||||
|
return language;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer getSpaceDrawableKey(Locale locale) {
|
||||||
|
return Arrays.hashCode(new Object[] {
|
||||||
|
locale,
|
||||||
|
mAutoCorrectionSpacebarLedOn,
|
||||||
|
mSpacebarTextFadeFactor
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearSpacebarDrawableCache() {
|
||||||
|
for (final BitmapDrawable drawable : mSpacebarDrawableCache.values()) {
|
||||||
|
final Bitmap bitmap = drawable.getBitmap();
|
||||||
|
bitmap.recycle();
|
||||||
|
}
|
||||||
|
mSpacebarDrawableCache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BitmapDrawable getSpaceDrawable(Locale locale) {
|
||||||
|
final Integer hashCode = getSpaceDrawableKey(locale);
|
||||||
|
final BitmapDrawable cached = mSpacebarDrawableCache.get(hashCode);
|
||||||
|
if (cached != null) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
final BitmapDrawable drawable = new BitmapDrawable(getResources(), drawSpacebar(
|
||||||
|
locale, mAutoCorrectionSpacebarLedOn, mSpacebarTextFadeFactor));
|
||||||
|
mSpacebarDrawableCache.put(hashCode, drawable);
|
||||||
|
return drawable;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap drawSpacebar(Locale inputLocale, boolean isAutoCorrection,
|
||||||
|
float textFadeFactor) {
|
||||||
|
final int width = mSpaceKey.mWidth;
|
||||||
|
final int height = mSpaceIcon != null ? mSpaceIcon.getIntrinsicHeight() : mSpaceKey.mHeight;
|
||||||
|
final Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
||||||
|
final Canvas canvas = new Canvas(buffer);
|
||||||
|
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
|
||||||
|
|
||||||
|
// If application locales are explicitly selected.
|
||||||
|
if (inputLocale != null) {
|
||||||
|
final Paint paint = new Paint();
|
||||||
|
paint.setAntiAlias(true);
|
||||||
|
paint.setTextAlign(Align.CENTER);
|
||||||
|
|
||||||
|
final String language = layoutSpacebar(paint, inputLocale, width, mSpacebarTextSize);
|
||||||
|
|
||||||
|
// Draw language text with shadow
|
||||||
|
// In case there is no space icon, we will place the language text at the center of
|
||||||
|
// spacebar.
|
||||||
|
final float descent = paint.descent();
|
||||||
|
final float textHeight = -paint.ascent() + descent;
|
||||||
|
final float baseline = (mSpaceIcon != null) ? height * SPACEBAR_LANGUAGE_BASELINE
|
||||||
|
: height / 2 + textHeight / 2;
|
||||||
|
paint.setColor(getSpacebarTextColor(mSpacebarTextShadowColor, textFadeFactor));
|
||||||
|
canvas.drawText(language, width / 2, baseline - descent - 1, paint);
|
||||||
|
paint.setColor(getSpacebarTextColor(mSpacebarTextColor, textFadeFactor));
|
||||||
|
canvas.drawText(language, width / 2, baseline - descent, paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the spacebar icon at the bottom
|
||||||
|
if (isAutoCorrection) {
|
||||||
|
final int iconWidth = width * SPACE_LED_LENGTH_PERCENT / 100;
|
||||||
|
final int iconHeight = mAutoCorrectionSpacebarLedIcon.getIntrinsicHeight();
|
||||||
|
int x = (width - iconWidth) / 2;
|
||||||
|
int y = height - iconHeight;
|
||||||
|
mAutoCorrectionSpacebarLedIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
|
||||||
|
mAutoCorrectionSpacebarLedIcon.draw(canvas);
|
||||||
|
} else if (mSpaceIcon != null) {
|
||||||
|
final int iconWidth = mSpaceIcon.getIntrinsicWidth();
|
||||||
|
final int iconHeight = mSpaceIcon.getIntrinsicHeight();
|
||||||
|
int x = (width - iconWidth) / 2;
|
||||||
|
int y = height - iconHeight;
|
||||||
|
mSpaceIcon.setBounds(x, y, x + iconWidth, y + iconHeight);
|
||||||
|
mSpaceIcon.draw(canvas);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,11 +344,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
if (inputView == null) return;
|
if (inputView == null) return;
|
||||||
final Keyboard keyboard = inputView.getKeyboard();
|
final Keyboard keyboard = inputView.getKeyboard();
|
||||||
if (keyboard instanceof LatinKeyboard && keyboard == oldKeyboard) {
|
if (keyboard instanceof LatinKeyboard && keyboard == oldKeyboard) {
|
||||||
inputView.updateSpacebar();
|
inputView.updateSpacebar(fadeFactor,
|
||||||
final Key updatedKey = ((LatinKeyboard)keyboard).updateSpacebarLanguage(
|
SubtypeSwitcher.getInstance().needsToDisplayLanguage(
|
||||||
fadeFactor,
|
keyboard.mId.mLocale));
|
||||||
SubtypeSwitcher.getInstance().needsToDisplayLanguage(keyboard.mId.mLocale));
|
|
||||||
inputView.invalidateKey(updatedKey);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue