Merge remote-tracking branch 'goog/master' into merge
This commit is contained in:
commit
65a3fb01c1
22 changed files with 456 additions and 209 deletions
|
@ -37,7 +37,12 @@
|
||||||
<bool name="config_default_popup_preview">true</bool>
|
<bool name="config_default_popup_preview">true</bool>
|
||||||
<!-- Default values for whether quick fixes and bigram suggestions are activated -->
|
<!-- Default values for whether quick fixes and bigram suggestions are activated -->
|
||||||
<bool name="config_default_quick_fixes">true</bool>
|
<bool name="config_default_quick_fixes">true</bool>
|
||||||
|
<!-- Default value for bigram suggestion: while showing candidates for a word should we weigh
|
||||||
|
in the previous word? -->
|
||||||
<bool name="config_default_bigram_suggestions">true</bool>
|
<bool name="config_default_bigram_suggestions">true</bool>
|
||||||
|
<!-- Default value for bigram prediction: after entering a word and a space only, should we look
|
||||||
|
at input history to suggest a hopefully helpful candidate for the next word? -->
|
||||||
|
<bool name="config_default_bigram_prediction">false</bool>
|
||||||
<bool name="config_default_recorrection_enabled">true</bool>
|
<bool name="config_default_recorrection_enabled">true</bool>
|
||||||
<bool name="config_default_sound_enabled">false</bool>
|
<bool name="config_default_sound_enabled">false</bool>
|
||||||
<bool name="config_use_spacebar_language_switcher">true</bool>
|
<bool name="config_use_spacebar_language_switcher">true</bool>
|
||||||
|
|
|
@ -26,8 +26,8 @@
|
||||||
<integer name="key_shift">-1</integer>
|
<integer name="key_shift">-1</integer>
|
||||||
<integer name="key_switch_alpha_symbol">-2</integer>
|
<integer name="key_switch_alpha_symbol">-2</integer>
|
||||||
<integer name="key_delete">-5</integer>
|
<integer name="key_delete">-5</integer>
|
||||||
<integer name="key_settings">-100</integer>
|
<integer name="key_settings">-6</integer>
|
||||||
<integer name="key_voice">-102</integer>
|
<integer name="key_shortcut">-8</integer>
|
||||||
|
|
||||||
<!-- Array used for mapping key codes to description strings. -->
|
<!-- Array used for mapping key codes to description strings. -->
|
||||||
<array name="key_descriptions">
|
<array name="key_descriptions">
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
<item>@string/description_delete_key</item>
|
<item>@string/description_delete_key</item>
|
||||||
<item>@integer/key_settings</item>
|
<item>@integer/key_settings</item>
|
||||||
<item>@string/description_settings_key</item>
|
<item>@string/description_settings_key</item>
|
||||||
<item>@integer/key_voice</item>
|
<item>@integer/key_shortcut</item>
|
||||||
<item>@string/description_voice_key</item>
|
<item>@string/description_voice_key</item>
|
||||||
</array>
|
</array>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -38,7 +38,13 @@
|
||||||
<string name="general_category">General</string>
|
<string name="general_category">General</string>
|
||||||
|
|
||||||
<!-- Category title for text prediction -->
|
<!-- Category title for text prediction -->
|
||||||
<string name="prediction_category">Text correction</string>
|
<string name="correction_category">Text correction</string>
|
||||||
|
|
||||||
|
<!-- Category title for ngrams -->
|
||||||
|
<string name="ngram_category">Suggestions based on previous words</string>
|
||||||
|
|
||||||
|
<!-- Category title for misc options -->
|
||||||
|
<string name="misc_category">Other options</string>
|
||||||
|
|
||||||
<!-- Option to enable auto capitalization of sentences -->
|
<!-- Option to enable auto capitalization of sentences -->
|
||||||
<string name="auto_cap">Auto-capitalization</string>
|
<string name="auto_cap">Auto-capitalization</string>
|
||||||
|
@ -55,6 +61,8 @@
|
||||||
<string name="prefs_suggestion_visibility_show_name">Always show</string>
|
<string name="prefs_suggestion_visibility_show_name">Always show</string>
|
||||||
<string name="prefs_suggestion_visibility_show_only_portrait_name">Show on portrait mode</string>
|
<string name="prefs_suggestion_visibility_show_only_portrait_name">Show on portrait mode</string>
|
||||||
<string name="prefs_suggestion_visibility_hide_name">Always hide</string>
|
<string name="prefs_suggestion_visibility_hide_name">Always hide</string>
|
||||||
|
<!-- Option to enable spacebar language switcher [CHAR LIMIT=20]-->
|
||||||
|
<string name="prefs_use_spacebar_language_switch">Use the spacebar language switcher</string>
|
||||||
|
|
||||||
<!-- Option to show/hide the settings key -->
|
<!-- Option to show/hide the settings key -->
|
||||||
<string name="prefs_settings_key">Show settings key</string>
|
<string name="prefs_settings_key">Show settings key</string>
|
||||||
|
@ -78,9 +86,13 @@
|
||||||
<string name="auto_correction_threshold_mode_aggeressive">Aggressive</string>
|
<string name="auto_correction_threshold_mode_aggeressive">Aggressive</string>
|
||||||
|
|
||||||
<!-- Option to enable bigram correction -->
|
<!-- Option to enable bigram correction -->
|
||||||
<string name="bigram_suggestion">Bigram Suggestions</string>
|
<string name="bigram_suggestion">Bigram suggestions</string>
|
||||||
<!-- Description for auto correction -->
|
<!-- Description for auto correction -->
|
||||||
<string name="bigram_suggestion_summary">Use previous word to improve suggestion</string>
|
<string name="bigram_suggestion_summary">Use previous word to improve suggestion</string>
|
||||||
|
<!-- Option to enable using user-history bigram when no input -->
|
||||||
|
<string name="bigram_prediction">Bigram prediction</string>
|
||||||
|
<!-- Description for auto correction -->
|
||||||
|
<string name="bigram_prediction_summary">Use previous word also for prediction</string>
|
||||||
|
|
||||||
<!-- Indicates that a word has been added to the dictionary -->
|
<!-- Indicates that a word has been added to the dictionary -->
|
||||||
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
|
<string name="added_word"><xliff:g id="word">%s</xliff:g> : Saved</string>
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
<key-style
|
<key-style
|
||||||
latin:styleName="micKeyStyle"
|
latin:styleName="micKeyStyle"
|
||||||
latin:code="@integer/key_voice"
|
latin:code="@integer/key_shortcut"
|
||||||
latin:keyIcon="@drawable/sym_keyboard_voice_holo"
|
latin:keyIcon="@drawable/sym_keyboard_voice_holo"
|
||||||
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
|
@ -127,7 +127,7 @@
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
<key-style
|
<key-style
|
||||||
latin:styleName="micKeyStyle"
|
latin:styleName="micKeyStyle"
|
||||||
latin:code="@integer/key_voice"
|
latin:code="@integer/key_shortcut"
|
||||||
latin:keyIcon="@drawable/sym_bkeyboard_mic"
|
latin:keyIcon="@drawable/sym_bkeyboard_mic"
|
||||||
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
|
|
|
@ -118,7 +118,7 @@
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
<key-style
|
<key-style
|
||||||
latin:styleName="micKeyStyle"
|
latin:styleName="micKeyStyle"
|
||||||
latin:code="@integer/key_voice"
|
latin:code="@integer/key_shortcut"
|
||||||
latin:keyIcon="@drawable/sym_keyboard_mic"
|
latin:keyIcon="@drawable/sym_keyboard_mic"
|
||||||
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
||||||
latin:parentStyle="settingsPopupStyle" />
|
latin:parentStyle="settingsPopupStyle" />
|
||||||
|
@ -191,7 +191,7 @@
|
||||||
latin:parentStyle="functionalKeyStyle" />
|
latin:parentStyle="functionalKeyStyle" />
|
||||||
<key-style
|
<key-style
|
||||||
latin:styleName="micKeyStyle"
|
latin:styleName="micKeyStyle"
|
||||||
latin:code="@integer/key_voice"
|
latin:code="@integer/key_shortcut"
|
||||||
latin:keyIcon="@drawable/sym_bkeyboard_mic"
|
latin:keyIcon="@drawable/sym_bkeyboard_mic"
|
||||||
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
latin:iconPreview="@drawable/sym_keyboard_feedback_mic"
|
||||||
latin:parentStyle="settingsPopupStyle" />
|
latin:parentStyle="settingsPopupStyle" />
|
||||||
|
|
|
@ -66,8 +66,8 @@
|
||||||
android:summary="@string/language_selection_summary" />
|
android:summary="@string/language_selection_summary" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/prediction_category"
|
android:title="@string/correction_category"
|
||||||
android:key="prediction_settings">
|
android:key="correction_settings">
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="quick_fixes"
|
android:key="quick_fixes"
|
||||||
android:title="@string/quick_fixes"
|
android:title="@string/quick_fixes"
|
||||||
|
@ -90,13 +90,27 @@
|
||||||
android:entryValues="@array/prefs_suggestion_visibility_values"
|
android:entryValues="@array/prefs_suggestion_visibility_values"
|
||||||
android:entries="@array/prefs_suggestion_visibilities"
|
android:entries="@array/prefs_suggestion_visibilities"
|
||||||
android:defaultValue="@string/prefs_suggestion_visibility_default_value" />
|
android:defaultValue="@string/prefs_suggestion_visibility_default_value" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/ngram_category"
|
||||||
|
android:key="ngram_settings">
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="bigram_suggestion"
|
android:key="bigram_suggestion"
|
||||||
android:title="@string/bigram_suggestion"
|
android:title="@string/bigram_suggestion"
|
||||||
android:summary="@string/bigram_suggestion_summary"
|
android:summary="@string/bigram_suggestion_summary"
|
||||||
android:persistent="true"
|
android:persistent="true"
|
||||||
android:defaultValue="true" />
|
android:defaultValue="true" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="bigram_prediction"
|
||||||
|
android:dependency="bigram_suggestion"
|
||||||
|
android:title="@string/bigram_prediction"
|
||||||
|
android:summary="@string/bigram_prediction_summary"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="false" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:title="@string/misc_category"
|
||||||
|
android:key="misc_settings">
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="usability_study_mode"
|
android:key="usability_study_mode"
|
||||||
android:title="@string/prefs_usability_study_mode"
|
android:title="@string/prefs_usability_study_mode"
|
||||||
|
@ -115,6 +129,7 @@
|
||||||
android:entryValues="@array/keyboard_layout_modes_values"
|
android:entryValues="@array/keyboard_layout_modes_values"
|
||||||
android:entries="@array/keyboard_layout_modes"
|
android:entries="@array/keyboard_layout_modes"
|
||||||
android:defaultValue="@string/config_default_keyboard_theme_id" />
|
android:defaultValue="@string/config_default_keyboard_theme_id" />
|
||||||
|
</PreferenceCategory>
|
||||||
<!-- <Preference
|
<!-- <Preference
|
||||||
android:title="Debug Settings"
|
android:title="Debug Settings"
|
||||||
android:key="debug_settings">
|
android:key="debug_settings">
|
||||||
|
|
|
@ -35,6 +35,13 @@
|
||||||
android:defaultValue="@string/config_default_keyboard_theme_id"
|
android:defaultValue="@string/config_default_keyboard_theme_id"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:key="use_spacebar_language_switch"
|
||||||
|
android:title="@string/prefs_use_spacebar_language_switch"
|
||||||
|
android:persistent="true"
|
||||||
|
android:defaultValue="false"
|
||||||
|
/>
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="debug_mode"
|
android:key="debug_mode"
|
||||||
android:title="@string/prefs_debug_mode"
|
android:title="@string/prefs_debug_mode"
|
||||||
|
|
|
@ -68,19 +68,14 @@ public class Keyboard {
|
||||||
public static final int CODE_DUMMY = 0;
|
public static final int CODE_DUMMY = 0;
|
||||||
public static final int CODE_SHIFT = -1;
|
public static final int CODE_SHIFT = -1;
|
||||||
public static final int CODE_SWITCH_ALPHA_SYMBOL = -2;
|
public static final int CODE_SWITCH_ALPHA_SYMBOL = -2;
|
||||||
public static final int CODE_CANCEL = -3;
|
public static final int CODE_CAPSLOCK = -3;
|
||||||
public static final int CODE_DONE = -4;
|
public static final int CODE_CANCEL = -4;
|
||||||
public static final int CODE_DELETE = -5;
|
public static final int CODE_DELETE = -5;
|
||||||
public static final int CODE_ALT = -6;
|
public static final int CODE_SETTINGS = -6;
|
||||||
|
public static final int CODE_SETTINGS_LONGPRESS = -7;
|
||||||
|
public static final int CODE_SHORTCUT = -8;
|
||||||
// Code value representing the code is not specified.
|
// Code value representing the code is not specified.
|
||||||
public static final int CODE_UNSPECIFIED = -99;
|
public static final int CODE_UNSPECIFIED = -99;
|
||||||
public static final int CODE_SETTINGS = -100;
|
|
||||||
public static final int CODE_SETTINGS_LONGPRESS = -101;
|
|
||||||
// TODO: remove this once LatinIME stops referring to this.
|
|
||||||
public static final int CODE_VOICE = -102;
|
|
||||||
public static final int CODE_CAPSLOCK = -103;
|
|
||||||
public static final int CODE_NEXT_LANGUAGE = -104;
|
|
||||||
public static final int CODE_PREV_LANGUAGE = -105;
|
|
||||||
|
|
||||||
/** Horizontal gap default for all rows */
|
/** Horizontal gap default for all rows */
|
||||||
private int mDefaultHorizontalGap;
|
private int mDefaultHorizontalGap;
|
||||||
|
|
|
@ -146,11 +146,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
// Update the settings key state because number of enabled IMEs could have been changed
|
// Update the settings key state because number of enabled IMEs could have been changed
|
||||||
mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
|
mSettingsKeyEnabledInSettings = getSettingsKeyMode(mPrefs, mInputMethodService);
|
||||||
final KeyboardId id = getKeyboardId(attribute, isSymbols);
|
final KeyboardId id = getKeyboardId(attribute, isSymbols);
|
||||||
|
|
||||||
final Keyboard oldKeyboard = mInputView.getKeyboard();
|
|
||||||
if (oldKeyboard != null && oldKeyboard.mId.equals(id))
|
|
||||||
return;
|
|
||||||
|
|
||||||
makeSymbolsKeyboardIds(id.mMode, attribute);
|
makeSymbolsKeyboardIds(id.mMode, attribute);
|
||||||
mCurrentId = id;
|
mCurrentId = id;
|
||||||
mInputView.setKeyPreviewEnabled(mInputMethodService.getPopupOn());
|
mInputView.setKeyPreviewEnabled(mInputMethodService.getPopupOn());
|
||||||
|
@ -296,12 +291,6 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyReleased() {
|
|
||||||
LatinKeyboard latinKeyboard = getLatinKeyboard();
|
|
||||||
if (latinKeyboard != null)
|
|
||||||
latinKeyboard.keyReleased();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isShiftedOrShiftLocked() {
|
public boolean isShiftedOrShiftLocked() {
|
||||||
LatinKeyboard latinKeyboard = getLatinKeyboard();
|
LatinKeyboard latinKeyboard = getLatinKeyboard();
|
||||||
if (latinKeyboard != null)
|
if (latinKeyboard != null)
|
||||||
|
|
|
@ -46,6 +46,9 @@ import java.util.Locale;
|
||||||
public class LatinKeyboard extends Keyboard {
|
public class LatinKeyboard extends Keyboard {
|
||||||
private static final int SPACE_LED_LENGTH_PERCENT = 80;
|
private static final int SPACE_LED_LENGTH_PERCENT = 80;
|
||||||
|
|
||||||
|
public static final int CODE_NEXT_LANGUAGE = -100;
|
||||||
|
public static final int CODE_PREV_LANGUAGE = -101;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance();
|
private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance();
|
||||||
|
|
||||||
|
@ -53,17 +56,15 @@ public class LatinKeyboard extends Keyboard {
|
||||||
private final Key mSpaceKey;
|
private final Key mSpaceKey;
|
||||||
private final Drawable mSpaceIcon;
|
private final Drawable mSpaceIcon;
|
||||||
private final Drawable mSpacePreviewIcon;
|
private final Drawable mSpacePreviewIcon;
|
||||||
private final int[] mSpaceKeyIndexArray;
|
private final int mSpaceKeyIndex;
|
||||||
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 mSpacebarTextColor;
|
private final int mSpacebarTextColor;
|
||||||
private final int mSpacebarTextShadowColor;
|
private final int mSpacebarTextShadowColor;
|
||||||
private final int mSpacebarVerticalCorrection;
|
|
||||||
private float mSpacebarTextFadeFactor = 0.0f;
|
private float mSpacebarTextFadeFactor = 0.0f;
|
||||||
private int mSpaceDragStartX;
|
private final int mSpacebarLanguageSwitchThreshold;
|
||||||
private int mSpaceDragLastDiff;
|
private int mSpacebarLanguageSwitchDiff;
|
||||||
private boolean mCurrentlyInSpace;
|
|
||||||
private SlidingLocaleDrawable mSlidingLocaleIcon;
|
private SlidingLocaleDrawable mSlidingLocaleIcon;
|
||||||
private final HashMap<Integer, SoftReference<BitmapDrawable>> mSpaceDrawableCache =
|
private final HashMap<Integer, SoftReference<BitmapDrawable>> mSpaceDrawableCache =
|
||||||
new HashMap<Integer, SoftReference<BitmapDrawable>>();
|
new HashMap<Integer, SoftReference<BitmapDrawable>>();
|
||||||
|
@ -102,7 +103,7 @@ public class LatinKeyboard extends Keyboard {
|
||||||
case CODE_SPACE:
|
case CODE_SPACE:
|
||||||
spaceKeyIndex = index;
|
spaceKeyIndex = index;
|
||||||
break;
|
break;
|
||||||
case CODE_VOICE:
|
case CODE_SHORTCUT:
|
||||||
shortcutKeyIndex = index;
|
shortcutKeyIndex = index;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -112,7 +113,7 @@ public class LatinKeyboard extends Keyboard {
|
||||||
mSpaceKey = (spaceKeyIndex >= 0) ? keys.get(spaceKeyIndex) : null;
|
mSpaceKey = (spaceKeyIndex >= 0) ? keys.get(spaceKeyIndex) : null;
|
||||||
mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null;
|
mSpaceIcon = (mSpaceKey != null) ? mSpaceKey.getIcon() : null;
|
||||||
mSpacePreviewIcon = (mSpaceKey != null) ? mSpaceKey.getPreviewIcon() : null;
|
mSpacePreviewIcon = (mSpaceKey != null) ? mSpaceKey.getPreviewIcon() : null;
|
||||||
mSpaceKeyIndexArray = new int[] { spaceKeyIndex };
|
mSpaceKeyIndex = spaceKeyIndex;
|
||||||
|
|
||||||
mShortcutKey = (shortcutKeyIndex >= 0) ? keys.get(shortcutKeyIndex) : null;
|
mShortcutKey = (shortcutKeyIndex >= 0) ? keys.get(shortcutKeyIndex) : null;
|
||||||
mEnabledShortcutIcon = (mShortcutKey != null) ? mShortcutKey.getIcon() : null;
|
mEnabledShortcutIcon = (mShortcutKey != null) ? mShortcutKey.getIcon() : null;
|
||||||
|
@ -130,8 +131,8 @@ public class LatinKeyboard extends Keyboard {
|
||||||
mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
|
mSpaceAutoCorrectionIndicator = res.getDrawable(R.drawable.sym_keyboard_space_led);
|
||||||
mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left);
|
mButtonArrowLeftIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_left);
|
||||||
mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right);
|
mButtonArrowRightIcon = res.getDrawable(R.drawable.sym_keyboard_language_arrows_right);
|
||||||
mSpacebarVerticalCorrection = res.getDimensionPixelOffset(
|
// The threshold is "key width" x 1.5
|
||||||
R.dimen.spacebar_vertical_correction);
|
mSpacebarLanguageSwitchThreshold = (getMostCommonKeyWidth() * 3) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) {
|
public void setSpacebarTextFadeFactor(float fadeFactor, LatinKeyboardView view) {
|
||||||
|
@ -322,7 +323,10 @@ public class LatinKeyboard extends Keyboard {
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateLocaleDrag(int diff) {
|
public void updateSpacebarPreviewIcon(int diff) {
|
||||||
|
if (mSpacebarLanguageSwitchDiff == diff)
|
||||||
|
return;
|
||||||
|
mSpacebarLanguageSwitchDiff = diff;
|
||||||
if (mSlidingLocaleIcon == null) {
|
if (mSlidingLocaleIcon == null) {
|
||||||
final int width = Math.max(mSpaceKey.mWidth,
|
final int width = Math.max(mSpaceKey.mWidth,
|
||||||
(int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
|
(int)(getMinWidth() * SPACEBAR_POPUP_MIN_RATIO));
|
||||||
|
@ -330,7 +334,6 @@ public class LatinKeyboard extends Keyboard {
|
||||||
mSlidingLocaleIcon =
|
mSlidingLocaleIcon =
|
||||||
new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
|
new SlidingLocaleDrawable(mContext, mSpacePreviewIcon, width, height);
|
||||||
mSlidingLocaleIcon.setBounds(0, 0, width, height);
|
mSlidingLocaleIcon.setBounds(0, 0, width, height);
|
||||||
mSpaceKey.setPreviewIcon(mSlidingLocaleIcon);
|
|
||||||
}
|
}
|
||||||
mSlidingLocaleIcon.setDiff(diff);
|
mSlidingLocaleIcon.setDiff(diff);
|
||||||
if (Math.abs(diff) == Integer.MAX_VALUE) {
|
if (Math.abs(diff) == Integer.MAX_VALUE) {
|
||||||
|
@ -341,86 +344,45 @@ public class LatinKeyboard extends Keyboard {
|
||||||
mSpaceKey.getPreviewIcon().invalidateSelf();
|
mSpaceKey.getPreviewIcon().invalidateSelf();
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method is called when "popup on keypress" is off.
|
public boolean shouldTriggerSpacebarSlidingLanguageSwitch(int diff) {
|
||||||
|
return Math.abs(diff) > mSpacebarLanguageSwitchThreshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if spacebar needs showing preview even when "popup on keypress" is off.
|
||||||
|
* @param keyIndex index of the pressing key
|
||||||
|
* @return true if spacebar needs showing preview
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean needSpacebarPreview(int keyIndex) {
|
public boolean needSpacebarPreview(int keyIndex) {
|
||||||
|
// This method is called when "popup on keypress" is off.
|
||||||
if (!mSubtypeSwitcher.useSpacebarLanguageSwitcher())
|
if (!mSubtypeSwitcher.useSpacebarLanguageSwitcher())
|
||||||
return false;
|
return false;
|
||||||
// Dismiss key preview.
|
// Dismiss key preview.
|
||||||
if (keyIndex == KeyDetector.NOT_A_KEY)
|
if (keyIndex == KeyDetector.NOT_A_KEY)
|
||||||
return true;
|
return true;
|
||||||
// Key is not a spacebar.
|
// Key is not a spacebar.
|
||||||
if (keyIndex != mSpaceKeyIndexArray[0])
|
if (keyIndex != mSpaceKeyIndex)
|
||||||
return false;
|
return false;
|
||||||
// The language switcher will be displayed only when the dragging distance is greater
|
// The language switcher will be displayed only when the dragging distance is greater
|
||||||
// than average key width of this keyboard.
|
// than the threshold.
|
||||||
return Math.abs(mSpaceDragLastDiff) > getMostCommonKeyWidth();
|
return shouldTriggerSpacebarSlidingLanguageSwitch(mSpacebarLanguageSwitchDiff);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLanguageChangeDirection() {
|
public int getLanguageChangeDirection() {
|
||||||
if (mSpaceKey == null || SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() <= 1
|
if (mSpaceKey == null || mSubtypeSwitcher.getEnabledKeyboardLocaleCount() <= 1 || Math.abs(
|
||||||
|| Math.abs(mSpaceDragLastDiff) < getMostCommonKeyWidth() * SPACEBAR_DRAG_WIDTH) {
|
mSpacebarLanguageSwitchDiff) < getMostCommonKeyWidth() * SPACEBAR_DRAG_WIDTH) {
|
||||||
return 0; // No change
|
return 0; // No change
|
||||||
}
|
}
|
||||||
return mSpaceDragLastDiff > 0 ? 1 : -1;
|
return mSpacebarLanguageSwitchDiff > 0 ? 1 : -1;
|
||||||
}
|
|
||||||
|
|
||||||
public void keyReleased() {
|
|
||||||
mCurrentlyInSpace = false;
|
|
||||||
mSpaceDragLastDiff = 0;
|
|
||||||
if (mSpaceKey != null) {
|
|
||||||
updateLocaleDrag(Integer.MAX_VALUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the magic of locking the touch gesture into the spacebar when
|
|
||||||
* switching input languages.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean isInside(Key key, int pointX, int pointY) {
|
|
||||||
int x = pointX;
|
|
||||||
int y = pointY;
|
|
||||||
final int code = key.mCode;
|
|
||||||
if (code == CODE_SPACE) {
|
|
||||||
y += mSpacebarVerticalCorrection;
|
|
||||||
if (SubtypeSwitcher.getInstance().useSpacebarLanguageSwitcher()
|
|
||||||
&& SubtypeSwitcher.getInstance().getEnabledKeyboardLocaleCount() > 1) {
|
|
||||||
if (mCurrentlyInSpace) {
|
|
||||||
int diff = x - mSpaceDragStartX;
|
|
||||||
if (Math.abs(diff - mSpaceDragLastDiff) > 0) {
|
|
||||||
updateLocaleDrag(diff);
|
|
||||||
}
|
|
||||||
mSpaceDragLastDiff = diff;
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
boolean isOnSpace = key.isOnKey(x, y);
|
|
||||||
if (isOnSpace) {
|
|
||||||
mCurrentlyInSpace = true;
|
|
||||||
mSpaceDragStartX = x;
|
|
||||||
updateLocaleDrag(0);
|
|
||||||
}
|
|
||||||
return isOnSpace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lock into the spacebar
|
|
||||||
if (mCurrentlyInSpace) return false;
|
|
||||||
|
|
||||||
return key.isOnKey(x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int[] getNearestKeys(int x, int y) {
|
public int[] getNearestKeys(int x, int y) {
|
||||||
if (mCurrentlyInSpace) {
|
|
||||||
return mSpaceKeyIndexArray;
|
|
||||||
} else {
|
|
||||||
// Avoid dead pixels at edges of the keyboard
|
// Avoid dead pixels at edges of the keyboard
|
||||||
return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
|
return super.getNearestKeys(Math.max(0, Math.min(x, getMinWidth() - 1)),
|
||||||
Math.max(0, Math.min(y, getHeight() - 1)));
|
Math.max(0, Math.min(y, getHeight() - 1)));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static int getTextSizeFromTheme(Theme theme, int style, int defValue) {
|
private static int getTextSizeFromTheme(Theme theme, int style, int defValue) {
|
||||||
TypedArray array = theme.obtainStyledAttributes(
|
TypedArray array = theme.obtainStyledAttributes(
|
||||||
|
|
|
@ -68,11 +68,6 @@ public class LatinKeyboardView extends KeyboardView {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setKeyboard(Keyboard newKeyboard) {
|
public void setKeyboard(Keyboard newKeyboard) {
|
||||||
final LatinKeyboard oldKeyboard = getLatinKeyboard();
|
|
||||||
if (oldKeyboard != null) {
|
|
||||||
// Reset old keyboard state before switching to new keyboard.
|
|
||||||
oldKeyboard.keyReleased();
|
|
||||||
}
|
|
||||||
super.setKeyboard(newKeyboard);
|
super.setKeyboard(newKeyboard);
|
||||||
// One-seventh of the keyboard width seems like a reasonable threshold
|
// One-seventh of the keyboard width seems like a reasonable threshold
|
||||||
mJumpThresholdSquare = newKeyboard.getMinWidth() / 7;
|
mJumpThresholdSquare = newKeyboard.getMinWidth() / 7;
|
||||||
|
@ -216,8 +211,7 @@ public class LatinKeyboardView extends KeyboardView {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent me) {
|
public boolean onTouchEvent(MotionEvent me) {
|
||||||
LatinKeyboard keyboard = getLatinKeyboard();
|
if (getLatinKeyboard() == null) return true;
|
||||||
if (keyboard == null) return true;
|
|
||||||
|
|
||||||
// If there was a sudden jump, return without processing the actual motion event.
|
// If there was a sudden jump, return without processing the actual motion event.
|
||||||
if (handleSuddenJump(me)) {
|
if (handleSuddenJump(me)) {
|
||||||
|
@ -226,24 +220,6 @@ public class LatinKeyboardView extends KeyboardView {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset any bounding box controls in the keyboard
|
|
||||||
if (me.getAction() == MotionEvent.ACTION_DOWN) {
|
|
||||||
keyboard.keyReleased();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (me.getAction() == MotionEvent.ACTION_UP) {
|
|
||||||
int languageDirection = keyboard.getLanguageChangeDirection();
|
|
||||||
if (languageDirection != 0) {
|
|
||||||
getOnKeyboardActionListener().onCodeInput(
|
|
||||||
languageDirection == 1
|
|
||||||
? Keyboard.CODE_NEXT_LANGUAGE : Keyboard.CODE_PREV_LANGUAGE,
|
|
||||||
null, mLastX, mLastY);
|
|
||||||
me.setAction(MotionEvent.ACTION_CANCEL);
|
|
||||||
keyboard.keyReleased();
|
|
||||||
return super.onTouchEvent(me);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onTouchEvent(me);
|
return super.onTouchEvent(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ package com.android.inputmethod.keyboard;
|
||||||
import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
|
import com.android.inputmethod.keyboard.KeyboardView.UIHandler;
|
||||||
import com.android.inputmethod.latin.LatinImeLogger;
|
import com.android.inputmethod.latin.LatinImeLogger;
|
||||||
import com.android.inputmethod.latin.R;
|
import com.android.inputmethod.latin.R;
|
||||||
|
import com.android.inputmethod.latin.SubtypeSwitcher;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -90,6 +91,12 @@ public class PointerTracker {
|
||||||
// ignore modifier key if true
|
// ignore modifier key if true
|
||||||
private boolean mIgnoreModifierKey;
|
private boolean mIgnoreModifierKey;
|
||||||
|
|
||||||
|
// TODO: Remove these hacking variables
|
||||||
|
// true if this pointer is in sliding language switch
|
||||||
|
private boolean mIsInSlidingLanguageSwitch;
|
||||||
|
private int mSpaceKeyIndex;
|
||||||
|
private final SubtypeSwitcher mSubtypeSwitcher;
|
||||||
|
|
||||||
// Empty {@link KeyboardActionListener}
|
// Empty {@link KeyboardActionListener}
|
||||||
private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() {
|
private static final KeyboardActionListener EMPTY_LISTENER = new KeyboardActionListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -129,6 +136,7 @@ public class PointerTracker {
|
||||||
R.dimen.config_touch_noise_threshold_distance);
|
R.dimen.config_touch_noise_threshold_distance);
|
||||||
mTouchNoiseThresholdDistanceSquared = (int)(
|
mTouchNoiseThresholdDistanceSquared = (int)(
|
||||||
touchNoiseThresholdDistance * touchNoiseThresholdDistance);
|
touchNoiseThresholdDistance * touchNoiseThresholdDistance);
|
||||||
|
mSubtypeSwitcher = SubtypeSwitcher.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setOnKeyboardActionListener(KeyboardActionListener listener) {
|
public void setOnKeyboardActionListener(KeyboardActionListener listener) {
|
||||||
|
@ -338,6 +346,7 @@ public class PointerTracker {
|
||||||
mKeyAlreadyProcessed = false;
|
mKeyAlreadyProcessed = false;
|
||||||
mIsRepeatableKey = false;
|
mIsRepeatableKey = false;
|
||||||
mIsInSlidingKeyInput = false;
|
mIsInSlidingKeyInput = false;
|
||||||
|
mIsInSlidingLanguageSwitch = false;
|
||||||
mIgnoreModifierKey = false;
|
mIgnoreModifierKey = false;
|
||||||
if (isValidKeyIndex(keyIndex)) {
|
if (isValidKeyIndex(keyIndex)) {
|
||||||
// This onPress call may have changed keyboard layout. Those cases are detected at
|
// This onPress call may have changed keyboard layout. Those cases are detected at
|
||||||
|
@ -374,6 +383,12 @@ public class PointerTracker {
|
||||||
return;
|
return;
|
||||||
final PointerTrackerKeyState keyState = mKeyState;
|
final PointerTrackerKeyState keyState = mKeyState;
|
||||||
|
|
||||||
|
// TODO: Remove this hacking code
|
||||||
|
if (mIsInSlidingLanguageSwitch) {
|
||||||
|
((LatinKeyboard)mKeyboard).updateSpacebarPreviewIcon(x - keyState.getKeyX());
|
||||||
|
showKeyPreview(mSpaceKeyIndex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
final int lastX = keyState.getLastX();
|
final int lastX = keyState.getLastX();
|
||||||
final int lastY = keyState.getLastY();
|
final int lastY = keyState.getLastY();
|
||||||
final int oldKeyIndex = keyState.getKeyIndex();
|
final int oldKeyIndex = keyState.getKeyIndex();
|
||||||
|
@ -428,11 +443,25 @@ public class PointerTracker {
|
||||||
dismissKeyPreview();
|
dismissKeyPreview();
|
||||||
setReleasedKeyGraphics(oldKeyIndex);
|
setReleasedKeyGraphics(oldKeyIndex);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else if (mKeyboard.needSpacebarPreview(keyIndex)) {
|
}
|
||||||
|
// TODO: Remove this hack code
|
||||||
|
else if (isSpaceKey(keyIndex) && !mIsInSlidingLanguageSwitch
|
||||||
|
&& mKeyboard instanceof LatinKeyboard) {
|
||||||
|
final LatinKeyboard keyboard = ((LatinKeyboard)mKeyboard);
|
||||||
|
if (mSubtypeSwitcher.useSpacebarLanguageSwitcher()
|
||||||
|
&& mSubtypeSwitcher.getEnabledKeyboardLocaleCount() > 1) {
|
||||||
|
final int diff = x - keyState.getKeyX();
|
||||||
|
if (keyboard.shouldTriggerSpacebarSlidingLanguageSwitch(diff)) {
|
||||||
|
// Detect start sliding language switch.
|
||||||
|
mIsInSlidingLanguageSwitch = true;
|
||||||
|
mSpaceKeyIndex = keyIndex;
|
||||||
|
keyboard.updateSpacebarPreviewIcon(diff);
|
||||||
// Display spacebar slide language switcher.
|
// Display spacebar slide language switcher.
|
||||||
showKeyPreview(keyIndex);
|
showKeyPreview(keyIndex);
|
||||||
|
queue.releaseAllPointersExcept(this, eventTime, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
|
if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
|
||||||
|
@ -447,7 +476,6 @@ public class PointerTracker {
|
||||||
} else {
|
} else {
|
||||||
mKeyAlreadyProcessed = true;
|
mKeyAlreadyProcessed = true;
|
||||||
dismissKeyPreview();
|
dismissKeyPreview();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -462,7 +490,7 @@ public class PointerTracker {
|
||||||
if (isModifier()) {
|
if (isModifier()) {
|
||||||
// Before processing an up event of modifier key, all pointers already being
|
// Before processing an up event of modifier key, all pointers already being
|
||||||
// tracked should be released.
|
// tracked should be released.
|
||||||
queue.releaseAllPointersExcept(this, eventTime);
|
queue.releaseAllPointersExcept(this, eventTime, true);
|
||||||
} else {
|
} else {
|
||||||
queue.releaseAllPointersOlderThan(this, eventTime);
|
queue.releaseAllPointersOlderThan(this, eventTime);
|
||||||
}
|
}
|
||||||
|
@ -474,8 +502,10 @@ public class PointerTracker {
|
||||||
// Let this pointer tracker know that one of newer-than-this pointer trackers got an up event.
|
// Let this pointer tracker know that one of newer-than-this pointer trackers got an up event.
|
||||||
// This pointer tracker needs to keep the key top graphics "pressed", but needs to get a
|
// This pointer tracker needs to keep the key top graphics "pressed", but needs to get a
|
||||||
// "virtual" up event.
|
// "virtual" up event.
|
||||||
public void onPhantomUpEvent(int x, int y, long eventTime) {
|
public void onPhantomUpEvent(int x, int y, long eventTime, boolean updateReleasedKeyGraphics) {
|
||||||
onUpEventInternal(x, y, eventTime, false);
|
if (DEBUG_EVENT)
|
||||||
|
printTouchEvent("onPhntEvent:", x, y, eventTime);
|
||||||
|
onUpEventInternal(x, y, eventTime, updateReleasedKeyGraphics);
|
||||||
mKeyAlreadyProcessed = true;
|
mKeyAlreadyProcessed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,6 +530,20 @@ public class PointerTracker {
|
||||||
setReleasedKeyGraphics(keyIndex);
|
setReleasedKeyGraphics(keyIndex);
|
||||||
if (mKeyAlreadyProcessed)
|
if (mKeyAlreadyProcessed)
|
||||||
return;
|
return;
|
||||||
|
// TODO: Remove this hacking code
|
||||||
|
if (mIsInSlidingLanguageSwitch) {
|
||||||
|
setReleasedKeyGraphics(mSpaceKeyIndex);
|
||||||
|
final int languageDir = ((LatinKeyboard)mKeyboard).getLanguageChangeDirection();
|
||||||
|
if (languageDir != 0) {
|
||||||
|
final int code = (languageDir == 1)
|
||||||
|
? LatinKeyboard.CODE_NEXT_LANGUAGE : LatinKeyboard.CODE_PREV_LANGUAGE;
|
||||||
|
// This will change keyboard layout.
|
||||||
|
mListener.onCodeInput(code, new int[] {code}, keyX, keyY);
|
||||||
|
}
|
||||||
|
((LatinKeyboard)mKeyboard).updateSpacebarPreviewIcon(0);
|
||||||
|
mIsInSlidingLanguageSwitch = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!mIsRepeatableKey) {
|
if (!mIsRepeatableKey) {
|
||||||
detectAndSendKey(keyIndex, keyX, keyY);
|
detectAndSendKey(keyIndex, keyX, keyY);
|
||||||
}
|
}
|
||||||
|
@ -515,8 +559,10 @@ public class PointerTracker {
|
||||||
if (DEBUG_EVENT)
|
if (DEBUG_EVENT)
|
||||||
printTouchEvent("onCancelEvt:", x, y, eventTime);
|
printTouchEvent("onCancelEvt:", x, y, eventTime);
|
||||||
|
|
||||||
if (queue != null)
|
if (queue != null) {
|
||||||
|
queue.releaseAllPointersExcept(this, eventTime, true);
|
||||||
queue.remove(this);
|
queue.remove(this);
|
||||||
|
}
|
||||||
onCancelEventInternal();
|
onCancelEventInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,21 +35,22 @@ public class PointerTrackerQueue {
|
||||||
if (t.isModifier()) {
|
if (t.isModifier()) {
|
||||||
oldestPos++;
|
oldestPos++;
|
||||||
} else {
|
} else {
|
||||||
t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime);
|
t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, false);
|
||||||
queue.remove(oldestPos);
|
queue.remove(oldestPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void releaseAllPointers(long eventTime) {
|
public void releaseAllPointers(long eventTime) {
|
||||||
releaseAllPointersExcept(null, eventTime);
|
releaseAllPointersExcept(null, eventTime, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
|
public void releaseAllPointersExcept(PointerTracker tracker, long eventTime,
|
||||||
|
boolean updateReleasedKeyGraphics) {
|
||||||
for (PointerTracker t : mQueue) {
|
for (PointerTracker t : mQueue) {
|
||||||
if (t == tracker)
|
if (t == tracker)
|
||||||
continue;
|
continue;
|
||||||
t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime);
|
t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime, updateReleasedKeyGraphics);
|
||||||
}
|
}
|
||||||
mQueue.clear();
|
mQueue.clear();
|
||||||
if (tracker != null)
|
if (tracker != null)
|
||||||
|
|
|
@ -197,6 +197,11 @@ public class BinaryDictionary extends Dictionary {
|
||||||
Arrays.fill(mBigramScores, 0);
|
Arrays.fill(mBigramScores, 0);
|
||||||
|
|
||||||
int codesSize = codes.size();
|
int codesSize = codes.size();
|
||||||
|
if (codesSize <= 0) {
|
||||||
|
// Do not return bigrams from BinaryDictionary when nothing was typed.
|
||||||
|
// Only use user-history bigrams (or whatever other bigram dictionaries decide).
|
||||||
|
return;
|
||||||
|
}
|
||||||
Arrays.fill(mInputCodes, -1);
|
Arrays.fill(mInputCodes, -1);
|
||||||
int[] alternatives = codes.getCodesAt(0);
|
int[] alternatives = codes.getCodesAt(0);
|
||||||
System.arraycopy(alternatives, 0, mInputCodes, 0,
|
System.arraycopy(alternatives, 0, mInputCodes, 0,
|
||||||
|
|
|
@ -33,6 +33,7 @@ public class DebugSettings extends PreferenceActivity
|
||||||
|
|
||||||
private boolean mServiceNeedsRestart = false;
|
private boolean mServiceNeedsRestart = false;
|
||||||
private CheckBoxPreference mDebugMode;
|
private CheckBoxPreference mDebugMode;
|
||||||
|
private CheckBoxPreference mUseSpacebarLanguageSwitch;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle icicle) {
|
protected void onCreate(Bundle icicle) {
|
||||||
|
@ -60,6 +61,13 @@ public class DebugSettings extends PreferenceActivity
|
||||||
updateDebugMode();
|
updateDebugMode();
|
||||||
mServiceNeedsRestart = true;
|
mServiceNeedsRestart = true;
|
||||||
}
|
}
|
||||||
|
} else if (key.equals(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY)) {
|
||||||
|
if (mUseSpacebarLanguageSwitch != null) {
|
||||||
|
mUseSpacebarLanguageSwitch.setChecked(
|
||||||
|
prefs.getBoolean(SubtypeSwitcher.USE_SPACEBAR_LANGUAGE_SWITCH_KEY,
|
||||||
|
getResources().getBoolean(
|
||||||
|
R.bool.config_use_spacebar_language_switcher)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -161,23 +161,62 @@ public class EditingUtils {
|
||||||
|
|
||||||
private static final Pattern spaceRegex = Pattern.compile("\\s+");
|
private static final Pattern spaceRegex = Pattern.compile("\\s+");
|
||||||
|
|
||||||
|
|
||||||
public static CharSequence getPreviousWord(InputConnection connection,
|
public static CharSequence getPreviousWord(InputConnection connection,
|
||||||
String sentenceSeperators) {
|
String sentenceSeperators) {
|
||||||
//TODO: Should fix this. This could be slow!
|
//TODO: Should fix this. This could be slow!
|
||||||
CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
|
CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
|
||||||
if (prev == null) {
|
return getPreviousWord(prev, sentenceSeperators);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the word before the whitespace preceding the non-whitespace preceding the cursor.
|
||||||
|
// Also, it won't return words that end in a separator.
|
||||||
|
// Example :
|
||||||
|
// "abc def|" -> abc
|
||||||
|
// "abc def |" -> abc
|
||||||
|
// "abc def. |" -> abc
|
||||||
|
// "abc def . |" -> def
|
||||||
|
// "abc|" -> null
|
||||||
|
// "abc |" -> null
|
||||||
|
// "abc. def|" -> null
|
||||||
|
public static CharSequence getPreviousWord(CharSequence prev, String sentenceSeperators) {
|
||||||
|
if (prev == null) return null;
|
||||||
String[] w = spaceRegex.split(prev);
|
String[] w = spaceRegex.split(prev);
|
||||||
if (w.length >= 2 && w[w.length-2].length() > 0) {
|
|
||||||
char lastChar = w[w.length-2].charAt(w[w.length-2].length() -1);
|
// If we can't find two words, or we found an empty word, return null.
|
||||||
if (sentenceSeperators.contains(String.valueOf(lastChar))) {
|
if (w.length < 2 || w[w.length - 2].length() <= 0) return null;
|
||||||
return null;
|
|
||||||
|
// If ends in a separator, return null
|
||||||
|
char lastChar = w[w.length - 2].charAt(w[w.length - 2].length() - 1);
|
||||||
|
if (sentenceSeperators.contains(String.valueOf(lastChar))) return null;
|
||||||
|
|
||||||
|
return w[w.length - 2];
|
||||||
}
|
}
|
||||||
return w[w.length-2];
|
|
||||||
} else {
|
public static CharSequence getThisWord(InputConnection connection, String sentenceSeperators) {
|
||||||
return null;
|
final CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
|
||||||
|
return getThisWord(prev, sentenceSeperators);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the word immediately before the cursor, even if there is whitespace between it and
|
||||||
|
// the cursor - but not if there is punctuation.
|
||||||
|
// Example :
|
||||||
|
// "abc def|" -> def
|
||||||
|
// "abc def |" -> def
|
||||||
|
// "abc def. |" -> null
|
||||||
|
// "abc def . |" -> null
|
||||||
|
public static CharSequence getThisWord(CharSequence prev, String sentenceSeperators) {
|
||||||
|
if (prev == null) return null;
|
||||||
|
String[] w = spaceRegex.split(prev);
|
||||||
|
|
||||||
|
// No word : return null
|
||||||
|
if (w.length < 1 || w[w.length - 1].length() <= 0) return null;
|
||||||
|
|
||||||
|
// If ends in a separator, return null
|
||||||
|
char lastChar = w[w.length - 1].charAt(w[w.length - 1].length() - 1);
|
||||||
|
if (sentenceSeperators.contains(String.valueOf(lastChar))) return null;
|
||||||
|
|
||||||
|
return w[w.length - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class SelectedWord {
|
public static class SelectedWord {
|
||||||
|
|
|
@ -177,7 +177,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
private boolean mJustAddedAutoSpace;
|
private boolean mJustAddedAutoSpace;
|
||||||
private boolean mAutoCorrectEnabled;
|
private boolean mAutoCorrectEnabled;
|
||||||
private boolean mRecorrectionEnabled;
|
private boolean mRecorrectionEnabled;
|
||||||
|
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
|
||||||
private boolean mBigramSuggestionEnabled;
|
private boolean mBigramSuggestionEnabled;
|
||||||
|
// Prediction: use bigrams to predict the next word when there is no input for it yet
|
||||||
|
private boolean mBigramPredictionEnabled;
|
||||||
private boolean mAutoCorrectOn;
|
private boolean mAutoCorrectOn;
|
||||||
private boolean mVibrateOn;
|
private boolean mVibrateOn;
|
||||||
private boolean mSoundOn;
|
private boolean mSoundOn;
|
||||||
|
@ -266,6 +269,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4;
|
private static final int MSG_FADEOUT_LANGUAGE_ON_SPACEBAR = 4;
|
||||||
private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
|
private static final int MSG_DISMISS_LANGUAGE_ON_SPACEBAR = 5;
|
||||||
private static final int MSG_SPACE_TYPED = 6;
|
private static final int MSG_SPACE_TYPED = 6;
|
||||||
|
private static final int MSG_SET_BIGRAM_PREDICTIONS = 7;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message msg) {
|
public void handleMessage(Message msg) {
|
||||||
|
@ -281,6 +285,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
case MSG_UPDATE_SHIFT_STATE:
|
case MSG_UPDATE_SHIFT_STATE:
|
||||||
switcher.updateShiftState();
|
switcher.updateShiftState();
|
||||||
break;
|
break;
|
||||||
|
case MSG_SET_BIGRAM_PREDICTIONS:
|
||||||
|
updateBigramPredictions();
|
||||||
|
break;
|
||||||
case MSG_VOICE_RESULTS:
|
case MSG_VOICE_RESULTS:
|
||||||
mVoiceProxy.handleVoiceResults(preferCapitalization()
|
mVoiceProxy.handleVoiceResults(preferCapitalization()
|
||||||
|| (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked()));
|
|| (switcher.isAlphabetMode() && switcher.isShiftedOrShiftLocked()));
|
||||||
|
@ -333,6 +340,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
removeMessages(MSG_UPDATE_SHIFT_STATE);
|
removeMessages(MSG_UPDATE_SHIFT_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void postUpdateBigramPredictions() {
|
||||||
|
removeMessages(MSG_SET_BIGRAM_PREDICTIONS);
|
||||||
|
sendMessageDelayed(obtainMessage(MSG_SET_BIGRAM_PREDICTIONS), DELAY_UPDATE_SUGGESTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cancelUpdateBigramPredictions() {
|
||||||
|
removeMessages(MSG_SET_BIGRAM_PREDICTIONS);
|
||||||
|
}
|
||||||
|
|
||||||
public void updateVoiceResults() {
|
public void updateVoiceResults() {
|
||||||
sendMessage(obtainMessage(MSG_VOICE_RESULTS));
|
sendMessage(obtainMessage(MSG_VOICE_RESULTS));
|
||||||
}
|
}
|
||||||
|
@ -343,11 +359,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
|
final LatinKeyboardView inputView = mKeyboardSwitcher.getInputView();
|
||||||
if (inputView != null) {
|
if (inputView != null) {
|
||||||
final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
|
final LatinKeyboard keyboard = mKeyboardSwitcher.getLatinKeyboard();
|
||||||
|
// The language is always displayed when the delay is negative.
|
||||||
|
final boolean needsToDisplayLanguage = localeChanged
|
||||||
|
|| mConfigDelayBeforeFadeoutLanguageOnSpacebar < 0;
|
||||||
// The language is never displayed when the delay is zero.
|
// The language is never displayed when the delay is zero.
|
||||||
if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0)
|
if (mConfigDelayBeforeFadeoutLanguageOnSpacebar != 0)
|
||||||
inputView.setSpacebarTextFadeFactor(localeChanged ? 1.0f
|
inputView.setSpacebarTextFadeFactor(needsToDisplayLanguage ? 1.0f
|
||||||
: mConfigFinalFadeoutFactorOfLanguageOnSpacebar, keyboard);
|
: mConfigFinalFadeoutFactorOfLanguageOnSpacebar, keyboard);
|
||||||
// The language is always displayed when the delay is negative.
|
// The fadeout animation will start when the delay is positive.
|
||||||
if (localeChanged && mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) {
|
if (localeChanged && mConfigDelayBeforeFadeoutLanguageOnSpacebar > 0) {
|
||||||
sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard),
|
sendMessageDelayed(obtainMessage(MSG_FADEOUT_LANGUAGE_ON_SPACEBAR, keyboard),
|
||||||
mConfigDelayBeforeFadeoutLanguageOnSpacebar);
|
mConfigDelayBeforeFadeoutLanguageOnSpacebar);
|
||||||
|
@ -548,7 +567,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
final KeyboardSwitcher switcher = mKeyboardSwitcher;
|
final KeyboardSwitcher switcher = mKeyboardSwitcher;
|
||||||
LatinKeyboardView inputView = switcher.getInputView();
|
LatinKeyboardView inputView = switcher.getInputView();
|
||||||
|
|
||||||
if(DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onStartInputView: " + inputView);
|
Log.d(TAG, "onStartInputView: " + inputView);
|
||||||
}
|
}
|
||||||
// In landscape mode, this method gets called without the input view being created.
|
// In landscape mode, this method gets called without the input view being created.
|
||||||
|
@ -754,7 +773,12 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
mComposing.setLength(0);
|
mComposing.setLength(0);
|
||||||
mHasValidSuggestions = false;
|
mHasValidSuggestions = false;
|
||||||
|
if (isCursorTouchingWord()) {
|
||||||
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
mHandler.postUpdateSuggestions();
|
mHandler.postUpdateSuggestions();
|
||||||
|
} else {
|
||||||
|
setPunctuationSuggestions();
|
||||||
|
}
|
||||||
TextEntryState.reset();
|
TextEntryState.reset();
|
||||||
InputConnection ic = getCurrentInputConnection();
|
InputConnection ic = getCurrentInputConnection();
|
||||||
if (ic != null) {
|
if (ic != null) {
|
||||||
|
@ -784,14 +808,20 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
|| TextEntryState.isRecorrecting())
|
|| TextEntryState.isRecorrecting())
|
||||||
&& (newSelStart < newSelEnd - 1 || !mHasValidSuggestions)) {
|
&& (newSelStart < newSelEnd - 1 || !mHasValidSuggestions)) {
|
||||||
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
|
if (isCursorTouchingWord() || mLastSelectionStart < mLastSelectionEnd) {
|
||||||
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
mHandler.postUpdateOldSuggestions();
|
mHandler.postUpdateOldSuggestions();
|
||||||
} else {
|
} else {
|
||||||
abortRecorrection(false);
|
abortRecorrection(false);
|
||||||
// Show the punctuation suggestions list if the current one is not
|
// If showing the "touch again to save" hint, do not replace it. Else,
|
||||||
// and if not showing "Touch again to save".
|
// show the bigrams if we are at the end of the text, punctuation otherwise.
|
||||||
if (mCandidateView != null && !isShowingPunctuationList()
|
if (mCandidateView != null
|
||||||
&& !mCandidateView.isShowingAddToDictionaryHint()) {
|
&& !mCandidateView.isShowingAddToDictionaryHint()) {
|
||||||
setPunctuationSuggestions();
|
InputConnection ic = getCurrentInputConnection();
|
||||||
|
if (null == ic || !TextUtils.isEmpty(ic.getTextAfterCursor(1, 0))) {
|
||||||
|
if (!isShowingPunctuationList()) setPunctuationSuggestions();
|
||||||
|
} else {
|
||||||
|
mHandler.postUpdateBigramPredictions();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1159,16 +1189,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
case Keyboard.CODE_SETTINGS_LONGPRESS:
|
case Keyboard.CODE_SETTINGS_LONGPRESS:
|
||||||
onSettingsKeyLongPressed();
|
onSettingsKeyLongPressed();
|
||||||
break;
|
break;
|
||||||
case Keyboard.CODE_NEXT_LANGUAGE:
|
case LatinKeyboard.CODE_NEXT_LANGUAGE:
|
||||||
toggleLanguage(true);
|
toggleLanguage(true);
|
||||||
break;
|
break;
|
||||||
case Keyboard.CODE_PREV_LANGUAGE:
|
case LatinKeyboard.CODE_PREV_LANGUAGE:
|
||||||
toggleLanguage(false);
|
toggleLanguage(false);
|
||||||
break;
|
break;
|
||||||
case Keyboard.CODE_CAPSLOCK:
|
case Keyboard.CODE_CAPSLOCK:
|
||||||
switcher.toggleCapsLock();
|
switcher.toggleCapsLock();
|
||||||
break;
|
break;
|
||||||
case Keyboard.CODE_VOICE:
|
case Keyboard.CODE_SHORTCUT:
|
||||||
mSubtypeSwitcher.switchToShortcutIME();
|
mSubtypeSwitcher.switchToShortcutIME();
|
||||||
break;
|
break;
|
||||||
case Keyboard.CODE_TAB:
|
case Keyboard.CODE_TAB:
|
||||||
|
@ -1231,7 +1261,14 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
if (mComposing.length() == 0) {
|
if (mComposing.length() == 0) {
|
||||||
mHasValidSuggestions = false;
|
mHasValidSuggestions = false;
|
||||||
}
|
}
|
||||||
|
if (1 == length) {
|
||||||
|
// 1 == length means we are about to erase the last character of the word,
|
||||||
|
// so we can show bigrams.
|
||||||
|
mHandler.postUpdateBigramPredictions();
|
||||||
|
} else {
|
||||||
|
// length > 1, so we still have letters to deduce a suggestion from.
|
||||||
mHandler.postUpdateSuggestions();
|
mHandler.postUpdateSuggestions();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ic.deleteSurroundingText(1, 0);
|
ic.deleteSurroundingText(1, 0);
|
||||||
}
|
}
|
||||||
|
@ -1367,6 +1404,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
|
|
||||||
// Should dismiss the "Touch again to save" message when handling separator
|
// Should dismiss the "Touch again to save" message when handling separator
|
||||||
if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) {
|
if (mCandidateView != null && mCandidateView.dismissAddToDictionaryHint()) {
|
||||||
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
mHandler.postUpdateSuggestions();
|
mHandler.postUpdateSuggestions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1406,6 +1444,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
|
|
||||||
TextEntryState.typedCharacter((char) primaryCode, true, x, y);
|
TextEntryState.typedCharacter((char) primaryCode, true, x, y);
|
||||||
|
|
||||||
if (TextEntryState.isPunctuationAfterAccepted() && primaryCode != Keyboard.CODE_ENTER) {
|
if (TextEntryState.isPunctuationAfterAccepted() && primaryCode != Keyboard.CODE_ENTER) {
|
||||||
swapPunctuationAndSpace();
|
swapPunctuationAndSpace();
|
||||||
} else if (isSuggestionsRequested() && primaryCode == Keyboard.CODE_SPACE) {
|
} else if (isSuggestionsRequested() && primaryCode == Keyboard.CODE_SPACE) {
|
||||||
|
@ -1420,6 +1459,16 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
if (mCandidateView != null)
|
if (mCandidateView != null)
|
||||||
mCandidateView.onAutoCorrectionInverted(mBestWord);
|
mCandidateView.onAutoCorrectionInverted(mBestWord);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (Keyboard.CODE_SPACE == primaryCode) {
|
||||||
|
if (!isCursorTouchingWord()) {
|
||||||
|
mHandler.cancelUpdateSuggestions();
|
||||||
|
mHandler.cancelUpdateOldSuggestions();
|
||||||
|
mHandler.postUpdateBigramPredictions();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Set punctuation right away. onUpdateSelection will fire but tests whether it is
|
||||||
|
// already displayed or not, so it's okay.
|
||||||
setPunctuationSuggestions();
|
setPunctuationSuggestions();
|
||||||
}
|
}
|
||||||
mKeyboardSwitcher.updateShiftState();
|
mKeyboardSwitcher.updateShiftState();
|
||||||
|
@ -1654,6 +1703,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!mHasValidSuggestions) {
|
||||||
|
// If we are not composing a word, then it was a suggestion inferred from
|
||||||
|
// context - no user input. We should reset the word composer.
|
||||||
|
mWord.reset();
|
||||||
|
}
|
||||||
mJustAccepted = true;
|
mJustAccepted = true;
|
||||||
pickSuggestion(suggestion);
|
pickSuggestion(suggestion);
|
||||||
// Add the word to the auto dictionary if it's not a known word
|
// Add the word to the auto dictionary if it's not a known word
|
||||||
|
@ -1692,7 +1746,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
// TextEntryState.State.PICKED_SUGGESTION state.
|
// TextEntryState.State.PICKED_SUGGESTION state.
|
||||||
TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
|
TextEntryState.typedCharacter((char) Keyboard.CODE_SPACE, true,
|
||||||
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
|
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
|
||||||
setPunctuationSuggestions();
|
// From there on onUpdateSelection() will fire so suggestions will be updated
|
||||||
} else if (!showingAddToDictionaryHint) {
|
} else if (!showingAddToDictionaryHint) {
|
||||||
// If we're not showing the "Touch again to save", then show corrections again.
|
// If we're not showing the "Touch again to save", then show corrections again.
|
||||||
// In case the cursor position doesn't change, make sure we show the suggestions again.
|
// In case the cursor position doesn't change, make sure we show the suggestions again.
|
||||||
|
@ -1807,6 +1861,30 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final WordComposer sEmptyWordComposer = new WordComposer();
|
||||||
|
private void updateBigramPredictions() {
|
||||||
|
if (mSuggest == null || !isSuggestionsRequested())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!mBigramPredictionEnabled) {
|
||||||
|
setPunctuationSuggestions();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final CharSequence prevWord = EditingUtils.getThisWord(getCurrentInputConnection(),
|
||||||
|
mWordSeparators);
|
||||||
|
SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder(
|
||||||
|
mKeyboardSwitcher.getInputView(), sEmptyWordComposer, prevWord);
|
||||||
|
|
||||||
|
if (builder.size() > 0) {
|
||||||
|
// Explicitly supply an empty typed word (the no-second-arg version of
|
||||||
|
// showSuggestions will retrieve the word near the cursor, we don't want that here)
|
||||||
|
showSuggestions(builder.build(), "");
|
||||||
|
} else {
|
||||||
|
if (!isShowingPunctuationList()) setPunctuationSuggestions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setPunctuationSuggestions() {
|
private void setPunctuationSuggestions() {
|
||||||
setSuggestions(mSuggestPuncList);
|
setSuggestions(mSuggestPuncList);
|
||||||
setCandidatesViewShown(isCandidateStripVisible());
|
setCandidatesViewShown(isCandidateStripVisible());
|
||||||
|
@ -1907,6 +1985,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
ic.setComposingText(mComposing, 1);
|
ic.setComposingText(mComposing, 1);
|
||||||
TextEntryState.backspace();
|
TextEntryState.backspace();
|
||||||
}
|
}
|
||||||
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
mHandler.postUpdateSuggestions();
|
mHandler.postUpdateSuggestions();
|
||||||
} else {
|
} else {
|
||||||
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
|
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
|
||||||
|
@ -1982,7 +2061,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
public void onRelease(int primaryCode, boolean withSliding) {
|
public void onRelease(int primaryCode, boolean withSliding) {
|
||||||
KeyboardSwitcher switcher = mKeyboardSwitcher;
|
KeyboardSwitcher switcher = mKeyboardSwitcher;
|
||||||
// Reset any drag flags in the keyboard
|
// Reset any drag flags in the keyboard
|
||||||
switcher.keyReleased();
|
|
||||||
final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
|
final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
|
||||||
if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
|
if (distinctMultiTouch && primaryCode == Keyboard.CODE_SHIFT) {
|
||||||
switcher.onReleaseShift(withSliding);
|
switcher.onReleaseShift(withSliding);
|
||||||
|
@ -2132,6 +2210,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
|
|
||||||
mAutoCorrectEnabled = isAutoCorrectEnabled(prefs);
|
mAutoCorrectEnabled = isAutoCorrectEnabled(prefs);
|
||||||
mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(prefs);
|
mBigramSuggestionEnabled = mAutoCorrectEnabled && isBigramSuggestionEnabled(prefs);
|
||||||
|
mBigramPredictionEnabled = mBigramSuggestionEnabled && isBigramPredictionEnabled(prefs);
|
||||||
loadAndSetAutoCorrectionThreshold(prefs);
|
loadAndSetAutoCorrectionThreshold(prefs);
|
||||||
|
|
||||||
mVoiceProxy.loadSettings(attribute, prefs);
|
mVoiceProxy.loadSettings(attribute, prefs);
|
||||||
|
@ -2216,6 +2295,11 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
R.bool.config_default_bigram_suggestions));
|
R.bool.config_default_bigram_suggestions));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isBigramPredictionEnabled(SharedPreferences sp) {
|
||||||
|
return sp.getBoolean(Settings.PREF_BIGRAM_PREDICTIONS, mResources.getBoolean(
|
||||||
|
R.bool.config_default_bigram_prediction));
|
||||||
|
}
|
||||||
|
|
||||||
private void initSuggestPuncList() {
|
private void initSuggestPuncList() {
|
||||||
if (mSuggestPuncs != null || mSuggestPuncList != null)
|
if (mSuggestPuncs != null || mSuggestPuncList != null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -62,13 +62,18 @@ public class Settings extends PreferenceActivity
|
||||||
public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
|
public static final String PREF_SELECTED_LANGUAGES = "selected_languages";
|
||||||
public static final String PREF_SUBTYPES = "subtype_settings";
|
public static final String PREF_SUBTYPES = "subtype_settings";
|
||||||
|
|
||||||
public static final String PREF_PREDICTION_SETTINGS_KEY = "prediction_settings";
|
public static final String PREF_CORRECTION_SETTINGS_KEY = "correction_settings";
|
||||||
public static final String PREF_QUICK_FIXES = "quick_fixes";
|
public static final String PREF_QUICK_FIXES = "quick_fixes";
|
||||||
public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting";
|
public static final String PREF_SHOW_SUGGESTIONS_SETTING = "show_suggestions_setting";
|
||||||
public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
|
public static final String PREF_AUTO_CORRECTION_THRESHOLD = "auto_correction_threshold";
|
||||||
public static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion";
|
|
||||||
public static final String PREF_DEBUG_SETTINGS = "debug_settings";
|
public static final String PREF_DEBUG_SETTINGS = "debug_settings";
|
||||||
|
|
||||||
|
public static final String PREF_NGRAM_SETTINGS_KEY = "ngram_settings";
|
||||||
|
public static final String PREF_BIGRAM_SUGGESTIONS = "bigram_suggestion";
|
||||||
|
public static final String PREF_BIGRAM_PREDICTIONS = "bigram_prediction";
|
||||||
|
|
||||||
|
public static final String PREF_MISC_SETTINGS_KEY = "misc_settings";
|
||||||
|
|
||||||
public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode";
|
public static final String PREF_USABILITY_STUDY_MODE = "usability_study_mode";
|
||||||
|
|
||||||
// Dialog ids
|
// Dialog ids
|
||||||
|
@ -80,7 +85,10 @@ public class Settings extends PreferenceActivity
|
||||||
private ListPreference mSettingsKeyPreference;
|
private ListPreference mSettingsKeyPreference;
|
||||||
private ListPreference mShowCorrectionSuggestionsPreference;
|
private ListPreference mShowCorrectionSuggestionsPreference;
|
||||||
private ListPreference mAutoCorrectionThreshold;
|
private ListPreference mAutoCorrectionThreshold;
|
||||||
|
// Suggestion: use bigrams to adjust scores of suggestions obtained from unigram dictionary
|
||||||
private CheckBoxPreference mBigramSuggestion;
|
private CheckBoxPreference mBigramSuggestion;
|
||||||
|
// Prediction: use bigrams to predict the next word when there is no input for it yet
|
||||||
|
private CheckBoxPreference mBigramPrediction;
|
||||||
private Preference mDebugSettingsPreference;
|
private Preference mDebugSettingsPreference;
|
||||||
private boolean mVoiceOn;
|
private boolean mVoiceOn;
|
||||||
|
|
||||||
|
@ -96,6 +104,7 @@ public class Settings extends PreferenceActivity
|
||||||
R.string.auto_correction_threshold_mode_index_off);
|
R.string.auto_correction_threshold_mode_index_off);
|
||||||
final String currentSetting = mAutoCorrectionThreshold.getValue();
|
final String currentSetting = mAutoCorrectionThreshold.getValue();
|
||||||
mBigramSuggestion.setEnabled(!currentSetting.equals(autoCorrectionOff));
|
mBigramSuggestion.setEnabled(!currentSetting.equals(autoCorrectionOff));
|
||||||
|
mBigramPrediction.setEnabled(!currentSetting.equals(autoCorrectionOff));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -119,6 +128,7 @@ public class Settings extends PreferenceActivity
|
||||||
|
|
||||||
mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
|
mAutoCorrectionThreshold = (ListPreference) findPreference(PREF_AUTO_CORRECTION_THRESHOLD);
|
||||||
mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS);
|
mBigramSuggestion = (CheckBoxPreference) findPreference(PREF_BIGRAM_SUGGESTIONS);
|
||||||
|
mBigramPrediction = (CheckBoxPreference) findPreference(PREF_BIGRAM_PREDICTIONS);
|
||||||
mDebugSettingsPreference = findPreference(PREF_DEBUG_SETTINGS);
|
mDebugSettingsPreference = findPreference(PREF_DEBUG_SETTINGS);
|
||||||
if (mDebugSettingsPreference != null) {
|
if (mDebugSettingsPreference != null) {
|
||||||
final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN);
|
final Intent debugSettingsIntent = new Intent(Intent.ACTION_MAIN);
|
||||||
|
@ -131,7 +141,9 @@ public class Settings extends PreferenceActivity
|
||||||
final PreferenceGroup generalSettings =
|
final PreferenceGroup generalSettings =
|
||||||
(PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY);
|
(PreferenceGroup) findPreference(PREF_GENERAL_SETTINGS_KEY);
|
||||||
final PreferenceGroup textCorrectionGroup =
|
final PreferenceGroup textCorrectionGroup =
|
||||||
(PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY);
|
(PreferenceGroup) findPreference(PREF_CORRECTION_SETTINGS_KEY);
|
||||||
|
final PreferenceGroup bigramGroup =
|
||||||
|
(PreferenceGroup) findPreference(PREF_NGRAM_SETTINGS_KEY);
|
||||||
|
|
||||||
final boolean showSettingsKeyOption = getResources().getBoolean(
|
final boolean showSettingsKeyOption = getResources().getBoolean(
|
||||||
R.bool.config_enable_show_settings_key_option);
|
R.bool.config_enable_show_settings_key_option);
|
||||||
|
@ -178,6 +190,7 @@ public class Settings extends PreferenceActivity
|
||||||
R.bool.config_enable_bigram_suggestions_option);
|
R.bool.config_enable_bigram_suggestions_option);
|
||||||
if (!showBigramSuggestionsOption) {
|
if (!showBigramSuggestionsOption) {
|
||||||
textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS));
|
textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_SUGGESTIONS));
|
||||||
|
textCorrectionGroup.removePreference(findPreference(PREF_BIGRAM_PREDICTIONS));
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean showUsabilityModeStudyOption = getResources().getBoolean(
|
final boolean showUsabilityModeStudyOption = getResources().getBoolean(
|
||||||
|
@ -192,7 +205,7 @@ public class Settings extends PreferenceActivity
|
||||||
super.onResume();
|
super.onResume();
|
||||||
int autoTextSize = AutoText.getSize(getListView());
|
int autoTextSize = AutoText.getSize(getListView());
|
||||||
if (autoTextSize < 1) {
|
if (autoTextSize < 1) {
|
||||||
((PreferenceGroup) findPreference(PREF_PREDICTION_SETTINGS_KEY))
|
((PreferenceGroup) findPreference(PREF_CORRECTION_SETTINGS_KEY))
|
||||||
.removePreference(mQuickFixes);
|
.removePreference(mQuickFixes);
|
||||||
}
|
}
|
||||||
if (!VoiceProxy.VOICE_INSTALLED
|
if (!VoiceProxy.VOICE_INSTALLED
|
||||||
|
|
|
@ -52,6 +52,8 @@ public class SubtypeSwitcher {
|
||||||
private static final String VOICE_MODE = "voice";
|
private static final String VOICE_MODE = "voice";
|
||||||
private static final String SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY =
|
private static final String SUBTYPE_EXTRAVALUE_REQUIRE_NETWORK_CONNECTIVITY =
|
||||||
"requireNetworkConnectivity";
|
"requireNetworkConnectivity";
|
||||||
|
public static final String USE_SPACEBAR_LANGUAGE_SWITCH_KEY = "use_spacebar_language_switch";
|
||||||
|
|
||||||
private final TextUtils.SimpleStringSplitter mLocaleSplitter =
|
private final TextUtils.SimpleStringSplitter mLocaleSplitter =
|
||||||
new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER);
|
new TextUtils.SimpleStringSplitter(LOCALE_SEPARATER);
|
||||||
|
|
||||||
|
@ -61,6 +63,7 @@ public class SubtypeSwitcher {
|
||||||
private /* final */ Resources mResources;
|
private /* final */ Resources mResources;
|
||||||
private /* final */ ConnectivityManager mConnectivityManager;
|
private /* final */ ConnectivityManager mConnectivityManager;
|
||||||
private /* final */ boolean mConfigUseSpacebarLanguageSwitcher;
|
private /* final */ boolean mConfigUseSpacebarLanguageSwitcher;
|
||||||
|
private /* final */ SharedPreferences mPrefs;
|
||||||
private final ArrayList<InputMethodSubtypeCompatWrapper>
|
private final ArrayList<InputMethodSubtypeCompatWrapper>
|
||||||
mEnabledKeyboardSubtypesOfCurrentInputMethod =
|
mEnabledKeyboardSubtypesOfCurrentInputMethod =
|
||||||
new ArrayList<InputMethodSubtypeCompatWrapper>();
|
new ArrayList<InputMethodSubtypeCompatWrapper>();
|
||||||
|
@ -112,10 +115,8 @@ public class SubtypeSwitcher {
|
||||||
mInputLocaleStr = null;
|
mInputLocaleStr = null;
|
||||||
mCurrentSubtype = null;
|
mCurrentSubtype = null;
|
||||||
mAllEnabledSubtypesOfCurrentInputMethod = null;
|
mAllEnabledSubtypesOfCurrentInputMethod = null;
|
||||||
// TODO: Voice input should be created here
|
|
||||||
mVoiceInputWrapper = null;
|
mVoiceInputWrapper = null;
|
||||||
mConfigUseSpacebarLanguageSwitcher = service.getResources().getBoolean(
|
mPrefs = prefs;
|
||||||
R.bool.config_use_spacebar_language_switcher);
|
|
||||||
|
|
||||||
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
|
final NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
|
||||||
mIsNetworkConnected = (info != null && info.isConnected());
|
mIsNetworkConnected = (info != null && info.isConnected());
|
||||||
|
@ -133,6 +134,9 @@ 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() {
|
||||||
|
mConfigUseSpacebarLanguageSwitcher = mPrefs.getBoolean(USE_SPACEBAR_LANGUAGE_SWITCH_KEY,
|
||||||
|
mService.getResources().getBoolean(
|
||||||
|
R.bool.config_use_spacebar_language_switcher));
|
||||||
updateEnabledSubtypes();
|
updateEnabledSubtypes();
|
||||||
updateShortcutIME();
|
updateShortcutIME();
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,6 +265,16 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
return sb;
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void addBigramToSuggestions(CharSequence bigram) {
|
||||||
|
final int poolSize = mStringPool.size();
|
||||||
|
final StringBuilder sb = poolSize > 0 ?
|
||||||
|
(StringBuilder) mStringPool.remove(poolSize - 1)
|
||||||
|
: new StringBuilder(getApproxMaxWordLength());
|
||||||
|
sb.setLength(0);
|
||||||
|
sb.append(bigram);
|
||||||
|
mSuggestions.add(sb);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
|
// TODO: cleanup dictionaries looking up and suggestions building with SuggestedWords.Builder
|
||||||
public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
|
public SuggestedWords.Builder getSuggestedWordBuilder(View view, WordComposer wordComposer,
|
||||||
CharSequence prevWordForBigram) {
|
CharSequence prevWordForBigram) {
|
||||||
|
@ -286,7 +296,7 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
}
|
}
|
||||||
mTypedWord = typedWord;
|
mTypedWord = typedWord;
|
||||||
|
|
||||||
if (wordComposer.size() == 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM
|
if (wordComposer.size() <= 1 && (mCorrectionMode == CORRECTION_FULL_BIGRAM
|
||||||
|| mCorrectionMode == CORRECTION_BASIC)) {
|
|| mCorrectionMode == CORRECTION_BASIC)) {
|
||||||
// At first character typed, search only the bigrams
|
// At first character typed, search only the bigrams
|
||||||
Arrays.fill(mBigramScores, 0);
|
Arrays.fill(mBigramScores, 0);
|
||||||
|
@ -300,21 +310,26 @@ public class Suggest implements Dictionary.WordCallback {
|
||||||
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
for (final Dictionary dictionary : mBigramDictionaries.values()) {
|
||||||
dictionary.getBigrams(wordComposer, prevWordForBigram, this);
|
dictionary.getBigrams(wordComposer, prevWordForBigram, this);
|
||||||
}
|
}
|
||||||
char currentChar = wordComposer.getTypedWord().charAt(0);
|
if (TextUtils.isEmpty(typedWord)) {
|
||||||
char currentCharUpper = Character.toUpperCase(currentChar);
|
// Nothing entered: return all bigrams for the previous word
|
||||||
|
int insertCount = Math.min(mBigramSuggestions.size(), mPrefMaxSuggestions);
|
||||||
|
for (int i = 0; i < insertCount; ++i) {
|
||||||
|
addBigramToSuggestions(mBigramSuggestions.get(i));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Word entered: return only bigrams that match the first char of the typed word
|
||||||
|
final char currentChar = typedWord.charAt(0);
|
||||||
|
final char currentCharUpper = Character.toUpperCase(currentChar);
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int bigramSuggestionSize = mBigramSuggestions.size();
|
final int bigramSuggestionSize = mBigramSuggestions.size();
|
||||||
for (int i = 0; i < bigramSuggestionSize; i++) {
|
for (int i = 0; i < bigramSuggestionSize; i++) {
|
||||||
if (mBigramSuggestions.get(i).charAt(0) == currentChar
|
final CharSequence bigramSuggestion = mBigramSuggestions.get(i);
|
||||||
|| mBigramSuggestions.get(i).charAt(0) == currentCharUpper) {
|
final char bigramSuggestionFirstChar = bigramSuggestion.charAt(0);
|
||||||
int poolSize = mStringPool.size();
|
if (bigramSuggestionFirstChar == currentChar
|
||||||
StringBuilder sb = poolSize > 0 ?
|
|| bigramSuggestionFirstChar == currentCharUpper) {
|
||||||
(StringBuilder) mStringPool.remove(poolSize - 1)
|
addBigramToSuggestions(bigramSuggestion);
|
||||||
: new StringBuilder(getApproxMaxWordLength());
|
if (++count > mPrefMaxSuggestions) break;
|
||||||
sb.setLength(0);
|
}
|
||||||
sb.append(mBigramSuggestions.get(i));
|
|
||||||
mSuggestions.add(count++, sb);
|
|
||||||
if (count > mPrefMaxSuggestions) break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,6 +162,10 @@ public class UserBigramDictionary extends ExpandableDictionary {
|
||||||
if (mIme != null && mIme.getCurrentWord().isAutoCapitalized()) {
|
if (mIme != null && mIme.getCurrentWord().isAutoCapitalized()) {
|
||||||
word2 = Character.toLowerCase(word2.charAt(0)) + word2.substring(1);
|
word2 = Character.toLowerCase(word2.charAt(0)) + word2.substring(1);
|
||||||
}
|
}
|
||||||
|
// Do not insert a word as a bigram of itself
|
||||||
|
if (word1.equals(word2)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int freq = super.addBigram(word1, word2, FREQUENCY_FOR_TYPED);
|
int freq = super.addBigram(word1, word2, FREQUENCY_FOR_TYPED);
|
||||||
if (freq > FREQUENCY_MAX) freq = FREQUENCY_MAX;
|
if (freq > FREQUENCY_MAX) freq = FREQUENCY_MAX;
|
||||||
|
|
67
tests/src/com/android/inputmethod/latin/UtilsTests.java
Normal file
67
tests/src/com/android/inputmethod/latin/UtilsTests.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010,2011 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||||
|
* use this file except in compliance with the License. You may obtain a copy of
|
||||||
|
* the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations under
|
||||||
|
* the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.inputmethod.latin;
|
||||||
|
|
||||||
|
import android.test.AndroidTestCase;
|
||||||
|
|
||||||
|
import com.android.inputmethod.latin.tests.R;
|
||||||
|
|
||||||
|
public class UtilsTests extends AndroidTestCase {
|
||||||
|
|
||||||
|
// The following is meant to be a reasonable default for
|
||||||
|
// the "word_separators" resource.
|
||||||
|
private static final String sSeparators = ".,:;!?-";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************** Tests ************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for getting previous word (for bigram suggestions)
|
||||||
|
*/
|
||||||
|
public void testGetPreviousWord() {
|
||||||
|
// If one of the following cases breaks, the bigram suggestions won't work.
|
||||||
|
assertEquals(EditingUtils.getPreviousWord("abc def", sSeparators), "abc");
|
||||||
|
assertNull(EditingUtils.getPreviousWord("abc", sSeparators));
|
||||||
|
assertNull(EditingUtils.getPreviousWord("abc. def", sSeparators));
|
||||||
|
|
||||||
|
// The following tests reflect the current behavior of the function
|
||||||
|
// EditingUtils#getPreviousWord.
|
||||||
|
// TODO: However at this time, the code does never go
|
||||||
|
// into such a path, so it should be safe to change the behavior of
|
||||||
|
// this function if needed - especially since it does not seem very
|
||||||
|
// logical. These tests are just there to catch any unintentional
|
||||||
|
// changes in the behavior of the EditingUtils#getPreviousWord method.
|
||||||
|
assertEquals(EditingUtils.getPreviousWord("abc def ", sSeparators), "abc");
|
||||||
|
assertEquals(EditingUtils.getPreviousWord("abc def.", sSeparators), "abc");
|
||||||
|
assertEquals(EditingUtils.getPreviousWord("abc def .", sSeparators), "def");
|
||||||
|
assertNull(EditingUtils.getPreviousWord("abc ", sSeparators));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for getting the word before the cursor (for bigram)
|
||||||
|
*/
|
||||||
|
public void testGetThisWord() {
|
||||||
|
assertEquals(EditingUtils.getThisWord("abc def", sSeparators), "def");
|
||||||
|
assertEquals(EditingUtils.getThisWord("abc def ", sSeparators), "def");
|
||||||
|
assertNull(EditingUtils.getThisWord("abc def.", sSeparators));
|
||||||
|
assertNull(EditingUtils.getThisWord("abc def .", sSeparators));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue