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
404e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /**
414e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka     * Audio information
424e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka     */
434e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** Unspecified audio codec */
444e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_UNSPECIFIED = 0;
454e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** AMR (Narrowband) audio codec */
464e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_AMR = 1;
474e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** AMR (Wideband) audio codec */
484e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_AMR_WB = 2;
494e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** GSM Enhanced Full-Rate audio codec */
504e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_GSM_EFR = 3;
514e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** GSM Full-Rate audio codec */
524e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_GSM_FR = 4;
534e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** GSM Half-Rate audio codec */
544e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_GSM_HR = 5;
554e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** Enhanced Variable rate codec */
564e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_EVRC = 6;
574e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** Enhanced Variable rate codec revision B */
584e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_EVRC_B = 7;
594e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** Enhanced Variable rate codec (Wideband) */
604e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_EVRC_WB = 8;
614e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    /** Enhanced Variable rate codec (Narrowband) */
624e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public static final int AUDIO_QUALITY_EVRC_NW = 9;
634e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int index;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMT;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public State state;     // May be null if unavail
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMpty;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String number;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int TOA;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isVoice;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isVoicePrivacy;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int als;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int numberPresentation;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String name;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int namePresentation;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo uusInfo;
774e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka    public int audioQuality = AUDIO_QUALITY_UNSPECIFIED;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** returns null on error */
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static DriverCall
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    fromCLCCLine(String line) {
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DriverCall ret = new DriverCall();
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //+CLCC: 1,0,2,0,0,\"+18005551212\",145
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //     index,isMT,state,mode,isMpty(,number,TOA)?
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ATResponseParser p = new ATResponseParser(line);
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.index = p.nextInt();
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isMT = p.nextBoolean();
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.state = stateFromCLCC(p.nextInt());
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isVoice = (0 == p.nextInt());
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.isMpty = p.nextBoolean();
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // use ALLOWED as default presentation while parsing CLCC
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret.numberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (p.hasMore()) {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Some lame implementations return strings
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // like "NOT AVAILABLE" in the CLCC line
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.number = PhoneNumberUtils.extractNetworkPortionAlt(p.nextString());
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ret.number.length() == 0) {
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret.number = null;
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.TOA = p.nextInt();
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Make sure there's a leading + on addresses with a TOA
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // of 145
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ret.number = PhoneNumberUtils.stringFromStringAndTOA(
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                ret.number, ret.TOA);
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (ATParseEx ex) {
11899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG,"Invalid CLCC line: '" + line + "'");
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    DriverCall() {
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    toString() {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "id=" + index + ","
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + state + ","
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + "toa=" + TOA + ","
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isMpty ? "conf" : "norm") + ","
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isMT ? "mt" : "mo") + ","
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + als + ","
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isVoice ? "voc" : "nonvoc") + ","
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                + (isVoicePrivacy ? "evp" : "noevp") + ","
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                /*+ "number=" + number */ + ",cli=" + numberPresentation + ","
1414e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka                /*+ "name="+ name */ + "," + namePresentation + ","
1424e5766109645e58abfb272261f3e6b18d584aab4Adrian Muzyka                + "audioQuality=" + audioQuality;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static State
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    stateFromCLCC(int state) throws ATParseEx {
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(state) {
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 0: return State.ACTIVE;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 1: return State.HOLDING;
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 2: return State.DIALING;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 3: return State.ALERTING;
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 4: return State.INCOMING;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 5: return State.WAITING;
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new ATParseEx("illegal call state " + state);
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    presentationFromCLIP(int cli) throws ATParseEx
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(cli) {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 0: return PhoneConstants.PRESENTATION_ALLOWED;
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 1: return PhoneConstants.PRESENTATION_RESTRICTED;
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 2: return PhoneConstants.PRESENTATION_UNKNOWN;
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case 3: return PhoneConstants.PRESENTATION_PAYPHONE;
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new ATParseEx("illegal presentation " + cli);
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Comparable Implementation
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** For sorting by index */
175cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int
177cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    compareTo(DriverCall dc) {
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (index < dc.index) {
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return -1;
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (index == dc.index) {
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { /*index > dc.index*/
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 1;
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
188