diff --git a/java/src/org/futo/inputmethod/keyboard/Key.java b/java/src/org/futo/inputmethod/keyboard/Key.java index 70291b9b00a6a32e85f0eb802a835c332eed2117..bb84e5d81ffe6b4aceab7314e68ff9b7d54cf8dc 100644 --- a/java/src/org/futo/inputmethod/keyboard/Key.java +++ b/java/src/org/futo/inputmethod/keyboard/Key.java @@ -465,11 +465,18 @@ public class Key implements Comparable<Key> { @Nonnull public static Key removeRedundantMoreKeys(@Nonnull final Key key, - @Nonnull final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout) { + @Nonnull final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout, boolean onlyDuplicateKeys) { final MoreKeySpec[] moreKeys = key.getMoreKeys(); - final MoreKeySpec[] filteredMoreKeys = MoreKeySpec.removeRedundantMoreKeys( - moreKeys, lettersOnBaseLayout); - return (filteredMoreKeys == moreKeys) ? key : new Key(key, filteredMoreKeys); + + MoreKeySpec[] clearedMoreKeys = moreKeys; + + clearedMoreKeys = MoreKeySpec.removeDuplicateMoreKeys(moreKeys); + + if(!onlyDuplicateKeys) { + clearedMoreKeys = MoreKeySpec.removeRedundantMoreKeys( + moreKeys, lettersOnBaseLayout); + } + return (clearedMoreKeys == moreKeys) ? key : new Key(key, clearedMoreKeys); } private static boolean needsToUpcase(final int labelFlags, final int keyboardElementId) { diff --git a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java index 87de4c760ca4d4694cb9b8875d3c8a7ffc9363ce..093eef34b0f98a37bc829889bc60183554c022b1 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/KeyboardParams.java @@ -139,9 +139,6 @@ public class KeyboardParams { } public void removeRedundantMoreKeys() { - if (mAllowRedundantMoreKeys) { - return; - } final MoreKeySpec.LettersOnBaseLayout lettersOnBaseLayout = new MoreKeySpec.LettersOnBaseLayout(); for (final Key key : mSortedKeys) { @@ -150,7 +147,7 @@ public class KeyboardParams { final ArrayList<Key> allKeys = new ArrayList<>(mSortedKeys); mSortedKeys.clear(); for (final Key key : allKeys) { - final Key filteredKey = Key.removeRedundantMoreKeys(key, lettersOnBaseLayout); + final Key filteredKey = Key.removeRedundantMoreKeys(key, lettersOnBaseLayout, mAllowRedundantMoreKeys); mSortedKeys.add(mUniqueKeysCache.getUniqueKey(filteredKey)); } } diff --git a/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java b/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java index 0352e821c3e3e3f1227a23b3012a5891d29d9fab..7e2bfe67667f5b5574c75a36e8616de1410f0533 100644 --- a/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java +++ b/java/src/org/futo/inputmethod/keyboard/internal/MoreKeySpec.java @@ -169,6 +169,29 @@ public final class MoreKeySpec { return filteredMoreKeys.toArray(new MoreKeySpec[size]); } + + @Nullable + public static MoreKeySpec[] removeDuplicateMoreKeys(@Nullable final MoreKeySpec[] moreKeys) { + if (moreKeys == null) { + return null; + } + + final ArrayList<MoreKeySpec> filteredMoreKeys = new ArrayList<>(); + for (final MoreKeySpec moreKey : moreKeys) { + if (!filteredMoreKeys.contains(moreKey)) { + filteredMoreKeys.add(moreKey); + } + } + + final int size = filteredMoreKeys.size(); + if (size == moreKeys.length) { + return moreKeys; + } + + return filteredMoreKeys.toArray(new MoreKeySpec[size]); + } + + // Constants for parsing. private static final char COMMA = Constants.CODE_COMMA; private static final char BACKSLASH = Constants.CODE_BACKSLASH;