Support ignoring penalty for bad wifi networks
am: c9048bc556

Change-Id: I6666ee45e9a08c02444c6268b2232bbe8aa2adec
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index ee455af..da08e62 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2735,6 +2735,15 @@
                 PROMPT_UNVALIDATED_DELAY_MS);
     }
 
+    @VisibleForTesting
+    public boolean avoidBadWifi() {
+        int defaultAvoidBadWifi =
+            mContext.getResources().getInteger(R.integer.config_networkAvoidBadWifi);
+        int avoid = Settings.Global.getInt(mContext.getContentResolver(),
+            Settings.Global.NETWORK_AVOID_BAD_WIFI, defaultAvoidBadWifi);
+        return avoid == 1;
+    }
+
     private void handlePromptUnvalidated(Network network) {
         if (VDBG) log("handlePromptUnvalidated " + network);
         NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index ba39ec0..cb4bb88 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -115,6 +115,7 @@
 // is satisfying one or more background NetworkRequests it is kept up in the background. If it is
 // not, ConnectivityService disconnects the NetworkAgent's AsyncChannel.
 public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
+
     public NetworkInfo networkInfo;
     // This Network object should always be used if possible, so as to encourage reuse of the
     // enclosed socket factory and connection pool.  Avoid creating other Network objects.
@@ -415,13 +416,20 @@
         }
 
         int score = currentScore;
-        if (!lastValidated && !pretendValidated) {
+        if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty()) {
             score -= UNVALIDATED_SCORE_PENALTY;
         }
         if (score < 0) score = 0;
         return score;
     }
 
+    // Return true on devices configured to ignore score penalty for wifi networks
+    // that become unvalidated (b/31075769).
+    private boolean ignoreWifiUnvalidationPenalty() {
+        boolean isWifi = networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
+        return isWifi && !mConnService.avoidBadWifi() && everValidated;
+    }
+
     // Get the current score for this Network.  This may be modified from what the
     // NetworkAgent sent, as it has modifiers applied to it.
     public int getCurrentScore() {