Merge "Hang up original swapped connection" into oc-dr1-dev
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 1ce0c00..3b2ffc6 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -39,6 +39,7 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.Process;
+import android.os.PersistableBundle;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
 import android.os.UserHandle;
@@ -58,6 +59,7 @@
 import android.telephony.NeighboringCellInfo;
 import android.telephony.NetworkScanRequest;
 import android.telephony.RadioAccessFamily;
+import android.telephony.Rlog;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SmsManager;
@@ -65,6 +67,7 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyHistogram;
 import android.telephony.TelephonyManager;
+import android.telephony.UssdResponse;
 import android.telephony.VisualVoicemailSmsFilterSettings;
 import android.text.TextUtils;
 import android.util.ArraySet;
@@ -287,6 +290,22 @@
                      Pair<String, ResultReceiver> ussdObject = (Pair) request.argument;
                      String ussdRequest =  ussdObject.first;
                      ResultReceiver wrappedCallback = ussdObject.second;
+
+                     if (!isUssdApiAllowed(request.subId)) {
+                         // Carrier does not support use of this API, return failure.
+                         Rlog.w(LOG_TAG, "handleUssdRequest: carrier does not support USSD apis.");
+                         UssdResponse response = new UssdResponse(ussdRequest, null);
+                         Bundle returnData = new Bundle();
+                         returnData.putParcelable(TelephonyManager.USSD_RESPONSE, response);
+                         wrappedCallback.send(TelephonyManager.USSD_RETURN_FAILURE, returnData);
+
+                         request.result = true;
+                         synchronized (request) {
+                             request.notifyAll();
+                         }
+                         return;
+                     }
+
                      try {
                          request.result = phone != null ?
                                  phone.handleUssdRequest(ussdRequest, wrappedCallback)
@@ -3832,6 +3851,21 @@
         }
     }
 
+    private boolean isUssdApiAllowed(int subId) {
+        CarrierConfigManager configManager =
+                (CarrierConfigManager) mPhone.getContext().getSystemService(
+                        Context.CARRIER_CONFIG_SERVICE);
+        if (configManager == null) {
+            return false;
+        }
+        PersistableBundle pb = configManager.getConfigForSubId(subId);
+        if (pb == null) {
+            return false;
+        }
+        return pb.getBoolean(
+                CarrierConfigManager.KEY_ALLOW_USSD_REQUESTS_VIA_TELEPHONY_MANAGER_BOOL);
+    }
+
     /**
      * Check if phone is in emergency callback mode
      * @return true if phone is in emergency callback mode