Request PS preferred scan after ePDN setup failure in limited state
ePDN setup can fail if it is requested while initial registration is
on going and the registration is rejected.
To recover this exceptional case, request PS preferred scan instead of
CS preferred scan to retry on the same network with emergency attach.
Bug: 331167263
Test: atest EmergencyCallDomainSelectorTest
Change-Id: I3b2aaf9511188c954fc38197af281d7c105df0f4
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();
}