Call根据拨打网络不同, 分为normall call [通过CS网络拨打] 和 IMS call [也就是volte,通过IMS网络拨打]。
根据操作流程不同,分为主叫[MO]和被叫[MT].
一、MO call [往外拨打电话]
1. 整体状态流转 :
DIALING -----------> ALERTING -----------> ACTIVE ---------->HANGUP
2. 整体结构: [图中文件根据log的主要体现列出,并非全部文件哦]
3. 重点关注telephony 部分
1. TelephonyConnectionService.java .
dial事件从Telecom 传到 Telephony,的入口就在TelephonyConnectionService中onCreateOutgoingConnection()这个函数。
a.这个函数会get真正的telephony的phone对象;
b.会通过CarrierConfigManager获取carrierConfig;
c.会检查radio的状态
d.会创建TelephonyConnection。
2.GsmCdmaPhone.java
这个文件的dial函数 进行逻辑的dial动作,并且返回一个com.android.internal.telephony.Connection这个connection会跟随这个call的整个生命周期。
a.首先会根据刚才的CarrierConfig, 判断emergencycall 是否使用IMSPhone进行dial. 如果是,这一步会调用IMSPhone.dial()。
b.然后判断ServiceState是否可以打电话,airplane mode或者 outofService 等情况都会抛出异常。
c.然后转到dialInternal(),这个函数通过GsmMmiCode对Mmicode进行处理,并且会判断CLIR的状态。
d.对于normalcall ,满足mmi==null,接下来会直接调用GsmCdmaCallTracker.dial();
3.GsmCdmaCallTracker.java
a. 根据carrierConfig对拨出号码进行convert,通过convertNumberIfNecessary()。
b. 必须保证当前dial的这一通电话必须是foregroundCall, 所以如果当前已经有active的通话,需要将当前的通话 hold.
c. 创建了新的GsmCdmaConnection->mPendingMO , 这个Connection会成为telephony与RIL沟通的状态传递媒介。