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; 52767a662ecde33c3979bf02b793d392aca0403162Wink Saville 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** returns null on error */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static DriverCall 55767a662ecde33c3979bf02b793d392aca0403162Wink Saville fromCLCCLine(String line) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DriverCall ret = new DriverCall(); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //+CLCC: 1,0,2,0,0,\"+18005551212\",145 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // index,isMT,state,mode,isMpty(,number,TOA)? 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ATResponseParser p = new ATResponseParser(line); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.index = p.nextInt(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.isMT = p.nextBoolean(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.state = stateFromCLCC(p.nextInt()); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.isVoice = (0 == p.nextInt()); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.isMpty = p.nextBoolean(); 69767a662ecde33c3979bf02b793d392aca0403162Wink Saville 70105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project // use ALLOWED as default presentation while parsing CLCC 71105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project ret.numberPresentation = Connection.PRESENTATION_ALLOWED; 72767a662ecde33c3979bf02b793d392aca0403162Wink Saville 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.hasMore()) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Some lame implementations return strings 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // like "NOT AVAILABLE" in the CLCC line 769e534153264138cfee383c626db92b934fafc1afTammo Spalink ret.number = PhoneNumberUtils.extractNetworkPortionAlt(p.nextString()); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ret.number.length() == 0) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.number = null; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.TOA = p.nextInt(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure there's a leading + on addresses with a TOA 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of 145 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.number = PhoneNumberUtils.stringFromStringAndTOA( 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret.number, ret.TOA); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ATParseEx ex) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG,"Invalid CLCC line: '" + line + "'"); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public 100767a662ecde33c3979bf02b793d392aca0403162Wink Saville DriverCall() { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String 104767a662ecde33c3979bf02b793d392aca0403162Wink Saville toString() { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "id=" + index + "," 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + state + "," 107a14f47f975064816df3008e66055d41ddb9d7353Wink Saville + "toa=" + TOA + "," 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (isMpty ? "conf" : "norm") + "," 109a14f47f975064816df3008e66055d41ddb9d7353Wink Saville + (isMT ? "mt" : "mo") + "," 110a14f47f975064816df3008e66055d41ddb9d7353Wink Saville + als + "," 111a14f47f975064816df3008e66055d41ddb9d7353Wink Saville + (isVoice ? "voc" : "nonvoc") + "," 112a14f47f975064816df3008e66055d41ddb9d7353Wink Saville + (isVoicePrivacy ? "evp" : "noevp") + "," 113a14f47f975064816df3008e66055d41ddb9d7353Wink Saville /*+ "number=" + number */ + ",cli=" + numberPresentation + "," 114a14f47f975064816df3008e66055d41ddb9d7353Wink Saville /*+ "name="+ name */ + "," + namePresentation; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static State 118767a662ecde33c3979bf02b793d392aca0403162Wink Saville stateFromCLCC(int state) throws ATParseEx { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(state) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: return State.ACTIVE; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: return State.HOLDING; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: return State.DIALING; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: return State.ALERTING; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 4: return State.INCOMING; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 5: return State.WAITING; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ATParseEx("illegal call state " + state); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 130767a662ecde33c3979bf02b793d392aca0403162Wink Saville 131105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static int 132105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project presentationFromCLIP(int cli) throws ATParseEx 133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project { 134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project switch(cli) { 135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 0: return Connection.PRESENTATION_ALLOWED; 136105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 1: return Connection.PRESENTATION_RESTRICTED; 137105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 2: return Connection.PRESENTATION_UNKNOWN; 138105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project case 3: return Connection.PRESENTATION_PAYPHONE; 139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project default: 140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project throw new ATParseEx("illegal presentation " + cli); 141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 142105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Comparable Implementation 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** For sorting by index */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville compareTo (Object o) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DriverCall dc; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dc = (DriverCall)o; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < dc.index) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (index == dc.index) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { /*index > dc.index*/ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 162