Merge "Keep PS preferred scan after VoLTE failure only once" into 24D1-dev
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 18c03ac..29ad29e 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -215,6 +215,7 @@
     private boolean mTryCsWhenPsFails;
     private boolean mTryEsFallback;
     private boolean mIsWaitingForDataDisconnection;
+    private boolean mSwitchRatPreferenceWithLocalNotRegistered;
     private int mModemCount;
 
     /** Indicates whether this instance is deactivated. */
@@ -445,7 +446,8 @@
         }
 
         if (mLastNetworkType == EUTRAN && mLastRegResult != null
-                && mSelectionAttributes.getPsDisconnectCause() != null) {
+                && mSelectionAttributes.getPsDisconnectCause() != null
+                && !mSwitchRatPreferenceWithLocalNotRegistered) {
             int regState = mLastRegResult.getRegState();
             int reasonCode = mSelectionAttributes.getPsDisconnectCause().getCode();
             if (reasonCode == ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED
@@ -453,6 +455,7 @@
                     && regState != REGISTRATION_STATE_ROAMING) {
                 // b/326292100, ePDN setup failed in limited state, request PS preferred scan.
                 mLastNetworkType = UNKNOWN;
+                mSwitchRatPreferenceWithLocalNotRegistered = true;
             }
         }
 
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index fab7256..53f3b8a 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -2882,6 +2882,7 @@
 
     @Test
     public void testDefaultLimitedServiceEutranFail() throws Exception {
+        mResultConsumer = null;
         createSelector(SLOT_0_SUB_ID);
         unsolBarringInfoChanged(false);
 
@@ -2894,14 +2895,36 @@
 
         bindImsServiceUnregistered();
 
-        verifyPsDialed();
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
 
         attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
                 new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
         mDomainSelector.reselectDomain(attr);
         processAllMessages();
 
-        verifyScanPsPreferred();
+        // Verify PS preferred scan
+        verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(EUTRAN, (int) mAccessNetwork.get(0));
+        assertNotNull(mResultConsumer);
+
+        regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, false, 0, 0, "", "");
+        mResultConsumer.accept(regResult);
+
+        processAllMessages();
+        verify(mWwanSelectorCallback, times(2)).onDomainSelected(eq(DOMAIN_PS), eq(true));
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        // Verify RAT preference change
+        verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
+                any(), eq(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE),
+                anyBoolean(), any(), any());
+        assertEquals(UTRAN, (int) mAccessNetwork.get(0));
     }
 
     @Test