Dial CS when the result is an EUTRAN without PS domain service.

When scanning, if the emergency service is not supported but CSFB is possible, modem will report EUTRAN instead of changing system.

Bug: 267713931
Test: atest EmergencyCallDomainSelector
Change-Id: I05eaa0df0f8a78cdd19e6afcf0d3c072091c1df8
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(),