19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony;
18767a662ecde33c3979bf02b793d392aca0403162Wink Saville//import com.android.internal.telephony.*;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.Comparable;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
26767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class DriverCall implements Comparable {
27767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static final String LOG_TAG = "RILB";
28767a662ecde33c3979bf02b793d392aca0403162Wink Saville
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public enum State {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ACTIVE,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HOLDING,
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DIALING,    // MO call only
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ALERTING,   // MO call only
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INCOMING,   // MT call only
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WAITING;    // MT call only
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If you add a state, make sure to look for the switch()
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // statements that use this enum
38105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int index;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isMT;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public State state;     // May be null if unavail
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isMpty;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String number;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int TOA;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isVoice;
47a14f47f975064816df3008e66055d41ddb9d7353Wink Saville    public boolean isVoicePrivacy;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int als;
49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int numberPresentation;
50a14f47f975064816df3008e66055d41ddb9d7353Wink Saville    public String name;
51a14f47f975064816df3008e66055d41ddb9d7353Wink Saville    public int namePresentation;
5224440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    public UUSInfo uusInfo;
53767a662ecde33c3979bf02b793d392aca0403162Wink Saville
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** returns null on error */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static DriverCall
56767a662ecde33c3979bf02b793d392aca0403162Wink Saville    fromCLCCLine(String line) {
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DriverCall ret = new DriverCall();
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //+CLCC: 1,0,2,0,0,\"+18005551212\",145
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //     index,isMT,state,mode,isMpty(,number,TOA)?
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ATResponseParser p = new ATResponseParser(line);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret.index = p.nextInt();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret.isMT = p.nextBoolean();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret.state = stateFromCLCC(p.nextInt());
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret.isVoice = (0 == p.nextInt());
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret.isMpty = p.nextBoolean();
70767a662ecde33c3979bf02b793d392aca0403162Wink Saville
71105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            // use ALLOWED as default presentation while parsing CLCC
72105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            ret.numberPresentation = Connection.PRESENTATION_ALLOWED;
73767a662ecde33c3979bf02b793d392aca0403162Wink Saville
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (p.hasMore()) {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Some lame implementations return strings
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // like "NOT AVAILABLE" in the CLCC line
779e534153264138cfee383c626db92b934fafc1afTammo Spalink                ret.number = PhoneNumberUtils.extractNetworkPortionAlt(p.nextString());
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ret.number.length() == 0) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ret.number = null;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.TOA = p.nextInt();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Make sure there's a leading + on addresses with a TOA
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // of 145
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ret.number = PhoneNumberUtils.stringFromStringAndTOA(
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                ret.number, ret.TOA);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (ATParseEx ex) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG,"Invalid CLCC line: '" + line + "'");
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public
101767a662ecde33c3979bf02b793d392aca0403162Wink Saville    DriverCall() {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String
105767a662ecde33c3979bf02b793d392aca0403162Wink Saville    toString() {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "id=" + index + ","
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + state + ","
108a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                + "toa=" + TOA + ","
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (isMpty ? "conf" : "norm") + ","
110a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                + (isMT ? "mt" : "mo") + ","
111a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                + als + ","
112a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                + (isVoice ? "voc" : "nonvoc") + ","
113a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                + (isVoicePrivacy ? "evp" : "noevp") + ","
114a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                /*+ "number=" + number */ + ",cli=" + numberPresentation + ","
115a14f47f975064816df3008e66055d41ddb9d7353Wink Saville                /*+ "name="+ name */ + "," + namePresentation;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static State
119767a662ecde33c3979bf02b793d392aca0403162Wink Saville    stateFromCLCC(int state) throws ATParseEx {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch(state) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 0: return State.ACTIVE;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 1: return State.HOLDING;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 2: return State.DIALING;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 3: return State.ALERTING;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 4: return State.INCOMING;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case 5: return State.WAITING;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new ATParseEx("illegal call state " + state);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
131767a662ecde33c3979bf02b793d392aca0403162Wink Saville
132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static int
133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    presentationFromCLIP(int cli) throws ATParseEx
134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    {
135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        switch(cli) {
136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            case 0: return Connection.PRESENTATION_ALLOWED;
137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            case 1: return Connection.PRESENTATION_RESTRICTED;
138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            case 2: return Connection.PRESENTATION_UNKNOWN;
139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            case 3: return Connection.PRESENTATION_PAYPHONE;
140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            default:
141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                throw new ATParseEx("illegal presentation " + cli);
142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Comparable Implementation
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** For sorting by index */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville    compareTo (Object o) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DriverCall dc;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dc = (DriverCall)o;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < dc.index) {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (index == dc.index) {
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else { /*index > dc.index*/
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 1;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
163