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

Commit b3c546ce authored by Chalard Jean's avatar Chalard Jean
Browse files

[NS D03] Migrate the bad wifi avoidance policy

Test: ConnectivityServiceTest
Bug: 113554781

Change-Id: I688593cc0379a0d2042e30fbe83e549dcb02723e
parent da0c5df4
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -16,12 +16,16 @@

package com.android.internal.util;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.RemoteException;
import android.util.ExceptionUtils;

import java.util.Collection;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
@@ -218,4 +222,20 @@ public class FunctionalUtils {
            }
        }
    }

    /**
     * Find the first element in the list that matches the predicate.
     *
     * The standard Java way of doing this is to use streams, which is very expensive.
     *
     * @return the first matching element, or null if none.
     */
    @Nullable
    public static <T> T findFirst(@NonNull final Collection<T> haystack,
            @NonNull final Predicate<T> p) {
        for (final T needle : haystack) {
            if (p.test(needle)) return needle;
        }
        return null;
    }
}
+25 −2
Original line number Diff line number Diff line
@@ -16,8 +16,13 @@

package com.android.server.connectivity;

import static android.net.NetworkScore.POLICY_IGNORE_ON_WIFI;

import static com.android.internal.util.FunctionalUtils.findFirst;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;

import java.util.ArrayList;
@@ -37,15 +42,33 @@ public class NetworkRanker {
            @NonNull final Collection<NetworkAgentInfo> nais) {
        final ArrayList<NetworkAgentInfo> candidates = new ArrayList<>(nais);
        candidates.removeIf(nai -> !nai.satisfies(request));
        // Enforce policy.
        filterBadWifiAvoidancePolicy(candidates);

        NetworkAgentInfo bestNetwork = null;
        int bestScore = Integer.MIN_VALUE;
        for (final NetworkAgentInfo nai : candidates) {
            if (nai.getCurrentScore() > bestScore) {
            final int score = nai.getCurrentScore();
            if (score > bestScore) {
                bestNetwork = nai;
                bestScore = nai.getCurrentScore();
                bestScore = score;
            }
        }
        return bestNetwork;
    }

    // If some network with wifi transport is present, drop all networks with POLICY_IGNORE_ON_WIFI.
    private void filterBadWifiAvoidancePolicy(
            @NonNull final ArrayList<NetworkAgentInfo> candidates) {
        final NetworkAgentInfo wifi = findFirst(candidates,
                nai -> nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                        && nai.everValidated
                        // Horrible hack : there is old UI that will let a user say they want to
                        // override the policy only for this network only at this time and it
                        // feeds into the following member. This old UI should probably be removed
                        // but for now keep backward compatibility.
                        && !nai.avoidUnvalidated);
        if (null == wifi) return; // No wifi : this policy doesn't apply
        candidates.removeIf(nai -> nai.getNetworkScore().hasPolicy(POLICY_IGNORE_ON_WIFI));
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.connectivity

import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
@@ -35,6 +36,7 @@ class NetworkRankerTest {
    private fun makeNai(satisfy: Boolean, score: Int) = mock(NetworkAgentInfo::class.java).also {
        doReturn(satisfy).`when`(it).satisfies(any())
        doReturn(score).`when`(it).currentScore
        it.networkCapabilities = NetworkCapabilities()
    }

    @Test