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; 28734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahujaimport static com.android.internal.telephony.cat.CatCmdMessage. 29734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja SetupEventListConstants.USER_ACTIVITY_EVENT; 30734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahujaimport static com.android.internal.telephony.cat.CatCmdMessage. 31734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja SetupEventListConstants.IDLE_SCREEN_AVAILABLE_EVENT; 32734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahujaimport static com.android.internal.telephony.cat.CatCmdMessage. 33734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja SetupEventListConstants.LANGUAGE_SELECTION_EVENT; 34734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahujaimport static com.android.internal.telephony.cat.CatCmdMessage. 35734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja SetupEventListConstants.BROWSER_TERMINATION_EVENT; 36734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahujaimport static com.android.internal.telephony.cat.CatCmdMessage. 37734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja SetupEventListConstants.BROWSING_STATUS_EVENT; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Factory class, used for decoding raw byte arrays, received from baseband, 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * into a CommandParams object. 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass CommandParamsFactory extends Handler { 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static CommandParamsFactory sInstance = null; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private IconLoader mIconLoader; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandParams mCmdParams = null; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private int mIconLoadState = LOAD_NO_ICON; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private RilMessageDecoder mCaller = null; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // constants 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MSG_ID_LOAD_ICON_DONE = 1; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // loading icons state parameters. 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_NO_ICON = 0; 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_SINGLE_ICON = 1; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_MULTI_ICONS = 2; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for refresh command 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE = 0x00; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FILE_CHANGE = 0x02; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT = 0x03; 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_UICC_RESET = 0x04; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for PLI command 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int DTTZ_SETTING = 0x03; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LANGUAGE_SETTING = 0x04; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // As per TS 102.223 Annex C, Structure of CAT communications, 6933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // the APDU length can be max 255 bytes. This leaves only 239 bytes for user 7033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // input string. CMD details TLV + Device IDs TLV + Result TLV + Other 7133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // details of TextString TLV not including user input take 16 bytes. 7233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 7333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // If UCS2 encoding is used, maximum 118 UCS2 chars can be encoded in 238 bytes. 7433a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // Each UCS2 char takes 2 bytes. Byte Order Mask(BOM), 0xFEFF takes 2 bytes. 7533a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 7633a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // If GSM 7 bit default(use 8 bits to represent a 7 bit char) format is used, 7733a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // maximum 239 chars can be encoded in 239 bytes since each char takes 1 byte. 7833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 7933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // No issues for GSM 7 bit packed format encoding. 8033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 8133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja private static final int MAX_GSM7_DEFAULT_CHARS = 239; 8233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja private static final int MAX_UCS2_CHARS = 118; 8333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IccFileHandler fh) { 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sInstance != null) { 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sInstance; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (fh != null) { 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new CommandParamsFactory(caller, fh); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandParamsFactory(RilMessageDecoder caller, IccFileHandler fh) { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller = caller; 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader = IconLoader.getInstance(this, fh); 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandDetails processCommandDetails(List<ComprehensionTlv> ctlvs) { 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = null; 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvs != null) { 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Search for the Command Details object. 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlvCmdDet = searchForTag( 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlvTag.COMMAND_DETAILS, ctlvs); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvCmdDet != null) { 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdDet = ValueParser.retrieveCommandDetails(ctlvCmdDet); 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "processCommandDetails: Failed to procees command details e=" + e); 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return cmdDet; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void make(BerTlv berTlv) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv == null) { 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // reset global state parameters. 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = null; 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_NO_ICON; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // only proactive command messages are processed. 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv.getTag() != BerTlv.BER_PROACTIVE_COMMAND_TAG) { 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean cmdPending = false; 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs = berTlv.getComprehensionTlvs(); 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // process command dtails from the tlv list. 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = processCommandDetails(ctlvs); 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdDet == null) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // extract command type enumeration from the raw value stored inside 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the Command Details object. 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType cmdType = AppInterface.CommandType 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .fromInt(cmdDet.typeOfCommand); 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdType == null) { 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This PROACTIVE COMMAND is presently not handled. Hence set 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // result code as BEYOND_TERMINAL_CAPABILITY in TR. 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1529edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang // proactive command length is incorrect. 1539edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang if (!berTlv.isLengthValid()) { 1549edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang mCmdParams = new CommandParams(cmdDet); 1559edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang sendCmdParams(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 1569edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang return; 1579edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang } 1589edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdType) { 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_MENU: 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SELECT_ITEM: 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DISPLAY_TEXT: 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processDisplayText(cmdDet, ctlvs); 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_IDLE_MODE_TEXT: 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetUpIdleModeText(cmdDet, ctlvs); 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INKEY: 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInkey(cmdDet, ctlvs); 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INPUT: 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInput(cmdDet, ctlvs); 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DTMF: 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SMS: 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SS: 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_USSD: 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processEventNotify(cmdDet, ctlvs); 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 18586968438e444728053137c764cc37cf9c0a15d16Siddartha Pothapragada case GET_CHANNEL_STATUS: 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_CALL: 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetupCall(cmdDet, ctlvs); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH: 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processRefresh(cmdDet, ctlvs); 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = false; 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LAUNCH_BROWSER: 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processLaunchBrowser(cmdDet, ctlvs); 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PLAY_TONE: 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processPlayTone(cmdDet, ctlvs); 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 199734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case SET_UP_EVENT_LIST: 200734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja cmdPending = processSetUpEventList(cmdDet, ctlvs); 201734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PROVIDE_LOCAL_INFORMATION: 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processProvideLocalInfo(cmdDet, ctlvs); 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case OPEN_CHANNEL: 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CLOSE_CHANNEL: 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RECEIVE_DATA: 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DATA: 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processBIPClient(cmdDet, ctlvs); 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // unsupported proactive commands 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "make: caught ResultException e=" + e); 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(e.result()); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!cmdPending) { 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.OK); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case MSG_ID_LOAD_ICON_DONE: 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(setIcons(msg.obj)); 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ResultCode setIcons(Object data) { 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Bitmap[] icons = null; 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int iconIndex = 0; 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (data == null) { 242deb8ccd0fbeae2b2f21f8a4ccc1139a79cccc71ejangeon.kim return ResultCode.OK; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon((Bitmap) data); 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville icons = (Bitmap[]) data; 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // set each item icon. 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Bitmap icon : icons) { 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon(icon); 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ResultCode.OK; 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void sendCmdParams(ResultCode resCode) { 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller.sendMsgParamsDecoded(resCode, mCmdParams); 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for a COMPREHENSION-TLV object with the given tag from a list 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects used to search in 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForTag(ComprehensionTlvTag tag, 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return searchForNextTag(tag, iter); 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for the next COMPREHENSION-TLV object with the given tag from a 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list iterated by {@code iter}. {@code iter} points to the object next to 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the found object when this method returns. Used for searching the same 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list for similar tags, usually item id. 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param iter Iterator for ComprehensionTlv objects used for search 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForNextTag(ComprehensionTlvTag tag, 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter) { 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int tagValue = tag.value(); 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (iter.hasNext()) { 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = iter.next(); 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getTag() == tagValue) { 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ctlv; 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes DISPLAY_TEXT proactive command from the SIM card. 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processDisplayText(CommandDetails cmdDet, 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process DisplayText"); 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If the tlv object doesn't exist or the it is a null object reply 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with command not understood. 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (textMsg.text == null) { 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.IMMEDIATE_RESPONSE, ctlvs); 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.duration = ValueParser.retrieveDuration(ctlv); 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Parse command qualifier parameters. 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.isHighPriority = (cmdDet.commandQualifier & 0x01) != 0; 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.userClear = (cmdDet.commandQualifier & 0x80) != 0; 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card. 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetUpIdleModeText(CommandDetails cmdDet, 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetUpIdleModeText"); 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // load icons only when text exist. 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (textMsg.text != null) { 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INKEY proactive command from the SIM card. 4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInkey(CommandDetails cmdDet, 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInkey"); 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse duration 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.duration = ValueParser.retrieveDuration(ctlv); 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = 1; 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = 1; 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.yesNo = (cmdDet.commandQualifier & 0x04) != 0; 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = true; 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INPUT proactive command from the SIM card. 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInput(CommandDetails cmdDet, 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInput"); 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.RESPONSE_LENGTH, ctlvs); 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = rawValue[valueIndex] & 0xff; 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = rawValue[valueIndex + 1] & 0xff; 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DEFAULT_TEXT, ctlvs); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.defaultText = ValueParser.retrieveTextString(ctlv); 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = (cmdDet.commandQualifier & 0x04) == 0; 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.packed = (cmdDet.commandQualifier & 0x08) != 0; 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 51833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // Truncate the maxLen if it exceeds the max number of chars that can 51933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // be encoded. Limit depends on DCS in Command Qualifier. 52033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja if (input.ucs2 && input.maxLen > MAX_UCS2_CHARS) { 52133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja CatLog.d(this, "UCS2: received maxLen = " + input.maxLen + 52233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja ", truncating to " + MAX_UCS2_CHARS); 52333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja input.maxLen = MAX_UCS2_CHARS; 52433a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja } else if (!input.packed && input.maxLen > MAX_GSM7_DEFAULT_CHARS) { 52533a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja CatLog.d(this, "GSM 7Bit Default: received maxLen = " + input.maxLen + 52633a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja ", truncating to " + MAX_GSM7_DEFAULT_CHARS); 52733a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja input.maxLen = MAX_GSM7_DEFAULT_CHARS; 52833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja } 52933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes REFRESH proactive command from the SIM card. 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processRefresh(CommandDetails cmdDet, 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process Refresh"); 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // REFRESH proactive command is rerouted by the baseband and handled by 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the telephony layer. IDLE TEXT should be removed for a REFRESH command 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with "initialization" or "reset" 5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE: 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FILE_CHANGE: 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT: 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_UICC_RESET: 5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, null); 5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SELECT_ITEM proactive command from the SIM card. 5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSelectItem(CommandDetails cmdDet, 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SelectItem"); 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Menu menu = new Menu(); 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId titleIconId = null; 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ItemsIconId itemsIconId = null; 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.title = ValueParser.retrieveAlphaId(ctlv); 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (true) { 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ITEM, iter); 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.items.add(ValueParser.retrieveItem(ctlv)); 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We must have at least one menu item. 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (menu.items.size() == 0) { 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ID, ctlvs); 6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // CAT items are listed 1...n while list start at 0, need to 6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // subtract one. 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.defaultItem = ValueParser.retrieveItemId(ctlv) - 1; 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville titleIconId = ValueParser.retrieveIconId(ctlv); 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.titleIconSelfExplanatory = titleIconId.selfExplanatory; 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ICON_ID_LIST, ctlvs); 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville itemsIconId = ValueParser.retrieveItemsIconId(ctlv); 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.itemsIconSelfExplanatory = itemsIconId.selfExplanatory; 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean presentTypeSpecified = (cmdDet.commandQualifier & 0x01) != 0; 6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (presentTypeSpecified) { 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((cmdDet.commandQualifier & 0x02) == 0) { 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.DATA_VALUES; 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.NAVIGATION_OPTIONS; 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.softKeyPreferred = (cmdDet.commandQualifier & 0x04) != 0; 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new SelectItemParams(cmdDet, menu, titleIconId != null); 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Load icons data if needed. 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_NO_ICON: 6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(titleIconId.recordNumber, this 6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = itemsIconId.recordNumbers; 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (titleIconId != null) { 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a new array for all the icons (title and items). 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers = new int[itemsIconId.recordNumbers.length + 1]; 6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = titleIconId.recordNumber; 6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(itemsIconId.recordNumbers, 0, recordNumbers, 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1, itemsIconId.recordNumbers.length); 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes EVENT_NOTIFY message from baseband. 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 */ 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processEventNotify(CommandDetails cmdDet, 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process EventNotify"); 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 705734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * Processes SET_UP_EVENT_LIST proactive command from the SIM card. 706734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * 707734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @param cmdDet Command Details object retrieved. 708734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @param ctlvs List of ComprehensionTlv objects following Command Details 709734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * object and Device Identities object within the proactive command 710734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @return false. This function always returns false meaning that the command 711734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * processing is not pending and additional asynchronous processing 712734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * is not required. 713734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja */ 714734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja private boolean processSetUpEventList(CommandDetails cmdDet, 715734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja List<ComprehensionTlv> ctlvs) { 716734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 717734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja CatLog.d(this, "process SetUpEventList"); 718734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.EVENT_LIST, ctlvs); 719734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja if (ctlv != null) { 720734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja try { 721734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja byte[] rawValue = ctlv.getRawValue(); 722734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int valueIndex = ctlv.getValueIndex(); 723734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int valueLen = ctlv.getLength(); 724734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int[] eventList = new int[valueLen]; 725734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int eventValue = -1; 726734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int i = 0; 727734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja while (valueLen > 0) { 728734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja eventValue = rawValue[valueIndex] & 0xff; 729734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja valueIndex++; 730734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja valueLen--; 731734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 732734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja switch (eventValue) { 733734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case USER_ACTIVITY_EVENT: 734734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case IDLE_SCREEN_AVAILABLE_EVENT: 735734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case LANGUAGE_SELECTION_EVENT: 736734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case BROWSER_TERMINATION_EVENT: 737734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case BROWSING_STATUS_EVENT: 738734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja eventList[i] = eventValue; 739734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja i++; 740734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 741734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja default: 742734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 743734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 744734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 745734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 746734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja mCmdParams = new SetEventListParams(cmdDet, eventList); 747734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } catch (IndexOutOfBoundsException e) { 748734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja CatLog.e(this, " IndexOutofBoundException in processSetUpEventList"); 749734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 750734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 751734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja return false; 752734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 753734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 754734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja /** 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes LAUNCH_BROWSER proactive command from the SIM card. 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processLaunchBrowser(CommandDetails cmdDet, 7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process LaunchBrowser"); 7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String url = null; 7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.URL, ctlvs); 7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueLen = ctlv.getLength(); 7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (valueLen > 0) { 7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = GsmAlphabet.gsm8BitUnpackedToString(rawValue, 7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville valueIndex, valueLen); 7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = null; 7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier. 7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = iconId.selfExplanatory; 7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse command qualifier value. 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LaunchBrowserMode mode; 8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x00: 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_IF_NOT_ALREADY_LAUNCHED; 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x02: 8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.USE_EXISTING_BROWSER; 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x03: 8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_NEW_BROWSER; 8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new LaunchBrowserParams(cmdDet, confirmMsg, url, mode); 8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes PLAY_TONE proactive command from the SIM card. 8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required.t 8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processPlayTone(CommandDetails cmdDet, 8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process PlayTone"); 8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Tone tone = null; 8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Duration duration = null; 8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TONE, ctlvs); 8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Nothing to do for null objects. 8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getLength() > 0) { 8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int toneVal = rawValue[valueIndex]; 8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tone = Tone.fromInt(toneVal); 8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException( 8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ResultCode.CMD_DATA_NOT_UNDERSTOOD); 8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville duration = ValueParser.retrieveDuration(ctlv); 8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean vibrate = (cmdDet.commandQualifier & 0x01) != 0x00; 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new PlayToneParams(cmdDet, textMsg, tone, duration, vibrate); 8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SETUP_CALL proactive command from the SIM card. 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details object retrieved from the proactive command 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object 8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetupCall(CommandDetails cmdDet, 9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetupCall"); 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // User confirmation phase message. 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Call set up phase message. 9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage callMsg = new TextMessage(); 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId confirmIconId = null; 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId callIconId = null; 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get confirmation message string. 9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmIconId = ValueParser.retrieveIconId(ctlv); 9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = confirmIconId.selfExplanatory; 9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get call set up message string. 9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.text = ValueParser.retrieveAlphaId(ctlv); 9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIconId = ValueParser.retrieveIconId(ctlv); 9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.iconSelfExplanatory = callIconId.selfExplanatory; 9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CallSetupParams(cmdDet, confirmMsg, callMsg); 9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (confirmIconId != null || callIconId != null) { 9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = new int[2]; 9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = confirmIconId != null 9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? confirmIconId.recordNumber : -1; 9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[1] = callIconId != null ? callIconId.recordNumber 9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : -1; 9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processProvideLocalInfo(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) 9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process ProvideLocalInfo"); 9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DTTZ_SETTING: 9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [DTTZ_SETTING]"); 9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LANGUAGE_SETTING: 9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [LANGUAGE_SETTING]"); 9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI[" + cmdDet.commandQualifier + "] Command Not Supported"); 9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.BEYOND_TERMINAL_CAPABILITY); 9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processBIPClient(CommandDetails cmdDet, 9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType commandType = 9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType.fromInt(cmdDet.typeOfCommand); 9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (commandType != null) { 9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process "+ commandType.name()); 9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean has_alpha_id = false; 9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "alpha TLV text=" + textMsg.text); 9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville has_alpha_id = true; 9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new BIPClientParams(cmdDet, textMsg, has_alpha_id); 10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 100822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIconLoader.loadIcon(iconId.recordNumber, obtainMessage(MSG_ID_LOAD_ICON_DONE)); 10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1013eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta 1014eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta public void dispose() { 1015eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mIconLoader.dispose(); 1016eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mIconLoader = null; 1017eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mCmdParams = null; 1018eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mCaller = null; 1019eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta sInstance = null; 1020eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta } 10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1022