From d8f3d167353f6c6f6c5cb7a4c8e941c03b8e9511 Mon Sep 17 00:00:00 2001 From: Chung-yih Wang Date: Thu, 16 Sep 2010 19:00:01 +0800 Subject: [PATCH] Add a new phone state ANSWERING. The state ANSWERING is set when we answer an incoming sip call, i.e. sending a 'OK' response to the peer. The state will be set to ACTIVE once the 'ACK' from peer is received. Change-Id: I84ee3cc68222eb34e032896ce23f7431d4ad774a --- .../internal/telephony/CallManager.java | 20 ++++++++++++++++--- .../com/android/internal/telephony/Phone.java | 4 +++- .../internal/telephony/sip/SipPhone.java | 1 + .../internal/telephony/sip/SipPhoneBase.java | 2 ++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 8bd789ca8b182..83496dca8763a 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -197,10 +197,12 @@ public final class CallManager { Phone.State s = Phone.State.IDLE; for (Phone phone : mPhones) { - if (phone.getState() == Phone.State.RINGING) { - return Phone.State.RINGING; + if (phone.getState() == Phone.State.ANSWERING) { + return Phone.State.ANSWERING; + } else if (phone.getState() == Phone.State.RINGING) { + s = Phone.State.RINGING; } else if (phone.getState() == Phone.State.OFFHOOK) { - s = Phone.State.OFFHOOK; + if (s == Phone.State.IDLE) s = Phone.State.OFFHOOK; } } return s; @@ -289,6 +291,18 @@ public final class CallManager { return getFirstActiveRingingCall().getPhone(); } + /** + * @return the first answering call + */ + public Call getFirstAnsweringCall() { + for (Phone phone : mPhones) { + if (phone.getState() == Phone.State.ANSWERING) { + return phone.getForegroundCall(); + } + } + return null; + } + /** * unregister phone from CallManager * @param phone diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java index 9afade33b006c..7464cc74ac3b1 100644 --- a/telephony/java/com/android/internal/telephony/Phone.java +++ b/telephony/java/com/android/internal/telephony/Phone.java @@ -55,10 +55,12 @@ public interface Phone { *
  • OFFHOOK = The phone is off hook. At least one call * exists that is dialing, active or holding and no calls are * ringing or waiting.
  • + *
  • ANSWERING = The incoming call is picked up but the + * call is not established yet.
  • * */ enum State { - IDLE, RINGING, OFFHOOK; + IDLE, RINGING, OFFHOOK, ANSWERING; }; /** diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java index 5af32da31b6fc..07dd35d896dea 100755 --- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java +++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java @@ -158,6 +158,7 @@ public class SipPhone extends SipPhoneBase { } else { throw new CallStateException("phone not ringing"); } + updatePhoneState(); } } diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java index 9098e6ffb154f..2efbd175bc0e9 100755 --- a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java +++ b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java @@ -538,6 +538,8 @@ abstract class SipPhoneBase extends PhoneBase { if (getRingingCall().isRinging()) { state = State.RINGING; + } else if (getForegroundCall().isRinging()) { + state = State.ANSWERING; } else if (getForegroundCall().isIdle() && getBackgroundCall().isIdle()) { state = State.IDLE;