Loading flags/data.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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 src/java/com/android/internal/telephony/ServiceStateTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading src/java/com/android/internal/telephony/data/AccessNetworksManager.java +32 −10 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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); Loading @@ -297,7 +303,7 @@ public class AccessNetworksManager extends Handler { } if (!qualifiedNetworksList.isEmpty()) { setPreferredTransports(qualifiedNetworksList); setPreferredTransports(qualifiedNetworksList, forceReconnect); mQualifiedNetworksChangedRegistrants.notifyResult(qualifiedNetworksList); } } Loading Loading @@ -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( Loading Loading @@ -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); } /** Loading Loading @@ -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]); Loading @@ -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" : "")); } } } Loading @@ -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( Loading @@ -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; } Loading src/java/com/android/internal/telephony/data/DataNetwork.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +19 −6 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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; Loading Loading @@ -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) Loading @@ -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*/); } } } } Loading Loading
flags/data.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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
src/java/com/android/internal/telephony/ServiceStateTracker.java +1 −1 Original line number Diff line number Diff line Loading @@ -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) { Loading
src/java/com/android/internal/telephony/data/AccessNetworksManager.java +32 −10 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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); Loading @@ -297,7 +303,7 @@ public class AccessNetworksManager extends Handler { } if (!qualifiedNetworksList.isEmpty()) { setPreferredTransports(qualifiedNetworksList); setPreferredTransports(qualifiedNetworksList, forceReconnect); mQualifiedNetworksChangedRegistrants.notifyResult(qualifiedNetworksList); } } Loading Loading @@ -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( Loading Loading @@ -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); } /** Loading Loading @@ -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]); Loading @@ -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" : "")); } } } Loading @@ -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( Loading @@ -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; } Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +19 −6 Original line number Diff line number Diff line Loading @@ -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)); Loading Loading @@ -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; Loading Loading @@ -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) Loading @@ -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*/); } } } } Loading