Merge "Import translations. DO NOT MERGE"
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index e987b94..2d44977 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -112,12 +112,30 @@
     /** Phone state changed event*/
     private static final int PHONE_STATE_CHANGED = -1;
 
+    /** check status then decide whether answerCall */
+    private static final int MSG_CHECK_STATUS_ANSWERCALL = 100;
+
+    /** poll phone DISCONNECTING status interval */
+    private static final int DISCONNECTING_POLLING_INTERVAL_MS = 200;
+
+    /** poll phone DISCONNECTING status times limit */
+    private static final int DISCONNECTING_POLLING_TIMES_LIMIT = 8;
+
     /** Define for not a special CNAP string */
     private static final int CNAP_SPECIAL_CASE_NO = -1;
 
     /** Noise suppression status as selected by user */
     private static boolean sIsNoiseSuppressionEnabled = true;
 
+    private static class FgRingCalls {
+        private Call fgCall;
+        private Call ringing;
+        public FgRingCalls(Call fg, Call ring) {
+            fgCall = fg;
+            ringing = ring;
+        }
+    }
+
     /**
      * Handler that tracks the connections and updates the value of the
      * Mute settings for each connection as needed.
@@ -125,9 +143,32 @@
     private static class ConnectionHandler extends Handler {
         @Override
         public void handleMessage(Message msg) {
-            AsyncResult ar = (AsyncResult) msg.obj;
             switch (msg.what) {
+                case MSG_CHECK_STATUS_ANSWERCALL:
+                    FgRingCalls frC = (FgRingCalls) msg.obj;
+                    // wait for finishing disconnecting
+                    // before check the ringing call state
+                    if ((frC.fgCall != null) &&
+                        (frC.fgCall.getState() == Call.State.DISCONNECTING) &&
+                        (msg.arg1 < DISCONNECTING_POLLING_TIMES_LIMIT)) {
+                        Message retryMsg =
+                            mConnectionHandler.obtainMessage(MSG_CHECK_STATUS_ANSWERCALL);
+                        retryMsg.arg1 = 1 + msg.arg1;
+                        retryMsg.obj = msg.obj;
+                        mConnectionHandler.sendMessageDelayed(retryMsg,
+                            DISCONNECTING_POLLING_INTERVAL_MS);
+                    // since hangupActiveCall() also accepts the ringing call
+                    // check if the ringing call was already answered or not
+                    // only answer it when the call still is ringing
+                    } else if (frC.ringing.isRinging()) {
+                        if (msg.arg1 == DISCONNECTING_POLLING_TIMES_LIMIT) {
+                            Log.e(LOG_TAG, "DISCONNECTING time out");
+                        }
+                        answerCall(frC.ringing);
+                    }
+                    break;
                 case PHONE_STATE_CHANGED:
+                    AsyncResult ar = (AsyncResult) msg.obj;
                     if (DBG) log("ConnectionHandler: updating mute state for each connection");
 
                     CallManager cm = (CallManager) ar.userObj;
@@ -544,17 +585,17 @@
         // hanging up the active call also accepts the waiting call
         // while active call and waiting call are from the same phone
         // i.e. both from GSM phone
-        if (!hangupActiveCall(cm.getActiveFgCall())) {
+        Call fgCall = cm.getActiveFgCall();
+        if (!hangupActiveCall(fgCall)) {
             Log.w(LOG_TAG, "end active call failed!");
             return false;
         }
 
-        // since hangupActiveCall() also accepts the ringing call
-        // check if the ringing call was already answered or not
-        // only answer it when the call still is ringing
-        if (ringing.isRinging()) {
-            return answerCall(ringing);
-        }
+        mConnectionHandler.removeMessages(MSG_CHECK_STATUS_ANSWERCALL);
+        Message msg = mConnectionHandler.obtainMessage(MSG_CHECK_STATUS_ANSWERCALL);
+        msg.arg1 = 1;
+        msg.obj = new FgRingCalls(fgCall, ringing);
+        mConnectionHandler.sendMessage(msg);
 
         return true;
     }