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; 495767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja private boolean mloadIcon = false; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // constants 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int MSG_ID_LOAD_ICON_DONE = 1; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // loading icons state parameters. 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_NO_ICON = 0; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_SINGLE_ICON = 1; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LOAD_MULTI_ICONS = 2; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for refresh command 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE = 0x00; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT_AND_FILE_CHANGE = 0x02; 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_NAA_INIT = 0x03; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int REFRESH_UICC_RESET = 0x04; 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Command Qualifier values for PLI command 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int DTTZ_SETTING = 0x03; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static final int LANGUAGE_SETTING = 0x04; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // As per TS 102.223 Annex C, Structure of CAT communications, 7033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // the APDU length can be max 255 bytes. This leaves only 239 bytes for user 7133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // input string. CMD details TLV + Device IDs TLV + Result TLV + Other 7233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // details of TextString TLV not including user input take 16 bytes. 7333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 7433a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // If UCS2 encoding is used, maximum 118 UCS2 chars can be encoded in 238 bytes. 7533a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // Each UCS2 char takes 2 bytes. Byte Order Mask(BOM), 0xFEFF takes 2 bytes. 7633a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 7733a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // If GSM 7 bit default(use 8 bits to represent a 7 bit char) format is used, 7833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // maximum 239 chars can be encoded in 239 bytes since each char takes 1 byte. 7933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // 8033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // No issues for GSM 7 bit packed format encoding. 8133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 8233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja private static final int MAX_GSM7_DEFAULT_CHARS = 239; 8333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja private static final int MAX_UCS2_CHARS = 118; 8433a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller, 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IccFileHandler fh) { 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (sInstance != null) { 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return sInstance; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (fh != null) { 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return new CommandParamsFactory(caller, fh); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandParamsFactory(RilMessageDecoder caller, IccFileHandler fh) { 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller = caller; 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader = IconLoader.getInstance(this, fh); 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CommandDetails processCommandDetails(List<ComprehensionTlv> ctlvs) { 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = null; 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvs != null) { 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Search for the Command Details object. 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlvCmdDet = searchForTag( 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlvTag.COMMAND_DETAILS, ctlvs); 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlvCmdDet != null) { 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdDet = ValueParser.retrieveCommandDetails(ctlvCmdDet); 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "processCommandDetails: Failed to procees command details e=" + e); 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return cmdDet; 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void make(BerTlv berTlv) { 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv == null) { 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // reset global state parameters. 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = null; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_NO_ICON; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // only proactive command messages are processed. 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (berTlv.getTag() != BerTlv.BER_PROACTIVE_COMMAND_TAG) { 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean cmdPending = false; 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs = berTlv.getComprehensionTlvs(); 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // process command dtails from the tlv list. 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandDetails cmdDet = processCommandDetails(ctlvs); 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdDet == null) { 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // extract command type enumeration from the raw value stored inside 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the Command Details object. 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType cmdType = AppInterface.CommandType 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .fromInt(cmdDet.typeOfCommand); 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cmdType == null) { 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This PROACTIVE COMMAND is presently not handled. Hence set 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // result code as BEYOND_TERMINAL_CAPABILITY in TR. 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1539edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang // proactive command length is incorrect. 1549edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang if (!berTlv.isLengthValid()) { 1559edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang mCmdParams = new CommandParams(cmdDet); 1569edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang sendCmdParams(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 1579edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang return; 1589edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang } 1599edadf11a7ac700a529f49e46822e2983ed551e4Sanny Shang 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdType) { 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_MENU: 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SELECT_ITEM: 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSelectItem(cmdDet, ctlvs); 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DISPLAY_TEXT: 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processDisplayText(cmdDet, ctlvs); 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_IDLE_MODE_TEXT: 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetUpIdleModeText(cmdDet, ctlvs); 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INKEY: 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInkey(cmdDet, ctlvs); 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case GET_INPUT: 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processGetInput(cmdDet, ctlvs); 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DTMF: 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SMS: 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_SS: 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_USSD: 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processEventNotify(cmdDet, ctlvs); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 18686968438e444728053137c764cc37cf9c0a15d16Siddartha Pothapragada case GET_CHANNEL_STATUS: 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SET_UP_CALL: 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processSetupCall(cmdDet, ctlvs); 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH: 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processRefresh(cmdDet, ctlvs); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = false; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LAUNCH_BROWSER: 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processLaunchBrowser(cmdDet, ctlvs); 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PLAY_TONE: 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processPlayTone(cmdDet, ctlvs); 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 200734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case SET_UP_EVENT_LIST: 201734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja cmdPending = processSetUpEventList(cmdDet, ctlvs); 202734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case PROVIDE_LOCAL_INFORMATION: 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processProvideLocalInfo(cmdDet, ctlvs); 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case OPEN_CHANNEL: 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CLOSE_CHANNEL: 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case RECEIVE_DATA: 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SEND_DATA: 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cmdPending = processBIPClient(cmdDet, ctlvs); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // unsupported proactive commands 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY); 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (ResultException e) { 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "make: caught ResultException e=" + e); 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(e.result()); 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!cmdPending) { 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendCmdParams(ResultCode.OK); 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage(Message msg) { 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case MSG_ID_LOAD_ICON_DONE: 23314009be9dc7f52a92cb6d3c195058c9ee120239cSandeep Gutta if (mIconLoader != null) { 23414009be9dc7f52a92cb6d3c195058c9ee120239cSandeep Gutta sendCmdParams(setIcons(msg.obj)); 23514009be9dc7f52a92cb6d3c195058c9ee120239cSandeep Gutta } 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ResultCode setIcons(Object data) { 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Bitmap[] icons = null; 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int iconIndex = 0; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (data == null) { 2455767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja CatLog.d(this, "Optional Icon data is NULL"); 2465767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mCmdParams.mLoadIconFailed = true; 2475767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = false; 2485767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja /** In case of icon load fail consider the 2495767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja ** received proactive command as valid (sending RESULT OK) as 2505767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja ** The result code, 'PRFRMD_ICON_NOT_DISPLAYED' will be added in the 2515767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja ** terminal response by CatService/StkAppService if needed based on 2525767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja ** the value of mLoadIconFailed. 2535767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja */ 254deb8ccd0fbeae2b2f21f8a4ccc1139a79cccc71ejangeon.kim return ResultCode.OK; 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon((Bitmap) data); 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville icons = (Bitmap[]) data; 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // set each item icon. 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (Bitmap icon : icons) { 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams.setIcon(icon); 2655767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja if (icon == null && mloadIcon) { 2665767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja CatLog.d(this, "Optional Icon data is NULL while loading multi icons"); 2675767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mCmdParams.mLoadIconFailed = true; 2685767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja } 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ResultCode.OK; 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void sendCmdParams(ResultCode resCode) { 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCaller.sendMsgParamsDecoded(resCode, mCmdParams); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for a COMPREHENSION-TLV object with the given tag from a list 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects used to search in 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForTag(ComprehensionTlvTag tag, 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return searchForNextTag(tag, iter); 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Search for the next COMPREHENSION-TLV object with the given tag from a 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list iterated by {@code iter}. {@code iter} points to the object next to 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the found object when this method returns. Used for searching the same 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * list for similar tags, usually item id. 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param tag A tag to search for 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param iter Iterator for ComprehensionTlv objects used for search 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return A ComprehensionTlv object that has the tag value of {@code tag}. 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If no object is found with the tag, null is returned. 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ComprehensionTlv searchForNextTag(ComprehensionTlvTag tag, 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter) { 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int tagValue = tag.value(); 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (iter.hasNext()) { 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = iter.next(); 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getTag() == tagValue) { 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ctlv; 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes DISPLAY_TEXT proactive command from the SIM card. 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processDisplayText(CommandDetails cmdDet, 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process DisplayText"); 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If the tlv object doesn't exist or the it is a null object reply 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with command not understood. 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (textMsg.text == null) { 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.IMMEDIATE_RESPONSE, ctlvs); 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.duration = ValueParser.retrieveDuration(ctlv); 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Parse command qualifier parameters. 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.isHighPriority = (cmdDet.commandQualifier & 0x01) != 0; 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.userClear = (cmdDet.commandQualifier & 0x80) != 0; 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 3715767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card. 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetUpIdleModeText(CommandDetails cmdDet, 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetUpIdleModeText"); 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveTextString(ctlv); 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4035767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja 4045767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 4055767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja if (ctlv != null) { 4065767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja iconId = ValueParser.retrieveIconId(ctlv); 4075767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja textMsg.iconSelfExplanatory = iconId.selfExplanatory; 4085767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja } 4095767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja 4105767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja /* 4115767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja * If the tlv object doesn't contain text and the icon is not self 4125767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja * explanatory then reply with command not understood. 4135767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja */ 4145767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja 4155767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja if (textMsg.text == null && iconId != null && !textMsg.iconSelfExplanatory) { 4165767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 4215767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INKEY proactive command from the SIM card. 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInkey(CommandDetails cmdDet, 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInkey"); 4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 459b0b6604c4acdf7d5d2480e360d2a03b40e7f69aeTakeshi Shinohara input.iconSelfExplanatory = iconId.selfExplanatory; 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse duration 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.duration = ValueParser.retrieveDuration(ctlv); 4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = 1; 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = 1; 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.yesNo = (cmdDet.commandQualifier & 0x04) != 0; 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = true; 4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 4805767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes GET_INPUT proactive command from the SIM card. 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processGetInput(CommandDetails cmdDet, 5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process GetInput"); 5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Input input = new Input(); 5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING, 5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.text = ValueParser.retrieveTextString(ctlv); 5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.RESPONSE_LENGTH, ctlvs); 5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.minLen = rawValue[valueIndex] & 0xff; 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.maxLen = rawValue[valueIndex + 1] & 0xff; 5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DEFAULT_TEXT, ctlvs); 5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.defaultText = ValueParser.retrieveTextString(ctlv); 5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 537b0b6604c4acdf7d5d2480e360d2a03b40e7f69aeTakeshi Shinohara input.iconSelfExplanatory = iconId.selfExplanatory; 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0; 5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0; 5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.echo = (cmdDet.commandQualifier & 0x04) == 0; 5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.packed = (cmdDet.commandQualifier & 0x08) != 0; 5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 54633a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // Truncate the maxLen if it exceeds the max number of chars that can 54733a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja // be encoded. Limit depends on DCS in Command Qualifier. 54833a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja if (input.ucs2 && input.maxLen > MAX_UCS2_CHARS) { 54933a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja CatLog.d(this, "UCS2: received maxLen = " + input.maxLen + 55033a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja ", truncating to " + MAX_UCS2_CHARS); 55133a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja input.maxLen = MAX_UCS2_CHARS; 55233a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja } else if (!input.packed && input.maxLen > MAX_GSM7_DEFAULT_CHARS) { 55333a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja CatLog.d(this, "GSM 7Bit Default: received maxLen = " + input.maxLen + 55433a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja ", truncating to " + MAX_GSM7_DEFAULT_CHARS); 55533a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja input.maxLen = MAX_GSM7_DEFAULT_CHARS; 55633a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja } 55733a48fcaa7ae76a2bf85c5de80a5df2a2d4818c4Preeti Ahuja 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new GetInputParams(cmdDet, input); 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 5615767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes REFRESH proactive command from the SIM card. 5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processRefresh(CommandDetails cmdDet, 5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) { 5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process Refresh"); 5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // REFRESH proactive command is rerouted by the baseband and handled by 5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the telephony layer. IDLE TEXT should be removed for a REFRESH command 5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // with "initialization" or "reset" 5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE: 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT_AND_FILE_CHANGE: 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_NAA_INIT: 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case REFRESH_UICC_RESET: 5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, null); 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SELECT_ITEM proactive command from the SIM card. 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSelectItem(CommandDetails cmdDet, 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SelectItem"); 6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Menu menu = new Menu(); 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId titleIconId = null; 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ItemsIconId itemsIconId = null; 6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6167dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur AppInterface.CommandType cmdType = AppInterface.CommandType 6177dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur .fromInt(cmdDet.typeOfCommand); 6187dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.title = ValueParser.retrieveAlphaId(ctlv); 6237dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur } else if (cmdType == AppInterface.CommandType.SET_UP_MENU) { 6247dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur // According to spec ETSI TS 102 223 section 6.10.3, the 6257dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur // Alpha ID is mandatory (and also part of minimum set of 6267dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur // elements required) for SET_UP_MENU. If it is not received 6277dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur // by ME, then ME should respond with "error: missing minimum 6287dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur // information" and not "command performed successfully". 6297dd1718b87a2050d9c2f0c34809c118670bb561dMohammad Rahimpur throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (true) { 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ITEM, iter); 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.items.add(ValueParser.retrieveItem(ctlv)); 6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // We must have at least one menu item. 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (menu.items.size() == 0) { 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING); 6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ID, ctlvs); 6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // CAT items are listed 1...n while list start at 0, need to 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // subtract one. 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.defaultItem = ValueParser.retrieveItemId(ctlv) - 1; 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville titleIconId = ValueParser.retrieveIconId(ctlv); 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.titleIconSelfExplanatory = titleIconId.selfExplanatory; 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ITEM_ICON_ID_LIST, ctlvs); 6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville itemsIconId = ValueParser.retrieveItemsIconId(ctlv); 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.itemsIconSelfExplanatory = itemsIconId.selfExplanatory; 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean presentTypeSpecified = (cmdDet.commandQualifier & 0x01) != 0; 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (presentTypeSpecified) { 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((cmdDet.commandQualifier & 0x02) == 0) { 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.DATA_VALUES; 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.presentationType = PresentationType.NAVIGATION_OPTIONS; 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.softKeyPreferred = (cmdDet.commandQualifier & 0x04) != 0; 6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville menu.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0; 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new SelectItemParams(cmdDet, menu, titleIconId != null); 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Load icons data if needed. 6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mIconLoadState) { 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_NO_ICON: 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_SINGLE_ICON: 6855767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(titleIconId.recordNumber, this 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LOAD_MULTI_ICONS: 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = itemsIconId.recordNumbers; 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (titleIconId != null) { 6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Create a new array for all the icons (title and items). 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers = new int[itemsIconId.recordNumbers.length + 1]; 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = titleIconId.recordNumber; 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(itemsIconId.recordNumbers, 0, recordNumbers, 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1, itemsIconId.recordNumbers.length); 6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6985767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes EVENT_NOTIFY message from baseband. 7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processEventNotify(CommandDetails cmdDet, 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process EventNotify"); 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlvs); 7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new DisplayTextParams(cmdDet, textMsg); 7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 7375767ae41f516736b666062091d4f1948eccca8f4Preeti Ahuja mloadIcon = true; 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 747734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * Processes SET_UP_EVENT_LIST proactive command from the SIM card. 748734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * 749734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @param cmdDet Command Details object retrieved. 750734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @param ctlvs List of ComprehensionTlv objects following Command Details 751734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * object and Device Identities object within the proactive command 752734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * @return false. This function always returns false meaning that the command 753734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * processing is not pending and additional asynchronous processing 754734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja * is not required. 755734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja */ 756734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja private boolean processSetUpEventList(CommandDetails cmdDet, 757734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja List<ComprehensionTlv> ctlvs) { 758734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 759734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja CatLog.d(this, "process SetUpEventList"); 760734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.EVENT_LIST, ctlvs); 761734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja if (ctlv != null) { 762734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja try { 763734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja byte[] rawValue = ctlv.getRawValue(); 764734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int valueIndex = ctlv.getValueIndex(); 765734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int valueLen = ctlv.getLength(); 766734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int[] eventList = new int[valueLen]; 767734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int eventValue = -1; 768734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja int i = 0; 769734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja while (valueLen > 0) { 770734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja eventValue = rawValue[valueIndex] & 0xff; 771734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja valueIndex++; 772734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja valueLen--; 773734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 774734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja switch (eventValue) { 775734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case USER_ACTIVITY_EVENT: 776734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case IDLE_SCREEN_AVAILABLE_EVENT: 777734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case LANGUAGE_SELECTION_EVENT: 778734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case BROWSER_TERMINATION_EVENT: 779734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja case BROWSING_STATUS_EVENT: 780734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja eventList[i] = eventValue; 781734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja i++; 782734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 783734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja default: 784734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja break; 785734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 786734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 787734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 788734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja mCmdParams = new SetEventListParams(cmdDet, eventList); 789734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } catch (IndexOutOfBoundsException e) { 790734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja CatLog.e(this, " IndexOutofBoundException in processSetUpEventList"); 791734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 792734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 793734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja return false; 794734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja } 795734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja 796734900afa3a8e35d3a75786dc59f91b6f3136157Preeti Ahuja /** 7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes LAUNCH_BROWSER proactive command from the SIM card. 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processLaunchBrowser(CommandDetails cmdDet, 8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process LaunchBrowser"); 8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String url = null; 8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.URL, ctlvs); 8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueLen = ctlv.getLength(); 8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (valueLen > 0) { 8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = GsmAlphabet.gsm8BitUnpackedToString(rawValue, 8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville valueIndex, valueLen); 8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville url = null; 8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD); 8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier. 8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = iconId.selfExplanatory; 8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse command qualifier value. 8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville LaunchBrowserMode mode; 8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x00: 8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_IF_NOT_ALREADY_LAUNCHED; 8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x02: 8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.USE_EXISTING_BROWSER; 8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case 0x03: 8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mode = LaunchBrowserMode.LAUNCH_NEW_BROWSER; 8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new LaunchBrowserParams(cmdDet, confirmMsg, url, mode); 8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes PLAY_TONE proactive command from the SIM card. 8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details container object. 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required.t 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @throws ResultException 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processPlayTone(CommandDetails cmdDet, 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process PlayTone"); 8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Tone tone = null; 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Duration duration = null; 8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TONE, ctlvs); 8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Nothing to do for null objects. 8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv.getLength() > 0) { 8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] rawValue = ctlv.getRawValue(); 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int valueIndex = ctlv.getValueIndex(); 8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int toneVal = rawValue[valueIndex]; 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville tone = Tone.fromInt(toneVal); 8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (IndexOutOfBoundsException e) { 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException( 9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ResultCode.CMD_DATA_NOT_UNDERSTOOD); 9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse tone duration 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs); 9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville duration = ValueParser.retrieveDuration(ctlv); 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean vibrate = (cmdDet.commandQualifier & 0x01) != 0x00; 9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new PlayToneParams(cmdDet, textMsg, tone, duration, vibrate); 9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcon(iconId.recordNumber, this 9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Processes SETUP_CALL proactive command from the SIM card. 9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param cmdDet Command Details object retrieved from the proactive command 9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object 9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param ctlvs List of ComprehensionTlv objects following Command Details 9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * object and Device Identities object within the proactive command 9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if the command is processing is pending and additional 9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * asynchronous processing is required. 9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processSetupCall(CommandDetails cmdDet, 9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process SetupCall"); 9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Iterator<ComprehensionTlv> iter = ctlvs.iterator(); 9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // User confirmation phase message. 9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage confirmMsg = new TextMessage(); 9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Call set up phase message. 9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage callMsg = new TextMessage(); 9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId confirmIconId = null; 9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId callIconId = null; 9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get confirmation message string. 9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.text = ValueParser.retrieveAlphaId(ctlv); 9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmIconId = ValueParser.retrieveIconId(ctlv); 9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville confirmMsg.iconSelfExplanatory = confirmIconId.selfExplanatory; 9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // get call set up message string. 9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter); 9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.text = ValueParser.retrieveAlphaId(ctlv); 9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIconId = ValueParser.retrieveIconId(ctlv); 9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callMsg.iconSelfExplanatory = callIconId.selfExplanatory; 9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CallSetupParams(cmdDet, confirmMsg, callMsg); 9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (confirmIconId != null || callIconId != null) { 9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_MULTI_ICONS; 9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int[] recordNumbers = new int[2]; 9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[0] = confirmIconId != null 9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ? confirmIconId.recordNumber : -1; 9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville recordNumbers[1] = callIconId != null ? callIconId.recordNumber 9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : -1; 9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoader.loadIcons(recordNumbers, this 9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville .obtainMessage(MSG_ID_LOAD_ICON_DONE)); 9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processProvideLocalInfo(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs) 9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throws ResultException { 9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process ProvideLocalInfo"); 10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (cmdDet.commandQualifier) { 10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DTTZ_SETTING: 10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [DTTZ_SETTING]"); 10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case LANGUAGE_SETTING: 10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI [LANGUAGE_SETTING]"); 10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "PLI[" + cmdDet.commandQualifier + "] Command Not Supported"); 10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new CommandParams(cmdDet); 10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new ResultException(ResultCode.BEYOND_TERMINAL_CAPABILITY); 10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean processBIPClient(CommandDetails cmdDet, 10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville List<ComprehensionTlv> ctlvs) throws ResultException { 10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType commandType = 10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AppInterface.CommandType.fromInt(cmdDet.typeOfCommand); 10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (commandType != null) { 10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "process "+ commandType.name()); 10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TextMessage textMsg = new TextMessage(); 10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IconId iconId = null; 10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ComprehensionTlv ctlv = null; 10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean has_alpha_id = false; 10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse alpha identifier 10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs); 10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.text = ValueParser.retrieveAlphaId(ctlv); 10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CatLog.d(this, "alpha TLV text=" + textMsg.text); 10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville has_alpha_id = true; 10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // parse icon identifier 10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs); 10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ctlv != null) { 10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville iconId = ValueParser.retrieveIconId(ctlv); 10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.iconSelfExplanatory = iconId.selfExplanatory; 10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville textMsg.responseNeeded = false; 10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCmdParams = new BIPClientParams(cmdDet, textMsg, has_alpha_id); 10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (iconId != null) { 10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mIconLoadState = LOAD_SINGLE_ICON; 105022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIconLoader.loadIcon(iconId.recordNumber, obtainMessage(MSG_ID_LOAD_ICON_DONE)); 10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1055eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta 1056eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta public void dispose() { 1057eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mIconLoader.dispose(); 1058eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mIconLoader = null; 1059eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mCmdParams = null; 1060eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta mCaller = null; 1061eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta sInstance = null; 1062eca4a2ab310bf8d96cf98b5e880e2f8eef7ffeb6Sandeep Gutta } 10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1064