diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 6f032afcdd..a0707d5ce1 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -372,11 +372,6 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_SET_ACCEPT_UNVALIDATED = 28; - /** - * used to specify whether a network should not be penalized when it becomes unvalidated. - */ - private static final int EVENT_SET_AVOID_UNVALIDATED = 35; - /** * used to ask the user to confirm a connection to an unvalidated network. * obj = network @@ -404,6 +399,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_REQUEST_LINKPROPERTIES = 32; private static final int EVENT_REQUEST_NETCAPABILITIES = 33; + /* + * used to specify whether a network should not be penalized when it becomes unvalidated. + */ + private static final int EVENT_SET_AVOID_UNVALIDATED = 35; + + /** + * used to trigger revalidation of a network. + */ + private static final int EVENT_REVALIDATE_NETWORK = 36; + /** Handler thread used for both of the handlers below. */ @VisibleForTesting protected final HandlerThread mHandlerThread; @@ -2999,6 +3004,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } break; } + case EVENT_REVALIDATE_NETWORK: { + boolean hasConnectivity = (msg.arg2 == 1); + handleReportNetworkConnectivity((Network) msg.obj, msg.arg1, hasConnectivity); + break; + } } } } @@ -3171,8 +3181,14 @@ public class ConnectivityService extends IConnectivityManager.Stub public void reportNetworkConnectivity(Network network, boolean hasConnectivity) { enforceAccessPermission(); enforceInternetPermission(); + final int uid = Binder.getCallingUid(); + final int connectivityInfo = hasConnectivity ? 1 : 0; + mHandler.sendMessage( + mHandler.obtainMessage(EVENT_REVALIDATE_NETWORK, uid, connectivityInfo, network)); + } - // TODO: execute this logic on ConnectivityService handler. + private void handleReportNetworkConnectivity( + Network network, int uid, boolean hasConnectivity) { final NetworkAgentInfo nai; if (network == null) { nai = getDefaultNetwork(); @@ -3187,10 +3203,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (hasConnectivity == nai.lastValidated) { return; } - final int uid = Binder.getCallingUid(); if (DBG) { - log("reportNetworkConnectivity(" + nai.network.netId + ", " + hasConnectivity + - ") by " + uid); + int netid = nai.network.netId; + log("reportNetworkConnectivity(" + netid + ", " + hasConnectivity + ") by " + uid); } // Validating a network that has not yet connected could result in a call to // rematchNetworkAndRequests() which is not meant to work on such networks.