Merge changes Ia91b3b3c,Id9ecdac5,I4b17d1b1

* changes:
  Revert "[NS D01] Remove candidates that don't satisfy the request."
  Revert "[NS D02] Mix in the ignore on wifi policy."
  Revert "Address comments on ag/10316753"
diff --git a/core/java/android/net/NetworkScore.java b/core/java/android/net/NetworkScore.java
index d2e59eb..ae17378 100644
--- a/core/java/android/net/NetworkScore.java
+++ b/core/java/android/net/NetworkScore.java
@@ -21,6 +21,7 @@
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.annotation.TestApi;
+import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -86,7 +87,7 @@
         /** toString */
         public String toString() {
             return "latency = " + latencyMs + " downlinkBandwidth = " + downlinkBandwidthKBps
-                    + " uplinkBandwidth = " + uplinkBandwidthKBps;
+                    + "uplinkBandwidth = " + uplinkBandwidthKBps;
         }
 
         @NonNull
@@ -353,27 +354,17 @@
         private Metrics mLinkLayerMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
                 Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
         @NonNull
-        private Metrics mEndToEndMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
+        private Metrics mEndToMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
                 Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
         private int mSignalStrength = UNKNOWN_SIGNAL_STRENGTH;
         private int mRange = RANGE_UNKNOWN;
         private boolean mExiting = false;
         private int mLegacyScore = 0;
+        @NonNull private Bundle mExtensions = new Bundle();
 
         /** Create a new builder. */
         public Builder() { }
 
-        /** @hide */
-        public Builder(@NonNull final NetworkScore source) {
-            mPolicy = source.mPolicy;
-            mLinkLayerMetrics = source.mLinkLayerMetrics;
-            mEndToEndMetrics = source.mEndToEndMetrics;
-            mSignalStrength = source.mSignalStrength;
-            mRange = source.mRange;
-            mExiting = source.mExiting;
-            mLegacyScore = source.mLegacyScore;
-        }
-
         /** Add a policy flag. */
         @NonNull public Builder addPolicy(@Policy final int policy) {
             mPolicy |= policy;
@@ -394,7 +385,7 @@
 
         /** Set the end-to-end metrics. */
         @NonNull public Builder setEndToEndMetrics(@NonNull final Metrics endToEndMetrics) {
-            mEndToEndMetrics = endToEndMetrics;
+            mEndToMetrics = endToEndMetrics;
             return this;
         }
 
@@ -426,7 +417,7 @@
 
         /** Build the NetworkScore object represented by this builder. */
         @NonNull public NetworkScore build() {
-            return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToEndMetrics,
+            return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToMetrics,
                     mSignalStrength, mRange, mExiting, mLegacyScore);
         }
     }
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 15e0932..f84d35f 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3839,9 +3839,8 @@
         return avoidBadWifi();
     }
 
+
     private void rematchForAvoidBadWifiUpdate() {
-        ensureRunningOnConnectivityServiceThread();
-        mixInAllNetworkScores();
         rematchAllNetworksAndRequests();
         for (NetworkAgentInfo nai: mNetworkAgentInfos.values()) {
             if (nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
@@ -7067,45 +7066,9 @@
         }
     }
 
-    /**
-     * Re-mixin all network scores.
-     * This is called when some global setting like avoidBadWifi has changed.
-     * TODO : remove this when all usages have been removed.
-     */
-    private void mixInAllNetworkScores() {
-        ensureRunningOnConnectivityServiceThread();
-        for (final NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
-            nai.setNetworkScore(mixInNetworkScore(nai, nai.getNetworkScore()));
-        }
-    }
-
-    /**
-     * Mix in the Connectivity-managed parts of the NetworkScore.
-     * @param nai The NAI this score applies to.
-     * @param sourceScore the score sent by the network agent, or the previous score of this NAI.
-     * @return A new score with the Connectivity-managed parts mixed in.
-     */
-    @NonNull
-    private NetworkScore mixInNetworkScore(@NonNull final NetworkAgentInfo nai,
-            @NonNull final NetworkScore sourceScore) {
-        final NetworkScore.Builder score = new NetworkScore.Builder(sourceScore);
-
-        // TODO : this should be done in Telephony. It should be handled per-network because
-        // it's a carrier-dependent config.
-        if (nai.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
-            if (mMultinetworkPolicyTracker.getAvoidBadWifi()) {
-                score.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI);
-            } else {
-                score.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI);
-            }
-        }
-
-        return score.build();
-    }
-
     private void updateNetworkScore(NetworkAgentInfo nai, NetworkScore ns) {
         if (VDBG || DDBG) log("updateNetworkScore for " + nai.toShortString() + " to " + ns);
-        nai.setNetworkScore(mixInNetworkScore(nai, ns));
+        nai.setNetworkScore(ns);
         rematchAllNetworksAndRequests();
         sendUpdatedScoreToFactories(nai);
     }
diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java
index 1ae7dc5..d0aabf9 100644
--- a/services/core/java/com/android/server/connectivity/NetworkRanker.java
+++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java
@@ -20,7 +20,6 @@
 import android.annotation.Nullable;
 import android.net.NetworkRequest;
 
-import java.util.ArrayList;
 import java.util.Collection;
 
 /**
@@ -32,15 +31,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 : candidates) {
+        for (final NetworkAgentInfo nai : nais) {
+            if (!nai.satisfies(request)) continue;
             if (nai.getCurrentScore() > bestScore) {
                 bestNetwork = nai;
                 bestScore = nai.getCurrentScore();