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

Commit 3b89a257 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android Git Automerger
Browse files

am c8fb03e6: Merge "Save and restore Row attributes using stack"

* commit 'c8fb03e6':
  Save and restore Row attributes using stack
parents b0045c06 c8fb03e6
Loading
Loading
Loading
Loading
+6 −25
Original line number Diff line number Diff line
@@ -440,9 +440,6 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
                attr, R.styleable.Keyboard_Include);
        final TypedArray keyAttr = mResources.obtainAttributes(attr, R.styleable.Keyboard_Key);
        int keyboardLayout = 0;
        float savedDefaultKeyWidth = 0;
        int savedDefaultKeyLabelFlags = 0;
        int savedDefaultBackgroundType = Key.BACKGROUND_TYPE_NORMAL;
        try {
            XmlParseUtils.checkAttributeExists(
                    keyboardAttr, R.styleable.Keyboard_Include_keyboardLayout, "keyboardLayout",
@@ -450,24 +447,10 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
            keyboardLayout = keyboardAttr.getResourceId(
                    R.styleable.Keyboard_Include_keyboardLayout, 0);
            if (row != null) {
                if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyXPos)) {
                // Override current x coordinate.
                row.setXPos(row.getKeyX(keyAttr));
                }
                // TODO: Remove this if-clause and do the same as backgroundType below.
                savedDefaultKeyWidth = row.getDefaultKeyWidth();
                if (keyAttr.hasValue(R.styleable.Keyboard_Key_keyWidth)) {
                    // Override default key width.
                    row.setDefaultKeyWidth(row.getKeyWidth(keyAttr));
                }
                savedDefaultKeyLabelFlags = row.getDefaultKeyLabelFlags();
                // Bitwise-or default keyLabelFlag if exists.
                row.setDefaultKeyLabelFlags(keyAttr.getInt(
                        R.styleable.Keyboard_Key_keyLabelFlags, 0) | savedDefaultKeyLabelFlags);
                savedDefaultBackgroundType = row.getDefaultBackgroundType();
                // Override default backgroundType if exists.
                row.setDefaultBackgroundType(keyAttr.getInt(
                        R.styleable.Keyboard_Key_backgroundType, savedDefaultBackgroundType));
                // Push current Row attributes and update with new attributes.
                row.pushRowAttributes(keyAttr);
            }
        } finally {
            keyboardAttr.recycle();
@@ -484,10 +467,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> {
            parseMerge(parserForInclude, row, skip);
        } finally {
            if (row != null) {
                // Restore default keyWidth, keyLabelFlags, and backgroundType.
                row.setDefaultKeyWidth(savedDefaultKeyWidth);
                row.setDefaultKeyLabelFlags(savedDefaultKeyLabelFlags);
                row.setDefaultBackgroundType(savedDefaultBackgroundType);
                // Restore Row attributes.
                row.popRowAttributes();
            }
            parserForInclude.close();
        }
+66 −34
Original line number Diff line number Diff line
@@ -23,10 +23,13 @@ import android.util.Xml;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.ResourceUtils;

import org.xmlpull.v1.XmlPullParser;

import java.util.ArrayDeque;

/**
 * Container for keys in the keyboard. All keys in a row are at the same Y-coordinate.
 * Some of the key size defaults can be overridden per row from what the {@link Keyboard}
@@ -40,33 +43,68 @@ public final class KeyboardRow {
    private final KeyboardParams mParams;
    /** The height of this row. */
    private final int mRowHeight;

    private final ArrayDeque<RowAttributes> mRowAttributesStack = CollectionUtils.newArrayDeque();

    private static class RowAttributes {
        /** Default width of a key in this row. */
    private float mDefaultKeyWidth;
        public final float mDefaultKeyWidth;
        /** Default keyLabelFlags in this row. */
    private int mDefaultKeyLabelFlags;
        public final int mDefaultKeyLabelFlags;
        /** Default backgroundType for this row */
    private int mDefaultBackgroundType;
        public final int mDefaultBackgroundType;

        /**
         * Parse and create key attributes. This constructor is used to parse Row tag.
         *
         * @param keyAttr an attributes array of Row tag.
         * @param defaultKeyWidth a default key width.
         * @param keyboardWidth the keyboard width that is required to calculate keyWidth attribute.
         */
        public RowAttributes(final TypedArray keyAttr, final float defaultKeyWidth,
                final int keyboardWidth) {
            mDefaultKeyWidth = keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
                    keyboardWidth, keyboardWidth, defaultKeyWidth);
            mDefaultKeyLabelFlags = keyAttr.getInt(R.styleable.Keyboard_Key_keyLabelFlags, 0);
            mDefaultBackgroundType = keyAttr.getInt(R.styleable.Keyboard_Key_backgroundType,
                    Key.BACKGROUND_TYPE_NORMAL);
        }

        /**
         * Parse and update key attributes using default attributes. This constructor is used
         * to parse include tag.
         *
         * @param keyAttr an attributes array of include tag.
         * @param defaultRowAttr default Row attributes.
         * @param keyboardWidth the keyboard width that is required to calculate keyWidth attribute.
         */
        public RowAttributes(final TypedArray keyAttr, final RowAttributes defaultRowAttr,
                final int keyboardWidth) {
            mDefaultKeyWidth = keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
                    keyboardWidth, keyboardWidth, defaultRowAttr.mDefaultKeyWidth);
            mDefaultKeyLabelFlags = keyAttr.getInt(R.styleable.Keyboard_Key_keyLabelFlags, 0)
                    | defaultRowAttr.mDefaultKeyLabelFlags;
            mDefaultBackgroundType = keyAttr.getInt(R.styleable.Keyboard_Key_backgroundType,
                    defaultRowAttr.mDefaultBackgroundType);
        }
    }

    private final int mCurrentY;
    // Will be updated by {@link Key}'s constructor.
    private float mCurrentX;

    public KeyboardRow(final Resources res, final KeyboardParams params, final XmlPullParser parser,
            final int y) {
    public KeyboardRow(final Resources res, final KeyboardParams params,
            final XmlPullParser parser, final int y) {
        mParams = params;
        final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                R.styleable.Keyboard);
        mRowHeight = (int)ResourceUtils.getDimensionOrFraction(keyboardAttr,
                R.styleable.Keyboard_rowHeight,
                params.mBaseHeight, params.mDefaultRowHeight);
                R.styleable.Keyboard_rowHeight, params.mBaseHeight, params.mDefaultRowHeight);
        keyboardAttr.recycle();
        final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                R.styleable.Keyboard_Key);
        mDefaultKeyWidth = keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
                params.mBaseWidth, params.mBaseWidth, params.mDefaultKeyWidth);
        mDefaultKeyLabelFlags = keyAttr.getInt(R.styleable.Keyboard_Key_keyLabelFlags, 0);
        mDefaultBackgroundType = keyAttr.getInt(R.styleable.Keyboard_Key_backgroundType,
                Key.BACKGROUND_TYPE_NORMAL);
        mRowAttributesStack.push(new RowAttributes(
                keyAttr, params.mDefaultKeyWidth, params.mBaseWidth));
        keyAttr.recycle();

        mCurrentY = y;
