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.InputModeSwitcher.ToggleStates;
207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.graphics.Rect;
227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.graphics.drawable.Drawable;
237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport android.view.KeyEvent;
247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.ArrayList;
267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectimport java.util.List;
277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/**
297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class used to represent a soft keyboard definition, including the height, the
307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * background image, the image for high light, the keys, etc.
317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */
327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class SoftKeyboard {
337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The XML resource id for this soft keyboard. */
347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mSkbXmlId;
357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** Do we need to cache this soft keyboard? */
377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean mCacheFlag;
387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * After user switches to this soft keyboard, if this flag is true, this
417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * soft keyboard will be kept unless explicit switching operation is
427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * performed, otherwise IME will switch back to the previous keyboard layout
437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * whenever user clicks on any none-function key.
447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     **/
457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean mStickyFlag;
467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The cache id for this soft keyboard. It is used to identify it in the
497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * soft keyboard pool.
507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mCacheId;
527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Used to indicate whether this soft keyboard is newly loaded from an XML
557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * file or is just gotten from the soft keyboard pool.
567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean mNewlyLoadedFlag = true;
587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The width of the soft keyboard. */
607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mSkbCoreWidth;
617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The height of the soft keyboard. */
637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mSkbCoreHeight;
647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The soft keyboard template for this soft keyboard. */
667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private SkbTemplate mSkbTemplate;
677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** Used to indicate whether this soft keyboard is a QWERTY keyboard. */
697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean mIsQwerty;
707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * When {@link #mIsQwerty} is true, this member is Used to indicate that the
737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * soft keyboard should be displayed in uppercase.
747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean mIsQwertyUpperCase;
767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * The id of the rows which are enabled. Rows with id
797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * {@link KeyRow#ALWAYS_SHOW_ROW_ID} are always enabled.
807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private int mEnabledRowId;
827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Rows in this soft keyboard. Each row has a id. Only matched rows will be
857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * enabled.
867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private List<KeyRow> mKeyRows;
887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Background of the soft keyboard. If it is null, the one in the soft
917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * keyboard template will be used.
927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     **/
937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable mSkbBg;
947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Background for key balloon. If it is null, the one in the soft keyboard
977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * template will be used.
987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     **/
997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Drawable mBalloonBg;
1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Background for popup mini soft keyboard. If it is null, the one in the
1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * soft keyboard template will be used.
1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     **/
1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Drawable mPopupBg;
1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The left and right margin of a key. */
1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private float mKeyXMargin = 0;
1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /** The top and bottom margin of a key. */
1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private float mKeyYMargin = 0;
1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Rect mTmpRect = new Rect();
1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public SoftKeyboard(int skbXmlId, SkbTemplate skbTemplate, int skbWidth,
1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int skbHeight) {
1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbXmlId = skbXmlId;
1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbTemplate = skbTemplate;
1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbCoreWidth = skbWidth;
1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbCoreHeight = skbHeight;
1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setFlags(boolean cacheFlag, boolean stickyFlag,
1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            boolean isQwerty, boolean isQwertyUpperCase) {
1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCacheFlag = cacheFlag;
1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mStickyFlag = stickyFlag;
1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mIsQwerty = isQwerty;
1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mIsQwertyUpperCase = isQwertyUpperCase;
1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean getCacheFlag() {
1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mCacheFlag;
1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setCacheId(int cacheId) {
1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mCacheId = cacheId;
1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean getStickyFlag() {
1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mStickyFlag;
1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setSkbBackground(Drawable skbBg) {
1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbBg = skbBg;
1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setPopupBackground(Drawable popupBg) {
1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mPopupBg = popupBg;
1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setKeyBalloonBackground(Drawable balloonBg) {
1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mBalloonBg = balloonBg;
1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setKeyMargins(float xMargin, float yMargin) {
1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mKeyXMargin = xMargin;
1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mKeyYMargin = yMargin;
1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getCacheId() {
1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mCacheId;
1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void reset() {
1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mKeyRows) mKeyRows.clear();
1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setNewlyLoadedFlag(boolean newlyLoadedFlag) {
1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mNewlyLoadedFlag = newlyLoadedFlag;
1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean getNewlyLoadedFlag() {
1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mNewlyLoadedFlag;
1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void beginNewRow(int rowId, float yStartingPos) {
1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mKeyRows) mKeyRows = new ArrayList<KeyRow>();
1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        KeyRow keyRow = new KeyRow();
1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        keyRow.mRowId = rowId;
1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        keyRow.mTopF = yStartingPos;
1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        keyRow.mBottomF = yStartingPos;
1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        keyRow.mSoftKeys = new ArrayList<SoftKey>();
1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mKeyRows.add(keyRow);
1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public boolean addSoftKey(SoftKey softKey) {
1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (mKeyRows.size() == 0) return false;
1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        KeyRow keyRow = mKeyRows.get(mKeyRows.size() - 1);
1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == keyRow) return false;
1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        List<SoftKey> softKeys = keyRow.mSoftKeys;
1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        softKey.setSkbCoreSize(mSkbCoreWidth, mSkbCoreHeight);
1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        softKeys.add(softKey);
1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (softKey.mTopF < keyRow.mTopF) {
1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyRow.mTopF = softKey.mTopF;
1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (softKey.mBottomF > keyRow.mBottomF) {
1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyRow.mBottomF = softKey.mBottomF;
1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return true;
2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getSkbXmlId() {
2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbXmlId;
2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // Set the size of the soft keyboard core. In other words, the background's
2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    // padding are not counted.
2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void setSkbCoreSize(int skbCoreWidth, int skbCoreHeight) {
2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mKeyRows
2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                || (skbCoreWidth == mSkbCoreWidth && skbCoreHeight == mSkbCoreHeight)) {
2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return;
2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < mKeyRows.size(); row++) {
2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyRow.mBottom = (int) (skbCoreHeight * keyRow.mBottomF);
2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            keyRow.mTop = (int) (skbCoreHeight * keyRow.mTopF);
2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < softKeys.size(); i++) {
2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey softKey = softKeys.get(i);
2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                softKey.setSkbCoreSize(skbCoreWidth, skbCoreHeight);
2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbCoreWidth = skbCoreWidth;
2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mSkbCoreHeight = skbCoreHeight;
2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getSkbCoreWidth() {
2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbCoreWidth;
2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getSkbCoreHeight() {
2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbCoreHeight;
2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getSkbTotalWidth() {
2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Rect padding = getPadding();
2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbCoreWidth + padding.left + padding.right;
2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getSkbTotalHeight() {
2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Rect padding = getPadding();
2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbCoreHeight + padding.top + padding.bottom;
2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getKeyXMargin() {
2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Environment env = Environment.getInstance();
2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return (int) (mKeyXMargin * mSkbCoreWidth * env.getKeyXMarginFactor());
2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getKeyYMargin() {
2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Environment env = Environment.getInstance();
2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return (int) (mKeyYMargin * mSkbCoreHeight * env.getKeyYMarginFactor());
2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getSkbBackground() {
2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mSkbBg) return mSkbBg;
2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbTemplate.getSkbBackground();
2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getBalloonBackground() {
2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mBalloonBg) return mBalloonBg;
2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbTemplate.getBalloonBackground();
2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public Drawable getPopupBackground() {
2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mPopupBg) return mPopupBg;
2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mSkbTemplate.getPopupBackground();
2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public int getRowNum() {
2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mKeyRows) {
2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return mKeyRows.size();
2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return 0;
2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public KeyRow getKeyRowForDisplay(int row) {
2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mKeyRows && mKeyRows.size() > row) {
2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (KeyRow.ALWAYS_SHOW_ROW_ID == keyRow.mRowId
2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    || keyRow.mRowId == mEnabledRowId) {
2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return keyRow;
2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return null;
2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public SoftKey getKey(int row, int location) {
2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null != mKeyRows && mKeyRows.size() > row) {
2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = mKeyRows.get(row).mSoftKeys;
2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (softKeys.size() > location) {
2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                return softKeys.get(location);
2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return null;
2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public SoftKey mapToKey(int x, int y) {
3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mKeyRows) {
3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            return null;
3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // If the position is inside the rectangle of a certain key, return that
3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // key.
3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (KeyRow.ALWAYS_SHOW_ROW_ID != keyRow.mRowId
3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    && keyRow.mRowId != mEnabledRowId) continue;
3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (keyRow.mTop > y && keyRow.mBottom <= y) continue;
3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < keyNum; i++) {
3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(i);
3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey.mLeft <= x && sKey.mTop <= y && sKey.mRight > x
3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        && sKey.mBottom > y) {
3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    return sKey;
3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // If the position is outside the rectangles of all keys, find the
3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        // nearest one.
3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        SoftKey nearestKey = null;
3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        float nearestDis = Float.MAX_VALUE;
3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (KeyRow.ALWAYS_SHOW_ROW_ID != keyRow.mRowId
3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    && keyRow.mRowId != mEnabledRowId) continue;
3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (keyRow.mTop > y && keyRow.mBottom <= y) continue;
3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < keyNum; i++) {
3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(i);
3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                int disx = (sKey.mLeft + sKey.mRight) / 2 - x;
3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                int disy = (sKey.mTop + sKey.mBottom) / 2 - y;
3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                float dis = disx * disx + disy * disy;
3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (dis < nearestDis) {
3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    nearestDis = dis;
3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    nearestKey = sKey;
3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return nearestKey;
3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void switchQwertyMode(int toggle_state_id, boolean upperCase) {
3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (!mIsQwerty) return;
3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < keyNum; i++) {
3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(i);
3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey instanceof SoftKeyToggle) {
3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    ((SoftKeyToggle) sKey).enableToggleState(toggle_state_id,
3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            true);
3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey.mKeyCode >= KeyEvent.KEYCODE_A
3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        && sKey.mKeyCode <= KeyEvent.KEYCODE_Z) {
3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    sKey.changeCase(upperCase);
3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void enableToggleState(int toggleStateId, boolean resetIfNotFound) {
3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < keyNum; i++) {
3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(i);
3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey instanceof SoftKeyToggle) {
3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    ((SoftKeyToggle) sKey).enableToggleState(toggleStateId,
3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            resetIfNotFound);
3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void disableToggleState(int toggleStateId, boolean resetIfNotFound) {
3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < keyNum; i++) {
3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(i);
3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey instanceof SoftKeyToggle) {
3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    ((SoftKeyToggle) sKey).disableToggleState(toggleStateId,
3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            resetIfNotFound);
3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public void enableToggleStates(ToggleStates toggleStates) {
4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == toggleStates) return;
4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        enableRow(toggleStates.mRowIdToEnable);
4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean isQwerty = toggleStates.mQwerty;
4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean isQwertyUpperCase = toggleStates.mQwertyUpperCase;
4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean needUpdateQwerty = (isQwerty && mIsQwerty && (mIsQwertyUpperCase != isQwertyUpperCase));
4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int states[] = toggleStates.mKeyStates;
4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int statesNum = toggleStates.mKeyStatesNum;
4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (KeyRow.ALWAYS_SHOW_ROW_ID != keyRow.mRowId
4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    && keyRow.mRowId != mEnabledRowId) {
4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                continue;
4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int keyPos = 0; keyPos < keyNum; keyPos++) {
4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                SoftKey sKey = softKeys.get(keyPos);
4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (sKey instanceof SoftKeyToggle) {
4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    for (int statePos = 0; statePos < statesNum; statePos++) {
4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        ((SoftKeyToggle) sKey).enableToggleState(
4297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                                states[statePos], statePos == 0);
4307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    }
4317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    if (0 == statesNum) {
4327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        ((SoftKeyToggle) sKey).disableAllToggleStates();
4337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    }
4347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                if (needUpdateQwerty) {
4367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    if (sKey.mKeyCode >= KeyEvent.KEYCODE_A
4377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                            && sKey.mKeyCode <= KeyEvent.KEYCODE_Z) {
4387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        sKey.changeCase(isQwertyUpperCase);
4397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                    }
4407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                }
4417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mIsQwertyUpperCase = isQwertyUpperCase;
4447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private Rect getPadding() {
4477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        mTmpRect.set(0, 0, 0, 0);
4487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        Drawable skbBg = getSkbBackground();
4497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == skbBg) return mTmpRect;
4507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        skbBg.getPadding(mTmpRect);
4517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return mTmpRect;
4527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    /**
4557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * Enable a row with the give toggle Id. Rows with other toggle ids (except
4567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * the id {@link KeyRow#ALWAYS_SHOW_ROW_ID}) will be disabled.
4577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     *
4587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * @param rowId The row id to enable.
4597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     * @return True if the soft keyboard requires redrawing.
4607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project     */
4617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    private boolean enableRow(int rowId) {
4627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (KeyRow.ALWAYS_SHOW_ROW_ID == rowId) return false;
4637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        boolean enabled = false;
4657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
4667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = rowNum - 1; row >= 0; row--) {
4677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            if (mKeyRows.get(row).mRowId == rowId) {
4687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                enabled = true;
4697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                break;
4707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (enabled) {
4737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            mEnabledRowId = rowId;
4747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return enabled;
4767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
4777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
4787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    @Override
4797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public String toString() {
4807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        String str = "------------------SkbInfo----------------------\n";
4817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        String endStr = "-----------------------------------------------\n";
4827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        str += "Width: " + String.valueOf(mSkbCoreWidth) + "\n";
4837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        str += "Height: " + String.valueOf(mSkbCoreHeight) + "\n";
4847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        str += "KeyRowNum: " + mKeyRows == null ? "0" : String.valueOf(mKeyRows
4857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                .size())
4867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                + "\n";
4877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        if (null == mKeyRows) return str + endStr;
4887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int rowNum = mKeyRows.size();
4897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        for (int row = 0; row < rowNum; row++) {
4907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            KeyRow keyRow = mKeyRows.get(row);
4917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            List<SoftKey> softKeys = keyRow.mSoftKeys;
4927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            int keyNum = softKeys.size();
4937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            for (int i = 0; i < softKeys.size(); i++) {
4947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                str += "-key " + String.valueOf(i) + ":"
4957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project                        + softKeys.get(i).toString();
4967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project            }
4977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        }
4987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return str + endStr;
4997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
5007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
5017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    public String toShortString() {
5027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        return super.toString();
5037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
5047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
5057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    class KeyRow {
5067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        static final int ALWAYS_SHOW_ROW_ID = -1;
5077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        static final int DEFAULT_ROW_ID = 0;
5087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project
5097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        List<SoftKey> mSoftKeys;
5107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        /**
5117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project         * If the row id is {@link #ALWAYS_SHOW_ROW_ID}, this row will always be
5127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project         * enabled.
5137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project         */
5147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int mRowId;
5157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        float mTopF;
5167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        float mBottomF;
5177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int mTop;
5187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project        int mBottom;
5197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project    }
5207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}
521