17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/* 27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License. 67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at 77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and 147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License. 157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpackage com.android.inputmethod.pinyin; 187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport com.android.inputmethod.pinyin.SoftKeyboard.KeyRow; 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.Context; 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.res.Resources; 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.content.res.XmlResourceParser; 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.graphics.drawable.Drawable; 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.io.IOException; 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.regex.Pattern; 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/** 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class used to load a soft keyboard or a soft keyboard template from xml 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * files. 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class XmlKeyboardLoader { 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The tag used to define an xml-based soft keyboard template. 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_SKB_TEMPLATE = "skb_template"; 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The tag used to indicate the soft key type which is defined inside the 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_SKB_TEMPLATE} element in the xml file. file. 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_KEYTYPE = "key_type"; 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The tag used to define a default key icon for enter/delete/space keys. It 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * is defined inside the {@link #XMLTAG_SKB_TEMPLATE} element in the xml 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * file. 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_KEYICON = "key_icon"; 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the left and right margin for a key. A key's width 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * should be larger than double of this value. Defined inside 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYBOARD}. 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_XMARGIN = "key_xmargin"; 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the top and bottom margin for a key. A key's height 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * should be larger than double of this value. Defined inside 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYBOARD}. 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_YMARGIN = "key_ymargin"; 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the keyboard background image. Defined inside 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYBOARD}. 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_SKB_BG = "skb_bg"; 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the balloon background image for key press. Defined 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * inside {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYBOARD}. 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_BALLOON_BG = "balloon_bg"; 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the popup balloon background image for key press or 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * popup mini keyboard. Defined inside {@link #XMLTAG_SKB_TEMPLATE} and 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_KEYBOARD}. 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_POPUP_BG = "popup_bg"; 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the color to draw key label. Defined inside 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYTYPE}. 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_COLOR = "color"; 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the color to draw key's highlighted label. Defined 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * inside {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYTYPE}. 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_COLOR_HIGHLIGHT = "color_highlight"; 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the color to draw key's label in the popup balloon. 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Defined inside {@link #XMLTAG_SKB_TEMPLATE} and {@link #XMLTAG_KEYTYPE}. 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_COLOR_BALLOON = "color_balloon"; 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the id of {@link #XMLTAG_KEYTYPE} and 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_KEY}. Key types and keys defined in a soft keyboard 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * template should have id, because a soft keyboard needs the id to refer to 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * these default definitions. If a key defined in {@link #XMLTAG_KEYBOARD} 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * does not id, that means the key is newly defined; if it has id (and only 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * has id), the id is used to find the default definition from the soft 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * keyboard template. 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_ID = "id"; 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the key background for a specified key type. Defined 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * inside {@link #XMLTAG_KEYTYPE}. 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEYTYPE_BG = "bg"; 1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the key high-light background for a specified key type. 1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Defined inside {@link #XMLTAG_KEYTYPE}. 1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEYTYPE_HLBG = "hlbg"; 1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the starting x-position of an element. It can be defined 1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * in {@link #XMLTAG_ROW} and {@link #XMLTAG_KEY} in {XMLTAG_SKB_TEMPLATE}. 1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * If not defined, 0 will be used. For a key defined in 1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_KEYBOARD}, it always use its previous keys information to 1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * calculate its own position. 1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_START_POS_X = "start_pos_x"; 1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the starting y-position of an element. It can be defined 1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * in {@link #XMLTAG_ROW} and {@link #XMLTAG_KEY} in {XMLTAG_SKB_TEMPLATE}. 1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * If not defined, 0 will be used. For a key defined in 1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_KEYBOARD}, it always use its previous keys information to 1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * calculate its own position. 1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_START_POS_Y = "start_pos_y"; 1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of a row's id. Defined {@link #XMLTAG_ROW}. If not defined, 1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * -1 will be used. Rows with id -1 will be enabled always, rows with same 1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * row id will be enabled when the id is the same to the activated id of the 1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * soft keyboard. 1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_ROW_ID = "row_id"; 1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The tag used to indicate the keyboard element in the xml file. */ 1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_KEYBOARD = "keyboard"; 1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The tag used to indicate the row element in the xml file. */ 1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_ROW = "row"; 1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The tag used to indicate key-array element in the xml file. */ 1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_KEYS = "keys"; 1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The tag used to indicate a key element in the xml file. If the element is 1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * defined in a soft keyboard template, it should have an id. If it is 1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * defined in a soft keyboard, id is not required. 1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_KEY = "key"; 1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The tag used to indicate a key's toggle element in the xml file. */ 1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLTAG_TOGGLE_STATE = "toggle_state"; 1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag of the toggle state id for toggle key. Defined inside 1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #XMLTAG_TOGGLE_STATE} 1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_TOGGLE_STATE_ID = "state_id"; 1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of key template for the soft keyboard. */ 1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_SKB_TEMPLATE = "skb_template"; 1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag used to indicate whether this soft keyboard needs to be 1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * cached in memory for future use. {@link #DEFAULT_SKB_CACHE_FLAG} 1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * specifies the default value. 1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_SKB_CACHE_FLAG = "skb_cache_flag"; 1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Attribute tag used to indicate whether this soft keyboard is sticky. A 1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * sticky soft keyboard will keep the current layout unless user makes a 1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * switch explicitly. A none sticky soft keyboard will automatically goes 1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * back to the previous keyboard after click a none-function key. 1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * {@link #DEFAULT_SKB_STICKY_FLAG} specifies the default value. 1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_SKB_STICKY_FLAG = "skb_sticky_flag"; 1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag to indicate whether it is a QWERTY soft keyboard. */ 1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_QWERTY = "qwerty"; 2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * When the soft keyboard is a QWERTY one, this attribute tag to get the 2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * information that whether it is defined in upper case. 2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_QWERTY_UPPERCASE = "qwerty_uppercase"; 2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of key type. */ 2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_TYPE = "key_type"; 2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of key width. */ 2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_WIDTH = "width"; 2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of key height. */ 2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_HEIGHT = "height"; 2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key's repeating ability. */ 2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_REPEAT = "repeat"; 2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key's behavior for balloon. */ 2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_BALLOON = "balloon"; 2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key splitter in a key array. */ 2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_SPLITTER = "splitter"; 2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key labels in a key array. */ 2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_LABELS = "labels"; 2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key codes in a key array. */ 2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_CODES = "codes"; 2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key label in a key. */ 2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_LABEL = "label"; 2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key code in a key. */ 2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_CODE = "code"; 2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key icon in a key. */ 2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_ICON = "icon"; 2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Attribute tag of the key's popup icon in a key. */ 2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_ICON_POPUP = "icon_popup"; 2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The id for a mini popup soft keyboard. */ 2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final String XMLATTR_KEY_POPUP_SKBID = "popup_skb"; 2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static boolean DEFAULT_SKB_CACHE_FLAG = true; 2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static boolean DEFAULT_SKB_STICKY_FLAG = true; 2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The key type id for invalid key type. It is also used to generate next 2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * valid key type id by adding 1. 2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final int KEYTYPE_ID_LAST = -1; 2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private Context mContext; 2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private Resources mResources; 2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The event type in parsing the xml file. */ 2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private int mXmlEventType; 2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The current soft keyboard template used by the current soft keyboard 2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * under loading. 2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project **/ 2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private SkbTemplate mSkbTemplate; 2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The x position for the next key. */ 2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float mKeyXPos; 2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The y position for the next key. */ 2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float mKeyYPos; 2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The width of the keyboard to load. */ 2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int mSkbWidth; 2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** The height of the keyboard to load. */ 2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int mSkbHeight; 2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Key margin in x-way. */ 2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float mKeyXMargin = 0; 2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** Key margin in y-way. */ 2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float mKeyYMargin = 0; 2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Used to indicate whether next event has been fetched during processing 2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * the the current event. 2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean mNextEventFetched = false; 2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String mAttrTmp; 2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project class KeyCommonAttributes { 2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XmlResourceParser mXrp; 2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyType; 2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float keyWidth; 2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float keyHeight; 3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean repeat; 3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean balloon; 3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes(XmlResourceParser xrp) { 3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXrp = xrp; 3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project balloon = true; 3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Make sure the default object is not null. 3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean getAttributes(KeyCommonAttributes defAttr) { 3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyType = getInteger(mXrp, XMLATTR_KEY_TYPE, defAttr.keyType); 3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyWidth = getFloat(mXrp, XMLATTR_KEY_WIDTH, defAttr.keyWidth); 3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyHeight = getFloat(mXrp, XMLATTR_KEY_HEIGHT, defAttr.keyHeight); 3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project repeat = getBoolean(mXrp, XMLATTR_KEY_REPEAT, defAttr.repeat); 3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project balloon = getBoolean(mXrp, XMLATTR_KEY_BALLOON, defAttr.balloon); 3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (keyType < 0 || keyWidth <= 0 || keyHeight <= 0) { 3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public XmlKeyboardLoader(Context context) { 3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mContext = context; 3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mResources = mContext.getResources(); 3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public SkbTemplate loadSkbTemplate(int resourceId) { 3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == mContext || 0 == resourceId) { 3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Resources r = mResources; 3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XmlResourceParser xrp = r.getXml(resourceId); 3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrDef = new KeyCommonAttributes(xrp); 3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrKey = new KeyCommonAttributes(xrp); 3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate = new SkbTemplate(resourceId); 3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int lastKeyTypeId = KEYTYPE_ID_LAST; 3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int globalColor = 0; 3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int globalColorHl = 0; 3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int globalColorBalloon = 0; 3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXmlEventType = xrp.next(); 3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (mXmlEventType != XmlResourceParser.END_DOCUMENT) { 3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mNextEventFetched = false; 3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mXmlEventType == XmlResourceParser.START_TAG) { 3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String attribute = xrp.getName(); 3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (XMLTAG_SKB_TEMPLATE.compareTo(attribute) == 0) { 3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable skbBg = getDrawable(xrp, XMLATTR_SKB_BG, null); 3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable balloonBg = getDrawable(xrp, 3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_BALLOON_BG, null); 3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable popupBg = getDrawable(xrp, XMLATTR_POPUP_BG, 3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project null); 3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == skbBg || null == balloonBg 3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project || null == popupBg) { 3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.setBackgrounds(skbBg, balloonBg, popupBg); 3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float xMargin = getFloat(xrp, XMLATTR_KEY_XMARGIN, 0); 3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float yMargin = getFloat(xrp, XMLATTR_KEY_YMARGIN, 0); 3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.setMargins(xMargin, yMargin); 3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get default global colors. 3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project globalColor = getColor(xrp, XMLATTR_COLOR, 0); 3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project globalColorHl = getColor(xrp, XMLATTR_COLOR_HIGHLIGHT, 3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 0xffffffff); 3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project globalColorBalloon = getColor(xrp, 3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_COLOR_BALLOON, 0xffffffff); 3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_KEYTYPE.compareTo(attribute) == 0) { 3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int id = getInteger(xrp, XMLATTR_ID, KEYTYPE_ID_LAST); 3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable bg = getDrawable(xrp, XMLATTR_KEYTYPE_BG, null); 3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable hlBg = getDrawable(xrp, XMLATTR_KEYTYPE_HLBG, 3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project null); 3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int color = getColor(xrp, XMLATTR_COLOR, globalColor); 3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int colorHl = getColor(xrp, XMLATTR_COLOR_HIGHLIGHT, 3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project globalColorHl); 3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int colorBalloon = getColor(xrp, XMLATTR_COLOR_BALLOON, 3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project globalColorBalloon); 3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (id != lastKeyTypeId + 1) { 3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKeyType keyType = mSkbTemplate.createKeyType(id, 3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bg, hlBg); 3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyType.setColors(color, colorHl, colorBalloon); 3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!mSkbTemplate.addKeyType(keyType)) { 3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project lastKeyTypeId = id; 3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_KEYICON.compareTo(attribute) == 0) { 3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyCode = getInteger(xrp, XMLATTR_KEY_CODE, 0); 3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable icon = getDrawable(xrp, XMLATTR_KEY_ICON, null); 3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable iconPopup = getDrawable(xrp, 3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_KEY_ICON_POPUP, null); 3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != icon && null != iconPopup) { 3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.addDefaultKeyIcons(keyCode, icon, 3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project iconPopup); 3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_KEY.compareTo(attribute) == 0) { 4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyId = this.getInteger(xrp, XMLATTR_ID, -1); 4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (-1 == keyId) return null; 4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!attrKey.getAttributes(attrDef)) { 4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Update the key position for the key. 4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXPos = getFloat(xrp, XMLATTR_START_POS_X, 0); 4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYPos = getFloat(xrp, XMLATTR_START_POS_Y, 0); 4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKey softKey = getSoftKey(xrp, attrKey); 4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == softKey) return null; 4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.addDefaultKey(keyId, softKey); 4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the next tag. 4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!mNextEventFetched) mXmlEventType = xrp.next(); 4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project xrp.close(); 4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mSkbTemplate; 4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (XmlPullParserException e) { 4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Log.e(TAG, "Ill-formatted keyboard template resource file"); 4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (IOException e) { 4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Log.e(TAG, "Unable to keyboard template resource file"); 4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public SoftKeyboard loadKeyboard(int resourceId, int skbWidth, int skbHeight) { 4307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == mContext) return null; 4317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Resources r = mResources; 4327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SkbPool skbPool = SkbPool.getInstance(); 4337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XmlResourceParser xrp = mContext.getResources().getXml(resourceId); 4347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate = null; 4357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKeyboard softKeyboard = null; 4367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable skbBg; 4377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable popupBg; 4387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable balloonBg; 4397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKey softKey = null; 4407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrDef = new KeyCommonAttributes(xrp); 4427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrSkb = new KeyCommonAttributes(xrp); 4437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrRow = new KeyCommonAttributes(xrp); 4447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrKeys = new KeyCommonAttributes(xrp); 4457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrKey = new KeyCommonAttributes(xrp); 4467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXPos = 0; 4487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYPos = 0; 4497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbWidth = skbWidth; 4507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbHeight = skbHeight; 4517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 4537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXMargin = 0; 4547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYMargin = 0; 4557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXmlEventType = xrp.next(); 4567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (mXmlEventType != XmlResourceParser.END_DOCUMENT) { 4577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mNextEventFetched = false; 4587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mXmlEventType == XmlResourceParser.START_TAG) { 4597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String attr = xrp.getName(); 4607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1. Is it the root element, "keyboard"? 4617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (XMLTAG_KEYBOARD.compareTo(attr) == 0) { 4627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1.1 Get the keyboard template id. 4637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int skbTemplateId = xrp.getAttributeResourceValue(null, 4647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_SKB_TEMPLATE, 0); 4657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 1.2 Try to get the template from pool. If it is not 4677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // in, the pool will try to load it. 4687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate = skbPool.getSkbTemplate(skbTemplateId, 4697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mContext); 4707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == mSkbTemplate 4727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project || !attrSkb.getAttributes(attrDef)) { 4737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 4747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 4757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean cacheFlag = getBoolean(xrp, 4777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_SKB_CACHE_FLAG, DEFAULT_SKB_CACHE_FLAG); 4787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean stickyFlag = getBoolean(xrp, 4797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_SKB_STICKY_FLAG, 4807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project DEFAULT_SKB_STICKY_FLAG); 4817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean isQwerty = getBoolean(xrp, XMLATTR_QWERTY, 4827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project false); 4837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean isQwertyUpperCase = getBoolean(xrp, 4847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_QWERTY_UPPERCASE, false); 4857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard = new SoftKeyboard(resourceId, 4877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate, mSkbWidth, mSkbHeight); 4887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setFlags(cacheFlag, stickyFlag, isQwerty, 4897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project isQwertyUpperCase); 4907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXMargin = getFloat(xrp, XMLATTR_KEY_XMARGIN, 4927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.getXMargin()); 4937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYMargin = getFloat(xrp, XMLATTR_KEY_YMARGIN, 4947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mSkbTemplate.getYMargin()); 4957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project skbBg = getDrawable(xrp, XMLATTR_SKB_BG, null); 4967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project popupBg = getDrawable(xrp, XMLATTR_POPUP_BG, null); 4977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project balloonBg = getDrawable(xrp, XMLATTR_BALLOON_BG, null); 4987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != skbBg) { 4997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setSkbBackground(skbBg); 5007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != popupBg) { 5027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setPopupBackground(popupBg); 5037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != balloonBg) { 5057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setKeyBalloonBackground(balloonBg); 5067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setKeyMargins(mKeyXMargin, mKeyYMargin); 5087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_ROW.compareTo(attr) == 0) { 5097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!attrRow.getAttributes(attrSkb)) { 5107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the starting positions for the row. 5137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXPos = getFloat(xrp, XMLATTR_START_POS_X, 0); 5147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYPos = getFloat(xrp, XMLATTR_START_POS_Y, mKeyYPos); 5157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int rowId = getInteger(xrp, XMLATTR_ROW_ID, 5167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyRow.ALWAYS_SHOW_ROW_ID); 5177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.beginNewRow(rowId, mKeyYPos); 5187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_KEYS.compareTo(attr) == 0) { 5197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == softKeyboard) return null; 5207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!attrKeys.getAttributes(attrRow)) { 5217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String splitter = xrp.getAttributeValue(null, 5257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_KEY_SPLITTER); 5267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project splitter = Pattern.quote(splitter); 5277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String labels = xrp.getAttributeValue(null, 5287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_KEY_LABELS); 5297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String codes = xrp.getAttributeValue(null, 5307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_KEY_CODES); 5317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == splitter || null == labels) { 5327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String labelArr[] = labels.split(splitter); 5357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String codeArr[] = null; 5367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != codes) { 5377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project codeArr = codes.split(splitter); 5387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (labelArr.length != codeArr.length) { 5397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project for (int i = 0; i < labelArr.length; i++) { 5447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey = new SoftKey(); 5457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyCode = 0; 5467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != codeArr) { 5477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyCode = Integer.valueOf(codeArr[i]); 5487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyAttribute(keyCode, labelArr[i], 5507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project attrKeys.repeat, attrKeys.balloon); 5517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyType(mSkbTemplate 5537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project .getKeyType(attrKeys.keyType), null, null); 5547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float left, right, top, bottom; 5567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project left = mKeyXPos; 5577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project right = left + attrKeys.keyWidth; 5597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project top = mKeyYPos; 5607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bottom = top + attrKeys.keyHeight; 5617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (right - left < 2 * mKeyXMargin) return null; 5637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (bottom - top < 2 * mKeyYMargin) return null; 5647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyDimensions(left, top, right, bottom); 5667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.addSoftKey(softKey); 5677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXPos = right; 5687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if ((int) mKeyXPos * mSkbWidth > mSkbWidth) { 5697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (XMLTAG_KEY.compareTo(attr) == 0) { 5737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == softKeyboard) { 5747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!attrKey.getAttributes(attrRow)) { 5777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyId = this.getInteger(xrp, XMLATTR_ID, -1); 5817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (keyId >= 0) { 5827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey = mSkbTemplate.getDefaultKey(keyId); 5837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 5847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey = getSoftKey(xrp, attrKey); 5857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == softKey) return null; 5877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 5887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Update the position for next key. 5897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyXPos = softKey.mRightF; 5907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if ((int) mKeyXPos * mSkbWidth > mSkbWidth) { 5917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 5927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 5937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If the current xml event type becomes a starting tag, 5947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // it indicates that we have parsed too much to get 5957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // toggling states, and we started a new row. In this 5967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // case, the row starting position information should 5977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // be updated. 5987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mXmlEventType == XmlResourceParser.START_TAG) { 5997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project attr = xrp.getName(); 6007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (XMLTAG_ROW.compareTo(attr) == 0) { 6017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYPos += attrRow.keyHeight; 6027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if ((int) mKeyYPos * mSkbHeight > mSkbHeight) { 6037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 6047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.addSoftKey(softKey); 6087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else if (mXmlEventType == XmlResourceParser.END_TAG) { 6107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String attr = xrp.getName(); 6117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (XMLTAG_ROW.compareTo(attr) == 0) { 6127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyYPos += attrRow.keyHeight; 6137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if ((int) mKeyYPos * mSkbHeight > mSkbHeight) { 6147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 6157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the next tag. 6207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!mNextEventFetched) mXmlEventType = xrp.next(); 6217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project xrp.close(); 6237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKeyboard.setSkbCoreSize(mSkbWidth, mSkbHeight); 6247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return softKeyboard; 6257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (XmlPullParserException e) { 6267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Log.e(TAG, "Ill-formatted keybaord resource file"); 6277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (IOException e) { 6287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Log.e(TAG, "Unable to read keyboard resource file"); 6297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 6317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Caller makes sure xrp and r are valid. 6347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private SoftKey getSoftKey(XmlResourceParser xrp, 6357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrKey) throws XmlPullParserException, 6367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project IOException { 6377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyCode = getInteger(xrp, XMLATTR_KEY_CODE, 0); 6387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String keyLabel = getString(xrp, XMLATTR_KEY_LABEL, null); 6397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable keyIcon = getDrawable(xrp, XMLATTR_KEY_ICON, null); 6407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable keyIconPopup = getDrawable(xrp, XMLATTR_KEY_ICON_POPUP, null); 6417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int popupSkbId = xrp.getAttributeResourceValue(null, 6427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XMLATTR_KEY_POPUP_SKBID, 0); 6437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == keyLabel && null == keyIcon) { 6457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyIcon = mSkbTemplate.getDefaultKeyIcon(keyCode); 6467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyIconPopup = mSkbTemplate.getDefaultKeyIconPopup(keyCode); 6477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == keyIcon || null == keyIconPopup) return null; 6487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Dimension information must been initialized before 6517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // getting toggle state, because mKeyYPos may be changed 6527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // to next row when trying to get toggle state. 6537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float left, right, top, bottom; 6547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project left = mKeyXPos; 6557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project right = left + attrKey.keyWidth; 6567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project top = mKeyYPos; 6577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bottom = top + attrKey.keyHeight; 6587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (right - left < 2 * mKeyXMargin) return null; 6607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (bottom - top < 2 * mKeyYMargin) return null; 6617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Try to find if the next tag is 6637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // {@link #XMLTAG_TOGGLE_STATE_OF_KEY}, if yes, try to 6647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // create a toggle key. 6657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean toggleKey = false; 6667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXmlEventType = xrp.next(); 6677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mNextEventFetched = true; 6687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKey softKey; 6707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mXmlEventType == XmlResourceParser.START_TAG) { 6717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mAttrTmp = xrp.getName(); 6727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mAttrTmp.compareTo(XMLTAG_TOGGLE_STATE) == 0) { 6737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project toggleKey = true; 6747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (toggleKey) { 6777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey = new SoftKeyToggle(); 6787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!((SoftKeyToggle) softKey).setToggleStates(getToggleStates( 6797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project attrKey, (SoftKeyToggle) softKey, keyCode))) { 6807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 6817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 6837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey = new SoftKey(); 6847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Set the normal state 6877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyAttribute(keyCode, keyLabel, attrKey.repeat, 6887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project attrKey.balloon); 6897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setPopupSkbId(popupSkbId); 6907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyType(mSkbTemplate.getKeyType(attrKey.keyType), keyIcon, 6917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyIconPopup); 6927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey.setKeyDimensions(left, top, right, bottom); 6947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return softKey; 6957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 6967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 6977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private SoftKeyToggle.ToggleState getToggleStates( 6987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project KeyCommonAttributes attrKey, SoftKeyToggle softKey, int defKeyCode) 6997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project throws XmlPullParserException, IOException { 7007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project XmlResourceParser xrp = attrKey.mXrp; 7017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int stateId = getInteger(xrp, XMLATTR_TOGGLE_STATE_ID, 0); 7027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == stateId) return null; 7037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String keyLabel = getString(xrp, XMLATTR_KEY_LABEL, null); 7057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyTypeId = getInteger(xrp, XMLATTR_KEY_TYPE, KEYTYPE_ID_LAST); 7067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int keyCode; 7077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == keyLabel) { 7087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyCode = getInteger(xrp, XMLATTR_KEY_CODE, defKeyCode); 7097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 7107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project keyCode = getInteger(xrp, XMLATTR_KEY_CODE, 0); 7117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable icon = getDrawable(xrp, XMLATTR_KEY_ICON, null); 7137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable iconPopup = getDrawable(xrp, XMLATTR_KEY_ICON_POPUP, null); 7147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == icon && null == keyLabel) { 7157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return null; 7167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKeyToggle.ToggleState rootState = softKey.createToggleState(); 7187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.setStateId(stateId); 7197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyType = null; 7207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (KEYTYPE_ID_LAST != keyTypeId) { 7217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyType = mSkbTemplate.getKeyType(keyTypeId); 7227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyCode = keyCode; 7247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyIcon = icon; 7257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyIconPopup = iconPopup; 7267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mKeyLabel = keyLabel; 7277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean repeat = getBoolean(xrp, XMLATTR_KEY_REPEAT, attrKey.repeat); 7297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean balloon = getBoolean(xrp, XMLATTR_KEY_BALLOON, attrKey.balloon); 7307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.setStateFlags(repeat, balloon); 7317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mNextState = null; 7337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If there is another toggle state. 7357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXmlEventType = xrp.next(); 7367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while (mXmlEventType != XmlResourceParser.START_TAG 7377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project && mXmlEventType != XmlResourceParser.END_DOCUMENT) { 7387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mXmlEventType = xrp.next(); 7397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (mXmlEventType == XmlResourceParser.START_TAG) { 7417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String attr = xrp.getName(); 7427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (attr.compareTo(XMLTAG_TOGGLE_STATE) == 0) { 7437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SoftKeyToggle.ToggleState nextState = getToggleStates(attrKey, 7447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project softKey, defKeyCode); 7457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == nextState) return null; 7467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project rootState.mNextState = nextState; 7477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return rootState; 7517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private int getInteger(XmlResourceParser xrp, String name, int defValue) { 7547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int resId = xrp.getAttributeResourceValue(null, name, 0); 7557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String s; 7567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (resId == 0) { 7577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project s = xrp.getAttributeValue(null, name); 7587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == s) return defValue; 7597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 7607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int ret = Integer.valueOf(s); 7617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return ret; 7627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (NumberFormatException e) { 7637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return defValue; 7647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 7667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return Integer.parseInt(mContext.getResources().getString(resId)); 7677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private int getColor(XmlResourceParser xrp, String name, int defValue) { 7717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int resId = xrp.getAttributeResourceValue(null, name, 0); 7727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String s; 7737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (resId == 0) { 7747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project s = xrp.getAttributeValue(null, name); 7757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == s) return defValue; 7767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 7777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int ret = Integer.valueOf(s); 7787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return ret; 7797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (NumberFormatException e) { 7807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return defValue; 7817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 7837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mContext.getResources().getColor(resId); 7847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private String getString(XmlResourceParser xrp, String name, String defValue) { 7887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int resId = xrp.getAttributeResourceValue(null, name, 0); 7897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (resId == 0) { 7907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return xrp.getAttributeValue(null, name); 7917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 7927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mContext.getResources().getString(resId); 7937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 7957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 7967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private float getFloat(XmlResourceParser xrp, String name, float defValue) { 7977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int resId = xrp.getAttributeResourceValue(null, name, 0); 7987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (resId == 0) { 7997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String s = xrp.getAttributeValue(null, name); 8007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == s) return defValue; 8017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 8027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project float ret; 8037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (s.endsWith("%p")) { 8047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ret = Float.parseFloat(s.substring(0, s.length() - 2)) / 100; 8057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 8067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ret = Float.parseFloat(s); 8077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return ret; 8097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (NumberFormatException e) { 8107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return defValue; 8117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 8137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mContext.getResources().getDimension(resId); 8147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 8177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private boolean getBoolean(XmlResourceParser xrp, String name, 8187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean defValue) { 8197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project String s = xrp.getAttributeValue(null, name); 8207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == s) return defValue; 8217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project try { 8227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project boolean ret = Boolean.parseBoolean(s); 8237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return ret; 8247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } catch (NumberFormatException e) { 8257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return defValue; 8267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 8297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private Drawable getDrawable(XmlResourceParser xrp, String name, 8307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project Drawable defValue) { 8317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int resId = xrp.getAttributeResourceValue(null, name, 0); 8327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == resId) return defValue; 8337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mResources.getDrawable(resId); 8347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 8357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 836