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

Commit 071f4714 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Refactor BinaryDictionary a bit

This changes:
* Flag initialization code in BinaryDictionary to be more unit test friendly.
* Removing unnecessary class hierarchy of LatinIME inner class WordAlternatives.
* Formatting normalized score neatly.

Change-Id: I9f10c093d4f36258fe883cf3fb10cbbda2770497
parent 89ff5adc
Loading
Loading
Loading
Loading
+26 −22
Original line number Diff line number Diff line
@@ -58,24 +58,27 @@ public class BinaryDictionary extends Dictionary {
    private final int[] mBigramScores = new int[MAX_BIGRAMS];

    private final KeyboardSwitcher mKeyboardSwitcher = KeyboardSwitcher.getInstance();
    private final SubtypeSwitcher mSubtypeSwitcher = SubtypeSwitcher.getInstance();

    private static class Flags {
        private static class FlagEntry {
    public static class Flag {
        public final String mName;
        public final int mValue;
            public FlagEntry(String name, int value) {

        public Flag(String name, int value) {
            mName = name;
            mValue = value;
        }
    }
        public static final FlagEntry[] ALL_FLAGS = {

    public static final Flag FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING =
            new Flag("requiresGermanUmlautProcessing", 0x1);

    private static final Flag[] ALL_FLAGS = {
        // Here should reside all flags that trigger some special processing
        // These *must* match the definition in UnigramDictionary enum in
        // unigram_dictionary.h so please update both at the same time.
            new FlagEntry("requiresGermanUmlautProcessing", 0x1)
        FLAG_REQUIRES_GERMAN_UMLAUT_PROCESSING,
    };
    }

    private int mFlags = 0;

    private BinaryDictionary() {
@@ -110,12 +113,12 @@ public class BinaryDictionary extends Dictionary {
                return null;
            }
        }
        sInstance.initFlags();
        sInstance.mFlags = initFlags(ALL_FLAGS, SubtypeSwitcher.getInstance());
        return sInstance;
    }

    /* package for test */ static BinaryDictionary initDictionary(File dictionary, long startOffset,
            long length, int dicTypeId) {
            long length, int dicTypeId, Flag[] flagArray) {
        synchronized (sInstance) {
            sInstance.closeInternal();
            if (dictionary.isFile()) {
@@ -126,16 +129,17 @@ public class BinaryDictionary extends Dictionary {
                return null;
            }
        }
        sInstance.mFlags = initFlags(flagArray, null);
        return sInstance;
    }

    private void initFlags() {
    private static int initFlags(Flag[] flagArray, SubtypeSwitcher switcher) {
        int flags = 0;
        for (Flags.FlagEntry entry : Flags.ALL_FLAGS) {
            if (mSubtypeSwitcher.currentSubtypeContainsExtraValueKey(entry.mName))
        for (Flag entry : flagArray) {
            if (switcher == null || switcher.currentSubtypeContainsExtraValueKey(entry.mName))
                flags |= entry.mValue;
        }
        mFlags = flags;
        return flags;
    }

    static {
+16 −34
Original line number Diff line number Diff line
@@ -212,51 +212,35 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

    private final ArrayList<WordAlternatives> mWordHistory = new ArrayList<WordAlternatives>();

    public abstract static class WordAlternatives {
        protected CharSequence mChosenWord;
    public class WordAlternatives {
        private final CharSequence mChosenWord;
        private final WordComposer mWordComposer;

        public WordAlternatives() {
            // Nothing
        }

        public WordAlternatives(CharSequence chosenWord) {
        public WordAlternatives(CharSequence chosenWord, WordComposer wordComposer) {
            mChosenWord = chosenWord;
            mWordComposer = wordComposer;
        }

        @Override
        public int hashCode() {
            return mChosenWord.hashCode();
        }

        public abstract CharSequence getOriginalWord();

        public CharSequence getChosenWord() {
            return mChosenWord;
        }

        public abstract SuggestedWords.Builder getAlternatives();
    }

    public class TypedWordAlternatives extends WordAlternatives {
        private WordComposer word;

        public TypedWordAlternatives() {
            // Nothing
        public CharSequence getOriginalWord() {
            return mWordComposer.getTypedWord();
        }

        public TypedWordAlternatives(CharSequence chosenWord, WordComposer wordComposer) {
            super(chosenWord);
            word = wordComposer;
        public SuggestedWords.Builder getAlternatives() {
            return getTypedSuggestions(mWordComposer);
        }

        @Override
        public CharSequence getOriginalWord() {
            return word.getTypedWord();
        public int hashCode() {
            return mChosenWord.hashCode();
        }

        @Override
        public SuggestedWords.Builder getAlternatives() {
            return getTypedSuggestions(word);
        public boolean equals(Object o) {
            return o instanceof CharSequence && TextUtils.equals(mChosenWord, (CharSequence)o);
        }
    }

@@ -1436,7 +1420,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen

        // Make a copy of the CharSequence, since it is/could be a mutable CharSequence
        final String resultCopy = result.toString();
        TypedWordAlternatives entry = new TypedWordAlternatives(resultCopy,
        WordAlternatives entry = new WordAlternatives(resultCopy,
                new WordComposer(mWord));
        mWordHistory.add(entry);
    }
@@ -1727,9 +1711,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        // Search old suggestions to suggest re-corrected suggestions.
        for (WordAlternatives entry : mWordHistory) {
            if (TextUtils.equals(entry.getChosenWord(), touching.mWord)) {
                if (entry instanceof TypedWordAlternatives) {
                    foundWord = ((TypedWordAlternatives) entry).word;
                }
                foundWord = entry.mWordComposer;
                alternatives = entry;
                break;
            }
@@ -1749,7 +1731,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        // Found a match, show suggestions
        if (foundWord != null || alternatives != null) {
            if (alternatives == null) {
                alternatives = new TypedWordAlternatives(touching.mWord, foundWord);
                alternatives = new WordAlternatives(touching.mWord, foundWord);
            }
            showCorrections(alternatives);
            if (foundWord != null) {
+6 −4
Original line number Diff line number Diff line
@@ -110,8 +110,10 @@ public class Suggest implements Dictionary.WordCallback {
        init(context, BinaryDictionary.initDictionary(context, dictionaryResId, DIC_MAIN));
    }

    /* package for test */ Suggest(File dictionary, long startOffset, long length) {
        init(null, BinaryDictionary.initDictionary(dictionary, startOffset, length, DIC_MAIN));
    /* package for test */ Suggest(File dictionary, long startOffset, long length,
            BinaryDictionary.Flag[] flagArray) {
        init(null, BinaryDictionary.initDictionary(dictionary, startOffset, length, DIC_MAIN,
                flagArray));
    }

    private void init(Context context, BinaryDictionary mainDict) {
@@ -367,8 +369,8 @@ public class Suggest implements Dictionary.WordCallback {
            scoreInfoList.add(new SuggestedWords.SuggestedWordInfo("+", false));
            for (int i = 0; i < mScores.length; ++i) {
                if (normalizedScore > 0) {
                    final String scoreThreshold = Integer.toString(mScores[i]) + " (" +
                            normalizedScore + ")";
                    final String scoreThreshold = String.format("%d (%4.2f)", mScores[i],
                            normalizedScore);
                    scoreInfoList.add(
                            new SuggestedWords.SuggestedWordInfo(scoreThreshold, false));
                    normalizedScore = 0.0;
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ public class SuggestHelper {

    protected SuggestHelper(Context context, File dictionaryPath, long startOffset, long length,
            KeyboardId keyboardId) {
        mSuggest = new Suggest(dictionaryPath, startOffset, length);
        mSuggest = new Suggest(dictionaryPath, startOffset, length, null);
        mKeyboard = new LatinKeyboard(context, keyboardId);
        mKeyDetector = new ProximityKeyDetector();
        init();