[NS D01] Remove candidates that don't satisfy the request.
This is exactly equivalent to the previous version (though a bit
more expensive) but is useful for followup changes. See [NS D03]
to see a sample of how this will be used.
Bug: 113554781
Test: FrameworksNetTests
Change-Id: I39f3c248bd2f23f7b22bd89d2e1e031653fe9ddb
diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java
index d0aabf95..1ae7dc5 100644
--- a/services/core/java/com/android/server/connectivity/NetworkRanker.java
+++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java
@@ -20,6 +20,7 @@
import android.annotation.Nullable;
import android.net.NetworkRequest;
+import java.util.ArrayList;
import java.util.Collection;
/**
@@ -31,15 +32,15 @@
/**
* Find the best network satisfying this request among the list of passed networks.
*/
- // Almost equivalent to Collections.max(nais), but allows returning null if no network
- // satisfies the request.
@Nullable
public NetworkAgentInfo getBestNetwork(@NonNull final NetworkRequest request,
@NonNull final Collection<NetworkAgentInfo> nais) {
+ final ArrayList<NetworkAgentInfo> candidates = new ArrayList<>(nais);
+ candidates.removeIf(nai -> !nai.satisfies(request));
+
NetworkAgentInfo bestNetwork = null;
int bestScore = Integer.MIN_VALUE;
- for (final NetworkAgentInfo nai : nais) {
- if (!nai.satisfies(request)) continue;
+ for (final NetworkAgentInfo nai : candidates) {
if (nai.getCurrentScore() > bestScore) {
bestNetwork = nai;
bestScore = nai.getCurrentScore();