Adjust the RAT preference when SIM is absent
There can be countries where emergency calls on 2G networks
are more stable than other networks when SIM is absent.
Per configuration, adjust the RAT preference for network scan
when SIM is absent.
Bug: 335537430
Test: atest EmergencyCallDomainSelectorTest
Change-Id: I4751bffb4903d680355dc2dddd870dc649c2c502
diff --git a/res/values/config.xml b/res/values/config.xml
index a934398..1441cd1 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -358,6 +358,14 @@
<item>us</item>
</string-array>
+ <!-- Array of countries that GERAN is preferred than UTRAN and EUTRAN when SIM is absent.
+ Values should be ISO3166 country codes in lowercase. -->
+ <string-array name="config_countries_prefer_geran_when_sim_absent"
+ translatable="false">
+ <!-- b/335537430 -->
+ <item>cn</item>
+ </string-array>
+
<!-- The component name(a flattened ComponentName string) for the telephony domain selection
service. The device should fallback to the modem based domain selection architecture
if this is not configured. -->
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 897f226..a01131f 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -157,6 +157,7 @@
private static List<String> sSimReadyAllowList;
private static List<String> sPreferSlotWithNormalServiceList;
private static List<String> sPreferCsAfterCsfbFailure;
+ private static List<String> sPreferGeranWhenSimAbsent;
/**
* Network callback used to determine whether Wi-Fi is connected or not.
@@ -793,6 +794,13 @@
}
logi("readResourceConfiguration preferCsAfterCsfbFailure="
+ sPreferCsAfterCsfbFailure);
+
+ if (sPreferGeranWhenSimAbsent == null) {
+ sPreferGeranWhenSimAbsent = readResourceConfiguration(
+ R.array.config_countries_prefer_geran_when_sim_absent);
+ }
+ logi("readResourceConfiguration preferGeranWhenSimAbsent="
+ + sPreferGeranWhenSimAbsent);
}
private List<String> readResourceConfiguration(int id) {
@@ -819,6 +827,7 @@
sSimReadyAllowList = null;
sPreferSlotWithNormalServiceList = null;
sPreferCsAfterCsfbFailure = null;
+ sPreferGeranWhenSimAbsent = null;
}
private void selectDomain() {
@@ -1046,6 +1055,17 @@
+ ", csPreferred=" + csPreferred + ", esFallback=" + tryEsFallback
+ ", lastNetworkType=" + accessNetworkTypeToString(mLastNetworkType));
+ if (mLastRegResult != null
+ && !SubscriptionManager.isValidSubscriptionId(getSubId())
+ && sPreferGeranWhenSimAbsent.contains(mLastRegResult.getCountryIso())) {
+ logi("getNextPreferredNetworks preferGeran");
+ preferredNetworks.add(GERAN);
+ preferredNetworks.add(UTRAN);
+ preferredNetworks.add(EUTRAN);
+ preferredNetworks.add(NGRAN);
+ return preferredNetworks;
+ }
+
if (!csPreferred && (mLastNetworkType == UNKNOWN || tryEsFallback)) {
// Generate the list per the domain preference.
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 13ff5ac..7c8a884 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -129,6 +129,7 @@
import androidx.test.filters.SmallTest;
import com.android.TestContext;
+import com.android.phone.R;
import org.junit.After;
import org.junit.Before;
@@ -3970,6 +3971,87 @@
}
@Test
+ public void testAdjustCsRatPreference() throws Exception {
+ doReturn(new String[] {"us"}).when(mResources).getStringArray(
+ eq(R.array.config_countries_prefer_geran_when_sim_absent));
+
+ createSelector(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ unsolBarringInfoChanged(false);
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+ REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "", "us");
+ // Invalid subscription id
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyPsDialed();
+
+ mDomainSelector.reselectDomain(attr);
+ processAllMessages();
+
+ // Verify adjusted RAT preference
+ verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, GERAN);
+ }
+
+ @Test
+ public void testNotAdjustCsRatPreferenceCountryNotIdentified() throws Exception {
+ doReturn(new String[] {"us"}).when(mResources).getStringArray(
+ eq(R.array.config_countries_prefer_geran_when_sim_absent));
+
+ createSelector(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ unsolBarringInfoChanged(false);
+
+ // Country is not identified
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+ REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "");
+ // Invalid subscription id
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyPsDialed();
+
+ mDomainSelector.reselectDomain(attr);
+ processAllMessages();
+
+ // Verify not adjusted RAT preference
+ verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, UTRAN);
+ }
+
+ @Test
+ public void testNotAdjustCsRatPreferenceValidSubscription() throws Exception {
+ doReturn(new String[] {"us"}).when(mResources).getStringArray(
+ eq(R.array.config_countries_prefer_geran_when_sim_absent));
+
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(EUTRAN,
+ REGISTRATION_STATE_UNKNOWN, 0, false, true, 0, 0, "", "", "us");
+ // Valid subscription id
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+
+ verifyPsDialed();
+
+ mDomainSelector.reselectDomain(attr);
+ processAllMessages();
+
+ // Verify not adjusted RAT preference
+ verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, UTRAN);
+ }
+
+ @Test
public void testNotTerminateSelectionAfterCsFailure() throws Exception {
mResultConsumer = null;
createSelector(SLOT_0_SUB_ID);