CallManager/SipPhone: fix reject a ringing call

+ CallManager: fix getFirstActiveRingingCall(), getActiveFgCall(), getFirstActiveBgCall()
+ Set DisconnectCause to be INCOMING_REJECTED when a call is rejected

http://b/issue?id=3049671

Change-Id: Ica1d81ca4b71ab0ceb2ab437b82bbb4ccf86fe92
diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java
index 09b7d05..7a026fa 100644
--- a/telephony/java/com/android/internal/telephony/CallManager.java
+++ b/telephony/java/com/android/internal/telephony/CallManager.java
@@ -1468,13 +1468,27 @@
      *
      */
     public Call getActiveFgCall() {
-        for (Call call : mForegroundCalls) {
-            if (call.getState() != Call.State.IDLE) {
+        Call call = getFirstNonIdleCall(mForegroundCalls);
+        if (call == null) {
+            call = (mDefaultPhone == null)
+                    ? null
+                    : mDefaultPhone.getForegroundCall();
+        }
+        return call;
+    }
+
+    // Returns the first call that is not in IDLE state. If both active calls
+    // and disconnecting/disconnected calls exist, return the first active call.
+    private Call getFirstNonIdleCall(List<Call> calls) {
+        Call result = null;
+        for (Call call : calls) {
+            if (!call.isIdle()) {
                 return call;
+            } else if (call.getState() != Call.State.IDLE) {
+                if (result == null) result = call;
             }
         }
-        return (mDefaultPhone == null) ?
-                null : mDefaultPhone.getForegroundCall();
+        return result;
     }
 
     /**
@@ -1491,13 +1505,13 @@
      * Complete background calls list can be get by getBackgroundCalls()
      */
     public Call getFirstActiveBgCall() {
-        for (Call call : mBackgroundCalls) {
-            if (call.getState() != Call.State.IDLE) {
-                return call;
-            }
+        Call call = getFirstNonIdleCall(mBackgroundCalls);
+        if (call == null) {
+            call = (mDefaultPhone == null)
+                    ? null
+                    : mDefaultPhone.getBackgroundCall();
         }
-        return (mDefaultPhone == null) ?
-                null : mDefaultPhone.getBackgroundCall();
+        return call;
     }
 
     /**
@@ -1514,13 +1528,13 @@
      * Complete ringing calls list can be get by getRingingCalls()
      */
     public Call getFirstActiveRingingCall() {
-        for (Call call : mRingingCalls) {
-            if (!call.isIdle()) {
-                return call;
-            }
+        Call call = getFirstNonIdleCall(mRingingCalls);
+        if (call == null) {
+            call = (mDefaultPhone == null)
+                    ? null
+                    : mDefaultPhone.getRingingCall();
         }
-        return (mDefaultPhone == null) ?
-                null : mDefaultPhone.getRingingCall();
+        return call;
     }
 
     /**
diff --git a/telephony/java/com/android/internal/telephony/sip/SipPhone.java b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
index 4fd4cdd..02af0ed 100755
--- a/telephony/java/com/android/internal/telephony/sip/SipPhone.java
+++ b/telephony/java/com/android/internal/telephony/sip/SipPhone.java
@@ -807,7 +807,10 @@
                 } catch (SipException e) {
                     throw new CallStateException("hangup(): " + e);
                 } finally {
-                    mAdapter.onCallEnded(DisconnectCause.LOCAL);
+                    mAdapter.onCallEnded(((mState == Call.State.INCOMING)
+                            || (mState == Call.State.WAITING))
+                            ? DisconnectCause.INCOMING_REJECTED
+                            : DisconnectCause.LOCAL);
                 }
             }
         }