aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSewook Seo <sewookseo@google.com>2024-02-22 20:18:05 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2024-02-22 20:18:05 +0000
commitf30c091f3f13270e111c32aaaa450e19cf925bc8 (patch)
treed7a5e45b14b58cd7bfb1b607369ea680722a2f44 /src
parentef88673adbda644153bee5d0b1c3deafc5560f72 (diff)
parentcd2f50b3e7402dcf09fc411e38ae2f02e7e9864e (diff)
downloadtelephony-f30c091f3f13270e111c32aaaa450e19cf925bc8.tar.gz
Merge "Support handling reconnect to QualifiedNetworkType" into main
Diffstat (limited to 'src')
-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
5 files changed, 55 insertions, 19 deletions
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 c1e61c6f08..c1e6155468 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -1198,7 +1198,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 2fb23a738e..3ca28a33ca 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -975,13 +975,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));
@@ -1165,7 +1168,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;
@@ -3359,8 +3362,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)
@@ -3384,7 +3391,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 e0e0354552..cb4ddab76a 100644
--- a/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
@@ -162,7 +162,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) {
}
};