diff options
author | Sewook Seo <sewookseo@google.com> | 2024-02-07 07:03:31 +0000 |
---|---|---|
committer | Sewook Seo <sewookseo@google.com> | 2024-02-21 01:49:26 +0000 |
commit | cd2f50b3e7402dcf09fc411e38ae2f02e7e9864e (patch) | |
tree | c49e3eaf9cb1a82e5005931e221637605a74bea4 /src | |
parent | 26b7b3325900de06e39799598f94547379aefccf (diff) | |
download | telephony-cd2f50b3e7402dcf09fc411e38ae2f02e7e9864e.tar.gz |
Support handling reconnect to QualifiedNetworkType
Data FWK implementation to handle preferred RAT update with forceReconnect flag from QNS.
Bug: 319520561
Test: atest FrameworksTelephonyTests
Change-Id: Id70c2c7cb45ebc77c9c7be6218f29434697ff03a
Diffstat (limited to 'src')
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 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) { } }; |