一.主要简介
作为快速上手的介绍,当然只是介绍需要重点关注能够快速定位代码的地方,有些具体的代码不会做详细介绍,只介绍需要关注类的重点代码片段。
二.功能介绍
上面两张图片分别是通话状态和来电状态图片,我主要介绍也是围绕这两张图片功能来介绍。
主要功能:
1.显示通话信息(联系人信息,通话状态时间等)
2.外音,静音,录音,键盘,呼叫保持,多方通话,电话切换,多方通话管理,视频通话,挂断电话,短信拒接等功能
3.来电通知栏提醒,全屏显示,通话切后台切换,靠近灭屏等功能
三.关键类和布局介绍
1.IncallUi重点只有一个InCallActivity,所有界面都是通过它切换fragment管理。
@Override
public void onFragmentAttached(Fragment fragment) {
if (fragment instanceof DialpadFragment) {
mDialpadFragment = (DialpadFragment) fragment;
} else if (fragment instanceof AnswerFragment) {
mAnswerFragment = (AnswerFragment) fragment;
} else if (fragment instanceof CallCardFragment) {
mCallCardFragment = (CallCardFragment) fragment;
mChildFragmentManager = mCallCardFragment.getChildFragmentManager();
} else if (fragment instanceof ConferenceManagerFragment) {
mConferenceManagerFragment = (ConferenceManagerFragment) fragment;
} else if (fragment instanceof CallButtonFragment) {
mCallButtonFragment = (CallButtonFragment) fragment;
}
}
private void showFragment(String tag, boolean show, boolean executeImmediately) {
Trace.beginSection("showFragment - " + tag);
final FragmentManager fm = getFragmentManagerForTag(tag);
if (fm == null) {
Log.w(TAG, "Fragment manager is null for : " + tag);
return;
}
Fragment fragment = fm.findFragmentByTag(tag);
if (!show && fragment == null) {
// Nothing to show, so bail early.
return;
}
final FragmentTransaction transaction = fm.beginTransaction();
if (show) {
if (fragment == null) {
fragment = createNewFragmentForTag(tag);
transaction.add(getContainerIdForFragment(tag), fragment, tag);
} else {
transaction.show(fragment);
}
Logger.logScreenView(getScreenTypeForTag(tag), this);
} else {
transaction.hide(fragment);
}
transaction.commitAllowingStateLoss();
if (executeImmediately) {
fm.executePendingTransactions();
}
Trace.endSection();
}
private Fragment createNewFragmentForTag(String tag) {
if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
mDialpadFragment = new DialpadFragment();
return mDialpadFragment;
} else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
if (AccessibilityUtil.isTalkBackEnabled(this)) {
mAnswerFragment = new AccessibleAnswerFragment();
} else {
mAnswerFragment = new GlowPadAnswerFragment();
}
return mAnswerFragment;
} else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
mConferenceManagerFragment = new ConferenceManagerFragment();
return mConferenceManagerFragment;
} else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
mCallCardFragment = new CallCardFragment();
return mCallCardFragment;
}
throw new IllegalStateException("Unexpected fragment: " + tag);
}
private FragmentManager getFragmentManagerForTag(String tag) {
if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
return mChildFragmentManager;
} else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
return mChildFragmentManager;
} else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
return getFragmentManager();
} else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
return getFragmentManager();
}
throw new IllegalStateException("Unexpected fragment: " + tag);
}
private int getScreenTypeForTag(String tag) {
switch (tag) {
case TAG_DIALPAD_FRAGMENT:
return ScreenEvent.INCALL_DIALPAD;
case TAG_CALLCARD_FRAGMENT:
return ScreenEvent.INCALL;
case TAG_CONFERENCE_FRAGMENT:
return ScreenEvent.CONFERENCE_MANAGEMENT;
case TAG_ANSWER_FRAGMENT:
return ScreenEvent.INCOMING_CALL;
default:
return ScreenEvent.UNKNOWN;
}
}
private int getContainerIdForFragment(String tag) {
if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
return R.id.answer_and_dialpad_container;
} else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
return R.id.answer_and_dialpad_container;
} else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
return R.id.main;
} else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
return R.id.main;
}
throw new IllegalStateException("Unexpected fragment: " + tag);
}
2.CallCardFragment.java CallCardPresenter.java主要主要功能,显示通话信息(联系人信息,通话状态时间等),挂断电话,第二通话信息管理,录音时间显示功能:
2.1CallCardFragment.java主要主要功能,显示通话信息(联系人信息,通话状态时间等),挂断电话,第二通话信息管理,录音时间显示功能。
设置通话显示信息接口(通话状态,姓名,号码,通话时间,联系人头像,归属地。。。)。
public void setPrimary(String number, String name, boolean nameIsNumber, String label,
Drawable photo, boolean isSipCall, boolean isContactPhotoShown, boolean isWorkCall)
第二路通话信息显示接口(通话状态,姓名,号码,归属地。。。)。
public void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
String providerLabel, boolean isConference, boolean isVideoCall, boolean isFullscreen)
更新背景颜色
public void updateColors()
显示多方通话管理按钮
public void showManageConferenceCallButton(boolean visible)
更新录音时间
private void updateRecordTimeState(boolean isRecording)
2.2.CallCardPresenter.java查询联系人信息,更新通话状态
查询通话联系人信息
private void startContactInfoSearch(final Call call, final boolean isPrimary,boolean isIncoming)