private void updatePhoneState() {
    PhoneConstants.State oldState = mState;

    if (mRingingCall.isRinging()) {
      mState = PhoneConstants.State.RINGING;
    } else if (mPendingMO != null || !(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
      mState = PhoneConstants.State.OFFHOOK;
    } else {
      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 (DBG) log("updatePhoneState oldState=" + oldState + ", newState=" + mState);

    if (mState != oldState) {
      mPhone.notifyPhoneStateChanged();
    }
  }