KeyStylesSet.java revision 38d6a18821794dc733760b55fd2a896626f784e2
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 19e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaokaimport android.content.res.Resources; 200b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport android.content.res.TypedArray; 210b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport android.util.Log; 220b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 234e1dab8cfaad891fe041ed8d71893186c05cef71Tadashi G. Takaokaimport com.android.inputmethod.keyboard.Keyboard; 24c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaokaimport com.android.inputmethod.latin.R; 25e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaokaimport com.android.inputmethod.latin.Utils; 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 319b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaokaimport java.util.ArrayList; 320b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport java.util.HashMap; 330b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 340b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokapublic class KeyStyles { 35e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka private static final String TAG = KeyStyles.class.getSimpleName(); 369b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private static final boolean DEBUG = false; 370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private final HashMap<String, DeclaredKeyStyle> mStyles = 390b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka new HashMap<String, DeclaredKeyStyle>(); 400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle(); 410b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 420b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public interface KeyStyle { 4338d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String[] getStringArray(TypedArray a, int index); 4438d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String getString(TypedArray a, int index); 450b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue); 460b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue); 470b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 480b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 49bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka private static class EmptyKeyStyle implements KeyStyle { 504665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka EmptyKeyStyle() { 51e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka // Nothing to do. 520b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 530b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 545a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 5538d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String[] getStringArray(TypedArray a, int index) { 5638d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka return parseStringArray(a, index); 579b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 589b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 599b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka @Override 6038d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String getString(TypedArray a, int index) { 6138d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka return a.getString(index); 620b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 630b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 645a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 650b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue) { 660b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getInt(index, defaultValue); 670b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 680b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 695a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 700b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue) { 710b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getInt(index, defaultValue); 720b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 730b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 7438d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka protected static String[] parseStringArray(TypedArray a, int index) { 759b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (!a.hasValue(index)) 769b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return null; 7738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka return parseCsvString(a.getString(index), a.getResources(), R.string.english_ime_name); 789b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 79bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } 80bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka 81bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka /* package for test */ 8238d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka static String[] parseCsvString(String rawText, Resources res, int packageNameResId) { 83e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka final String text = Utils.resolveStringResource(rawText, res, packageNameResId); 84bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka final int size = text.length(); 85e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka if (size == 0) { 86e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka return null; 87e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 88e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka if (size == 1) { 89e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka return new String[] { text }; 90e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 91e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka 92bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka final StringBuilder sb = new StringBuilder(); 93bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka ArrayList<String> list = null; 94bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka int start = 0; 95bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka for (int pos = 0; pos < size; pos++) { 96bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka final char c = text.charAt(pos); 97bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka if (c == ',') { 98e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka if (list == null) { 99e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka list = new ArrayList<String>(); 100e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 101bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka if (sb.length() == 0) { 102bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka list.add(text.substring(start, pos)); 103bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } else { 104bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka list.add(sb.toString()); 105bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka sb.setLength(0); 1069b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 107bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka start = pos + 1; 108bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka continue; 109e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } else if (c == Utils.ESCAPE_CHAR) { 110bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka if (start == pos) { 111bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka // Skip escape character at the beginning of the value. 112bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka start++; 113bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka pos++; 114bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } else { 115e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka if (start < pos && sb.length() == 0) { 116bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka sb.append(text.subSequence(start, pos)); 117e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 118bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka pos++; 119e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka if (pos < size) { 120bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka sb.append(text.charAt(pos)); 121e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka } 122bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } 123bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } else if (sb.length() > 0) { 124bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka sb.append(c); 1259b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 126bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } 127bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka if (list == null) { 128e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka return new String[] { 129e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka sb.length() > 0 ? sb.toString() : text.substring(start) 130e54a4005d569cddbf8610dfd3e9afaec540fa060Tadashi G. Takaoka }; 131bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka } else { 132bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka list.add(sb.length() > 0 ? sb.toString() : text.substring(start)); 133bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka return list.toArray(new String[list.size()]); 1349b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1350b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1360b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 137bd7b160cfb05ee543e3cb6ddc7bd231b3f3aba0bTadashi G. Takaoka private static class DeclaredKeyStyle extends EmptyKeyStyle { 1380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>(); 1390b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 14138d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String[] getStringArray(TypedArray a, int index) { 1429b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return a.hasValue(index) 14338d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka ? super.getStringArray(a, index) : (String[])mAttributes.get(index); 1449b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1459b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 1469b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka @Override 14738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka public String getString(TypedArray a, int index) { 1480b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.hasValue(index) 14938d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka ? super.getString(a, index) : (String)mAttributes.get(index); 1500b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1510b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1520b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1539b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue) { 1540b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1559b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return super.getInt(a, index, (value != null) ? value : defaultValue); 1560b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1570b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1580b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1590b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue) { 1600b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1610b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return super.getFlag(a, index, defaultValue) | (value != null ? value : 0); 1620b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1630b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1644665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka DeclaredKeyStyle() { 1650b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka super(); 1660b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1670b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1684665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka void parseKeyStyleAttributes(TypedArray keyAttr) { 1690b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka // TODO: Currently not all Key attributes can be declared as style. 170c4f71668d7b8203dc66f0f04c089a363189eb4ceTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_code); 1712013bab89ca2f82589f99d98d9cf3b41ea5aac65Tadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_altCode); 17238d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka readString(keyAttr, R.styleable.Keyboard_Key_keyLabel); 17338d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka readString(keyAttr, R.styleable.Keyboard_Key_keyOutputText); 17438d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka readString(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); 17538d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka readStringArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); 17613d5f6605be6a6e8d9e5dde5b204dc050a862550Tadashi G. Takaoka readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelFlags); 177c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon); 17842fcb2de641c4cd5d57f34889c8752401e35dcc8Tadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled); 179c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview); 1809d5601e9013c5ec9a7ac75db16f4a0a8218b02bfTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn); 1817918ed016960908700582e47322e52d74c328cc7Tadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_backgroundType); 18213d5f6605be6a6e8d9e5dde5b204dc050a862550Tadashi G. Takaoka readFlag(keyAttr, R.styleable.Keyboard_Key_keyActionFlags); 1830b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1840b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 18538d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka private void readString(TypedArray a, int index) { 1860b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 18738d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka mAttributes.put(index, a.getString(index)); 1880b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1890b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1909b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private void readInt(TypedArray a, int index) { 1910b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1929b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka mAttributes.put(index, a.getInt(index, 0)); 1930b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1940b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1950b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private void readFlag(TypedArray a, int index) { 1960b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1970b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1980b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0)); 1990b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2000b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 20138d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka private void readStringArray(TypedArray a, int index) { 20238d6a18821794dc733760b55fd2a896626f784e2Tadashi G. Takaoka final String[] value = parseStringArray(a, index); 2039b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (value != null) 2049b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka mAttributes.put(index, value); 2050b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2060b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2074665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka void addParent(DeclaredKeyStyle parentStyle) { 2080b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.putAll(parentStyle.mAttributes); 2090b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2100b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2110b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2129b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs, 2134665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka XmlPullParser parser) throws XmlPullParserException { 21409430720d5eee7e2de405d600059bd39aa1d3e49Tadashi G. Takaoka final String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName); 2159b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />", 2164e1dab8cfaad891fe041ed8d71893186c05cef71Tadashi G. Takaoka Keyboard.Builder.TAG_KEY_STYLE, styleName)); 2170b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (mStyles.containsKey(styleName)) 2184665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka throw new XmlParseUtils.ParseException( 2194665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka "duplicate key style declared: " + styleName, parser); 2200b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2210b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final DeclaredKeyStyle style = new DeclaredKeyStyle(); 2229b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (keyStyleAttr.hasValue(R.styleable.Keyboard_KeyStyle_parentStyle)) { 22309430720d5eee7e2de405d600059bd39aa1d3e49Tadashi G. Takaoka final String parentStyle = keyStyleAttr.getString( 2245a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka R.styleable.Keyboard_KeyStyle_parentStyle); 2250b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final DeclaredKeyStyle parent = mStyles.get(parentStyle); 2260b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (parent == null) 2274665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka throw new XmlParseUtils.ParseException( 2284665463ccd4880c2392d26baa784c5d28de986ccTadashi G. Takaoka "Unknown parentStyle " + parentStyle, parser); 2290b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka style.addParent(parent); 2300b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2310b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka style.parseKeyStyleAttributes(keyAttrs); 2320b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mStyles.put(styleName, style); 2330b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2340b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2350b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public KeyStyle getKeyStyle(String styleName) { 2360b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return mStyles.get(styleName); 2370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2398fbf29e2d54027a17993cd0d4ad486e3454b56f6Tadashi G. Takaoka public static KeyStyle getEmptyKeyStyle() { 2400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return EMPTY_KEY_STYLE; 2410b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2420b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka} 243