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