ComposeMessageFragment 是用来编写新message和管理查看conversation message历史内容的主界面。这个界面处理从启动它的地方传过来的intent,intent内容可能包括:
thread_id,指定展现的conversation,当新建一个message时,thread_id不存在;
msg_uri,指定编辑的message;
address,当前收信人;
compose_mode,模式 为true则强制编辑收信人和附件,隐藏 message历史,默认为false;
exit_on_sent,当message发送后是否退出activity 。
ComposeMessageFragment的宿主activity是ComposeMessageActivity有多种启动action,分别为内部启动和
“android.intent.action.SENDTO”、”android.intent.action.SEND”、”android.intent.action.SEND_MULTIPLE”,intent传过来的数据类型包括vcard vcalender text video audio等。本文的源码分析包括生命周期和监听器两部分。
初始化两个变量:
mDoublePane = MmsConfig.isUsingDoublePane();
mTabletPane = MmsConfig.isSenseTablet();
主要方法功能如下:
mNeedUpdateRecipientsDropDown //根据adress判断初化收件人是否需要下拉。
checkIfKeyguardShallBeDismissed(); //去掉锁屏界面。
setMemberFields(arguments)-->handleIntentViewAction(Intent intent); //最主要的方法,初始化基础变量,mThreadId,mMessageUri,mComposeMode,mSendDiscreetMode,mExitOnSentHtc等,来源先是arguments传过来的参数,后是Uri uri = intent.getData()中的数据。
GetRecipientListThread()-->ThreadGetRecipientlist(address)-->RecipientList.getRecipientList(address); //异步获取收件人列表mRecipientList。
initReplyWindow(); //xy智能回复弹框。
返回布局R.layout.specific_detail_thread_view:
initContentViewAndEditorPanel(inflater)--> v = ViewCache.getInstance().get(getActivity().getBaseContext(),
ComposeMessageFragment.class.hashCode(), R.layout.specific_detail_thread_view);
本界面的主要内容数据和显示处理都在此时执行:
waitForwardMmsReady()--> MmsUtils.getPersister().load(tempUri)--> processAfterOnCreate()--> initUILayout()--> handleSendIntent(intent)--> initSmartSms(address);//如果是mms,则异步封装pdu后通知主线程执行 processAfterOnCreate(),如果是sms则直接 processAfterOnCreate()。
initUILayout()--> initActivityWidget()--> initMessageList(false, address)--> startMsgListQuery()--> mMsgListAdapter.startAsyncQuery(); //查询历史message并显示
initActivityWidget()-->initMediaAttachment()-->startAsyncQueryDraft()/mMessageBodyEditor.attachMedia(); //initActivityWidget()中设置mSubjectEditor.setText(mSubject),mMsgTextEditor.setText(body)。initMediaAttachment()处理mms附件,sms草稿。
handleSendIntent(intent)--> handleLaunchMsgComposeActionIntent(intent);
//处理intent中的数据,createRecipientListByPicker(mNumber) 获取收件人列表 attachVCardbySms(vCard)名片 attachVcalendar(data)日程。
initSmartSms(address)-->mXyComposeManager.loadMenu(this, address);
onnewintent模式调用 handleLaunchMsgComposeActionIntent();
mXyComposeManager.showInflateMenu();
主要执行了infiFocus()和MessageUtils.SendReadReportProcess()。
handleReadReportAndMarkAsRead()–> markAsRead() //标记为已读
还有onPrepareOptionsMenu() onRequestPermissionsResult() ,以上生命周期执行完以后,Fragment就加载数据、监听器、显示完成。界面的交互事件较多,以下选取主要listener对象和事件方法说明。
监听器 | 功能 |
---|---|
mActionBarContainerLayoutChangeListener | 增加QuickContactBadge点击面积 |
mReceiverHTCTime | 接收TIMEFORMAT_CHANGED action |
mReceiverTime | 接收ACTION_TIME_CHANGED action |
mCategoryChangeListene | switchCategory()更改信息类别 |
mRecipientOnKeyListener | mRecipientsEditor 响应回车键 |
mComposeRecipientCallBack | 响应更新Recipientlist |
mResultReceiver | 启动键盘 |
DeleteMessageListener | 响应dialog onclick删除一条信息或一个会话 |
PickEmailListener | 响应dialog onclick选择Email |
DiscardOldDraftListener | 响应dialog onclick放弃旧草稿 |
mMmsPhoneStateListener | 响应电话卡切换 |
mStoragePermissionCallBack | Permission grant回调 |
mWFCBroadcastReceiver/mTMOWifiIMSBroadcastReceiver | 响应com.htc.intent.action.WFC_LOWSIGNAL |
mUIlistenter | 更新当前联系人信息 |
mVCardParseCompleteListener | vcard解析监听 |
onActivityResult() 除响应一般activity返回,更重要的是接收处理dialog的返回数据,在 handleDialogResult()中,包含以下case :
//ComposeMessageFragment中的case
private static final int DIALOG_ACTION_ADD_SLIDE = 1;
...
private static final int DIALOG_ACTION_DETAIL_VIEW_CONTACT = 14;
//ComposeDialogFragment中的case
protected static final int TYPE_SIMPLE_DIALOG = 0;
...
protected static final int TYPE_MULTI_USER_ALARM = 20;
onActivityResult()中主要方法有:
deleteMessageByNumber(delLocked, selectedNumber); //按号话 删除信息
deleteMessageByThread(delLocked); //按threadid 删除信息
deleteMessageBySelect(); //删除选中信息
confirmNetworkBeforeSend(slotId); //确认网络
sendMessage(slotId); //发送信息
MessageUtils.makePhoneCall(getActivity(), intent); //打电话
MessageUtils.createAddToNewContactIntent(address, isPhoneNumber); //创建联系人
信息发送流程:
mEditorPanel.onclick() //输入框回车或发送按钮
-->mFragment.confirmSendMessageIfNeeded() //fragment回调
-->confirmSendMessageIfNeededSync(int slotId) -->confirmNetworkBeforeSend(int slotId) //检查网络
-->checkRoamingBeforeSend(int slotId, boolean isMms)
-->sendMessage(slotId) --> sendSmsByWorkingMessage(dests, slotId)
-->smsWorkingMessage.send()/mmsWorkingMessage.send() //封装信息数据,放入发送队列;
onOptionsItemSelected()中OptionsMenu点击事件,包括呼叫、转发等直接触发或者弹出dialog再由onActivityResult()接收的操作,menu case:
public static final int MENU_LEAVE_CHAT = 101;
...
private static final int MENU_VIEW_FILTER_MIN = 301;