am 708e4251: Merge "Revert the ANSWERING state." into gingerbread

Merge commit '708e42512a8b14202cd872d96d1f071ccb4cf915' into gingerbread-plus-aosp

* commit '708e42512a8b14202cd872d96d1f071ccb4cf915':
  Revert the ANSWERING state.
diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java
index 9f86378..49b7a72 100644
--- a/telephony/java/com/android/internal/telephony/CallManager.java
+++ b/telephony/java/com/android/internal/telephony/CallManager.java
@@ -238,9 +238,7 @@
         Phone.State s = Phone.State.IDLE;
 
         for (Phone phone : mPhones) {
-            if (phone.getState() == Phone.State.ANSWERING) {
-                return Phone.State.ANSWERING;
-            } else if (phone.getState() == Phone.State.RINGING) {
+            if (phone.getState() == Phone.State.RINGING) {
                 s = Phone.State.RINGING;
             } else if (phone.getState() == Phone.State.OFFHOOK) {
                 if (s == Phone.State.IDLE) s = Phone.State.OFFHOOK;
@@ -358,19 +356,26 @@
     }
 
     /**
-     * @return the first answering call
+     * unregister phone from CallManager
+     * @param phone
      */
-    public Call getFirstAnsweringCall() {
-        for (Phone phone : mPhones) {
-            if (phone.getState() == Phone.State.ANSWERING) {
-                return phone.getForegroundCall();
+    public void unregisterPhone(Phone phone) {
+        if (phone != null && mPhones.contains(phone)) {
+            mPhones.remove(phone);
+            mRingingCalls.remove(phone.getRingingCall());
+            mBackgroundCalls.remove(phone.getBackgroundCall());
+            mForegroundCalls.remove(phone.getForegroundCall());
+            unregisterForPhoneStates(phone);
+            if (phone == mDefaultPhone) {
+                if (mPhones.isEmpty()) {
+                    mDefaultPhone = null;
+                } else {
+                    mDefaultPhone = mPhones.get(0);
+                }
             }
         }
-        return null;
     }
 
-
-
     public void setAudioMode() {
         Context context = getContext();
         if (context == null) return;
@@ -1359,7 +1364,7 @@
      */
     public Call getFirstActiveBgCall() {
         for (Call call : mBackgroundCalls) {
-            if (!call.isIdle()) {
+            if (call.getState() != Call.State.IDLE) {
                 return call;
             }
         }
diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java
index 4900bb4..3dd9a01 100644
--- a/telephony/java/com/android/internal/telephony/Phone.java
+++ b/telephony/java/com/android/internal/telephony/Phone.java
@@ -55,12 +55,10 @@
      * <li>OFFHOOK = The phone is off hook. At least one call
      * exists that is dialing, active or holding and no calls are
      * ringing or waiting.</li>
-     * <li>ANSWERING = The incoming call is picked up but the
-     *  call is not established yet.</li>
      * </ul>
      */
     enum State {
-        IDLE, RINGING, OFFHOOK, ANSWERING;
+        IDLE, RINGING, OFFHOOK;
     };
 
     /**
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
index 0a87ddb..35aa3b3 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
@@ -143,23 +143,15 @@
             // in case the active/holding call disappeared and this
             // is no longer call waiting
 
-            if (ringingCall.getState() == Call.State.INCOMING) {
+            if ((ringingCall.getState() == Call.State.INCOMING) ||
+                    (ringingCall.getState() == Call.State.WAITING)) {
                 Log.v(LOG_TAG, "acceptCall");
                 // Always unmute when answering a new call
                 setMute(false);
-                // make ringingCall foreground
-                foregroundCall.switchWith(ringingCall);
-                foregroundCall.acceptCall();
-            } else if (ringingCall.getState() == Call.State.WAITING) {
-                setMute(false);
-                switchHoldingAndActive();
-                // make ringingCall foreground
-                foregroundCall.switchWith(ringingCall);
-                foregroundCall.acceptCall();
+                ringingCall.acceptCall();
             } else {
                 throw new CallStateException("phone not ringing");
             }
-            updatePhoneState();
         }
     }
 
@@ -482,8 +474,8 @@
         }
 
         void acceptCall() throws CallStateException {
-            if (this != foregroundCall) {
-                throw new CallStateException("acceptCall() in a non-fg call");
+            if (this != ringingCall) {
+                throw new CallStateException("acceptCall() in a non-ringing call");
             }
             if (connections.size() != 1) {
                 throw new CallStateException("acceptCall() in a conf call");
@@ -646,6 +638,18 @@
                     if (newState == Call.State.INCOMING) {
                         setState(mOwner.getState()); // INCOMING or WAITING
                     } else {
+                        if (mOwner == ringingCall) {
+                            if (ringingCall.getState() == Call.State.WAITING) {
+                                try {
+                                    switchHoldingAndActive();
+                                } catch (CallStateException e) {
+                                    // disconnect the call.
+                                    onCallEnded(DisconnectCause.LOCAL);
+                                    return;
+                                }
+                            }
+                            foregroundCall.switchWith(ringingCall);
+                        }
                         if (newState == Call.State.ACTIVE) call.startAudio();
                         setState(newState);
                     }
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
index 2efbd17..9098e6f 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
@@ -538,8 +538,6 @@
 
         if (getRingingCall().isRinging()) {
             state = State.RINGING;
-        } else if (getForegroundCall().isRinging()) {
-            state = State.ANSWERING;
         } else if (getForegroundCall().isIdle()
                 && getBackgroundCall().isIdle()) {
             state = State.IDLE;