Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f18599a1 authored by Andriy Naborskyy's avatar Andriy Naborskyy Committed by Android (Google) Code Review
Browse files

Merge changes I49a76582,Iac4b75bc into cw-f-dev

* changes:
  DO NOT MERGE ANYWHERE ConnectivityService: move reportNetworkConnectivity to handler
  DO NOT MERGE ANYWHERE ConnectivityService: safer locking
parents a053eaa8 456b9156
Loading
Loading
Loading
Loading
+46 −24
Original line number Diff line number Diff line
@@ -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;
@@ -1327,14 +1332,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
    @Override
    public LinkProperties getLinkProperties(Network network) {
        enforceAccessPermission();
        NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
        if (nai != null) {
        return getLinkProperties(getNetworkAgentInfoForNetwork(network));
    }

    private LinkProperties getLinkProperties(NetworkAgentInfo nai) {
        if (nai == null) {
            return null;
        }
        synchronized (nai) {
            return new LinkProperties(nai.linkProperties);
        }
    }
        return null;
    }

    private NetworkCapabilities getNetworkCapabilitiesInternal(NetworkAgentInfo nai) {
        if (nai != null) {
@@ -2996,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;
                }
            }
        }
    }
@@ -3168,8 +3181,15 @@ 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));
    }

        NetworkAgentInfo nai;
    private void handleReportNetworkConnectivity(
            Network network, int uid, boolean hasConnectivity) {
        final NetworkAgentInfo nai;
        if (network == null) {
            nai = getDefaultNetwork();
        } else {
@@ -3180,21 +3200,23 @@ public class ConnectivityService extends IConnectivityManager.Stub
            return;
        }
        // Revalidate if the app report does not match our current validated state.
        if (hasConnectivity == nai.lastValidated) return;
        final int uid = Binder.getCallingUid();
        if (hasConnectivity == nai.lastValidated) {
            return;
        }
        if (DBG) {
            log("reportNetworkConnectivity(" + nai.network.netId + ", " + hasConnectivity +
                    ") by " + uid);
            int netid = nai.network.netId;
            log("reportNetworkConnectivity(" + netid + ", " + hasConnectivity + ") by " + uid);
        }
        synchronized (nai) {
        // Validating a network that has not yet connected could result in a call to
        // rematchNetworkAndRequests() which is not meant to work on such networks.
            if (!nai.everConnected) return;

            if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, false)) return;

            nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
        if (!nai.everConnected) {
            return;
        }
        LinkProperties lp = getLinkProperties(nai);
        if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
            return;
        }
        nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
    }

    private ProxyInfo getDefaultProxy() {