InCallScreen.java
复制通话界面的显示和提供人机交互的接口,进入该界面第一个调用ONCreate,否则进入OnNewIntent,该配置文件是incall_screen.xml,其中incallPanel为通话联系人的信息和状态显示,配置文件为call_card.xml,包含两路通话的view定义;InCallTouchUi显示通过管理的控制UI,对应配置文件为incall_touch_ui.xml;
mhandle的handleMessage方法接收到framework的CallManager发出的不同Phone状态的变化,更新UI。消息类型如下:
SUPP_SERVICE_FAILED:弹出mSuppServiceFailureDialog
PHONE_STATE_CHANGED:调用requestUpdateScreen方法请求更新通话界面,发送 REQUEST_UPDATE_SCREEN消息
REQUEST_UPDATE_SCREEN:内部调用UpdateScreen
PHONE_DISCONNECT:通话连接失败时调用,在delayedCleanupAfterDisconnect中退出通话界面
handleOnscreenButtonClick响应通话控制的点击按钮,涉及通话能力控制的相关处理逻辑
PhoneUtils类中的静态方法,如接听电话、挂断电话、恢复、保持通话等通话控制的操作。
联系人信息:CallCard
通话联系人信息的显示和更新实在InCallScreen的updateScreen中完成的,调用Callcard的updateState方法,displayMaincallStatus显示更新第一路通话的信息,displayOnHoldCallStatus显示hold通话保持的第二路通话信息。通过PhoneUtils.getCallerInfo获取CallerInfo对象,保存了通话联系人的基本信息。
IncallTouchUI 通话控制:
incomingCallWidget:接通/挂断/短信回复时需要使用;
manageConferenceButton:多方通话的界面跳转控制按钮,只有在多方通话时才显示。
dialpadButton:也就是显示或隐藏拨号盘(DTMF);
audioButton:开启/关闭扬声器;
muteButton:开启/关闭麦克风静音,开启之后对方无法听到你的声音;
holdButton:开启/关闭呼叫保持;
addButton:增加多路通话;也就是在通话的过程中可以暂停当前通话,拨打另一路通话并接通;
通话控制相关的控件在IncallTouchUI 的updateState中更新,实现OnTriggerListener接口,该接口为锁屏控制的接口,这里4.2做了个修改,在OnTrigger函数中,区分向上、向左和向右三个方向直接定义0,1,2,而不使用SlidingTab的类。在InCallScreen的OnResume和OnPause中注册ACTION_HEADSET_PLUG接收耳机免提事件的广播,发送EVENT_HEADSET_PLUG_STATE_CHANGED消息,调用showAudioModePopup显示出菜单,进入InCallTouchUI的onMenuItemClick切换音频输出的策略。
DTMFTwelveKeyDialer
布局文件为dtmf_twelve_key_dialer_view.xml,由输入框dtmfDialerField和12按键dialpad.xml组成。
PhoneGlobals:
4.2中将4.0中的PhoneApp中的内容移到了PhoneGlobals中。
OnCreate中创建mWakeLock和mPartialWakeLock进行Phone应用的电源管理。获取了mWakeLock后,设置中的休眠时间不起作用,屏幕一直高亮,直到锁释放或者手动按power键。获取了mPartialWakeLock后,此时可以关闭屏幕和键盘灯,但不是立马关闭,直到设置的休眠时间到了,关屏。
Sensor感应器获取手机当前的方位,判断手机是否靠近脸部。
mProximityWakeLock电源唤醒锁,获取之后,关闭屏幕。
MediaButtonBoardcastReceive接收耳机HOOK的广播事件,调用PhoneUtils的 handleHeadsetHook响应耳机的HOOK事件。
PhoneAppBoardcastReceive处理Phone应用中杂项的广播事件,像飞行模式、数 据连接、SIM卡状态等变化。
CallNotify:
onNewRingingConnect接收到来电后的处理,调用startIncommingCallQuery查询 联系人信息。通过PhoneUtils的startGetCallerInfo获取GSMConnection的 userData查询 到CallerInfo中。
onPhoneStatechanged通话状态变化的处理。onDisconnect通话连接断开的处理。连接断开有三种类型callLogType:
INCOMMING_TYPE(来电)OUTGOING_TYPE(呼叫)MISSED_TYPE(未接来电)