bool
TelephonyCallGroup::CanConference(const TelephonyCall& aCall,
                                  TelephonyCall* aSecondCall)
{
  if (!aCall.Mergeable()) {
    return false;
  }

  if (!aSecondCall) {
    MOZ_ASSERT(!mCalls.IsEmpty());

    return (mCallState == nsITelephonyProvider::CALL_STATE_CONNECTED &&
            aCall.CallState() == nsITelephonyProvider::CALL_STATE_HELD) ||
           (mCallState == nsITelephonyProvider::CALL_STATE_HELD &&
            aCall.CallState() == nsITelephonyProvider::CALL_STATE_CONNECTED);
  }

  MOZ_ASSERT(mCallState == nsITelephonyProvider::CALL_STATE_UNKNOWN);

  if (aCall.ServiceId() != aSecondCall->ServiceId()) {
    return false;
  }

  if (!aSecondCall->Mergeable()) {
    return false;
  }

  return (aCall.CallState() == nsITelephonyProvider::CALL_STATE_CONNECTED &&
          aSecondCall->CallState() == nsITelephonyProvider::CALL_STATE_HELD) ||
         (aCall.CallState() == nsITelephonyProvider::CALL_STATE_HELD &&
          aSecondCall->CallState() == nsITelephonyProvider::CALL_STATE_CONNECTED);
}
bool
TelephonyCallGroup::CanConference(const TelephonyCall& aCall,
                                  const TelephonyCall* aSecondCall)
{
  if (!aCall.Mergeable()) {
    return false;
  }

  if (!aSecondCall) {
    MOZ_ASSERT(!mCalls.IsEmpty());
    return (mState == TelephonyCallGroupState::Connected &&
            aCall.State() == TelephonyCallState::Held) ||
           (mState == TelephonyCallGroupState::Held &&
            aCall.State() == TelephonyCallState::Connected);
  }

  MOZ_ASSERT(mState != TelephonyCallGroupState::_empty);

  if (aCall.ServiceId() != aSecondCall->ServiceId()) {
    return false;
  }

  if (!aSecondCall->Mergeable()) {
    return false;
  }

  return (aCall.State() == TelephonyCallState::Connected &&
          aSecondCall->State() == TelephonyCallState::Held) ||
         (aCall.State() == TelephonyCallState::Held &&
          aSecondCall->State() == TelephonyCallState::Connected);
}