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

Commit 01d54002 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Refactor KeysCache to UniqueKeysCache

Change-Id: I8e3c4705c705a1c6e05e9112211d7012912d7e41
parent 9d5d01a5
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