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 android.graphics.drawable.Drawable; 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/** 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Class for soft keys which defined in the keyboard xml file. A soft key can be 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * a basic key or a toggling key. 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @see com.android.inputmethod.pinyin.SoftKey 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectpublic class SoftKeyToggle extends SoftKey { 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * The current state number is stored in the lowest 8 bits of mKeyMask, this 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * mask is used to get the state number. If the current state is 0, the 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * normal state is enabled; if the current state is more than 0, a toggle 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * state in the toggle state chain will be enabled. 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private static final int KEYMASK_TOGGLE_STATE = 0x000000ff; 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private ToggleState mToggleState; 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int getToggleStateId() { 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return (mKeyMask & KEYMASK_TOGGLE_STATE); 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The state id should be valid, and less than 255. 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If resetIfNotFound is true and there is no such toggle state with the 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // given id, the key state will be reset. 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If the key state is newly changed (enabled to the given state, or 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // reseted) and needs re-draw, return true. 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean enableToggleState(int stateId, boolean resetIfNotFound) { 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE); 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (oldStateId == stateId) return false; 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask &= (~KEYMASK_TOGGLE_STATE); 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (stateId > 0) { 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask |= (KEYMASK_TOGGLE_STATE & stateId); 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (getToggleState() == null) { 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask &= (~KEYMASK_TOGGLE_STATE); 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (!resetIfNotFound && oldStateId > 0) { 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask |= (KEYMASK_TOGGLE_STATE & oldStateId); 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return resetIfNotFound; 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The state id should be valid, and less than 255. 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If resetIfNotFound is true and there is no such toggle state with the 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // given id, the key state will be reset. 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If the key state is newly changed and needs re-draw, return true. 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean disableToggleState(int stateId, boolean resetIfNotFound) { 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE); 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (oldStateId == stateId) { 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask &= (~KEYMASK_TOGGLE_STATE); 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return stateId != 0; 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (resetIfNotFound) { 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask &= (~KEYMASK_TOGGLE_STATE); 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return oldStateId != 0; 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Clear any toggle state. If the key needs re-draw, return true. 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean disableAllToggleStates() { 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int oldStateId = (mKeyMask & KEYMASK_TOGGLE_STATE); 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mKeyMask &= (~KEYMASK_TOGGLE_STATE); 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return oldStateId != 0; 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable getKeyIcon() { 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) return state.mKeyIcon; 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.getKeyIcon(); 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable getKeyIconPopup() { 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state.mKeyIconPopup) { 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyIconPopup; 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyIcon; 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.getKeyIconPopup(); 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int getKeyCode() { 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) return state.mKeyCode; 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyCode; 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public String getKeyLabel() { 1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) return state.mKeyLabel; 1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyLabel; 1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable getKeyBg() { 1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyType) { 1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyType.mKeyBg; 1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyType.mKeyBg; 1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable getKeyHlBg() { 1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyType) { 1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyType.mKeyHlBg; 1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyType.mKeyHlBg; 1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int getColor() { 1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyType) { 1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyType.mColor; 1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyType.mColor; 1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int getColorHl() { 1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyType) { 1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyType.mColorHl; 1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyType.mColorHl; 1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int getColorBalloon() { 1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyType) { 1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state.mKeyType.mColorBalloon; 1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return mKeyType.mColorBalloon; 1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean isKeyCodeKey() { 1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (state.mKeyCode > 0) return true; 1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.isKeyCodeKey(); 1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean isUserDefKey() { 1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (state.mKeyCode < 0) return true; 1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.isUserDefKey(); 1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean isUniStrKey() { 1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state.mKeyLabel && state.mKeyCode == 0) { 1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return false; 2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.isUniStrKey(); 2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean needBalloon() { 2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return (state.mIdAndFlags & KEYMASK_BALLOON) != 0; 2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.needBalloon(); 2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean repeatable() { 2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state) { 2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return (state.mIdAndFlags & KEYMASK_REPEAT) != 0; 2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return super.repeatable(); 2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project @Override 2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public void changeCase(boolean lowerCase) { 2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = getToggleState(); 2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null != state && null != state.mKeyLabel) { 2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (lowerCase) 2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project state.mKeyLabel = state.mKeyLabel.toLowerCase(); 2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project else 2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project state.mKeyLabel = state.mKeyLabel.toUpperCase(); 2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public ToggleState createToggleState() { 2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return new ToggleState(); 2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public boolean setToggleStates(ToggleState rootState) { 2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (null == rootState) return false; 2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mToggleState = rootState; 2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return true; 2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private ToggleState getToggleState() { 2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int stateId = (mKeyMask & KEYMASK_TOGGLE_STATE); 2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (0 == stateId) return null; 2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ToggleState state = mToggleState; 2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project while ((null != state) 2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project && (state.mIdAndFlags & KEYMASK_TOGGLE_STATE) != stateId) { 2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project state = state.mNextState; 2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project return state; 2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public class ToggleState { 2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The id should be bigger than 0; 2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private int mIdAndFlags; 2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public SoftKeyType mKeyType; 2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public int mKeyCode; 2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable mKeyIcon; 2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public Drawable mKeyIconPopup; 2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public String mKeyLabel; 2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public ToggleState mNextState; 2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public void setStateId(int stateId) { 2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mIdAndFlags |= (stateId & KEYMASK_TOGGLE_STATE); 2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public void setStateFlags(boolean repeat, boolean balloon) { 2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (repeat) { 2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mIdAndFlags |= KEYMASK_REPEAT; 2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mIdAndFlags &= (~KEYMASK_REPEAT); 2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project if (balloon) { 2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mIdAndFlags |= KEYMASK_BALLOON; 2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } else { 2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project mIdAndFlags &= (~KEYMASK_BALLOON); 2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } 2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 284