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