blob: a923d8f0c37f8596d83ee08684e6d06fafd5a842 [file] [log] [blame]
/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony;
import android.telephony.Rlog;
import java.lang.Comparable;
import android.telephony.PhoneNumberUtils;
/**
* {@hide}
*/
public class DriverCall implements Comparable<DriverCall> {
static final String LOG_TAG = "DriverCall";
public enum State {
ACTIVE,
HOLDING,
DIALING, // MO call only
ALERTING, // MO call only
INCOMING, // MT call only
WAITING; // MT call only
// If you add a state, make sure to look for the switch()
// statements that use this enum
}
public int index;
public boolean isMT;
public State state; // May be null if unavail
public boolean isMpty;
public String number;
public int TOA;
public boolean isVoice;
public boolean isVoicePrivacy;
public int als;
public int numberPresentation;
public String name;
public int namePresentation;
public UUSInfo uusInfo;
/** returns null on error */
static DriverCall
fromCLCCLine(String line) {
DriverCall ret = new DriverCall();
//+CLCC: 1,0,2,0,0,\"+18005551212\",145
// index,isMT,state,mode,isMpty(,number,TOA)?
ATResponseParser p = new ATResponseParser(line);
try {
ret.index = p.nextInt();
ret.isMT = p.nextBoolean();
ret.state = stateFromCLCC(p.nextInt());
ret.isVoice = (0 == p.nextInt());
ret.isMpty = p.nextBoolean();
// use ALLOWED as default presentation while parsing CLCC
ret.numberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
if (p.hasMore()) {
// Some lame implementations return strings
// like "NOT AVAILABLE" in the CLCC line
ret.number = PhoneNumberUtils.extractNetworkPortionAlt(p.nextString());
if (ret.number.length() == 0) {
ret.number = null;
}
ret.TOA = p.nextInt();
// Make sure there's a leading + on addresses with a TOA
// of 145
ret.number = PhoneNumberUtils.stringFromStringAndTOA(
ret.number, ret.TOA);
}
} catch (ATParseEx ex) {
Rlog.e(LOG_TAG,"Invalid CLCC line: '" + line + "'");
return null;
}
return ret;
}
public
DriverCall() {
}
@Override
public String
toString() {
return "id=" + index + ","
+ state + ","
+ "toa=" + TOA + ","
+ (isMpty ? "conf" : "norm") + ","
+ (isMT ? "mt" : "mo") + ","
+ als + ","
+ (isVoice ? "voc" : "nonvoc") + ","
+ (isVoicePrivacy ? "evp" : "noevp") + ","
/*+ "number=" + number */ + ",cli=" + numberPresentation + ","
/*+ "name="+ name */ + "," + namePresentation;
}
public static State
stateFromCLCC(int state) throws ATParseEx {
switch(state) {
case 0: return State.ACTIVE;
case 1: return State.HOLDING;
case 2: return State.DIALING;
case 3: return State.ALERTING;
case 4: return State.INCOMING;
case 5: return State.WAITING;
default:
throw new ATParseEx("illegal call state " + state);
}
}
public static int
presentationFromCLIP(int cli) throws ATParseEx
{
switch(cli) {
case 0: return PhoneConstants.PRESENTATION_ALLOWED;
case 1: return PhoneConstants.PRESENTATION_RESTRICTED;
case 2: return PhoneConstants.PRESENTATION_UNKNOWN;
case 3: return PhoneConstants.PRESENTATION_PAYPHONE;
default:
throw new ATParseEx("illegal presentation " + cli);
}
}
//***** Comparable Implementation
/** For sorting by index */
@Override
public int
compareTo(DriverCall dc) {
if (index < dc.index) {
return -1;
} else if (index == dc.index) {
return 0;
} else { /*index > dc.index*/
return 1;
}
}
}