IMS:silent redial/srvcc call cleanup.

When silent redial or srvcc occurs. the IMSPhone call state is not set to idle
even after the call is ended. Also, the mConnection in mHandoverCall is not
cleaned up. This CL is to fix these 2 issues.

Bug:  19035679
Change-Id: I6bee704e2d7d8bf05ca1a910d25af4a02347328b
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java b/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
index 6b1a648..e7a394a 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaCallTracker.java
@@ -37,6 +37,7 @@
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.TelephonyProperties;
+import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 
 import java.io.FileDescriptor;
@@ -467,6 +468,10 @@
                 !(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
             mState = PhoneConstants.State.OFFHOOK;
         } else {
+            ImsPhone imsPhone = (ImsPhone)mPhone.getImsPhone();
+            if ( mState == PhoneConstants.State.OFFHOOK && (imsPhone != null)){
+                imsPhone.callEndCleanupHandOverCallIfAny();
+            }
             mState = PhoneConstants.State.IDLE;
         }
 
diff --git a/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java b/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
index c483a5e..64b4155 100755
--- a/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
@@ -46,6 +46,7 @@
 import com.android.internal.telephony.gsm.GSMPhone;
 import com.android.internal.telephony.gsm.GsmCall;
 import com.android.internal.telephony.gsm.GsmConnection;
+import com.android.internal.telephony.imsphone.ImsPhone;
 import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 
 import java.io.FileDescriptor;
@@ -393,13 +394,16 @@
     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 {
+            ImsPhone imsPhone = (ImsPhone)mPhone.getImsPhone();
+            if ( mState == PhoneConstants.State.OFFHOOK && (imsPhone != null)){
+                imsPhone.callEndCleanupHandOverCallIfAny();
+            }
             mState = PhoneConstants.State.IDLE;
         }
 
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index 18291ff..efc53c4 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -1249,7 +1249,12 @@
     public boolean isImsRegistered() {
         return mImsRegistered;
     }
+
     public void setImsRegistered(boolean value) {
         mImsRegistered = value;
     }
+
+    public void callEndCleanupHandOverCallIfAny() {
+        mCT.callEndCleanupHandOverCallIfAny();
+    }
 }
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
index dfc53ba..4c76401 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
@@ -780,6 +780,15 @@
         mPhone.notifyPreciseCallStateChanged();
     }
 
+    void callEndCleanupHandOverCallIfAny() {
+        if (mHandoverCall.mConnections.size() > 0) {
+            if (DBG) log("callEndCleanupHandOverCallIfAny, mHandoverCall.mConnections="
+                    + mHandoverCall.mConnections);
+            mHandoverCall.mConnections.clear();
+            mState = PhoneConstants.State.IDLE;
+        }
+    }
+
     /* package */
     void resumeWaitingOrHolding() throws CallStateException {
         if (DBG) log("resumeWaitingOrHolding");