@@ -77,28 +115,26 @@ public final class KeyboardRow {
        return mRowHeight;
    }

    public float getDefaultKeyWidth() {
        return mDefaultKeyWidth;
    public void pushRowAttributes(final TypedArray keyAttr) {
        final RowAttributes newAttributes = new RowAttributes(
                keyAttr, mRowAttributesStack.peek(), mParams.mBaseWidth);
        mRowAttributesStack.push(newAttributes);
    }

    public void setDefaultKeyWidth(final float defaultKeyWidth) {
        mDefaultKeyWidth = defaultKeyWidth;
    public void popRowAttributes() {
        mRowAttributesStack.pop();
    }

    public int getDefaultKeyLabelFlags() {
        return mDefaultKeyLabelFlags;
    public float getDefaultKeyWidth() {
        return mRowAttributesStack.peek().mDefaultKeyWidth;
    }

    public void setDefaultKeyLabelFlags(final int keyLabelFlags) {
        mDefaultKeyLabelFlags = keyLabelFlags;
    public int getDefaultKeyLabelFlags() {
        return mRowAttributesStack.peek().mDefaultKeyLabelFlags;
    }

    public int getDefaultBackgroundType() {
        return mDefaultBackgroundType;
    }

    public void setDefaultBackgroundType(final int backgroundType) {
        mDefaultBackgroundType = backgroundType;
        return mRowAttributesStack.peek().mDefaultBackgroundType;
    }

    public void setXPos(final float keyXPos) {
@@ -131,13 +167,9 @@ public final class KeyboardRow {
        return Math.max(keyXPos + keyboardRightEdge, mCurrentX);
    }

    public float getKeyWidth(final TypedArray keyAttr) {
        return getKeyWidth(keyAttr, mCurrentX);
    }

    public float getKeyWidth(final TypedArray keyAttr, final float keyXPos) {
        if (keyAttr == null) {
            return mDefaultKeyWidth;
            return getDefaultKeyWidth();
        }
        final int widthType = ResourceUtils.getEnumValue(keyAttr,
                R.styleable.Keyboard_Key_keyWidth, KEYWIDTH_NOT_ENUM);
@@ -149,7 +181,7 @@ public final class KeyboardRow {
            return keyboardRightEdge - keyXPos;
        default: // KEYWIDTH_NOT_ENUM
            return keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
                    mParams.mBaseWidth, mParams.mBaseWidth, mDefaultKeyWidth);
                    mParams.mBaseWidth, mParams.mBaseWidth, getDefaultKeyWidth());
        }
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.inputmethod.latin.utils;

import android.util.SparseArray;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -94,6 +95,10 @@ public final class CollectionUtils {
        return new CopyOnWriteArrayList<E>(array);
    }

    public static <E> ArrayDeque<E> newArrayDeque() {
        return new ArrayDeque<E>();
    }

    public static <E> SparseArray<E> newSparseArray() {
        return new SparseArray<E>();
    }