1.Call:Call有九种状态:IDLE,ACTIVE,HOLDING,DIALING,ALERTING,INCOMING,WAITING,DISCONNECTED,DISCONNECTING;
a.CdmaConnection (Context context, DriverCall dc, CdmaCallTracker ct, int index)
这个构造方法是在MT的时候使用的。因为它有一个DriverCall的参数。它通过parentFromDCState方法来获得对应的parent(call),把connection加入到call的connections变量进行管理。
b.CdmaConnection(Context context, String dialString, CdmaCallTracker ct, CdmaCall parent) 这个构造方法是在MO的时候使用的,它会传入一个指定的parent(call)且通过parentattachFake(),调用把Connection加入到call的connections变量进行管理。
是与ril层通信时的一个中间处理类,主要用来接收ril的call数据后转到java层上来。
a.首先着重理解ringingCall,foregroundCall,backgroundCall的含义。
在CdmaConnection.java中可以看到
private CdmaCall
parentFromDCState (DriverCall.State state) {
switch (state) {
case ACTIVE:
case DIALING:
case ALERTING:
return owner.foregroundCall;
//break;
case HOLDING:
return owner.backgroundCall;
//break;
case INCOMING:
case WAITING:
return owner.ringingCall;
//break;
default:
throw new RuntimeException("illegal call state: " + state);
}
}
ringingCall:用来管理INCOMING和WAITING的通话
foregroundCall:用来管理DAILING、ALERTING、ACTIVE的通话
backgroundCall:用来管理HOLD的通话
b.CdmaCallTracker的事件处理机制
CdmaCallTracker.java,以dial为例,过程如下:
RIL_REQUEST_DIAL:pendingOperations++,needsPoll=true
EVENT_OPERATION_COMPLETE:pendingOperations--
RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:如果call state有变化
RIL_REQUEST_GET_CURRENT_CALLS:
EVENT_POLL_CALLS_RESULT:if(msg == lastRelevantPoll)...
事件涉及到三个变量。
pendingOperations:这个变量时在发生请求的时候会++,在处理应答的时候会--。
needsPoll:该变量是用来配合pendingOperations处理是否需要从RIL获取当前calls列表,并更新connections列表。
lastRelevantPoll:在发送RIL_REQUEST_GET_CURRENT_CALLS的时候记录最近一次请求的message,在response的时候只对最近一次请求的response做出相应,更新connections列表。
上面三个变量主要是用来判断是否需要发送RIL_REQUEST_GET_CURRENT_CALLS请求来获得当前calls列表,并更新connections列表。
handlePollCalls()函数中。
if (conn == null && dc != null){
//conn为null,说明CallTracker中是没有对应的call的。这只有两种情况可以发生。MO的dialing///状态和MT的incoming/waiting状态。打电话和来电的时候会执行到此处。
}else if(conn != null && dc == null){
//说明在底层已经挂掉了。callTracker需要drop该connection,对方挂断电话的时候会执行到此处
}else if(conn != null && dc != null){
//
}
if (newRinging != null) {
//表示是一个MT call,需要通知用户。
phone.notifyNewRingingConnection(newRinging);
}