KeyStylesSet.java revision 406a54f41c3e2bb90bedefb6ff80d7b874242f83
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; 210b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 221be29abab2e112f0253a8a5da3478740bb866d27Tadashi G. Takaokaimport com.android.inputmethod.keyboard.internal.KeyboardBuilder.ParseException; 23c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaokaimport com.android.inputmethod.latin.R; 24c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka 25406a54f41c3e2bb90bedefb6ff80d7b874242f83Tadashi G. Takaokaimport org.xmlpull.v1.XmlPullParser; 26406a54f41c3e2bb90bedefb6ff80d7b874242f83Tadashi G. Takaoka 279b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaokaimport java.util.ArrayList; 280b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokaimport java.util.HashMap; 290b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 300b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaokapublic class KeyStyles { 310b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private static final String TAG = "KeyStyles"; 329b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private static final boolean DEBUG = false; 330b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 340b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private final HashMap<String, DeclaredKeyStyle> mStyles = 350b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka new HashMap<String, DeclaredKeyStyle>(); 360b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private static final KeyStyle EMPTY_KEY_STYLE = new EmptyKeyStyle(); 370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public interface KeyStyle { 399b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public CharSequence[] getTextArray(TypedArray a, int index); 400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public CharSequence getText(TypedArray a, int index); 410b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue); 420b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue); 430b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public boolean getBoolean(TypedArray a, int index, boolean defaultValue); 440b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 450b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 469b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka /* package */ static class EmptyKeyStyle implements KeyStyle { 470b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private EmptyKeyStyle() { 48e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka // Nothing to do. 490b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 500b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 515a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 529b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public CharSequence[] getTextArray(TypedArray a, int index) { 539b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return parseTextArray(a, index); 549b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 559b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 569b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka @Override 570b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public CharSequence getText(TypedArray a, int index) { 580b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getText(index); 590b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 600b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 615a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 620b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue) { 630b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getInt(index, defaultValue); 640b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 650b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 665a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 670b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue) { 680b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getInt(index, defaultValue); 690b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 700b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 715a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka @Override 720b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public boolean getBoolean(TypedArray a, int index, boolean defaultValue) { 730b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.getBoolean(index, defaultValue); 740b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 750b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 769b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka protected static CharSequence[] parseTextArray(TypedArray a, int index) { 779b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (!a.hasValue(index)) 789b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return null; 799b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka final CharSequence text = a.getText(index); 809b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return parseCsvText(text); 819b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 829b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 839b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka /* package */ static CharSequence[] parseCsvText(CharSequence text) { 849b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka final int size = text.length(); 859b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (size == 0) return null; 869b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (size == 1) return new CharSequence[] { text }; 879b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka final StringBuilder sb = new StringBuilder(); 889b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka ArrayList<CharSequence> list = null; 899b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka int start = 0; 909b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka for (int pos = 0; pos < size; pos++) { 919b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka final char c = text.charAt(pos); 929b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (c == ',') { 939b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (list == null) list = new ArrayList<CharSequence>(); 949b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (sb.length() == 0) { 959b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka list.add(text.subSequence(start, pos)); 969b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } else { 979b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka list.add(sb.toString()); 989b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka sb.setLength(0); 999b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1009b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka start = pos + 1; 1019b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka continue; 1029b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } else if (c == '\\') { 1039b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (start == pos) { 1049b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka // Skip escape character at the beginning of the value. 1059b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka start++; 1069b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka pos++; 1079b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } else { 1089b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (start < pos && sb.length() == 0) 1099b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka sb.append(text.subSequence(start, pos)); 1109b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka pos++; 1119b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (pos < size) 1129b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka sb.append(text.charAt(pos)); 1139b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1149b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } else if (sb.length() > 0) { 1159b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka sb.append(c); 1169b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1179b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1189b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (list == null) { 1199b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return new CharSequence[] { sb.length() > 0 ? sb : text.subSequence(start, size) }; 1209b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } else { 1219b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka list.add(sb.length() > 0 ? sb : text.subSequence(start, size)); 1229b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return list.toArray(new CharSequence[list.size()]); 1239b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1249b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1250b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1260b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1279b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private static class DeclaredKeyStyle extends EmptyKeyStyle { 1280b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private final HashMap<Integer, Object> mAttributes = new HashMap<Integer, Object>(); 1290b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1300b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1319b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public CharSequence[] getTextArray(TypedArray a, int index) { 1329b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return a.hasValue(index) 1339b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka ? super.getTextArray(a, index) : (CharSequence[])mAttributes.get(index); 1349b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka } 1359b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka 1369b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka @Override 1370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public CharSequence getText(TypedArray a, int index) { 1380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return a.hasValue(index) 1390b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka ? super.getText(a, index) : (CharSequence)mAttributes.get(index); 1400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1410b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1420b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1439b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public int getInt(TypedArray a, int index, int defaultValue) { 1440b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1459b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka return super.getInt(a, index, (value != null) ? value : defaultValue); 1460b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1470b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1480b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1490b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public int getFlag(TypedArray a, int index, int defaultValue) { 1500b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1510b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return super.getFlag(a, index, defaultValue) | (value != null ? value : 0); 1520b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1530b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1540b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka @Override 1550b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public boolean getBoolean(TypedArray a, int index, boolean defaultValue) { 1560b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Boolean value = (Boolean)mAttributes.get(index); 1570b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return super.getBoolean(a, index, (value != null) ? value : defaultValue); 1580b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1590b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1600b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private DeclaredKeyStyle() { 1610b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka super(); 1620b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1630b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1649b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private void parseKeyStyleAttributes(TypedArray keyAttr) { 1650b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka // TODO: Currently not all Key attributes can be declared as style. 166c4f71668d7b8203dc66f0f04c089a363189eb4ceTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_code); 1679b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka readText(keyAttr, R.styleable.Keyboard_Key_keyLabel); 1689b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka readText(keyAttr, R.styleable.Keyboard_Key_keyOutputText); 169520a297ad1d148a57bcf6559a9802d5d49182d70Tadashi G. Takaoka readText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); 1709d5601e9013c5ec9a7ac75db16f4a0a8218b02bfTadashi G. Takaoka readTextArray(keyAttr, R.styleable.Keyboard_Key_moreKeys); 171c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readFlag(keyAttr, R.styleable.Keyboard_Key_keyLabelOption); 172c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIcon); 173c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview); 174c2a21786e526cc32e48a577a55b1b7e72ae1a6ddTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_keyIconShifted); 1759d5601e9013c5ec9a7ac75db16f4a0a8218b02bfTadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_maxMoreKeysColumn); 1767918ed016960908700582e47322e52d74c328cc7Tadashi G. Takaoka readInt(keyAttr, R.styleable.Keyboard_Key_backgroundType); 1779b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka readBoolean(keyAttr, R.styleable.Keyboard_Key_isRepeatable); 178fdb6a194b1255c4d9cd642586b98e1e55ff58249Tadashi G. Takaoka readBoolean(keyAttr, R.styleable.Keyboard_Key_enabled); 1790b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1800b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1810b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private void readText(TypedArray a, int index) { 1820b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1830b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.put(index, a.getText(index)); 1840b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1850b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1869b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private void readInt(TypedArray a, int index) { 1870b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1889b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka mAttributes.put(index, a.getInt(index, 0)); 1890b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1900b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1910b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private void readFlag(TypedArray a, int index) { 1920b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka final Integer value = (Integer)mAttributes.get(index); 1930b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1940b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.put(index, a.getInt(index, 0) | (value != null ? value : 0)); 1950b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 1960b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 1970b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private void readBoolean(TypedArray a, int index) { 1980b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (a.hasValue(index)) 1990b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.put(index, a.getBoolean(index, false)); 2000b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2010b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2029b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka private void readTextArray(TypedArray a, int index) { 2039b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka final CharSequence[] value = parseTextArray(a, index); 2049b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (value != null) 2059b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka mAttributes.put(index, value); 2060b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2070b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2080b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka private void addParent(DeclaredKeyStyle parentStyle) { 2090b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mAttributes.putAll(parentStyle.mAttributes); 2100b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2110b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2120b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2139b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka public void parseKeyStyleAttributes(TypedArray keyStyleAttr, TypedArray keyAttrs, 214406a54f41c3e2bb90bedefb6ff80d7b874242f83Tadashi G. Takaoka XmlPullParser parser) { 21509430720d5eee7e2de405d600059bd39aa1d3e49Tadashi G. Takaoka final String styleName = keyStyleAttr.getString(R.styleable.Keyboard_KeyStyle_styleName); 2169b6d1d52d91f8f18952ae3841f4bb0d7309bfc0eTadashi G. Takaoka if (DEBUG) Log.d(TAG, String.format("<%s styleName=%s />", 2171be29abab2e112f0253a8a5da3478740bb866d27Tadashi G. Takaoka KeyboardBuilder.TAG_KEY_STYLE, styleName)); 2180b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka if (mStyles.containsKey(styleName)) 2190b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka throw new ParseException("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) 22709430720d5eee7e2de405d600059bd39aa1d3e49Tadashi G. Takaoka throw new ParseException("Unknown parentStyle " + parentStyle, parser); 2280b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka style.addParent(parent); 2290b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2300b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka style.parseKeyStyleAttributes(keyAttrs); 2310b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka mStyles.put(styleName, style); 2320b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2330b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2340b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public KeyStyle getKeyStyle(String styleName) { 2350b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return mStyles.get(styleName); 2360b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2370b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka 2380b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka public KeyStyle getEmptyKeyStyle() { 2390b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka return EMPTY_KEY_STYLE; 2400b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka } 2410b60f831922b9341a7ef5d2eba87aa91580d371fTadashi G. Takaoka} 242