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