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

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

Merge "Save and restore Row attributes using stack"

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


import org.xmlpull.v1.XmlPullParser;
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.
 * 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}
 * 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;
    private final KeyboardParams mParams;
    /** The height of this row. */
    /** The height of this row. */
    private final int mRowHeight;
    private final int mRowHeight;

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

    private static class RowAttributes {
        /** Default width of a key in this row. */
        /** Default width of a key in this row. */
    private float mDefaultKeyWidth;
        public final float mDefaultKeyWidth;
        /** Default keyLabelFlags in this row. */
        /** Default keyLabelFlags in this row. */
    private int mDefaultKeyLabelFlags;
        public final int mDefaultKeyLabelFlags;
        /** Default backgroundType for this row */
        /** 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;
    private final int mCurrentY;
    // Will be updated by {@link Key}'s constructor.
    // Will be updated by {@link Key}'s constructor.
    private float mCurrentX;
    private float mCurrentX;


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


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


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


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


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


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


    public int getDefaultBackgroundType() {
    public int getDefaultBackgroundType() {
        return mDefaultBackgroundType;
        return mRowAttributesStack.peek().mDefaultBackgroundType;
    }

    public void setDefaultBackgroundType(final int backgroundType) {
        mDefaultBackgroundType = backgroundType;
    }
    }


    public void setXPos(final float keyXPos) {
    public void setXPos(final float keyXPos) {
@@ -131,13 +167,9 @@ public final class KeyboardRow {
        return Math.max(keyXPos + keyboardRightEdge, mCurrentX);
        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) {
    public float getKeyWidth(final TypedArray keyAttr, final float keyXPos) {
        if (keyAttr == null) {
        if (keyAttr == null) {
            return mDefaultKeyWidth;
            return getDefaultKeyWidth();
        }
        }
        final int widthType = ResourceUtils.getEnumValue(keyAttr,
        final int widthType = ResourceUtils.getEnumValue(keyAttr,
                R.styleable.Keyboard_Key_keyWidth, KEYWIDTH_NOT_ENUM);
                R.styleable.Keyboard_Key_keyWidth, KEYWIDTH_NOT_ENUM);
@@ -149,7 +181,7 @@ public final class KeyboardRow {
            return keyboardRightEdge - keyXPos;
            return keyboardRightEdge - keyXPos;
        default: // KEYWIDTH_NOT_ENUM
        default: // KEYWIDTH_NOT_ENUM
            return keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
            return keyAttr.getFraction(R.styleable.Keyboard_Key_keyWidth,
                    mParams.mBaseWidth, mParams.mBaseWidth, mDefaultKeyWidth);
                    mParams.mBaseWidth, mParams.mBaseWidth, getDefaultKeyWidth());
        }
        }
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.inputmethod.latin.utils;


import android.util.SparseArray;
import android.util.SparseArray;


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


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

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