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