Merge "Request PS preferred scan after ePDN setup failure in limited state" into 24D1-dev
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index fbe61eb..a75f244 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -390,6 +390,18 @@
             return;
         }
 
+        if (mLastNetworkType == EUTRAN && mLastRegResult != null
+                && mSelectionAttributes.getPsDisconnectCause() != null) {
+            int regState = mLastRegResult.getRegState();
+            int reasonCode = mSelectionAttributes.getPsDisconnectCause().getCode();
+            if (reasonCode == ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED
+                    && regState != REGISTRATION_STATE_HOME
+                    && regState != REGISTRATION_STATE_ROAMING) {
+                // b/326292100, ePDN setup failed in limited state, request PS preferred scan.
+                mLastNetworkType = UNKNOWN;
+            }
+        }
+
         requestScan(true);
         mDomainSelected = false;
     }
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 3079ebd..b995ff5 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -113,6 +113,7 @@
 import android.telephony.WwanSelectorCallback;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.ImsReasonInfo;
 import android.telephony.ims.ProvisioningManager;
 import android.testing.TestableLooper;
 import android.util.Log;
@@ -2763,6 +2764,35 @@
         bindImsServiceUnregistered();
 
         verifyPsDialed();
+
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanCsPreferred();
+    }
+
+    @Test
+    public void testDefaultLimitedServiceEutranFail() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+                REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+
+        attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, false, regResult,
+                new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null));
+        mDomainSelector.reselectDomain(attr);
+        processAllMessages();
+
+        verifyScanPsPreferred();
     }
 
     @Test
@@ -3350,11 +3380,18 @@
 
     private static SelectionAttributes getSelectionAttributes(int slotId, int subId,
             boolean isTestEmergencyNumber, EmergencyRegistrationResult regResult) {
+        return getSelectionAttributes(slotId, subId, isTestEmergencyNumber, regResult, null);
+    }
+
+    private static SelectionAttributes getSelectionAttributes(int slotId, int subId,
+            boolean isTestEmergencyNumber, EmergencyRegistrationResult regResult,
+            ImsReasonInfo imsReasonInfo) {
         SelectionAttributes.Builder builder =
                 new SelectionAttributes.Builder(slotId, subId, SELECTOR_TYPE_CALLING)
                 .setAddress(TEST_URI)
                 .setEmergency(true)
                 .setTestEmergencyNumber(isTestEmergencyNumber)
+                .setPsDisconnectCause(imsReasonInfo)
                 .setEmergencyRegistrationResult(regResult);
         return builder.build();
     }