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