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

Commit 3dca77ec authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Refactor KeysCache to UniqueKeysCache"

parents 5ac8b040 01d54002
Loading
Loading
Loading
Loading
+5 −7
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ import com.android.inputmethod.compat.EditorInfoCompatUtils;
import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
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.keyboard.internal.UniqueKeysCache;
import com.android.inputmethod.latin.InputAttributes;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.RichInputMethodSubtype;
@@ -86,7 +86,7 @@ public final class KeyboardLayoutSet {
    private static final HashMap<KeyboardId, SoftReference<Keyboard>> sKeyboardCache =
            new HashMap<>();
    @Nonnull
    private static final KeysCache sKeysCache = new KeysCache();
    private static final UniqueKeysCache sUniqueKeysCache = UniqueKeysCache.newInstance();
    private final static HashMap<InputMethodSubtype, Integer> sScriptIdsForSubtypes =
            new HashMap<>();

@@ -144,7 +144,7 @@ public final class KeyboardLayoutSet {

    private static void clearKeyboardCache() {
        sKeyboardCache.clear();
        sKeysCache.clear();
        sUniqueKeysCache.clear();
    }

    public static int getScriptId(final Resources resources,
@@ -219,10 +219,8 @@ public final class KeyboardLayoutSet {
        }

        final KeyboardBuilder<KeyboardParams> builder =
                new KeyboardBuilder<>(mContext, new KeyboardParams());
        if (id.isAlphabetKeyboard()) {
            builder.setAutoGenerate(sKeysCache);
        }
                new KeyboardBuilder<>(mContext, new KeyboardParams(sUniqueKeysCache));
        sUniqueKeysCache.setEnabled(id.isAlphabetKeyboard());
        builder.setAllowRedundantMoreKes(elementParams.mAllowRedundantMoreKeys);
        final int keyboardXmlId = elementParams.mKeyboardXmlId;
        builder.load(keyboardXmlId, id);
+0 −4
Original line number Diff line number Diff line
@@ -161,10 +161,6 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
        params.GRID_HEIGHT = res.getInteger(R.integer.config_keyboard_grid_height);
    }

    public void setAutoGenerate(final KeysCache keysCache) {
        mParams.mKeysCache = keysCache;
    }

    public void setAllowRedundantMoreKes(final boolean enabled) {
        mParams.mAllowRedundantMoreKeys = enabled;
    }
+12 −12
Original line number Diff line number Diff line
@@ -77,9 +77,8 @@ public class KeyboardParams {
    @Nonnull
    public final KeyStylesSet mKeyStyles = new KeyStylesSet(mTextsSet);

    // TODO: Make this @Nonnull
    @Nullable
    public KeysCache mKeysCache;
    @Nonnull
    private final UniqueKeysCache mUniqueKeysCache;
    public boolean mAllowRedundantMoreKeys;

    public int mMostCommonKeyHeight = 0;
@@ -103,6 +102,14 @@ public class KeyboardParams {
        }
    };

    public KeyboardParams() {
        this(UniqueKeysCache.NO_CACHE);
    }

    public KeyboardParams(@Nonnull final UniqueKeysCache keysCache) {
        mUniqueKeysCache = keysCache;
    }

    protected void clearKeys() {
        mSortedKeys.clear();
        mShiftKeys.clear();
@@ -110,9 +117,7 @@ public class KeyboardParams {
    }

    public void onAddKey(@Nonnull final Key newKey) {
        // To avoid possible null pointer access.
        final KeysCache keysCache = mKeysCache;
        final Key key = (keysCache != null) ? keysCache.get(newKey) : newKey;
        final Key key = mUniqueKeysCache.getUniqueKey(newKey);
        final boolean isSpacer = key.isSpacer();
        if (isSpacer && key.getWidth() == 0) {
            // Ignore zero width {@link Spacer}.
@@ -140,16 +145,11 @@ public class KeyboardParams {
        for (final Key key : mSortedKeys) {
            lettersOnBaseLayout.addLetter(key);
        }
        // To avoid possible null pointer access.
        final KeysCache keysCache = mKeysCache;
        final ArrayList<Key> allKeys = new ArrayList<>(mSortedKeys);
        mSortedKeys.clear();
        for (final Key key : allKeys) {
            final Key filteredKey = Key.removeRedundantMoreKeys(key, lettersOnBaseLayout);
            if (keysCache != null) {
                keysCache.replace(key, filteredKey);
            }
            mSortedKeys.add(filteredKey);
            mSortedKeys.add(mUniqueKeysCache.getUniqueKey(filteredKey));
        }
    }

+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 * Copyright (C) 2014 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.
@@ -20,31 +20,62 @@ import com.android.inputmethod.keyboard.Key;

import java.util.HashMap;

// TODO: Rename more appropriate name.
public final class KeysCache {
    private final HashMap<Key, Key> mMap = new HashMap<>();
import javax.annotation.Nonnull;

public abstract class UniqueKeysCache {
    public abstract void setEnabled(boolean enabled);
    public abstract void clear();
    public abstract @Nonnull Key getUniqueKey(@Nonnull Key key);

    @Nonnull
    public static final UniqueKeysCache NO_CACHE = new UniqueKeysCache() {
        @Override
        public void setEnabled(boolean enabled) {}

        @Override
        public void clear() {}

        @Override
        public Key getUniqueKey(Key key) { return key; }
    };

    @Nonnull
    public static UniqueKeysCache newInstance() {
        return new UniqueKeysCacheImpl();
    }

    private static final class UniqueKeysCacheImpl extends UniqueKeysCache {
        private final HashMap<Key, Key> mCache;

        private boolean mEnabled;

        UniqueKeysCacheImpl() {
            mCache = new HashMap<>();
        }

        @Override
        public void setEnabled(final boolean enabled) {
            mEnabled = enabled;
        }

        @Override
        public void clear() {
        mMap.clear();
            mCache.clear();
        }

    // TODO: Rename more descriptive name.
    public Key get(final Key key) {
        final Key existingKey = mMap.get(key);
        @Override
        public Key getUniqueKey(final Key key) {
            if (!mEnabled) {
                return key;
            }
            final Key existingKey = mCache.get(key);
            if (existingKey != null) {
            // Reuse the existing element that equals to "key" without adding "key" to the map.
                // Reuse the existing object that equals to "key" without adding "key" to
                // the cache.
                return existingKey;
            }
        mMap.put(key, key);
            mCache.put(key, key);
            return key;
        }

    // TODO: Rename more descriptive name.
    public Key replace(final Key oldKey, final Key newKey) {
        if (oldKey.equals(newKey)) {
            return oldKey;
        }
        mMap.remove(oldKey);
        return get(newKey);
    }
}
+1 −19
Original line number Diff line number Diff line
@@ -120,31 +120,13 @@ abstract class LayoutTestsBase extends KeyboardLayoutSetTestsBase {

    // TODO: Add phone, phone symbols, number, number password layout tests.

    public final void testAlphabet() {
    public final void testLayouts() {
        doKeyboardTests(KeyboardId.ELEMENT_ALPHABET);
    }

    public final void testAlphabetAutomaticShifted() {
        doKeyboardTests(KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED);
    }

    public final void testAlphabetManualShifted() {
        doKeyboardTests(KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED);
    }

    public final void testAlphabetShiftLocked() {
        doKeyboardTests(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED);
    }

    public final void testAlphabetShiftLockShifted() {
        doKeyboardTests(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED);
    }

    public final void testSymbols() {
        doKeyboardTests(KeyboardId.ELEMENT_SYMBOLS);
    }

    public final void testSymbolsShifted() {
        doKeyboardTests(KeyboardId.ELEMENT_SYMBOLS_SHIFTED);
    }

Loading