19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenkapackage com.android.internal.telephony.cat;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.GsmAlphabet;
244f1244e0de634c6b7a0e67e1a7cb9bf7f914e574Alex Yakavenkaimport com.android.internal.telephony.IccFileHandler;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Factory class, used for decoding raw byte arrays, received from baseband,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into a CommandParams object.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass CommandParamsFactory extends Handler {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static CommandParamsFactory sInstance = null;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IconLoader mIconLoader;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CommandParams mCmdParams = null;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mIconLoadState = LOAD_NO_ICON;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private RilMessageDecoder mCaller = null;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // constants
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MSG_ID_LOAD_ICON_DONE = 1;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // loading icons state parameters.
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int LOAD_NO_ICON           = 0;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int LOAD_SINGLE_ICON       = 1;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int LOAD_MULTI_ICONS       = 2;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Command Qualifier values for refresh command
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE  = 0x00;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int REFRESH_NAA_INIT_AND_FILE_CHANGE       = 0x02;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int REFRESH_NAA_INIT                       = 0x03;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int REFRESH_UICC_RESET                     = 0x04;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla    // Command Qualifier values for PLI command
5638b6999d9e7f6a1193fd3105235afa2502013740Kazuhiro Ondo    static final int DTTZ_SETTING                           = 0x03;
57e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla    static final int LANGUAGE_SETTING                       = 0x04;
58e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static synchronized CommandParamsFactory getInstance(RilMessageDecoder caller,
604f1244e0de634c6b7a0e67e1a7cb9bf7f914e574Alex Yakavenka            IccFileHandler fh) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sInstance != null) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sInstance;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (fh != null) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new CommandParamsFactory(caller, fh);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
704f1244e0de634c6b7a0e67e1a7cb9bf7f914e574Alex Yakavenka    private CommandParamsFactory(RilMessageDecoder caller, IccFileHandler fh) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCaller = caller;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIconLoader = IconLoader.getInstance(this, fh);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CommandDetails processCommandDetails(List<ComprehensionTlv> ctlvs) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CommandDetails cmdDet = null;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlvs != null) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Search for the Command Details object.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComprehensionTlv ctlvCmdDet = searchForTag(
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ComprehensionTlvTag.COMMAND_DETAILS, ctlvs);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ctlvCmdDet != null) {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    cmdDet = ValueParser.retrieveCommandDetails(ctlvCmdDet);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (ResultException e) {
86a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka                    CatLog.d(this, "Failed to procees command details");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmdDet;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void make(BerTlv berTlv) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (berTlv == null) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reset global state parameters.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = null;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIconLoadState = LOAD_NO_ICON;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // only proactive command messages are processed.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (berTlv.getTag() != BerTlv.BER_PROACTIVE_COMMAND_TAG) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean cmdPending = false;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        List<ComprehensionTlv> ctlvs = berTlv.getComprehensionTlvs();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // process command dtails from the tlv list.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CommandDetails cmdDet = processCommandDetails(ctlvs);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cmdDet == null) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendCmdParams(ResultCode.CMD_TYPE_NOT_UNDERSTOOD);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // extract command type enumeration from the raw value stored inside
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the Command Details object.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AppInterface.CommandType cmdType = AppInterface.CommandType
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .fromInt(cmdDet.typeOfCommand);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cmdType == null) {
119e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            // This PROACTIVE COMMAND is presently not handled. Hence set
120e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            // result code as BEYOND_TERMINAL_CAPABILITY in TR.
121e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            mCmdParams = new CommandParams(cmdDet);
122e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (cmdType) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SET_UP_MENU:
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = processSelectItem(cmdDet, ctlvs);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SELECT_ITEM:
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = processSelectItem(cmdDet, ctlvs);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DISPLAY_TEXT:
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = processDisplayText(cmdDet, ctlvs);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SET_UP_IDLE_MODE_TEXT:
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cmdPending = processSetUpIdleModeText(cmdDet, ctlvs);
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 break;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case GET_INKEY:
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = processGetInkey(cmdDet, ctlvs);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case GET_INPUT:
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cmdPending = processGetInput(cmdDet, ctlvs);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 break;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SEND_DTMF:
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SEND_SMS:
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SEND_SS:
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SEND_USSD:
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cmdPending = processEventNotify(cmdDet, ctlvs);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 break;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case SET_UP_CALL:
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cmdPending = processSetupCall(cmdDet, ctlvs);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 break;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case REFRESH:
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                processRefresh(cmdDet, ctlvs);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = false;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case LAUNCH_BROWSER:
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 cmdPending = processLaunchBrowser(cmdDet, ctlvs);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 break;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             case PLAY_TONE:
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cmdPending = processPlayTone(cmdDet, ctlvs);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
165e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla             case PROVIDE_LOCAL_INFORMATION:
166e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                cmdPending = processProvideLocalInfo(cmdDet, ctlvs);
167e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                break;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // unsupported proactive commands
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCmdParams = new CommandParams(cmdDet);
171e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                sendCmdParams(ResultCode.BEYOND_TERMINAL_CAPABILITY);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (ResultException e) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCmdParams = new CommandParams(cmdDet);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendCmdParams(e.result());
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!cmdPending) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendCmdParams(ResultCode.OK);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MSG_ID_LOAD_ICON_DONE:
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendCmdParams(setIcons(msg.obj));
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ResultCode setIcons(Object data) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bitmap[] icons = null;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int iconIndex = 0;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ResultCode.PRFRMD_ICON_NOT_DISPLAYED;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch(mIconLoadState) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LOAD_SINGLE_ICON:
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCmdParams.setIcon((Bitmap) data);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LOAD_MULTI_ICONS:
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            icons = (Bitmap[]) data;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // set each item icon.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Bitmap icon : icons) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCmdParams.setIcon(icon);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ResultCode.OK;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void sendCmdParams(ResultCode resCode) {
216fc5b4802a544b6ca304aa7e58a26018ef714d233Wink Saville        mCaller.sendMsgParamsDecoded(resCode, mCmdParams);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Search for a COMPREHENSION-TLV object with the given tag from a list
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag A tag to search for
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects used to search in
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A ComprehensionTlv object that has the tag value of {@code tag}.
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         If no object is found with the tag, null is returned.
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComprehensionTlv searchForTag(ComprehensionTlvTag tag,
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Iterator<ComprehensionTlv> iter = ctlvs.iterator();
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return searchForNextTag(tag, iter);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Search for the next COMPREHENSION-TLV object with the given tag from a
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list iterated by {@code iter}. {@code iter} points to the object next to
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the found object when this method returns. Used for searching the same
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * list for similar tags, usually item id.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag A tag to search for
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param iter Iterator for ComprehensionTlv objects used for search
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A ComprehensionTlv object that has the tag value of {@code tag}.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         If no object is found with the tag, null is returned.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ComprehensionTlv searchForNextTag(ComprehensionTlvTag tag,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator<ComprehensionTlv> iter) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int tagValue = tag.value();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (iter.hasNext()) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ComprehensionTlv ctlv = iter.next();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ctlv.getTag() == tagValue) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return ctlv;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes DISPLAY_TEXT proactive command from the SIM card.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processDisplayText(CommandDetails cmdDet,
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs)
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws ResultException {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
272a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process DisplayText");
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage textMsg = new TextMessage();
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING,
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.text = ValueParser.retrieveTextString(ctlv);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the tlv object doesn't exist or the it is a null object reply
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // with command not understood.
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (textMsg.text == null) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.IMMEDIATE_RESPONSE, ctlvs);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.responseNeeded = false;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse icon identifier
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.iconSelfExplanatory = iconId.selfExplanatory;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse tone duration
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.duration = ValueParser.retrieveDuration(ctlv);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Parse command qualifier parameters.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textMsg.isHighPriority = (cmdDet.commandQualifier & 0x01) != 0;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textMsg.userClear = (cmdDet.commandQualifier & 0x80) != 0;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new DisplayTextParams(cmdDet, textMsg);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes SET_UP_IDLE_MODE_TEXT proactive command from the SIM card.
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processSetUpIdleModeText(CommandDetails cmdDet,
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
332a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process SetUpIdleModeText");
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage textMsg = new TextMessage();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING,
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.text = ValueParser.retrieveTextString(ctlv);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // load icons only when text exist.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (textMsg.text != null) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ctlv != null) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                iconId = ValueParser.retrieveIconId(ctlv);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                textMsg.iconSelfExplanatory = iconId.selfExplanatory;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new DisplayTextParams(cmdDet, textMsg);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes GET_INKEY proactive command from the SIM card.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processGetInkey(CommandDetails cmdDet,
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
375a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process GetInkey");
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Input input = new Input();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING,
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            input.text = ValueParser.retrieveTextString(ctlv);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse icon identifier
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
393e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        // parse duration
394e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs);
395e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        if (ctlv != null) {
396e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            input.duration = ValueParser.retrieveDuration(ctlv);
397e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        }
398e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.minLen = 1;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.maxLen = 1;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0;
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0;
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.yesNo = (cmdDet.commandQualifier & 0x04) != 0;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0;
406e81932e92a773538e1ad1ad1d4bfd8f241860c8ddujin.cha        input.echo = true;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new GetInputParams(cmdDet, input);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes GET_INPUT proactive command from the SIM card.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processGetInput(CommandDetails cmdDet,
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
432a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process GetInput");
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Input input = new Input();
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TEXT_STRING,
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            input.text = ValueParser.retrieveTextString(ctlv);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.RESPONSE_LENGTH, ctlvs);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] rawValue = ctlv.getRawValue();
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int valueIndex = ctlv.getValueIndex();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                input.minLen = rawValue[valueIndex] & 0xff;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                input.maxLen = rawValue[valueIndex + 1] & 0xff;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IndexOutOfBoundsException e) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.DEFAULT_TEXT, ctlvs);
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            input.defaultText = ValueParser.retrieveTextString(ctlv);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse icon identifier
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.digitOnly = (cmdDet.commandQualifier & 0x01) == 0;
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.ucs2 = (cmdDet.commandQualifier & 0x02) != 0;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.echo = (cmdDet.commandQualifier & 0x04) == 0;
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.packed = (cmdDet.commandQualifier & 0x08) != 0;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        input.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0;
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new GetInputParams(cmdDet, input);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes REFRESH proactive command from the SIM card.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processRefresh(CommandDetails cmdDet,
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
496a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process Refresh");
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // REFRESH proactive command is rerouted by the baseband and handled by
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the telephony layer. IDLE TEXT should be removed for a REFRESH command
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // with "initialization" or "reset"
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (cmdDet.commandQualifier) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REFRESH_NAA_INIT_AND_FULL_FILE_CHANGE:
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REFRESH_NAA_INIT_AND_FILE_CHANGE:
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REFRESH_NAA_INIT:
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REFRESH_UICC_RESET:
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCmdParams = new DisplayTextParams(cmdDet, null);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes SELECT_ITEM proactive command from the SIM card.
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processSelectItem(CommandDetails cmdDet,
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
525a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process SelectItem");
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Menu menu = new Menu();
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId titleIconId = null;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ItemsIconId itemsIconId = null;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Iterator<ComprehensionTlv> iter = ctlvs.iterator();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            menu.title = ValueParser.retrieveAlphaId(ctlv);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ctlv = searchForNextTag(ComprehensionTlvTag.ITEM, iter);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ctlv != null) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                menu.items.add(ValueParser.retrieveItem(ctlv));
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We must have at least one menu item.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (menu.items.size() == 0) {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ResultException(ResultCode.REQUIRED_VALUES_MISSING);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ITEM_ID, ctlvs);
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
554a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka            // CAT items are listed 1...n while list start at 0, need to
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // subtract one.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            menu.defaultItem = ValueParser.retrieveItemId(ctlv) - 1;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            titleIconId = ValueParser.retrieveIconId(ctlv);
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            menu.titleIconSelfExplanatory = titleIconId.selfExplanatory;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ITEM_ICON_ID_LIST, ctlvs);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_MULTI_ICONS;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            itemsIconId = ValueParser.retrieveItemsIconId(ctlv);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            menu.itemsIconSelfExplanatory = itemsIconId.selfExplanatory;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean presentTypeSpecified = (cmdDet.commandQualifier & 0x01) != 0;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (presentTypeSpecified) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((cmdDet.commandQualifier & 0x02) == 0) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                menu.presentationType = PresentationType.DATA_VALUES;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                menu.presentationType = PresentationType.NAVIGATION_OPTIONS;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        menu.softKeyPreferred = (cmdDet.commandQualifier & 0x04) != 0;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        menu.helpAvailable = (cmdDet.commandQualifier & 0x80) != 0;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new SelectItemParams(cmdDet, menu, titleIconId != null);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Load icons data if needed.
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch(mIconLoadState) {
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LOAD_NO_ICON:
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LOAD_SINGLE_ICON:
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(titleIconId.recordNumber, this
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case LOAD_MULTI_ICONS:
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] recordNumbers = itemsIconId.recordNumbers;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (titleIconId != null) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Create a new array for all the icons (title and items).
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                recordNumbers = new int[itemsIconId.recordNumbers.length + 1];
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                recordNumbers[0] = titleIconId.recordNumber;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(itemsIconId.recordNumbers, 0, recordNumbers,
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        1, itemsIconId.recordNumbers.length);
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcons(recordNumbers, this
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes EVENT_NOTIFY message from baseband.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processEventNotify(CommandDetails cmdDet,
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
622a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process EventNotify");
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage textMsg = new TextMessage();
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID,
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ctlvs);
629e81932e92a773538e1ad1ad1d4bfd8f241860c8ddujin.cha        textMsg.text = ValueParser.retrieveAlphaId(ctlv);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.iconSelfExplanatory = iconId.selfExplanatory;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textMsg.responseNeeded = false;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new DisplayTextParams(cmdDet, textMsg);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes SET_UP_EVENT_LIST proactive command from the SIM card.
6512563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville     *
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details object retrieved.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean processSetUpEventList(CommandDetails cmdDet,
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
661a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process SetUpEventList");
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.EVENT_LIST,
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // ctlvs);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if (ctlv != null) {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // try {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // byte[] rawValue = ctlv.getRawValue();
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // int valueIndex = ctlv.getValueIndex();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // int valueLen = ctlv.getLength();
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // } catch (IndexOutOfBoundsException e) {}
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes LAUNCH_BROWSER proactive command from the SIM card.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
686a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka    private boolean processLaunchBrowser(CommandDetails cmdDet,
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process LaunchBrowser");
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage confirmMsg = new TextMessage();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String url = null;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.URL, ctlvs);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] rawValue = ctlv.getRawValue();
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int valueIndex = ctlv.getValueIndex();
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int valueLen = ctlv.getLength();
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (valueLen > 0) {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    url = GsmAlphabet.gsm8BitUnpackedToString(rawValue,
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            valueIndex, valueLen);
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    url = null;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IndexOutOfBoundsException e) {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ResultException(ResultCode.CMD_DATA_NOT_UNDERSTOOD);
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse alpha identifier.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs);
714e81932e92a773538e1ad1ad1d4bfd8f241860c8ddujin.cha        confirmMsg.text = ValueParser.retrieveAlphaId(ctlv);
715e81932e92a773538e1ad1ad1d4bfd8f241860c8ddujin.cha
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse icon identifier
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            confirmMsg.iconSelfExplanatory = iconId.selfExplanatory;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse command qualifier value.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LaunchBrowserMode mode;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (cmdDet.commandQualifier) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case 0x00:
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mode = LaunchBrowserMode.LAUNCH_IF_NOT_ALREADY_LAUNCHED;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case 0x02:
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mode = LaunchBrowserMode.USE_EXISTING_BROWSER;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case 0x03:
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mode = LaunchBrowserMode.LAUNCH_NEW_BROWSER;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new LaunchBrowserParams(cmdDet, confirmMsg, url, mode);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     /**
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes PLAY_TONE proactive command from the SIM card.
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details container object.
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.t
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws ResultException
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka    private boolean processPlayTone(CommandDetails cmdDet,
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
762a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process PlayTone");
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Tone tone = null;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage textMsg = new TextMessage();
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Duration duration = null;
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId iconId = null;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = searchForTag(ComprehensionTlvTag.TONE, ctlvs);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Nothing to do for null objects.
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ctlv.getLength() > 0) {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    byte[] rawValue = ctlv.getRawValue();
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int valueIndex = ctlv.getValueIndex();
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int toneVal = rawValue[valueIndex];
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    tone = Tone.fromInt(toneVal);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IndexOutOfBoundsException e) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new ResultException(
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ResultCode.CMD_DATA_NOT_UNDERSTOOD);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse alpha identifier
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ALPHA_ID, ctlvs);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.text = ValueParser.retrieveAlphaId(ctlv);
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse tone duration
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.DURATION, ctlvs);
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            duration = ValueParser.retrieveDuration(ctlv);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // parse icon identifier
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            iconId = ValueParser.retrieveIconId(ctlv);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            textMsg.iconSelfExplanatory = iconId.selfExplanatory;
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean vibrate = (cmdDet.commandQualifier & 0x01) != 0x00;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        textMsg.responseNeeded = false;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new PlayToneParams(cmdDet, textMsg, tone, duration, vibrate);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (iconId != null) {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_SINGLE_ICON;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcon(iconId.recordNumber, this
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Processes SETUP_CALL proactive command from the SIM card.
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param cmdDet Command Details object retrieved from the proactive command
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ctlvs List of ComprehensionTlv objects following Command Details
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        object and Device Identities object within the proactive command
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the command is processing is pending and additional
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         asynchronous processing is required.
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
825a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka    private boolean processSetupCall(CommandDetails cmdDet,
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<ComprehensionTlv> ctlvs) throws ResultException {
827a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka        CatLog.d(this, "process SetupCall");
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Iterator<ComprehensionTlv> iter = ctlvs.iterator();
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComprehensionTlv ctlv = null;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // User confirmation phase message.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage confirmMsg = new TextMessage();
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Call set up phase message.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextMessage callMsg = new TextMessage();
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId confirmIconId = null;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IconId callIconId = null;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get confirmation message string.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter);
840e81932e92a773538e1ad1ad1d4bfd8f241860c8ddujin.cha        confirmMsg.text = ValueParser.retrieveAlphaId(ctlv);
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            confirmIconId = ValueParser.retrieveIconId(ctlv);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            confirmMsg.iconSelfExplanatory = confirmIconId.selfExplanatory;
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get call set up message string.
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForNextTag(ComprehensionTlvTag.ALPHA_ID, iter);
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callMsg.text = ValueParser.retrieveAlphaId(ctlv);
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ctlv = searchForTag(ComprehensionTlvTag.ICON_ID, ctlvs);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ctlv != null) {
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callIconId = ValueParser.retrieveIconId(ctlv);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            callMsg.iconSelfExplanatory = callIconId.selfExplanatory;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCmdParams = new CallSetupParams(cmdDet, confirmMsg, callMsg);
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (confirmIconId != null || callIconId != null) {
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoadState = LOAD_MULTI_ICONS;
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int[] recordNumbers = new int[2];
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recordNumbers[0] = confirmIconId != null
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? confirmIconId.recordNumber : -1;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recordNumbers[1] = callIconId != null ? callIconId.recordNumber
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : -1;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIconLoader.loadIcons(recordNumbers, this
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    .obtainMessage(MSG_ID_LOAD_ICON_DONE));
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
876e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla
877e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla    private boolean processProvideLocalInfo(CommandDetails cmdDet, List<ComprehensionTlv> ctlvs)
878e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            throws ResultException {
879e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        CatLog.d(this, "process ProvideLocalInfo");
880e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        switch (cmdDet.commandQualifier) {
88138b6999d9e7f6a1193fd3105235afa2502013740Kazuhiro Ondo            case DTTZ_SETTING:
88238b6999d9e7f6a1193fd3105235afa2502013740Kazuhiro Ondo                CatLog.d(this, "PLI [DTTZ_SETTING]");
88338b6999d9e7f6a1193fd3105235afa2502013740Kazuhiro Ondo                mCmdParams = new CommandParams(cmdDet);
88438b6999d9e7f6a1193fd3105235afa2502013740Kazuhiro Ondo                break;
885e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            case LANGUAGE_SETTING:
886e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                CatLog.d(this, "PLI [LANGUAGE_SETTING]");
887e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                mCmdParams = new CommandParams(cmdDet);
888e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                break;
889e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla            default:
890e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                CatLog.d(this, "PLI[" + cmdDet.commandQualifier + "] Command Not Supported");
891e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                mCmdParams = new CommandParams(cmdDet);
892e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla                throw new ResultException(ResultCode.BEYOND_TERMINAL_CAPABILITY);
893e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        }
894e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla        return false;
895e4866d016512d6670f98508846ccfb92a439a79cNaveen Kalla    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
897