10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
18cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
1999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.lang.Comparable;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
26cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Savillepublic class DriverCall implements Comparable<DriverCall> {
27cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "DriverCall";
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public enum State {
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ACTIVE,
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        HOLDING,
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DIALING,    // MO call only
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ALERTING,   // MO call only
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        INCOMING,   // MT call only
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        WAITING;    // MT call only
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If you add a state, make sure to look for the switch()
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // statements that use this enum
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int index;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMT;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public State state;     // May be null if unavail
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMpty;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String number;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int TOA;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isVoice;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isVoicePrivacy;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int als;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int numberPresentation;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String name;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int namePresentation;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo uusInfo;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** returns null on error */
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static DriverCall
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    fromCLCCLine(String line) {
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DriverCall ret = new DriverCall();
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //+CLCC: 1,0,2,0,0,\"+18005551212\",145
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //     index,isMT,state,mode,isMpty(,number,TOA)?
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ATResponseParser p = new ATResponseParser(line);
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.index = p.nextInt();
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isMT = p.nextBoolean();
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.state = stateFromCLCC(p.nextInt());
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isVoice = (0 == p.nextInt());
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isMpty = p.nextBoolean();
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // use ALLOWED as default presentation while parsing CLCC
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.numberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (p.hasMore()) {
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Some lame implementations return strings
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // like "NOT AVAILABLE" in the CLCC line
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.number = PhoneNumberUtils.extractNetworkPortionAlt(p.nextString());
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ret.number.length() == 0) {
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret.number = null;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.TOA = p.nextInt();
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Make sure there's a leading + on addresses with a TOA
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // of 145
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.number = PhoneNumberUtils.stringFromStringAndTOA(
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ret.number, ret.TOA);
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (ATParseEx ex) {
9399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG,"Invalid CLCC line: '" + line + "'");
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    DriverCall() {
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
104cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    toString() {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "id=" + index + ","
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + state + ","
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + "toa=" + TOA + ","
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isMpty ? "conf" : "norm") + ","
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isMT ? "mt" : "mo") + ","
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + als + ","
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isVoice ? "voc" : "nonvoc") + ","
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isVoicePrivacy ? "evp" : "noevp") + ","
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /*+ "number=" + number */ + ",cli=" + numberPresentation + ","
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /*+ "name="+ name */ + "," + namePresentation;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static State
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    stateFromCLCC(int state) throws ATParseEx {
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(state) {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 0: return State.ACTIVE;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 1: return State.HOLDING;
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 2: return State.DIALING;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 3: return State.ALERTING;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 4: return State.INCOMING;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 5: return State.WAITING;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new ATParseEx("illegal call state " + state);
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    presentationFromCLIP(int cli) throws ATParseEx
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(cli) {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 0: return PhoneConstants.PRESENTATION_ALLOWED;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 1: return PhoneConstants.PRESENTATION_RESTRICTED;
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 2: return PhoneConstants.PRESENTATION_UNKNOWN;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 3: return PhoneConstants.PRESENTATION_PAYPHONE;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new ATParseEx("illegal presentation " + cli);
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Comparable Implementation
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** For sorting by index */
149cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int
151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    compareTo(DriverCall dc) {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (index < dc.index) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return -1;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (index == dc.index) {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { /*index > dc.index*/
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 1;
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
162