aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flags/data.aconfig7
-rw-r--r--src/java/com/android/internal/telephony/ServiceStateTracker.java2
-rw-r--r--src/java/com/android/internal/telephony/data/AccessNetworksManager.java42
-rw-r--r--src/java/com/android/internal/telephony/data/DataNetwork.java2
-rw-r--r--src/java/com/android/internal/telephony/data/DataNetworkController.java25
-rw-r--r--src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java3
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java2
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/data/AccessNetworksManagerTest.java66
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java80
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java4
10 files changed, 203 insertions, 30 deletions
diff --git a/flags/data.aconfig b/flags/data.aconfig
index cad7da761a..3beb016b1e 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -111,3 +111,10 @@ flag {
description: "When QNS prefers MMS on IWLAN, MMS will be attempted on IWLAN if it can, even though if existing cellular network already supports MMS."
bug: "316211526"
}
+
+flag {
+ name: "reconnect_qualified_network"
+ namespace: "telephony"
+ description: "This flag is for internal implementation to handle reconnect request from QNS in telephony FWK."
+ bug: "319520561"
+} \ No newline at end of file
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index 88d541c38f..ba6479ed03 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -739,7 +739,7 @@ public class ServiceStateTracker extends Handler {
mAccessNetworksManagerCallback = new AccessNetworksManagerCallback(this::post) {
@Override
- public void onPreferredTransportChanged(int networkCapability) {
+ public void onPreferredTransportChanged(int networkCapability, boolean forceReconnect) {
// Check if preferred on IWLAN was changed in ServiceState.
boolean isIwlanPreferred = mAccessNetworksManager.isAnyApnOnIwlan();
if (mSS.isIwlanPreferred() != isIwlanPreferred) {
diff --git a/src/java/com/android/internal/telephony/data/AccessNetworksManager.java b/src/java/com/android/internal/telephony/data/AccessNetworksManager.java
index a657ecd8cf..3d3fbe959c 100644
--- a/src/java/com/android/internal/telephony/data/AccessNetworksManager.java
+++ b/src/java/com/android/internal/telephony/data/AccessNetworksManager.java
@@ -234,6 +234,11 @@ public class AccessNetworksManager extends Handler {
.mapToObj(AccessNetworkType::toString).collect(Collectors.joining(","))
+ "]");
+ handleQualifiedNetworksChanged(apnTypes, qualifiedNetworkTypes, false);
+ }
+
+ private void handleQualifiedNetworksChanged(
+ int apnTypes, int[] qualifiedNetworkTypes, boolean forceReconnect) {
if (Arrays.stream(qualifiedNetworkTypes).anyMatch(accessNetwork
-> !DataUtils.isValidAccessNetwork(accessNetwork))) {
loge("Invalid access networks " + Arrays.toString(qualifiedNetworkTypes));
@@ -274,8 +279,9 @@ public class AccessNetworksManager extends Handler {
AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
mAccessNetworksManagerCallbacks.forEach(callback ->
callback.invokeFromExecutor(() ->
- callback.onPreferredTransportChanged(DataUtils
- .apnTypeToNetworkCapability(apnType))));
+ callback.onPreferredTransportChanged(
+ DataUtils.apnTypeToNetworkCapability(apnType),
+ forceReconnect)));
}
} else {
mAvailableNetworks.put(apnType, qualifiedNetworkTypes);
@@ -297,7 +303,7 @@ public class AccessNetworksManager extends Handler {
}
if (!qualifiedNetworksList.isEmpty()) {
- setPreferredTransports(qualifiedNetworksList);
+ setPreferredTransports(qualifiedNetworksList, forceReconnect);
mQualifiedNetworksChangedRegistrants.notifyResult(qualifiedNetworksList);
}
}
@@ -338,6 +344,17 @@ public class AccessNetworksManager extends Handler {
}
});
}
+
+ @Override
+ public void onReconnectQualifedNetworkType(int apnTypes, int qualifiedNetworkType) {
+ if (mFeatureFlags.reconnectQualifiedNetwork()) {
+ log("onReconnectQualifedNetworkType: apnTypes = ["
+ + ApnSetting.getApnTypesStringFromBitmask(apnTypes)
+ + "], networks = [" + AccessNetworkType.toString(qualifiedNetworkType)
+ + "]");
+ handleQualifiedNetworksChanged(apnTypes, new int[]{qualifiedNetworkType}, true);
+ }
+ }
}
private void onEmergencyDataNetworkPreferredTransportChanged(
@@ -371,8 +388,10 @@ public class AccessNetworksManager extends Handler {
* Called when preferred transport changed.
*
* @param networkCapability The network capability.
+ * @param forceReconnect whether enforce reconnection to the preferred transport type.
*/
- public abstract void onPreferredTransportChanged(@NetCapability int networkCapability);
+ public abstract void onPreferredTransportChanged(
+ @NetCapability int networkCapability, boolean forceReconnect);
}
/**
@@ -610,7 +629,8 @@ public class AccessNetworksManager extends Handler {
: AccessNetworkConstants.TRANSPORT_TYPE_WWAN;
}
- private void setPreferredTransports(@NonNull List<QualifiedNetworks> networksList) {
+ private void setPreferredTransports(
+ @NonNull List<QualifiedNetworks> networksList, boolean forceReconnect) {
for (QualifiedNetworks networks : networksList) {
if (networks.qualifiedNetworks.length > 0) {
int transport = getTransportFromAccessNetwork(networks.qualifiedNetworks[0]);
@@ -618,11 +638,13 @@ public class AccessNetworksManager extends Handler {
mPreferredTransports.put(networks.apnType, transport);
mAccessNetworksManagerCallbacks.forEach(callback ->
callback.invokeFromExecutor(() ->
- callback.onPreferredTransportChanged(DataUtils
- .apnTypeToNetworkCapability(networks.apnType))));
+ callback.onPreferredTransportChanged(
+ DataUtils.apnTypeToNetworkCapability(networks.apnType),
+ forceReconnect)));
logl("setPreferredTransports: apnType="
+ ApnSetting.getApnTypeString(networks.apnType) + ", transport="
- + AccessNetworkConstants.transportTypeToString(transport));
+ + AccessNetworkConstants.transportTypeToString(transport)
+ + (forceReconnect ? ", forceReconnect:true" : ""));
}
}
}
@@ -643,7 +665,7 @@ public class AccessNetworksManager extends Handler {
* Get the preferred transport by network capability.
*
* @param networkCapability The network capability. (Note that only APN-type capabilities are
- * supported.
+ * supported.)
* @return The preferred transport.
*/
public @TransportType int getPreferredTransportByNetworkCapability(
@@ -662,7 +684,7 @@ public class AccessNetworksManager extends Handler {
* @return {@code true} if there is any APN is on IWLAN, otherwise {@code false}.
*/
public boolean isAnyApnOnIwlan() {
- for (int apnType : AccessNetworksManager.SUPPORTED_APN_TYPES) {
+ for (int apnType : SUPPORTED_APN_TYPES) {
if (getPreferredTransport(apnType) == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
return true;
}
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index d52a3b4380..6ae861c31c 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -1185,7 +1185,7 @@ public class DataNetwork extends StateMachine {
getHandler()::post) {
@Override
public void onPreferredTransportChanged(
- @NetCapability int networkCapability) {
+ @NetCapability int networkCapability, boolean forceReconnect) {
if (networkCapability == NetworkCapabilities.NET_CAPABILITY_MMS) {
log("MMS preference changed.");
updateNetworkCapabilities();
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index d16387fa65..645e8bd1a1 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -952,13 +952,16 @@ public class DataNetworkController extends Handler {
mAccessNetworksManager.registerCallback(new AccessNetworksManagerCallback(this::post) {
@Override
- public void onPreferredTransportChanged(@NetCapability int capability) {
+ public void onPreferredTransportChanged(
+ @NetCapability int capability, boolean forceReconnect) {
int preferredTransport = mAccessNetworksManager
.getPreferredTransportByNetworkCapability(capability);
logl("onPreferredTransportChanged: "
+ DataUtils.networkCapabilityToString(capability) + " preferred on "
- + AccessNetworkConstants.transportTypeToString(preferredTransport));
- DataNetworkController.this.onEvaluatePreferredTransport(capability);
+ + AccessNetworkConstants.transportTypeToString(preferredTransport)
+ + (forceReconnect ? "forceReconnect:true" : ""));
+
+ DataNetworkController.this.onEvaluatePreferredTransport(capability, forceReconnect);
if (!hasMessages(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS)) {
sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED));
@@ -1142,7 +1145,7 @@ public class DataNetworkController extends Handler {
}
break;
case EVENT_EVALUATE_PREFERRED_TRANSPORT:
- onEvaluatePreferredTransport(msg.arg1);
+ onEvaluatePreferredTransport(msg.arg1, msg.arg2 != 0 /* forceReconnect */);
break;
case EVENT_SUBSCRIPTION_PLANS_CHANGED:
SubscriptionPlan[] plans = (SubscriptionPlan[]) msg.obj;
@@ -3223,8 +3226,12 @@ public class DataNetworkController extends Handler {
* Called when needed to evaluate the preferred transport for certain capability.
*
* @param capability The network capability to evaluate.
+ * @param forceReconnect indicates whether enforce reconnection to move to the preferred
+ * transport type.
+ *
*/
- private void onEvaluatePreferredTransport(@NetCapability int capability) {
+ private void onEvaluatePreferredTransport(
+ @NetCapability int capability, boolean forceReconnect) {
int preferredTransport = mAccessNetworksManager
.getPreferredTransportByNetworkCapability(capability);
log("onEvaluatePreferredTransport: " + DataUtils.networkCapabilityToString(capability)
@@ -3248,7 +3255,13 @@ public class DataNetworkController extends Handler {
continue;
}
- tryHandoverDataNetwork(dataNetwork, preferredTransport, null/*handoverRetryEntry*/);
+ if (forceReconnect) {
+ tearDownGracefully(
+ dataNetwork, DataNetwork.TEAR_DOWN_REASON_HANDOVER_NOT_ALLOWED);
+ } else {
+ tryHandoverDataNetwork(
+ dataNetwork, preferredTransport, null/*handoverRetryEntry*/);
+ }
}
}
}
diff --git a/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
index b64c7cba07..af4b03aacf 100644
--- a/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
@@ -160,7 +160,8 @@ public class EmergencyCallDomainSelectionConnection extends DomainSelectionConne
private AccessNetworksManager.AccessNetworksManagerCallback mPreferredTransportCallback =
new AccessNetworksManager.AccessNetworksManagerCallback(Runnable::run) {
@Override
- public void onPreferredTransportChanged(@NetCapability int capability) {
+ public void onPreferredTransportChanged(
+ @NetCapability int capability, boolean forceReconnect) {
}
};
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index 1a6557b43a..121136d4a2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -3373,7 +3373,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
assertFalse(sst.mSS.isIwlanPreferred());
when(mAccessNetworksManager.isAnyApnOnIwlan()).thenReturn(true);
- accessNetworksManagerCallback.onPreferredTransportChanged(0);
+ accessNetworksManagerCallback.onPreferredTransportChanged(0, false);
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertTrue(sst.mSS.isIwlanPreferred());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/AccessNetworksManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/AccessNetworksManagerTest.java
index 91ed03f50c..d1e5066b58 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/AccessNetworksManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/AccessNetworksManagerTest.java
@@ -279,9 +279,9 @@ public class AccessNetworksManagerTest extends TelephonyTest {
processAllMessages();
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_MMS));
+ eq(NetworkCapabilities.NET_CAPABILITY_MMS), eq(false));
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_IMS));
+ eq(NetworkCapabilities.NET_CAPABILITY_IMS), eq(false));
Mockito.clearInvocations(mMockedCallback);
assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
NetworkCapabilities.NET_CAPABILITY_MMS)).isEqualTo(
@@ -295,7 +295,7 @@ public class AccessNetworksManagerTest extends TelephonyTest {
processAllMessages();
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_XCAP));
+ eq(NetworkCapabilities.NET_CAPABILITY_XCAP), eq(false));
Mockito.clearInvocations(mMockedCallback);
assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
NetworkCapabilities.NET_CAPABILITY_XCAP)).isEqualTo(
@@ -305,11 +305,12 @@ public class AccessNetworksManagerTest extends TelephonyTest {
ApnSetting.TYPE_XCAP | ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS,
new int[]{});
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_IMS));
+ eq(NetworkCapabilities.NET_CAPABILITY_IMS), eq(false));
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_MMS));
+ eq(NetworkCapabilities.NET_CAPABILITY_MMS), eq(false));
verify(mMockedCallback).onPreferredTransportChanged(
- eq(NetworkCapabilities.NET_CAPABILITY_XCAP));
+ eq(NetworkCapabilities.NET_CAPABILITY_XCAP), eq(false));
+ Mockito.clearInvocations(mMockedCallback);
assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
NetworkCapabilities.NET_CAPABILITY_IMS)).isEqualTo(
AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
@@ -348,4 +349,57 @@ public class AccessNetworksManagerTest extends TelephonyTest {
mIntegerConsumer);
}
+ @Test
+ public void testCallbackForReconnectQualifiedNetworkTypeWithFlagEnabled() throws Exception {
+ when(mFeatureFlags.reconnectQualifiedNetwork()).thenReturn(true);
+
+
+ mAccessNetworksManager.registerCallback(mMockedCallback);
+
+ mQnsCallback.onReconnectQualifedNetworkType(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS,
+ AccessNetworkType.IWLAN);
+ processAllMessages();
+
+ verify(mMockedCallback).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_MMS), eq(true));
+ verify(mMockedCallback).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_IMS), eq(true));
+ verify(mMockedCallback, never()).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_XCAP), eq(true));
+ Mockito.clearInvocations(mMockedCallback);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_MMS)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_IMS)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_XCAP)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ }
+
+ @Test
+ public void testCallbackForReconnectQualifiedNetworkTypeWithFlagDisabled() throws Exception {
+ when(mFeatureFlags.reconnectQualifiedNetwork()).thenReturn(false);
+ mQnsCallback.onReconnectQualifedNetworkType(ApnSetting.TYPE_IMS | ApnSetting.TYPE_MMS,
+ AccessNetworkType.IWLAN);
+ processAllMessages();
+
+ verify(mMockedCallback, never()).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_MMS), eq(true));
+ verify(mMockedCallback, never()).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_IMS), eq(true));
+ verify(mMockedCallback, never()).onPreferredTransportChanged(
+ eq(NetworkCapabilities.NET_CAPABILITY_XCAP), eq(true));
+ Mockito.clearInvocations(mMockedCallback);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_MMS)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_IMS)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ assertThat(mAccessNetworksManager.getPreferredTransportByNetworkCapability(
+ NetworkCapabilities.NET_CAPABILITY_XCAP)).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index fa4f8e4a55..14bad95f5e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -731,7 +731,14 @@ public class DataNetworkControllerTest extends TelephonyTest {
private void updateTransport(@NetCapability int capability, @TransportType int transport) {
doReturn(transport).when(mAccessNetworksManager)
.getPreferredTransportByNetworkCapability(capability);
- mAccessNetworksManagerCallback.onPreferredTransportChanged(capability);
+ mAccessNetworksManagerCallback.onPreferredTransportChanged(capability, false);
+ processAllMessages();
+ }
+
+ private void reconnectTransport(@NetCapability int capability, @TransportType int transport) {
+ doReturn(transport).when(mAccessNetworksManager)
+ .getPreferredTransportByNetworkCapability(capability);
+ mAccessNetworksManagerCallback.onPreferredTransportChanged(capability, true);
processAllMessages();
}
@@ -2881,7 +2888,7 @@ public class DataNetworkControllerTest extends TelephonyTest {
doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mAccessNetworksManager)
.getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
mAccessNetworksManagerCallback.onPreferredTransportChanged(
- NetworkCapabilities.NET_CAPABILITY_IMS);
+ NetworkCapabilities.NET_CAPABILITY_IMS, false);
serviceStateChanged(TelephonyManager.NETWORK_TYPE_UMTS,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
processAllMessages();
@@ -4975,4 +4982,73 @@ public class DataNetworkControllerTest extends TelephonyTest {
assertThat(waitForIntegerConsumerResponse(1 /*numOfEvents*/)).isTrue();
assertThat(mIntegerConsumerResult).isEqualTo(DataServiceCallback.RESULT_ERROR_INVALID_ARG);
}
+
+ @Test
+ public void testForceReconnectToPreferredTransportType() throws Exception {
+ testSetupImsDataNetwork();
+ reconnectTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+
+ // Verify IMS network was torn down on source first.
+ verify(mMockedWwanDataServiceManager).deactivateDataCall(anyInt(),
+ eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));
+
+ // Verify that IWLAN is brought up again on IWLAN.
+ verify(mMockedWlanDataServiceManager).setupDataCall(anyInt(),
+ any(DataProfile.class), anyBoolean(), anyBoolean(),
+ eq(DataService.REQUEST_REASON_NORMAL), any(), anyInt(), any(), any(), anyBoolean(),
+ any(Message.class));
+
+ DataNetwork dataNetwork = getDataNetworks().get(0);
+ assertThat(dataNetwork.getTransport()).isEqualTo(
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+ }
+
+ @Test
+ public void testForceReconnectIgnored() throws Exception {
+ mCarrierConfig.putStringArray(
+ CarrierConfigManager.KEY_IWLAN_HANDOVER_POLICY_STRING_ARRAY,
+ new String[]{
+ "source=EUTRAN|NGRAN|IWLAN|UNKNOWN, target=EUTRAN|NGRAN|IWLAN, "
+ + "type=allowed, capabilities=IMS"
+ });
+ carrierConfigChanged();
+
+ testSetupImsDataNetwork();
+ reconnectTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+
+ // request reconnection to current transport type, tear down should not happen.
+ verify(mMockedWwanDataServiceManager, never()).deactivateDataCall(anyInt(),
+ eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));
+
+ Mockito.reset(mMockedWlanDataServiceManager);
+
+ // Trigger Handover to IWLAN.
+ updateTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
+
+ // Capture the message for setup data call response. We want to delay it.
+ ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+ verify(mMockedWlanDataServiceManager).setupDataCall(anyInt(), any(DataProfile.class),
+ anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(), any(), any(), anyBoolean(),
+ messageCaptor.capture());
+
+ // Force reconnect to preferred transport type while handover is in progress.
+ reconnectTransport(NetworkCapabilities.NET_CAPABILITY_IMS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+
+ // Finally handover is completed.
+ Message msg = messageCaptor.getValue();
+ DataCallResponse response = new DataCallResponse.Builder()
+ .setCause(DataFailCause.NONE)
+ .build();
+ msg.getData().putParcelable("data_call_response", response);
+ msg.arg1 = DataServiceCallback.RESULT_SUCCESS;
+ msg.sendToTarget();
+ processAllMessages();
+
+ verify(mMockedWwanDataServiceManager, never()).deactivateDataCall(anyInt(),
+ eq(DataService.REQUEST_REASON_NORMAL), any(Message.class));
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index ad1ba61325..66444dacab 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -2242,7 +2242,7 @@ public class DataNetworkTest extends TelephonyTest {
any(TelephonyNetworkRequest.class),
eq(TelephonyManager.NETWORK_TYPE_IWLAN), eq(false), eq(false), eq(false));
accessNetworksManagerCallbackArgumentCaptor.getValue()
- .onPreferredTransportChanged(NetworkCapabilities.NET_CAPABILITY_MMS);
+ .onPreferredTransportChanged(NetworkCapabilities.NET_CAPABILITY_MMS, false);
processAllMessages();
// Check if MMS capability is removed.
@@ -2253,7 +2253,7 @@ public class DataNetworkTest extends TelephonyTest {
doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WWAN).when(mAccessNetworksManager)
.getPreferredTransportByNetworkCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
accessNetworksManagerCallbackArgumentCaptor.getValue()
- .onPreferredTransportChanged(NetworkCapabilities.NET_CAPABILITY_MMS);
+ .onPreferredTransportChanged(NetworkCapabilities.NET_CAPABILITY_MMS, false);
processAllMessages();
// Check if MMS capability is added back.