Merge "Dial CS when the result is an EUTRAN without PS domain service."
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 4aad5fe..ed87661 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -271,10 +271,33 @@
         }
 
         removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
-        onWwanNetworkTypeSelected(result.getAccessNetwork());
+        onWwanNetworkTypeSelected(getAccessNetworkType(result));
         mCancelSignal = null;
     }
 
+    /**
+     * Determines the scanned network type.
+     *
+     * @param result The result of network scan.
+     * @return The selected network type.
+     */
+    private @RadioAccessNetworkType int getAccessNetworkType(EmergencyRegResult result) {
+        int accessNetworkType = result.getAccessNetwork();
+        if (accessNetworkType != EUTRAN) return accessNetworkType;
+
+        int regState = result.getRegState();
+        int domain = result.getDomain();
+
+        // Emergency is not supported with LTE, but CSFB is possible.
+        if ((regState == REGISTRATION_STATE_HOME || regState == REGISTRATION_STATE_ROAMING)
+                && (domain == NetworkRegistrationInfo.DOMAIN_CS)) {
+            logi("getAccessNetworkType emergency not supported but CSFB is possible");
+            accessNetworkType = UTRAN;
+        }
+
+        return accessNetworkType;
+    }
+
     @Override
     public void cancelSelection() {
         logi("cancelSelection");
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 3f5b1af..137c844 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -53,6 +53,7 @@
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertTrue;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -139,6 +140,7 @@
     private @AccessNetworkConstants.RadioAccessNetworkType List<Integer> mAccessNetwork;
     private PowerManager mPowerManager;
     private ConnectivityManager.NetworkCallback mNetworkCallback;
+    private Consumer<EmergencyRegResult> mResultConsumer;
 
     @Before
     public void setUp() throws Exception {
@@ -237,6 +239,7 @@
             @Override
             public Void answer(InvocationOnMock invocation) throws Throwable {
                 mAccessNetwork = (List<Integer>) invocation.getArguments()[0];
+                mResultConsumer = (Consumer<EmergencyRegResult>) invocation.getArguments()[3];
                 return null;
             }
         }).when(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
@@ -1130,6 +1133,18 @@
     }
 
     @Test
+    public void testEutranWithCsDomainOnly() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
+                DOMAIN_CS, false, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
     public void testCsThenPsPreference() throws Exception {
         PersistableBundle bundle = getDefaultPersistableBundle();
         int[] domainPreference = new int[] {
@@ -1403,6 +1418,25 @@
         assertTrue(networks.contains(GERAN));
     }
 
+    private void setupForHandleScanResult() throws Exception {
+        mResultConsumer = null;
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(true);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+        processAllMessages();
+
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), anyInt(), any(), any());
+        assertNotNull(mResultConsumer);
+    }
+
     private void createSelector(int subId) throws Exception {
         mDomainSelector = new EmergencyCallDomainSelector(
                 mContext, SLOT_0, subId, mHandlerThread.getLooper(),