From b882c54945c273b5bff72c0b69b05014fa4ae5b7 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 4 Jun 2019 14:37:26 +0900 Subject: [PATCH] Allow passing in acceptUnvalidated without explicitlySelected This will allow wifi to tell ConnectivityService that partial connectivity is acceptable even if the network is not explicitly selected. This is needed when the user selects a partial connectivity network and tells the system to connect to the network, and never to ask again. In such cases, the system must switch to the network even if it is not explicitly selected. Bug: 130766237 Test: atest FrameworksNetTests Test: unit tests in an upcoming CL Change-Id: I13465090b7b1c0bf5dc83362387a5428d77b7e1d Merged-In: I13465090b7b1c0bf5dc83362387a5428d77b7e1d (cherry picked from commit e01696a4c499a9fa7087f20947fdb1581b9c0213) --- core/java/android/net/NetworkAgent.java | 19 ++++++++++++++++++- .../android/server/ConnectivityService.java | 10 +++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 2ff6043576..8295c17789 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -433,7 +433,24 @@ public abstract class NetworkAgent extends Handler { * {@link #saveAcceptUnvalidated} to respect the user's choice. */ public void explicitlySelected(boolean acceptUnvalidated) { - queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, acceptUnvalidated ? 1 : 0, 0); + explicitlySelected(true /* explicitlySelected */, acceptUnvalidated); + } + + /** + * Called by the bearer to indicate this network was manually selected by the user. + * This should be called before the NetworkInfo is marked CONNECTED so that this + * Network can be given special treatment at that time. If {@code acceptUnvalidated} is + * {@code true}, then the system will switch to this network. If it is {@code false} and the + * network cannot be validated, the system will ask the user whether to switch to this network. + * If the user confirms and selects "don't ask again", then the system will call + * {@link #saveAcceptUnvalidated} to persist the user's choice. Thus, if the transport ever + * calls this method with {@code acceptUnvalidated} set to {@code false}, it must also implement + * {@link #saveAcceptUnvalidated} to respect the user's choice. + */ + public void explicitlySelected(boolean explicitlySelected, boolean acceptUnvalidated) { + queueOrSendMessage(EVENT_SET_EXPLICITLY_SELECTED, + explicitlySelected ? 1 : 0, + acceptUnvalidated ? 1 : 0); } /** diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index dbee09450f..c400e38232 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2575,11 +2575,11 @@ public class ConnectivityService extends IConnectivityManager.Stub break; } case NetworkAgent.EVENT_SET_EXPLICITLY_SELECTED: { - if (nai.everConnected && !nai.networkMisc.explicitlySelected) { - loge("ERROR: already-connected network explicitly selected."); + if (nai.everConnected) { + loge("ERROR: cannot call explicitlySelected on already-connected network"); } - nai.networkMisc.explicitlySelected = true; - nai.networkMisc.acceptUnvalidated = msg.arg1 == 1; + nai.networkMisc.explicitlySelected = (msg.arg1 == 1); + nai.networkMisc.acceptUnvalidated = (msg.arg1 == 1) && (msg.arg2 == 1); // Mark the network as temporarily accepting partial connectivity so that it // will be validated (and possibly become default) even if it only provides // partial internet access. Note that if user connects to partial connectivity @@ -2587,7 +2587,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // out of wifi coverage) and if the same wifi is available again, the device // will auto connect to this wifi even though the wifi has "no internet". // TODO: Evaluate using a separate setting in IpMemoryStore. - nai.networkMisc.acceptPartialConnectivity = msg.arg1 == 1; + nai.networkMisc.acceptPartialConnectivity = (msg.arg2 == 1); break; } case NetworkAgent.EVENT_SOCKET_KEEPALIVE: {