1.1 MT call
我们先给出MT起呼过程的示例流程图,然后结合该图做代码流程的分析:
普通来电的流程,从RIL层开始,其流程如下,
具体的流程分析就不做文字阐述了,对着流程图看代码即可。
需要注意的是要有Telephony的框架意识和通信链路的相互关联关系,这些在其他文章里有讲述。
下面是一些简单的笔记摘要
1.1.1 来电提示(IncallUI)
5.3.3.1. 通用部分: telecomm到应用
在应用部分,在CallList里,当Phone.Listener的onCallAdded被调用时,根据来电状态Call.State.INCOMING,调用CallList. onIncoming(),它会把这个事件发送给向CallList注册的监听器listener.onIncomingCall(call),
CallButtonPresenter.java (cp_incallui_5.0\src\com\android\incallui): InCallPresenter.getInstance().addListener(this);
CallCardPresenter.java (cp_incallui_5.0\src\com\android\incallui): InCallPresenter.getInstance().addListener(this);
ConferenceManagerPresenter.java (cp_incallui_5.0\src\com\android\incallui): InCallPresenter.getInstance().addListener(this);
DialpadPresenter.java (cp_incallui_5.0\src\com\android\incallui): InCallPresenter.getInstance().addListener(this);
VideoCallPresenter.java (cp_incallui_5.0\src\com\android\incallui): InCallPresenter.getInstance().addListener(this);
InCallPresenter.java里,onIncomingCall被调用,它再调用监听器的onIncomingCall,
public void onIncomingCall(Call call) {
InCallState newState = startOrFinishUi(InCallState.INCOMING);
InCallState oldState = mInCallState;
Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
mInCallState = newState;
for (IncomingCallListener listener : mIncomingCallListeners) {
listener.onIncomingCall(oldState, mInCallState, call);
}
if (CallList.getInstance().isDsdaEnabled() && (mInCallActivity != null)) {
mInCallActivity.updateDsdaTab();
}
}
向它注册的监听器存放在mIncomingCallListeners里,注册过程在每个应用里,使用addIncomingCallListener方法进行注册:
CallButtonPresenter.java (packages\apps\incallui\src\com\android\incallui): InCallPresenter.getInstance().addIncomingCallListener(this);
CallCardPresenter.java (packages\apps\incallui\src\com\android\incallui): InCallPresenter.getInstance().addIncomingCallListener(this);
VideoCallPresenter.java (packages\apps\incallui\src\com\android\incallui): InCallPresenter.getInstance().addIncomingCallListener(this);
5.3.3.2. 视频来电
VideoCallPresenter是它的一个监听器,之后在自己的onIncomingCall里调用onStateChange,之后会调用enterVideoMode进入视频模式,
enterVideoMode里面有几个重要工作,包括对surface的设置和camera的处理,
private void enterVideoMode(int newVideoState) {
ui.showVideoUi(true);
enableCamera(isCameraRequired);
if (ui.isDisplayVideoSurfaceCreated()) {
Log.d(this, "Calling setDisplaySurface with " + ui.getDisplayVideoSurface());
mVideoCall.setDisplaySurface(ui.getDisplayVideoSurface());
}
}
对于变量ui,从对VideoCallUi实例创建的分析过程我们知道,它就是VideoCallFragment,所以ui.showVideoUi就是VideoCallFragment.showVideoUi,它通过inflateVideoCallViews创建VideoCallSurface,实现监听接口,并关联TextureView。
enableCamera在其他章节分析过,它是通过接口,打开底层的camera。
5.3.3.1. 普通来电
InCallPresenter 的showInCall()的调用会拉起来电界面。
CallCardPresenter实例的创建:
如同VideoCallPresenter,CallCardPresenter先在其相关类CallCardFragment通过createPresenter方法创建,createPresenter方法则在CallCardFragment的父类BaseFragment的构造函数里被调用,就是所在CallCardFragment类创建的时候,就创建了CallCardPresenter。
CallCardPresenter通过InCallPresenter.getInstance().addListener(this)向InCallPresenter注册,在CallCardPresenter.onUiReady里。
CallCardPresenter.onUiReady被BaseFragment的onActivityCreated调用。
CallCardFragment在Incall_screen.xml作为控件,布局加载时被初始化,在InCallActivity.java的initializeInCall被赋值给引用。
CallCardFragment的onCreateView会加载自己的布局文件call_card_content,
如果觉得我的文章对您有用,请打赏。您的支持是对我莫大的认可!