KeyStylesSet.java revision ecfbf4625c8afd9cde7b79e0c7846b87e20f79e9
10b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka/*
28632bff2d5a8e1160989008dea6eff4b94b065ddTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project
30b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka *
40b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); you may not
50b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * use this file except in compliance with the License. You may obtain a copy of
60b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * the License at
70b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka *
80b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0
90b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka *
100b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
110b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
120b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
130b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * License for the specific language governing permissions and limitations under
140b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka * the License.
150b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka */
160b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal;
180b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
190b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport android.content.res.TypedArray;
200b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport android.util.Log;
2156853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaokaimport android.util.SparseArray;
220b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
234e1dab8cfaad891fe041ed8d71893186c05cef71Tadashi G. Takaokaimport com.android.inputmethod.keyboard.Keyboard;
245f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaokaimport com.android.inputmethod.latin.CollectionUtils;
25c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaokaimport com.android.inputmethod.latin.R;
264e1dab8cfaad891fe041ed8d71893186c05cef71Tadashi G. Takaokaimport com.android.inputmethod.latin.XmlParseUtils;
27c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka
28406a54f41c3e2bb90bedefb6ff80d7b874242f83Tadashi G. Takaokaimport org.xmlpull.v1.XmlPullParser;
294665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaokaimport org.xmlpull.v1.XmlPullParserException;
30406a54f41c3e2bb90bedefb6ff80d7b874242f83Tadashi G. Takaoka
310b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport java.util.HashMap;
320b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
330b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokapublic class KeyStyles {
34e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka    private static final String TAG = KeyStyles.class.getSimpleName();
359b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka    private static final boolean DEBUG = false;
360b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
375f282ea9e4a4590fcbab6e27d5fca7dacbb40a6aTadashi G. Takaoka    final HashMap<String, KeyStyle> mStyles = CollectionUtils.newHashMap();
380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
392f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    final KeyboardTextsSet mTextsSet;
402be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final KeyStyle mEmptyKeyStyle;
412f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    private static final String EMPTY_STYLE_NAME = "<empty>";
422be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
436bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka    public KeyStyles(KeyboardTextsSet textsSet) {
446bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka        mTextsSet = textsSet;
452f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        mEmptyKeyStyle = new EmptyKeyStyle();
462f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        mStyles.put(EMPTY_STYLE_NAME, mEmptyKeyStyle);
472be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
482be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
492f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    public abstract class KeyStyle {
502be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        public abstract String[] getStringArray(TypedArray a, int index);
512be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        public abstract String getString(TypedArray a, int index);
522be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        public abstract int getInt(TypedArray a, int index, int defaultValue);
532be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        public abstract int getFlag(TypedArray a, int index);
542be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
552be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        protected String parseString(TypedArray a, int index) {
562be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            if (a.hasValue(index)) {
576bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka                return KeySpecParser.resolveTextReference(a.getString(index), mTextsSet);
582be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            }
592be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return null;
602be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
612be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
622be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        protected String[] parseStringArray(TypedArray a, int index) {
632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            if (a.hasValue(index)) {
646bfd5f631908c4afd893c9b25b353e5e16c5fc0cTadashi G. Takaoka                return KeySpecParser.parseCsvString(a.getString(index), mTextsSet);
652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            }
662be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return null;
672be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
680b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka    }
690b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
702f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    class EmptyKeyStyle extends KeyStyle {
715a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka        @Override
7238d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        public String[] getStringArray(TypedArray a, int index) {
732be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return parseStringArray(a, index);
749b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        }
759b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka
769b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        @Override
7738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        public String getString(TypedArray a, int index) {
782be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return parseString(a, index);
790b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
800b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
815a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka        @Override
820b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        public int getInt(TypedArray a, int index, int defaultValue) {
830b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka            return a.getInt(index, defaultValue);
840b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
850b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
865a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka        @Override
8717f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        public int getFlag(TypedArray a, int index) {
8817f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            return a.getInt(index, 0);
899b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        }
900b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka    }
910b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
922f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    private class DeclaredKeyStyle extends KeyStyle {
932f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        private final String mParentStyleName;
94ecfbf4625c8afd9cde7b79e0c7846b87e20f79e9Tadashi G. Takaoka        private final SparseArray<Object> mStyleAttributes = CollectionUtils.newSparseArray();
950b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
962f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        public DeclaredKeyStyle(String parentStyleName) {
972f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            mParentStyleName = parentStyleName;
982be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
992be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
1000b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        @Override
10138d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        public String[] getStringArray(TypedArray a, int index) {
10217f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
10317f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka                return parseStringArray(a, index);
10417f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
10556853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            final Object value = mStyleAttributes.get(index);
10656853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            if (value != null) {
10756853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka                return (String[])value;
1082f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            }
1092f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
1102f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            return parentStyle.getStringArray(a, index);
1119b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        }
1129b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka
1139b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        @Override
11438d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        public String getString(TypedArray a, int index) {
11517f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
1162be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                return parseString(a, index);
11717f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
11856853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            final Object value = mStyleAttributes.get(index);
11956853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            if (value != null) {
12056853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka                return (String)value;
1212f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            }
1222f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
1232f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            return parentStyle.getString(a, index);
1240b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1250b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1260b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        @Override
1279b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        public int getInt(TypedArray a, int index, int defaultValue) {
12817f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
12917f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka                return a.getInt(index, defaultValue);
13017f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
13156853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            final Object value = mStyleAttributes.get(index);
13256853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            if (value != null) {
13356853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka                return (Integer)value;
1342f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            }
1352f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
1362f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            return parentStyle.getInt(a, index, defaultValue);
1370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1390b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        @Override
14017f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        public int getFlag(TypedArray a, int index) {
14156853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            int flags = a.getInt(index, 0);
14256853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            final Object value = mStyleAttributes.get(index);
14356853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            if (value != null) {
14456853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka                flags |= (Integer)value;
1452f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            }
1462f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            final KeyStyle parentStyle = mStyles.get(mParentStyleName);
14756853c1e48deb71367104060b49b7b1f0344a476Tadashi G. Takaoka            return flags | parentStyle.getFlag(a, index);
1480b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1490b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
15017f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        void readKeyAttributes(TypedArray keyAttr) {
1510b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka            // TODO: Currently not all Key attributes can be declared as style.
152ed3bac91f242850c6d1833a5f8981b9cc208c5ddTadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_code);
153ed3bac91f242850c6d1833a5f8981b9cc208c5ddTadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_altCode);
15438d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyLabel);
15538d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText);
15638d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel);
15738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka            readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys);
15815c99e9f1a7776b95325d36cf9e38b6d674e483bTadashi G. Takaoka            readStringArray(keyAttr, R.styleable.Keyboard_Key_additionalMoreKeys);
15913d5f6605be6a6e8d9e5dde5b204dc050a862550Tadashi G. Takaoka            readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags);
160cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyIcon);
161cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled);
162cf41aff251ecc94b729307ede05208a104fcd8b0Tadashi G. Takaoka            readString(keyAttr, R.styleable.Keyboard_Key_keyIconPreview);
1639d5601e9013c5ec9a7ac75db16f4a0a8218b02bfTadashi G. Takaoka            readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn);
1647918ed016960908700582e47322e52d74c328cc7Tadashi G. Takaoka            readInt(keyAttr, R.styleable.Keyboard_Key_backgroundType);
16513d5f6605be6a6e8d9e5dde5b204dc050a862550Tadashi G. Takaoka            readFlag(keyAttr, R.styleable.Keyboard_Key_keyActionFlags);
1660b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1670b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
16838d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        private void readString(TypedArray a, int index) {
16917f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
1702be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mStyleAttributes.put(index, parseString(a, index));
17117f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
1720b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1730b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1749b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        private void readInt(TypedArray a, int index) {
17517f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
17617f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka                mStyleAttributes.put(index, a.getInt(index, 0));
17717f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
1780b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1790b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1800b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        private void readFlag(TypedArray a, int index) {
18117f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            if (a.hasValue(index)) {
1822be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                final Integer value = (Integer)mStyleAttributes.get(index);
18317f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka                mStyleAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0));
18417f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
1850b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
1860b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
18738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka        private void readStringArray(TypedArray a, int index) {
1882be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            if (a.hasValue(index)) {
1892be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mStyleAttributes.put(index, parseStringArray(a, index));
19017f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
19117f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        }
19217f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka    }
1930b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
1949b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka    public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs,
1954665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka            XmlPullParser parser) throws XmlPullParserException {
19609430720d5eee7e2de405d600059bd39aa1d3e49Tadashi G. Takaoka        final String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName);
19717f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        if (DEBUG) {
19817f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            Log.d(TAG, String.format("<%s styleName=%s />",
19917f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka                    Keyboard.Builder.TAG_KEY_STYLE, styleName));
20005bfd189a88be79ddfc74d0ea21792e2fb78f2aaTadashi G. Takaoka            if (mStyles.containsKey(styleName)) {
20105bfd189a88be79ddfc74d0ea21792e2fb78f2aaTadashi G. Takaoka                Log.d(TAG, "key-style " + styleName + " is overridden at "
20205bfd189a88be79ddfc74d0ea21792e2fb78f2aaTadashi G. Takaoka                        + parser.getPositionDescription());
20305bfd189a88be79ddfc74d0ea21792e2fb78f2aaTadashi G. Takaoka            }
20417f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        }
2050b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
2062f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        String parentStyleName = EMPTY_STYLE_NAME;
2079b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka        if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) {
2082f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            parentStyleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_parentStyle);
2092f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            if (!mStyles.containsKey(parentStyleName)) {
2104665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka                throw new XmlParseUtils.ParseException(
2112f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka                        "Unknown parentStyle " + parentStyleName, parser);
21217f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka            }
2130b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        }
2142f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        final DeclaredKeyStyle style = new DeclaredKeyStyle(parentStyleName);
21517f53103ee0d0360d8f93f6bac41ef37a0021402Tadashi G. Takaoka        style.readKeyAttributes(keyAttrs);
2160b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        mStyles.put(styleName, style);
2170b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka    }
2180b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka
2192f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka    public KeyStyle getKeyStyle(TypedArray keyAttr, XmlPullParser parser)
2202f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            throws XmlParseUtils.ParseException {
2212f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        if (!keyAttr.hasValue(R.styleable.Keyboard_Key_keyStyle)) {
2222f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            return mEmptyKeyStyle;
2232f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        }
2242f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        final String styleName = keyAttr.getString(R.styleable.Keyboard_Key_keyStyle);
2252f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        if (!mStyles.containsKey(styleName)) {
2262f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka            throw new XmlParseUtils.ParseException("Unknown key style: " + styleName, parser);
2272f83e9e53244651dded489f91879f5150fb9c39dTadashi G. Takaoka        }
2280b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka        return mStyles.get(styleName);
2290b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka    }
2300b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka}
231