Merge "Fix unit test when the FLAG_ENFORCE_TELEPHONY_FEATURE_MAPPING_FOR_PUBLIC_APIS enabled" into main
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index a510e51..2abf1e2 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -2303,11 +2303,15 @@
// On GSM phones, null connection means that we dialed an MMI code
int telephonyDisconnectCause = handleMmiCode(
phone, android.telephony.DisconnectCause.OUTGOING_FAILURE);
- mNormalCallConnection.setTelephonyConnectionDisconnected(mDisconnectCauseFactory
- .toTelecomDisconnectCause(telephonyDisconnectCause,
- "Connection is null", phone.getPhoneId()));
+ if (mNormalCallConnection.getState() != Connection.STATE_DISCONNECTED) {
+ mNormalCallConnection.setTelephonyConnectionDisconnected(
+ mDisconnectCauseFactory.toTelecomDisconnectCause(
+ telephonyDisconnectCause,
+ "Connection is null",
+ phone.getPhoneId()));
+ mNormalCallConnection.close();
+ }
clearNormalCallDomainSelectionConnection();
- mNormalCallConnection.close();
return;
}
@@ -2354,6 +2358,7 @@
boolean isMmiCode = (dialPart.startsWith("*") || dialPart.startsWith("#"))
&& dialPart.endsWith("#");
boolean isSuppServiceCode = ImsPhoneMmiCode.isSuppServiceCodes(dialPart, phone);
+ boolean isPotentialUssdCode = isMmiCode && !isSuppServiceCode;
// If the number is both an MMI code and a supplementary service code,
// it shall be treated as UT. In this case, domain selection is not performed.
@@ -2362,6 +2367,10 @@
return false;
}
+ /* For USSD codes, connection is closed and MMIDialogActivity is started.
+ To avoid connection close and return false. isPotentialUssdCode is handled after
+ all condition checks. */
+
// Check and select same domain as ongoing call on the same subscription (if exists)
int activeCallDomain = getActiveCallDomain(phone.getSubId());
if (activeCallDomain != NetworkRegistrationInfo.DOMAIN_UNKNOWN
@@ -2397,6 +2406,15 @@
mNormalCallConnection = connection;
future.thenAcceptAsync((domain) -> handleOutgoingCallConnectionByCallDomainSelection(
domain, phone, number, videoState), mDomainSelectionMainExecutor);
+
+ if (isPotentialUssdCode) {
+ Log.v(LOG_TAG, "PotentialUssdCode. Closing connection with DisconnectCause.DIALED_MMI");
+ connection.setTelephonyConnectionDisconnected(
+ mDisconnectCauseFactory.toTelecomDisconnectCause(
+ android.telephony.DisconnectCause.DIALED_MMI,
+ "Dialing USSD", phone.getPhoneId()));
+ connection.close();
+ }
return true;
}
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 05ae1f0..b790e8a 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -657,6 +657,13 @@
private void selectDomainFromInitialState() {
if (mDestroyed) return;
+ if (isInEmergencyCallbackModeOnPsWwan()) {
+ logi("selectDomain PS cellular connected in ECBM");
+ mPsNetworkType = EUTRAN;
+ onWwanNetworkTypeSelected(mPsNetworkType);
+ return;
+ }
+
boolean csInService = isCsInService();
boolean psInService = isPsInService();
@@ -1604,6 +1611,12 @@
&& mEcbmHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
}
+ private boolean isInEmergencyCallbackModeOnPsWwan() {
+ return mEcbmHelper.isInEmergencyCallbackMode(getSlotId())
+ && mEcbmHelper.getTransportType(getSlotId()) == TRANSPORT_TYPE_WWAN
+ && mEcbmHelper.getDataConnectionState(getSlotId()) == DATA_CONNECTED;
+ }
+
@Override
protected void logi(String msg) {
super.logi(msg);
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java b/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java
index e42dfe7..cdf2225 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallbackModeHelper.java
@@ -68,7 +68,7 @@
@NonNull PreciseDataConnectionState dataConnectionState) {
ApnSetting apnSetting = dataConnectionState.getApnSetting();
if ((apnSetting == null)
- || ((apnSetting.getApnTypeBitmask() | ApnSetting.TYPE_EMERGENCY) == 0)) {
+ || ((apnSetting.getApnTypeBitmask() & ApnSetting.TYPE_EMERGENCY) == 0)) {
return;
}
mTransportType = dataConnectionState.getTransportType();
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index b8b3359..39f01a2 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -2877,6 +2877,16 @@
doReturn(TRANSPORT_TYPE_WWAN).when(mEcbmHelper).getTransportType(anyInt());
doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ Consumer<WwanSelectorCallback> consumer =
+ (Consumer<WwanSelectorCallback>) invocation.getArguments()[0];
+ consumer.accept(mWwanSelectorCallback);
+ return null;
+ }
+ }).when(mTransportSelectorCallback).onWwanSelected(any());
+
EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "");
@@ -2889,6 +2899,7 @@
verify(mTransportSelectorCallback, never()).onWlanSelected(anyBoolean());
verify(mTransportSelectorCallback).onWwanSelected(any());
+ verify(mWwanSelectorCallback).onDomainSelected(eq(DOMAIN_PS), eq(true));
}
@Test
@@ -2959,6 +2970,42 @@
verify(mTransportSelectorCallback).onWwanSelected(any());
}
+ @Test
+ public void testNotInEcbmOnWwanConnected() throws Exception {
+ createSelector(SLOT_0_SUB_ID);
+ unsolBarringInfoChanged(false);
+
+ doReturn(false).when(mEcbmHelper).isInEmergencyCallbackMode(anyInt());
+ doReturn(TRANSPORT_TYPE_WLAN).when(mEcbmHelper).getTransportType(anyInt());
+ doReturn(DATA_CONNECTED).when(mEcbmHelper).getDataConnectionState(anyInt());
+
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ Consumer<WwanSelectorCallback> consumer =
+ (Consumer<WwanSelectorCallback>) invocation.getArguments()[0];
+ consumer.accept(mWwanSelectorCallback);
+ return null;
+ }
+ }).when(mTransportSelectorCallback).onWwanSelected(any());
+
+ EmergencyRegistrationResult regResult = getEmergencyRegResult(UNKNOWN,
+ 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(mTransportSelectorCallback, never()).onWlanSelected(anyBoolean());
+ verify(mTransportSelectorCallback).onWwanSelected(any());
+ verify(mWwanSelectorCallback, never()).onDomainSelected(anyInt(), anyBoolean());
+ verify(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
+ any(), anyInt(), anyBoolean(), any(), any());
+ }
+
private void setupForScanListTest(PersistableBundle bundle) throws Exception {
setupForScanListTest(bundle, false);
}