Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 244a24e3 authored by Satoshi Kataoka's avatar Satoshi Kataoka
Browse files

Consolidate dummy proximity info to the spell checker info

Bug: 8783170

Change-Id: I067486e5ec1ae7cdef8e2121392464ba71ee8add
parent 1eb1af75
Loading
Loading
Loading
Loading
+48 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -282,8 +285,7 @@ public final class KeyboardLayoutSet {
            return this;
        }

        @UsedForTesting
        public void disableTouchPositionCorrectionDataForTest() {
        public void disableTouchPositionCorrectionData() {
            mParams.mDisableTouchPositionCorrectionDataForTest = true;
        }

@@ -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();
    }
}
+0 −17
Original line number Diff line number Diff line
@@ -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();
+1 −3
Original line number Diff line number Diff line
@@ -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;

@@ -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;
+21 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 */);
@@ -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);
    }
}
+5 −12
Original line number Diff line number Diff line
@@ -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)) {
@@ -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)) {
@@ -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