呼叫转移流程(二)

时间:2024-05-23 16:07:02

下面为RIL工作框图:

呼叫转移流程(二)

 

 

呼叫转移中对RIL层返回的response,具体流程图如下

呼叫转移流程(二)

 

1. GsmCdmaPhone

一般向RIL请求request的类中含有对应的handleMessage方法会对RIL返回的response做出回应

 

GsmCdmaPhone.handleMessage中如果消息为EVENT_GET_CALL_FORWARD_DONE则表示返回得到返回的消息,得到了呼叫转移的状态,

如果onComplete不为空,则发送消息,发送到3.GsmUmtsCallForwardOptionhandler中,进行消息处理;

同时调用

GsmCdmaPhone.handleCfuqueryresult(CallForwardInfo[] infos)通知已经得到了呼叫转移的结果

 

2. SIMrecords

Phone.setVoiceCallForwardingFlag(int line, boolean enable)

 

RIccRecords的实例,但IccRecords中的setVoiceCallForwardingFlag函数具体实现是在子类SIMrecords中。

 

SIMrecordsIccrecords的子类,实际调用SIMRecords中的setVoiceCallForwardingFlag方法

 

 

3. RegistrantList消息机制

下面为消息的发送需要参考RegistrantList的消息处理机制

消息不断传递,最后在Registrant.java中的internalNotifyRegistrant方法中发送消息

 

代码中使用了RegistrantList,如何快速分析下一步流程走到哪里?

这是一个回调的过程,所以核心就是在哪里注册就在哪里处理,我们要找到调用register方法的地方。 我们看到在SIMRecords类中的

mRecordsEventRegistrants.notifyResult(EVENT_CFI);

先搜索mRecordsEventRegistrants,找到registerForRecordsEvent的方法;

 

 

再找到调用registerForRecordsEvent方法的地方,注册了事件EVENT_ICC_RECORD_EVENTS

 

最后搜索”EVENT_ICC_RECORD_EVENTS,找到handleMessage()方法对消息的处理,所以下一步代码流程就应该是走这里了。

4. GamCdmaPhone.hangdleMessage

GamCdmaPhonehangdleMessage中有对以下消息的处理语句,可以看到会调用processIccRecordEvents方法

 

GsmCdmaPhone.javaprocessIccRecordEvents

 

 

 

5. DefaultPhoneNotifier

notifyCallForwardingChanged方法为PhoneNotify接口的函数,具体实现在DefaultPhoneNotifier.java类中

 

6. TelephonyRegistry

调用TelephonyRegistry.javanotifyCallForwardingChangedForSubscriber

 

CallbackIPhoneStateListener

 

send

 

Handle传递消息LISTEN_CALL_FORWARDING_INDICATOR,处理消息在

PhoneStateListener中。

 

调用函数具体的实现代码,具体的实现过程要去看他的子类CallNotifierPhoneStateListener

7. CallNotifier

 

CallNotifierPhoneStateListener继承自PhoneStateListener,重写oncallForwardingIndicator-

-Changed方法;会调用updataPhoneStateListeners函数updataPhoneStateListeners函数中注册到Phone进程中

 

8.NotificationMgr

并且会调用函数updataCfi,此方法是用来发送通知 ,设置呼叫转移成功