am 6ad0dba3: am 92462cfa: Prevent non-emergency calls in ECM mode.

* commit '6ad0dba3cab65c93b3b500569d847e0bdd76fcd5':
  Prevent non-emergency calls in ECM mode.
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 360e9ef..da9cd33 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -941,6 +941,8 @@
     <string name="incall_error_power_off">Turn off airplane mode to make a call.</string>
     <!-- In-call screen: call failure message displayed in an error dialog when in airplane mode, WFC is enabled, not wifi-only, and not connected to wireless networks. [CHAR_LIMIT=NONE] -->
     <string name="incall_error_power_off_wfc">Turn off airplane mode or connect to a wireless network to make a call.</string>
+    <!-- In-call screen: call failure message displayed when the user attempts to make a non-emergency call while the phone is in emergency callback mode. -->
+    <string name="incall_error_ecm_emergency_only">Exit emergency callback mode to make a non-emergency call.</string>
     <!-- In-call screen: call failure message displayed in an error dialog.
          This string is currently unused (see comments in InCallScreen.java.) -->
     <string name="incall_error_emergency_only">Not registered on network.</string>
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index 81fc7aa..235c4b9 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -289,6 +289,11 @@
                 }
                 break;
 
+            case android.telephony.DisconnectCause.CDMA_NOT_EMERGENCY:
+                // Only emergency calls are allowed when in emergency callback mode.
+                resourceId = R.string.incall_error_ecm_emergency_only;
+                break;
+
             case android.telephony.DisconnectCause.EMERGENCY_ONLY:
                 // Only emergency numbers are allowed, but we tried to dial
                 // a non-emergency number.
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index e3807b8..a14a884 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -27,6 +27,7 @@
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telephony.CarrierConfigManager;
+import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
@@ -223,6 +224,26 @@
         }
         boolean useEmergencyCallHelper = false;
 
+        // If we're dialing a non-emergency number and the phone is in ECM mode, reject the call if
+        // carrier configuration specifies that we cannot make non-emergency calls in ECM mode.
+        if (!isEmergencyNumber && phone.isInEcm()) {
+            boolean allowNonEmergencyCalls = true;
+            CarrierConfigManager cfgManager = (CarrierConfigManager)
+                    phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+            if (cfgManager != null) {
+                allowNonEmergencyCalls = cfgManager.getConfigForSubId(phone.getSubId())
+                        .getBoolean(CarrierConfigManager.KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL);
+            }
+
+            if (!allowNonEmergencyCalls) {
+                return Connection.createFailedConnection(
+                        DisconnectCauseUtil.toTelecomDisconnectCause(
+                                DisconnectCause.CDMA_NOT_EMERGENCY,
+                                "Cannot make non-emergency call in ECM mode."
+                        ));
+            }
+        }
+
         if (isEmergencyNumber) {
             if (!phone.isRadioOn()) {
                 useEmergencyCallHelper = true;