Loading java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +48 −3 Original line number Diff line number Diff line Loading @@ -29,17 +29,18 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.text.InputType; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; import android.util.Xml; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.EditorInfoCompatUtils; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardParams; import com.android.inputmethod.keyboard.internal.KeysCache; import com.android.inputmethod.latin.AdditionalSubtype; import com.android.inputmethod.latin.CollectionUtils; import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.InputTypeUtils; Loading Loading @@ -72,6 +73,8 @@ public final class KeyboardLayoutSet { private static final String TAG_ELEMENT = "Element"; private static final String KEYBOARD_LAYOUT_SET_RESOURCE_PREFIX = "keyboard_layout_set_"; private static final int SPELLCHECKER_DUMMY_KEYBOARD_WIDTH = 480; private static final int SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT = 800; private final Context mContext; private final Params mParams; Loading Loading @@ -282,8 +285,7 @@ public final class KeyboardLayoutSet { return this; } @UsedForTesting public void disableTouchPositionCorrectionDataForTest() { public void disableTouchPositionCorrectionData() { mParams.mDisableTouchPositionCorrectionDataForTest = true; } Loading Loading @@ -413,4 +415,47 @@ public final class KeyboardLayoutSet { } } } public static KeyboardLayoutSet createKeyboardSetForSpellChecker(final Context context, final String locale, final String layout) { final InputMethodSubtype subtype = AdditionalSubtype.createAdditionalSubtype(locale, layout, null); return createKeyboardSet(context, subtype, SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT, false); } public static KeyboardLayoutSet createKeyboardSetForTest(final Context context, final InputMethodSubtype subtype, final int orientation, final boolean testCasesHaveTouchCoordinates) { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); final int width; final int height; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { width = Math.max(dm.widthPixels, dm.heightPixels); height = Math.min(dm.widthPixels, dm.heightPixels); } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { width = Math.min(dm.widthPixels, dm.heightPixels); height = Math.max(dm.widthPixels, dm.heightPixels); } else { throw new RuntimeException("Orientation should be ORIENTATION_LANDSCAPE or " + "ORIENTATION_PORTRAIT: orientation=" + orientation); } return createKeyboardSet(context, subtype, width, height, testCasesHaveTouchCoordinates); } private static KeyboardLayoutSet createKeyboardSet(final Context context, final InputMethodSubtype subtype, final int width, final int height, final boolean testCasesHaveTouchCoordinates) { final EditorInfo editorInfo = new EditorInfo(); editorInfo.inputType = InputType.TYPE_CLASS_TEXT; final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( context, editorInfo); builder.setScreenGeometry(width, height); builder.setSubtype(subtype); if (!testCasesHaveTouchCoordinates) { // For spell checker and tests builder.disableTouchPositionCorrectionData(); } return builder.build(); } } java/src/com/android/inputmethod/keyboard/ProximityInfo.java +0 −17 Original line number Diff line number Diff line Loading @@ -79,23 +79,6 @@ public class ProximityInfo { mNativeProximityInfo = createNativeProximityInfo(touchPositionCorrection); } /** * Constructor for subclasses such as * {@link com.android.inputmethod.latin.spellcheck.SpellCheckerProximityInfo}. */ protected ProximityInfo(final int[] proximityCharsArray, final int gridWidth, final int gridHeight) { this("", 1, 1, 1, 1, 1, 1, EMPTY_KEY_ARRAY, null); mNativeProximityInfo = setProximityInfoNative("" /* locale */, gridWidth /* displayWidth */, gridHeight /* displayHeight */, gridWidth, gridHeight, 1 /* mostCommonKeyWidth */, 1 /* mostCommonKeyHeight */, proximityCharsArray, 0 /* keyCount */, null /*keyXCoordinates */, null /* keyYCoordinates */, null /* keyWidths */, null /* keyHeights */, null /* keyCharCodes */, null /* sweetSpotCenterXs */, null /* sweetSpotCenterYs */, null /* sweetSpotRadii */); } private long mNativeProximityInfo; static { JniUtils.loadNativeLibrary(); Loading java/src/com/android/inputmethod/latin/WordComposer.java +1 −3 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.inputmethod.latin; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; Loading Loading @@ -211,9 +210,8 @@ public final class WordComposer { } /** * Internal method to retrieve reasonable proximity info for a character. * Add a dummy key by retrieving reasonable coordinates */ @UsedForTesting public void addKeyInfo(final int codePoint, final Keyboard keyboard) { final int x, y; final Key key; Loading java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +21 −4 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ import android.service.textservice.SpellCheckerService; import android.util.Log; import android.view.textservice.SuggestionsInfo; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.keyboard.KeyboardLayoutSet; import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.CollectionUtils; import com.android.inputmethod.latin.ContactsBinaryDictionary; Loading Loading @@ -126,6 +126,19 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return script; } private static String getKeyboardLayoutNameForScript(final int script) { switch (script) { case AndroidSpellCheckerService.SCRIPT_LATIN: return "qwerty"; case AndroidSpellCheckerService.SCRIPT_CYRILLIC: return "east_slavic"; case AndroidSpellCheckerService.SCRIPT_GREEK: return "greek"; default: throw new RuntimeException("Wrong script supplied: " + script); } } @Override public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { if (!PREF_USE_CONTACTS_KEY.equals(key)) return; Loading Loading @@ -385,9 +398,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return pool; } public DictAndProximity createDictAndProximity(final Locale locale) { public DictAndKeyboard createDictAndKeyboard(final Locale locale) { final int script = getScriptFromLocale(locale); final ProximityInfo proximityInfo = new SpellCheckerProximityInfo(script); final String keyboardLayoutName = getKeyboardLayoutNameForScript(script); final KeyboardLayoutSet keyboardLayoutSet = KeyboardLayoutSet.createKeyboardSetForSpellChecker(this, locale.toString(), keyboardLayoutName); final DictionaryCollection dictionaryCollection = DictionaryFactory.createMainDictionaryFromManager(this, locale, true /* useFullEditDistance */); Loading @@ -412,6 +429,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService mDictionaryCollectionsList.add( new WeakReference<DictionaryCollection>(dictionaryCollection)); } return new DictAndProximity(dictionaryCollection, proximityInfo); return new DictAndKeyboard(dictionaryCollection, keyboardLayoutSet); } } java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +5 −12 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } if (shouldFilterOut(inText, mScript)) { DictAndProximity dictInfo = null; DictAndKeyboard dictInfo = null; try { dictInfo = mDictionaryPool.pollWithDefaultTimeout(); if (!DictionaryPool.isAValidDictionary(dictInfo)) { Loading Loading @@ -286,7 +286,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { final int capitalizeType = StringUtils.getCapitalizationType(text); boolean isInDict = true; DictAndProximity dictInfo = null; DictAndKeyboard dictInfo = null; try { dictInfo = mDictionaryPool.pollWithDefaultTimeout(); if (!DictionaryPool.isAValidDictionary(dictInfo)) { Loading @@ -296,20 +296,13 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { final int length = text.length(); for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { final int codePoint = text.codePointAt(i); // The getXYForCodePointAndScript method returns (Y << 16) + X final int xy = SpellCheckerProximityInfo.getXYForCodePointAndScript( codePoint, mScript); if (SpellCheckerProximityInfo.NOT_A_COORDINATE_PAIR == xy) { composer.add(codePoint, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); } else { composer.add(codePoint, xy & 0xFFFF, xy >> 16); } composer.addKeyInfo(codePoint, dictInfo.getKeyboard(codePoint)); } // TODO: make a spell checker option to block offensive words or not final ArrayList<SuggestedWordInfo> suggestions = dictInfo.mDictionary.getSuggestions(composer, prevWord, dictInfo.mProximityInfo, true /* blockOffensiveWords */); dictInfo.getProximityInfo(), true /* blockOffensiveWords */); for (final SuggestedWordInfo suggestion : suggestions) { final String suggestionStr = suggestion.mWord; suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0, Loading Loading
java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java +48 −3 Original line number Diff line number Diff line Loading @@ -29,17 +29,18 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.text.InputType; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; import android.util.Xml; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodSubtype; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.EditorInfoCompatUtils; import com.android.inputmethod.keyboard.internal.KeyboardBuilder; import com.android.inputmethod.keyboard.internal.KeyboardParams; import com.android.inputmethod.keyboard.internal.KeysCache; import com.android.inputmethod.latin.AdditionalSubtype; import com.android.inputmethod.latin.CollectionUtils; import com.android.inputmethod.latin.InputAttributes; import com.android.inputmethod.latin.InputTypeUtils; Loading Loading @@ -72,6 +73,8 @@ public final class KeyboardLayoutSet { private static final String TAG_ELEMENT = "Element"; private static final String KEYBOARD_LAYOUT_SET_RESOURCE_PREFIX = "keyboard_layout_set_"; private static final int SPELLCHECKER_DUMMY_KEYBOARD_WIDTH = 480; private static final int SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT = 800; private final Context mContext; private final Params mParams; Loading Loading @@ -282,8 +285,7 @@ public final class KeyboardLayoutSet { return this; } @UsedForTesting public void disableTouchPositionCorrectionDataForTest() { public void disableTouchPositionCorrectionData() { mParams.mDisableTouchPositionCorrectionDataForTest = true; } Loading Loading @@ -413,4 +415,47 @@ public final class KeyboardLayoutSet { } } } public static KeyboardLayoutSet createKeyboardSetForSpellChecker(final Context context, final String locale, final String layout) { final InputMethodSubtype subtype = AdditionalSubtype.createAdditionalSubtype(locale, layout, null); return createKeyboardSet(context, subtype, SPELLCHECKER_DUMMY_KEYBOARD_WIDTH, SPELLCHECKER_DUMMY_KEYBOARD_HEIGHT, false); } public static KeyboardLayoutSet createKeyboardSetForTest(final Context context, final InputMethodSubtype subtype, final int orientation, final boolean testCasesHaveTouchCoordinates) { final DisplayMetrics dm = context.getResources().getDisplayMetrics(); final int width; final int height; if (orientation == Configuration.ORIENTATION_LANDSCAPE) { width = Math.max(dm.widthPixels, dm.heightPixels); height = Math.min(dm.widthPixels, dm.heightPixels); } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { width = Math.min(dm.widthPixels, dm.heightPixels); height = Math.max(dm.widthPixels, dm.heightPixels); } else { throw new RuntimeException("Orientation should be ORIENTATION_LANDSCAPE or " + "ORIENTATION_PORTRAIT: orientation=" + orientation); } return createKeyboardSet(context, subtype, width, height, testCasesHaveTouchCoordinates); } private static KeyboardLayoutSet createKeyboardSet(final Context context, final InputMethodSubtype subtype, final int width, final int height, final boolean testCasesHaveTouchCoordinates) { final EditorInfo editorInfo = new EditorInfo(); editorInfo.inputType = InputType.TYPE_CLASS_TEXT; final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder( context, editorInfo); builder.setScreenGeometry(width, height); builder.setSubtype(subtype); if (!testCasesHaveTouchCoordinates) { // For spell checker and tests builder.disableTouchPositionCorrectionData(); } return builder.build(); } }
java/src/com/android/inputmethod/keyboard/ProximityInfo.java +0 −17 Original line number Diff line number Diff line Loading @@ -79,23 +79,6 @@ public class ProximityInfo { mNativeProximityInfo = createNativeProximityInfo(touchPositionCorrection); } /** * Constructor for subclasses such as * {@link com.android.inputmethod.latin.spellcheck.SpellCheckerProximityInfo}. */ protected ProximityInfo(final int[] proximityCharsArray, final int gridWidth, final int gridHeight) { this("", 1, 1, 1, 1, 1, 1, EMPTY_KEY_ARRAY, null); mNativeProximityInfo = setProximityInfoNative("" /* locale */, gridWidth /* displayWidth */, gridHeight /* displayHeight */, gridWidth, gridHeight, 1 /* mostCommonKeyWidth */, 1 /* mostCommonKeyHeight */, proximityCharsArray, 0 /* keyCount */, null /*keyXCoordinates */, null /* keyYCoordinates */, null /* keyWidths */, null /* keyHeights */, null /* keyCharCodes */, null /* sweetSpotCenterXs */, null /* sweetSpotCenterYs */, null /* sweetSpotRadii */); } private long mNativeProximityInfo; static { JniUtils.loadNativeLibrary(); Loading
java/src/com/android/inputmethod/latin/WordComposer.java +1 −3 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.inputmethod.latin; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Keyboard; Loading Loading @@ -211,9 +210,8 @@ public final class WordComposer { } /** * Internal method to retrieve reasonable proximity info for a character. * Add a dummy key by retrieving reasonable coordinates */ @UsedForTesting public void addKeyInfo(final int codePoint, final Keyboard keyboard) { final int x, y; final Key key; Loading
java/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerService.java +21 −4 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ import android.service.textservice.SpellCheckerService; import android.util.Log; import android.view.textservice.SuggestionsInfo; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.keyboard.KeyboardLayoutSet; import com.android.inputmethod.latin.BinaryDictionary; import com.android.inputmethod.latin.CollectionUtils; import com.android.inputmethod.latin.ContactsBinaryDictionary; Loading Loading @@ -126,6 +126,19 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return script; } private static String getKeyboardLayoutNameForScript(final int script) { switch (script) { case AndroidSpellCheckerService.SCRIPT_LATIN: return "qwerty"; case AndroidSpellCheckerService.SCRIPT_CYRILLIC: return "east_slavic"; case AndroidSpellCheckerService.SCRIPT_GREEK: return "greek"; default: throw new RuntimeException("Wrong script supplied: " + script); } } @Override public void onSharedPreferenceChanged(final SharedPreferences prefs, final String key) { if (!PREF_USE_CONTACTS_KEY.equals(key)) return; Loading Loading @@ -385,9 +398,13 @@ public final class AndroidSpellCheckerService extends SpellCheckerService return pool; } public DictAndProximity createDictAndProximity(final Locale locale) { public DictAndKeyboard createDictAndKeyboard(final Locale locale) { final int script = getScriptFromLocale(locale); final ProximityInfo proximityInfo = new SpellCheckerProximityInfo(script); final String keyboardLayoutName = getKeyboardLayoutNameForScript(script); final KeyboardLayoutSet keyboardLayoutSet = KeyboardLayoutSet.createKeyboardSetForSpellChecker(this, locale.toString(), keyboardLayoutName); final DictionaryCollection dictionaryCollection = DictionaryFactory.createMainDictionaryFromManager(this, locale, true /* useFullEditDistance */); Loading @@ -412,6 +429,6 @@ public final class AndroidSpellCheckerService extends SpellCheckerService mDictionaryCollectionsList.add( new WeakReference<DictionaryCollection>(dictionaryCollection)); } return new DictAndProximity(dictionaryCollection, proximityInfo); return new DictAndKeyboard(dictionaryCollection, keyboardLayoutSet); } }
java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java +5 −12 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { } if (shouldFilterOut(inText, mScript)) { DictAndProximity dictInfo = null; DictAndKeyboard dictInfo = null; try { dictInfo = mDictionaryPool.pollWithDefaultTimeout(); if (!DictionaryPool.isAValidDictionary(dictInfo)) { Loading Loading @@ -286,7 +286,7 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { final int capitalizeType = StringUtils.getCapitalizationType(text); boolean isInDict = true; DictAndProximity dictInfo = null; DictAndKeyboard dictInfo = null; try { dictInfo = mDictionaryPool.pollWithDefaultTimeout(); if (!DictionaryPool.isAValidDictionary(dictInfo)) { Loading @@ -296,20 +296,13 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session { final int length = text.length(); for (int i = 0; i < length; i = text.offsetByCodePoints(i, 1)) { final int codePoint = text.codePointAt(i); // The getXYForCodePointAndScript method returns (Y << 16) + X final int xy = SpellCheckerProximityInfo.getXYForCodePointAndScript( codePoint, mScript); if (SpellCheckerProximityInfo.NOT_A_COORDINATE_PAIR == xy) { composer.add(codePoint, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE); } else { composer.add(codePoint, xy & 0xFFFF, xy >> 16); } composer.addKeyInfo(codePoint, dictInfo.getKeyboard(codePoint)); } // TODO: make a spell checker option to block offensive words or not final ArrayList<SuggestedWordInfo> suggestions = dictInfo.mDictionary.getSuggestions(composer, prevWord, dictInfo.mProximityInfo, true /* blockOffensiveWords */); dictInfo.getProximityInfo(), true /* blockOffensiveWords */); for (final SuggestedWordInfo suggestion : suggestions) { final String suggestionStr = suggestion.mWord; suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0, Loading