Fixing reject on CDMA devices.

Phone.rejectCall() does not universally work between GSM and CDMA
devices. The right way, ironically, is to invoke hangup() on the Call
object.

Also, adjusted the disconnect cause for calls that were either aborted
or disconnected locally to use DisconnectCause.LOCAL.

Bug: 15197550
Change-Id: Iac113f53a19439a4bc4d1017b23068d1d6b27cb4
diff --git a/src/com/android/services/telephony/PstnConnection.java b/src/com/android/services/telephony/PstnConnection.java
index 8157fca..1ad9b48 100644
--- a/src/com/android/services/telephony/PstnConnection.java
+++ b/src/com/android/services/telephony/PstnConnection.java
@@ -16,6 +16,8 @@
 
 package com.android.services.telephony;
 
+import android.telephony.DisconnectCause;
+
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection;
@@ -55,11 +57,7 @@
     protected void onReject() {
         Log.i(this, "Reject call.");
         if (isValidRingingCall(getOriginalConnection())) {
-            try {
-                mPhone.rejectCall();
-            } catch (CallStateException e) {
-                Log.e(this, e, "Failed to reject call.");
-            }
+            hangup(DisconnectCause.INCOMING_REJECTED);
         }
         super.onReject();
     }
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 5f2de83..0d84134 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -50,13 +50,13 @@
 
     @Override
     protected void onAbort() {
-        hangup();
+        hangup(DisconnectCause.LOCAL);
         super.onAbort();
     }
 
     @Override
     protected void onDisconnect() {
-        hangup();
+        hangup(DisconnectCause.LOCAL);
         super.onDisconnect();
     }
 
@@ -123,13 +123,16 @@
         super.onSetAudioState(audioState);
     }
 
-    private void hangup() {
+    protected void hangup(int disconnectCause) {
         if (mOriginalConnection != null) {
             try {
-                mOriginalConnection.hangup();
+                Call call = mOriginalConnection.getCall();
+                if (call != null) {
+                    call.hangup();
+                }
                 // Set state deliberately since we are going to close() and will no longer be
                 // listening to state updates from mOriginalConnection
-                setDisconnected(DisconnectCause.NORMAL, null);
+                setDisconnected(disconnectCause, null);
             } catch (CallStateException e) {
                 Log.e(this, e, "Call to Connection.hangup failed with exception");
             }