Merge "Dial CS when the result is an EUTRAN without PS domain service."
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 4aad5fe..ed87661 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -271,10 +271,33 @@
}
removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
- onWwanNetworkTypeSelected(result.getAccessNetwork());
+ onWwanNetworkTypeSelected(getAccessNetworkType(result));
mCancelSignal = null;
}
+ /**
+ * Determines the scanned network type.
+ *
+ * @param result The result of network scan.
+ * @return The selected network type.
+ */
+ private @RadioAccessNetworkType int getAccessNetworkType(EmergencyRegResult result) {
+ int accessNetworkType = result.getAccessNetwork();
+ 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)) {
+ logi("getAccessNetworkType emergency not supported but CSFB is possible");
+ accessNetworkType = UTRAN;
+ }
+
+ return accessNetworkType;
+ }
+
@Override
public void cancelSelection() {
logi("cancelSelection");
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 3f5b1af..137c844 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -53,6 +53,7 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -139,6 +140,7 @@
private @AccessNetworkConstants.RadioAccessNetworkType List<Integer> mAccessNetwork;
private PowerManager mPowerManager;
private ConnectivityManager.NetworkCallback mNetworkCallback;
+ private Consumer<EmergencyRegResult> mResultConsumer;
@Before
public void setUp() throws Exception {
@@ -237,6 +239,7 @@
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
mAccessNetwork = (List<Integer>) invocation.getArguments()[0];
+ mResultConsumer = (Consumer<EmergencyRegResult>) invocation.getArguments()[3];
return null;
}
}).when(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
@@ -1130,6 +1133,18 @@
}
@Test
+ public void testEutranWithCsDomainOnly() throws Exception {
+ setupForHandleScanResult();
+
+ EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
+ DOMAIN_CS, false, false, 0, 0, "", "");
+ mResultConsumer.accept(regResult);
+ processAllMessages();
+
+ verifyCsDialed();
+ }
+
+ @Test
public void testCsThenPsPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
@@ -1403,6 +1418,25 @@
assertTrue(networks.contains(GERAN));
}
+ private void setupForHandleScanResult() throws Exception {
+ mResultConsumer = null;
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(true);
+
+ EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+ 0, false, false, 0, 0, "", "");
+ SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+ mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+ processAllMessages();
+
+ bindImsServiceUnregistered();
+ processAllMessages();
+
+ verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
+ any(), anyInt(), any(), any());
+ assertNotNull(mResultConsumer);
+ }
+
private void createSelector(int subId) throws Exception {
mDomainSelector = new EmergencyCallDomainSelector(
mContext, SLOT_0, subId, mHandlerThread.getLooper(),