单路通话挂断流程
原生代码和rom厂商之间可能存在差异,我所了解到的,就是将dialer解耦一部分和通话界面相关的内容独立成一个应用。
首先我们先从界面上的挂断按钮的点击事件说起:
packages\apps\Dialer\java\com\android\incallui\incall\impl\InCallFragment.java
public void onClick(View view) {
if (view == endCallButton) {
LogUtil.i("InCallFragment.onClick", "end call button clicked");
Logger.get(getContext())
.logImpression(DialerImpression.Type.IN_CALL_DIALPAD_HANG_UP_BUTTON_PRESSED);
inCallScreenDelegate.onEndCallClicked();
} else {
LogUtil.e("InCallFragment.onClick", "unknown view: " + view);
Assert.fail();
}
}
packages\apps\Dialer\java\com\android\incallui\CallButtonPresenter.java
public void onEndCallClicked() {
LogUtil.i("CallButtonPresenter.onEndCallClicked", "call: " + call);
if (call != null) {
call.disconnect();
}
}
packages\apps\Dialer\java\com\android\incallui\call\DialerCall.java
import android.telecom.Call;
public void disconnect() {
LogUtil.i("DialerCall.disconnect", "");
setState(DialerCallState.DISCONNECTING);
for (DialerCallListener listener : listeners) {
listener.onDialerCallUpdate();
}
telecomCall.disconnect();
}
frameworks\base\telecomm\java\android\telecom\Call.java
private final InCallAdapter mInCallAdapter;
public void disconnect() {
mInCallAdapter.disconnectCall(mTelecomCallId);
}
有多个InCallAdapter,因为Call中没有对InCallAdapter进行导包,所以使用到的应该是同包下的类
frameworks\base\telecomm\java\android\telecom\InCallAdapter.java
private final IInCallAdapter mAdapter;
public void disconnectCall(String callId) {
try {
mAdapter.disconnectCall(callId);
} catch (RemoteException e) {
}
}
android\telecom\InCallAdapter到android\server\telecom是binder调用,我们就不细讲了
这个地方由FWK(框架层) —> APP(应用层)
packages\services\Telecomm\src\com\android\server\telecom\InCallAdapter.java
class InCallAdapter extends IInCallAdapter.Stub {
}
public void disconnectCall(String callId) {
try {
Log.startSession(LogUtils.Sessions.ICA_DISCONNECT_CALL, mOwnerPackageName);
long token = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
Log.v(this, "disconnectCall: %s", callId);
Call call = mCallIdMapper.getCall(callId);
if (call != null) {
mCallsManager.disconnectCall(call);
} else {
Log.w(this, "disconnectCall, unknown call id: %s", callId);
}
}
} finally {
Binder.restoreCallingIdentity(token);
}
} finally {
Log.endSession();
}
}
packages\services\Telecomm\src\com\android\server\telecom\CallsManager.java
public void disconnectCall(Call call) {
Log.v(this, "disconnectCall %s", call);
if (!mCalls.contains(call)) {
Log.w(this, "Unknown call (%s) asked to disconnect", call);
} else {
mLocallyDisconnectingCalls.add(call);
call.disconnect();
// Cancel any of the outgoing call futures if they're still around.
if (mPendingCallConfirm != null && !mPendingCallConfirm.isDone()) {
mPendingCallConfirm.complete(null);
mPendingCallConfirm = null;