10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2007 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cat; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.graphics.Bitmap; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.GsmAlphabet; 24d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccFileHandler; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.Iterator; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Factory class, used for decoding raw byte arrays, received from baseband, 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * into a CommandParams object. 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass CommandParamsFactory extends Handler { 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static CommandParamsFactory sInstance = null; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private IconLoader mIconLoader; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandParams mCmdParams = null; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private int mIconLoadState = LOAD_NO_ICON; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private RilMessageDecoder mCaller = null; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // constants 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MSG_ID_LOAD_ICON_DONE = 1; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // loading icons state parameters. 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_NO_ICON = 0; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_SINGLE_ICON = 1; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_MULTI_ICONS = 2; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for refresh command 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE = 0x00; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FILE_CHANGE = 0x02; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT = 0x03; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_UICC_RESET = 0x04; 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for PLI command 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int DTTZ_SETTING = 0x03; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LANGUAGE_SETTING = 0x04; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IccFileHandler fh) { 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sInstance != null) { 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sInstance; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (fh != null) { 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new CommandParamsFactory(caller, fh); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandParamsFactory(RilMessageDecoder caller, IccFileHandler fh) { 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller = caller; 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader = IconLoader.getInstance(this, fh); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandDetails processCommandDetails(List<ComprehensionTlv> ctlvs) { 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = null; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvs != null) { 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Search for the Command Details object. 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlvCmdDet = searchForTag( 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlvTag.COMMAND_DETAILS, ctlvs); 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvCmdDet != null) { 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdDet = ValueParser.retrieveCommandDetails(ctlvCmdDet); 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "processCommandDetails: Failed to procees command details e=" + e); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return cmdDet; 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void make(BerTlv berTlv) { 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv == null) { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // reset global state parameters. 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = null; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_NO_ICON; 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // only proactive command messages are processed. 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv.getTag() != BerTlv.BER_PROACTIVE_COMMAND_TAG) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean cmdPending = false; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs = berTlv.getComprehensionTlvs(); 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // process command dtails from the tlv list. 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = processCommandDetails(ctlvs); 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdDet == null) { 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // extract command type enumeration from the raw value stored inside 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the Command Details object. 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType cmdType = AppInterface.CommandType 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .fromInt(cmdDet.typeOfCommand); 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdType == null) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This PROACTIVE COMMAND is presently not handled. Hence set 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // result code as BEYOND_TERMINAL_CAPABILITY in TR. 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1279edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang // proactive command length is incorrect. 1289edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang if (!berTlv.isLengthValid()) { 1299edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang mCmdParams = new CommandParams(cmdDet); 1309edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang sendCmdParams(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 1319edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang return; 1329edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang } 1339edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdType) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_MENU: 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SELECT_ITEM: 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DISPLAY_TEXT: 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processDisplayText(cmdDet, ctlvs); 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_IDLE_MODE_TEXT: 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetUpIdleModeText(cmdDet, ctlvs); 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INKEY: 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInkey(cmdDet, ctlvs); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INPUT: 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInput(cmdDet, ctlvs); 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DTMF: 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SMS: 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SS: 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_USSD: 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processEventNotify(cmdDet, ctlvs); 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 16086968438e444728053137c764cc37cf9c0a15d16Siddartha Pothapragada case GET_CHANNEL_STATUS: 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_CALL: 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetupCall(cmdDet, ctlvs); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH: 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processRefresh(cmdDet, ctlvs); 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = false; 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LAUNCH_BROWSER: 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processLaunchBrowser(cmdDet, ctlvs); 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PLAY_TONE: 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processPlayTone(cmdDet, ctlvs); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PROVIDE_LOCAL_INFORMATION: 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processProvideLocalInfo(cmdDet, ctlvs); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case OPEN_CHANNEL: 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CLOSE_CHANNEL: 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RECEIVE_DATA: 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DATA: 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processBIPClient(cmdDet, ctlvs); 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // unsupported proactive commands 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "make: caught ResultException e=" + e); 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(e.result()); 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!cmdPending) { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.OK); 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case MSG_ID_LOAD_ICON_DONE: 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(setIcons(msg.obj)); 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ResultCode setIcons(Object data) { 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Bitmap[] icons = null; 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int iconIndex = 0; 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (data == null) { 214deb8ccd0fbeae2b2f21f8a4ccc1139a79cccc71ejangeon.kim return ResultCode.OK; 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon((Bitmap) data); 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville icons = (Bitmap[]) data; 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // set each item icon. 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Bitmap icon : icons) { 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon(icon); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ResultCode.OK; 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void sendCmdParams(ResultCode resCode) { 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller.sendMsgParamsDecoded(resCode, mCmdParams); 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for a COMPREHENSION-TLV object with the given tag from a list 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects used to search in 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForTag(ComprehensionTlvTag tag, 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return searchForNextTag(tag, iter); 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for the next COMPREHENSION-TLV object with the given tag from a 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list iterated by {@code iter}. {@code iter} points to the object next to 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the found object when this method returns. Used for searching the same 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list for similar tags, usually item id. 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param iter Iterator for ComprehensionTlv objects used for search 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForNextTag(ComprehensionTlvTag tag, 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter) { 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int tagValue = tag.value(); 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (iter.hasNext()) { 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = iter.next(); 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getTag() == tagValue) { 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ctlv; 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes DISPLAY_TEXT proactive command from the SIM card. 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processDisplayText(CommandDetails cmdDet, 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process DisplayText"); 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If the tlv object doesn't exist or the it is a null object reply 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with command not understood. 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (textMsg.text == null) { 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.IMMEDIATE_RESPONSE, ctlvs); 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.duration = ValueParser.retrieveDuration(ctlv); 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Parse command qualifier parameters. 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.isHighPriority = (cmdDet.commandQualifier & 0x01) != 0; 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.userClear = (cmdDet.commandQualifier & 0x80) != 0; 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card. 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetUpIdleModeText(CommandDetails cmdDet, 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetUpIdleModeText"); 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // load icons only when text exist. 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (textMsg.text != null) { 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INKEY proactive command from the SIM card. 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInkey(CommandDetails cmdDet, 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInkey"); 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse duration 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.duration = ValueParser.retrieveDuration(ctlv); 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = 1; 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = 1; 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.yesNo = (cmdDet.commandQualifier & 0x04) != 0; 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = true; 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INPUT proactive command from the SIM card. 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInput(CommandDetails cmdDet, 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInput"); 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.RESPONSE_LENGTH, ctlvs); 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = rawValue[valueIndex] & 0xff; 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = rawValue[valueIndex + 1] & 0xff; 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DEFAULT_TEXT, ctlvs); 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.defaultText = ValueParser.retrieveTextString(ctlv); 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = (cmdDet.commandQualifier & 0x04) == 0; 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.packed = (cmdDet.commandQualifier & 0x08) != 0; 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes REFRESH proactive command from the SIM card. 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processRefresh(CommandDetails cmdDet, 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process Refresh"); 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // REFRESH proactive command is rerouted by the baseband and handled by 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the telephony layer. IDLE TEXT should be removed for a REFRESH command 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with "initialization" or "reset" 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE: 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FILE_CHANGE: 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT: 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_UICC_RESET: 5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, null); 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SELECT_ITEM proactive command from the SIM card. 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSelectItem(CommandDetails cmdDet, 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SelectItem"); 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Menu menu = new Menu(); 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId titleIconId = null; 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ItemsIconId itemsIconId = null; 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.title = ValueParser.retrieveAlphaId(ctlv); 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (true) { 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ITEM, iter); 5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.items.add(ValueParser.retrieveItem(ctlv)); 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We must have at least one menu item. 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (menu.items.size() == 0) { 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ID, ctlvs); 5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // CAT items are listed 1...n while list start at 0, need to 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // subtract one. 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.defaultItem = ValueParser.retrieveItemId(ctlv) - 1; 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville titleIconId = ValueParser.retrieveIconId(ctlv); 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.titleIconSelfExplanatory = titleIconId.selfExplanatory; 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ICON_ID_LIST, ctlvs); 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville itemsIconId = ValueParser.retrieveItemsIconId(ctlv); 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.itemsIconSelfExplanatory = itemsIconId.selfExplanatory; 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean presentTypeSpecified = (cmdDet.commandQualifier & 0x01) != 0; 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (presentTypeSpecified) { 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((cmdDet.commandQualifier & 0x02) == 0) { 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.DATA_VALUES; 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.NAVIGATION_OPTIONS; 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.softKeyPreferred = (cmdDet.commandQualifier & 0x04) != 0; 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new SelectItemParams(cmdDet, menu, titleIconId != null); 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Load icons data if needed. 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_NO_ICON: 6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(titleIconId.recordNumber, this 6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = itemsIconId.recordNumbers; 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (titleIconId != null) { 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a new array for all the icons (title and items). 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers = new int[itemsIconId.recordNumbers.length + 1]; 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = titleIconId.recordNumber; 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(itemsIconId.recordNumbers, 0, recordNumbers, 6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1, itemsIconId.recordNumbers.length); 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes EVENT_NOTIFY message from baseband. 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processEventNotify(CommandDetails cmdDet, 6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process EventNotify"); 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes LAUNCH_BROWSER proactive command from the SIM card. 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processLaunchBrowser(CommandDetails cmdDet, 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process LaunchBrowser"); 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String url = null; 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.URL, ctlvs); 6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueLen = ctlv.getLength(); 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (valueLen > 0) { 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = GsmAlphabet.gsm8BitUnpackedToString(rawValue, 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville valueIndex, valueLen); 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = null; 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier. 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = iconId.selfExplanatory; 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse command qualifier value. 7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LaunchBrowserMode mode; 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x00: 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_IF_NOT_ALREADY_LAUNCHED; 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x02: 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.USE_EXISTING_BROWSER; 7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x03: 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_NEW_BROWSER; 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new LaunchBrowserParams(cmdDet, confirmMsg, url, mode); 7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes PLAY_TONE proactive command from the SIM card. 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required.t 7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processPlayTone(CommandDetails cmdDet, 7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process PlayTone"); 7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Tone tone = null; 7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Duration duration = null; 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TONE, ctlvs); 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Nothing to do for null objects. 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getLength() > 0) { 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int toneVal = rawValue[valueIndex]; 7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tone = Tone.fromInt(toneVal); 7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException( 7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ResultCode.CMD_DATA_NOT_UNDERSTOOD); 7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville duration = ValueParser.retrieveDuration(ctlv); 7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean vibrate = (cmdDet.commandQualifier & 0x01) != 0x00; 7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new PlayToneParams(cmdDet, textMsg, tone, duration, vibrate); 7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SETUP_CALL proactive command from the SIM card. 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details object retrieved from the proactive command 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object 8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetupCall(CommandDetails cmdDet, 8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetupCall"); 8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // User confirmation phase message. 8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Call set up phase message. 8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage callMsg = new TextMessage(); 8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId confirmIconId = null; 8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId callIconId = null; 8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get confirmation message string. 8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmIconId = ValueParser.retrieveIconId(ctlv); 8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = confirmIconId.selfExplanatory; 8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get call set up message string. 8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.text = ValueParser.retrieveAlphaId(ctlv); 8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIconId = ValueParser.retrieveIconId(ctlv); 8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.iconSelfExplanatory = callIconId.selfExplanatory; 8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CallSetupParams(cmdDet, confirmMsg, callMsg); 8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (confirmIconId != null || callIconId != null) { 8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = new int[2]; 8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = confirmIconId != null 8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? confirmIconId.recordNumber : -1; 8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[1] = callIconId != null ? callIconId.recordNumber 8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : -1; 8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processProvideLocalInfo(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) 8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process ProvideLocalInfo"); 8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DTTZ_SETTING: 8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [DTTZ_SETTING]"); 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LANGUAGE_SETTING: 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [LANGUAGE_SETTING]"); 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI[" + cmdDet.commandQualifier + "] Command Not Supported"); 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.BEYOND_TERMINAL_CAPABILITY); 8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processBIPClient(CommandDetails cmdDet, 8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType commandType = 8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType.fromInt(cmdDet.typeOfCommand); 8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (commandType != null) { 8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process "+ commandType.name()); 8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean has_alpha_id = false; 8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "alpha TLV text=" + textMsg.text); 9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville has_alpha_id = true; 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new BIPClientParams(cmdDet, textMsg, has_alpha_id); 9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 91922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIconLoader.loadIcon(iconId.recordNumber, obtainMessage(MSG_ID_LOAD_ICON_DONE)); 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 925