GsmCdmaCallTracker updatePhoneState
private void updatePhoneState() {
PhoneConstants.State oldState = mState;
/**
mRingingCall,mForegroundCall,mBackgroundCall在GsmCdmaCallTracker 初始化进行的初始化
public GsmCdmaCall mRingingCall = new GsmCdmaCall(this);
// A call that is ringing or (call) waiting
public GsmCdmaCall mForegroundCall = new GsmCdmaCall(this);
public GsmCdmaCall mBackgroundCall = new GsmCdmaCall(this);
*/
/**
(GsmCdmaCall)mRingingCall.isRinging()-->Call.isRinging-->getState().isRinging()-->
getState()-->mState-->State mState = State.IDLE-->(Call>public enum State(内部类))
isRinging()-->return this == INCOMING || this == WAITING;
*/
if (mRingingCall.isRinging()) {
mState = PhoneConstants.State.RINGING;
} else if (mPendingMO != null ||
!(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
mState = PhoneConstants.State.OFFHOOK;
} else {
Phone imsPhone = mPhone.getImsPhone();
if ( mState == PhoneConstants.State.OFFHOOK && (imsPhone != null)){
imsPhone.callEndCleanupHandOverCallIfAny();
}
mState = PhoneConstants.State.IDLE;
}
if (mState == PhoneConstants.State.IDLE && oldState != mState) {
mVoiceCallEndedRegistrants.notifyRegistrants(
new AsyncResult(null, null, null));
} else if (oldState == PhoneConstants.State.IDLE && oldState != mState) {
mVoiceCallStartedRegistrants.notifyRegistrants (
new AsyncResult(null, null, null));
}
if (Phone.DEBUG_PHONE) {
log("update phone state, old=" + oldState + " new="+ mState);
}
if (mState != oldState) {
mPhone.notifyPhoneStateChanged();
TelephonyMetrics.getInstance().writePhoneState(mPhone.getPhoneId(), mState);
}
}