Merge "Try CSFB if emergency service is not supported in scanned network" into 24D1-dev am: 71f132da0d

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/services/Telephony/+/27205444

Change-Id: If49c47b387c119e6ad4675a6c31c4aa4f32893e2
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index e992de2..3fb6ae8 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -342,6 +342,15 @@
                             logi("requestScan-onComplete");
                             sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
                         });
+            } else if ((mPreferredNetworkScanType
+                    == CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE)
+                    && (mScanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE)) {
+                mWwanSelectorCallback.onRequestEmergencyNetworkScan(
+                        mLastPreferredNetworks, mScanType, true, mCancelSignal,
+                        (regResult) -> {
+                            logi("requestScan-onComplete");
+                            sendMessage(obtainMessage(MSG_NETWORK_SCAN_RESULT, regResult));
+                        });
             } else {
                 // Continuous scan, do not start a new timer.
                 requestScan(false);
@@ -367,11 +376,10 @@
         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)) {
+                && isCsDomainOnlyAvailable(result)) {
             logi("getAccessNetworkType emergency not supported but CSFB is possible");
             accessNetworkType = UTRAN;
         }
@@ -379,6 +387,15 @@
         return accessNetworkType;
     }
 
+    private boolean isCsDomainOnlyAvailable(EmergencyRegistrationResult result) {
+        int domain = result.getDomain();
+        if (domain == NetworkRegistrationInfo.DOMAIN_CS) return true;
+        if ((domain & NetworkRegistrationInfo.DOMAIN_CS) > 0) {
+            return (!result.isEmcBearerSupported() || !result.isVopsSupported());
+        }
+        return false;
+    }
+
     @Override
     public void reselectDomain(SelectionAttributes attr) {
         logi("reselectDomain attr=" + attr);
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 7c5a82c..4690d6e 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -1893,6 +1893,32 @@
     }
 
     @Test
+    public void testEutranVopsNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, false, true, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testEutranEmcBearerNotSupported() throws Exception {
+        setupForHandleScanResult();
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_HOME,
+                DOMAIN_CS | DOMAIN_PS, true, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+        processAllMessages();
+
+        verifyCsDialed();
+    }
+
+    @Test
     public void testEutranWithPsDomainOnly() throws Exception {
         setupForHandleScanResult();
 
@@ -1945,8 +1971,10 @@
         mResultConsumer.accept(regResult);
         processAllMessages();
 
-        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
                 any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(false), any(), any());
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), eq(true), any(), any());
     }
 
     @Test