Update the avoid bad wifi settings on the handler thread.
am: 2618c1b7f0

Change-Id: I595949881353f5779ed2bb55ff05f27b513cd6de
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 1671803..ae61a7e 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -857,6 +857,15 @@
                 Settings.Global.NETWORK_SWITCH_NOTIFICATION_RATE_LIMIT_MILLIS,
                 LingerMonitor.DEFAULT_NOTIFICATION_RATE_LIMIT_MILLIS);
         mLingerMonitor = new LingerMonitor(mContext, mNotifier, dailyLimit, rateLimit);
+
+        intentFilter = new IntentFilter();
+        intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+        mContext.registerReceiverAsUser(new BroadcastReceiver() {
+            public void onReceive(Context context, Intent intent) {
+                mHandler.sendEmptyMessage(EVENT_CONFIGURE_NETWORK_AVOID_BAD_WIFI);
+            }
+        }, UserHandle.ALL, intentFilter, null, null);
+        updateAvoidBadWifi();
     }
 
     private NetworkRequest createInternetRequestForTransport(
@@ -2750,17 +2759,29 @@
                 PROMPT_UNVALIDATED_DELAY_MS);
     }
 
-    @VisibleForTesting
+    private boolean mAvoidBadWifi;
+
     public boolean avoidBadWifi() {
+        return mAvoidBadWifi;
+    }
+
+    @VisibleForTesting
+    public boolean updateAvoidBadWifi() {
         // There are two modes: either we always automatically avoid unvalidated wifi, or we show a
         // dialog and don't switch to it. The behaviour is controlled by the NETWORK_AVOID_BAD_WIFI
         // setting. If the setting has no value, then the value is taken from the config value,
         // which can be changed via OEM/carrier overlays.
+        //
+        // The only valid values for NETWORK_AVOID_BAD_WIFI are null and unset. Currently, the unit
+        // test uses 0 in order to avoid having to mock out fetching the carrier setting.
         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;
+
+        boolean prev = mAvoidBadWifi;
+        mAvoidBadWifi = (avoid == 1);
+        return mAvoidBadWifi != prev;
     }
 
     private void showValidationNotification(NetworkAgentInfo nai, NotificationType type) {
@@ -2899,7 +2920,9 @@
                     break;
                 }
                 case EVENT_CONFIGURE_NETWORK_AVOID_BAD_WIFI: {
-                    rematchAllNetworksAndRequests(null, 0);
+                    if (updateAvoidBadWifi()) {
+                        rematchAllNetworksAndRequests(null, 0);
+                    }
                     break;
                 }
                 case EVENT_REQUEST_LINKPROPERTIES: