wifi/CarrierNetworkEvaluator - skip blacklisted networks

Bug: 123923536
Test: atest CarrierNetworkEvaluatorTest
Change-Id: I1c461057b908856414b6d2a06bec2e0597bf4264
diff --git a/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java b/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java
index b052c7d..323cfc0 100644
--- a/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java
+++ b/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java
@@ -110,6 +110,17 @@
             }
             config.enterpriseConfig.setEapMethod(eapType);
 
+            // Check if we already have a network with the same credentials in WifiConfigManager
+            // database. If yes, we should check if the network is currently blacklisted.
+            WifiConfiguration existingNetwork =
+                    mWifiConfigManager.getConfiguredNetwork(config.configKey());
+            if (existingNetwork != null
+                    && !existingNetwork.getNetworkSelectionStatus().isNetworkEnabled()
+                    && !mWifiConfigManager.tryEnableNetwork(existingNetwork.networkId)) {
+                mLocalLog.log(TAG + ": Ignoring blacklisted network: "
+                        + WifiNetworkSelector.toNetworkString(existingNetwork));
+                continue;
+            }
             // Add the newly created WifiConfiguration to WifiConfigManager.
             NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(config,
                     Process.WIFI_UID);
@@ -131,7 +142,10 @@
 
             config = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
 
-            WifiConfiguration.NetworkSelectionStatus nss = config.getNetworkSelectionStatus();
+            WifiConfiguration.NetworkSelectionStatus nss = null;
+            if (config != null) {
+                nss = config.getNetworkSelectionStatus();
+            }
             if (nss == null) {
                 mLocalLog.log(TAG + ": null network selection status for: " + config);
                 continue;
diff --git a/service/tests/wifitests/src/com/android/server/wifi/CarrierNetworkEvaluatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/CarrierNetworkEvaluatorTest.java
index ef8ceb1..0c61e17 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/CarrierNetworkEvaluatorTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/CarrierNetworkEvaluatorTest.java
@@ -122,8 +122,8 @@
 
     private AddOrUpdateNetworkAnswer mAddOrUpdateNetworkAnswer;
 
-    private void configureNewSsid(int networkId, ScanDetail scanDetail, boolean isEphemeral,
-            boolean isSaved) {
+    private WifiConfiguration configureNewSsid(int networkId, ScanDetail scanDetail,
+            boolean isEphemeral, boolean isSaved) {
         WifiConfiguration newConfig = ScanResultUtil.createNetworkFromScanResult(
                 scanDetail.getScanResult());
         assertTrue("" + newConfig, WifiConfigurationUtil.validate(newConfig, true));
@@ -140,6 +140,7 @@
                 anyInt())).thenReturn(true);
         when(mWifiConfigManager.getConfiguredNetwork(networkId)).thenReturn(newConfig);
         mAddOrUpdateNetworkAnswer.addConfig(newConfig, networkId);
+        return newConfig;
     }
 
     /** Sets up test. */
@@ -334,4 +335,41 @@
         verify(mConnectableListener, never()).onConnectable(any(), any(), anyInt());
         assertNull(selected);
     }
+
+    /**
+     * One carrier Wi-Fi networks visible and cert installed but ssid is blacklisted.
+     *
+     * Desired behavior: no networks connectable or selected
+     */
+    @Test
+    public void testAvailableButBlacklisted() {
+        String[] ssids = {CARRIER1_SSID};
+        String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+        int[] freqs = {2470};
+        String[] caps = {"[WPA2-EAP-CCMP]"};
+        int[] levels = {10};
+
+        when(mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable()).thenReturn(true);
+
+        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(ssids, bssids,
+                freqs, caps, levels, mClock);
+        WifiConfiguration blacklisted =
+                configureNewSsid(CARRIER1_NET_ID, scanDetails.get(0), true, false);
+        blacklisted.getNetworkSelectionStatus()
+                .setNetworkSelectionStatus(
+                        WifiConfiguration.NetworkSelectionStatus
+                                .NETWORK_SELECTION_PERMANENTLY_DISABLED);
+        when(mWifiConfigManager.getConfiguredNetwork(eq(blacklisted.configKey())))
+                .thenReturn(blacklisted);
+        when(mWifiConfigManager.tryEnableNetwork(CARRIER1_NET_ID))
+                .thenReturn(false);
+
+        WifiConfiguration selected = mDut.evaluateNetworks(scanDetails, null, null, false, false,
+                mConnectableListener);
+        verify(mWifiConfigManager).getConfiguredNetwork(eq(blacklisted.configKey()));
+
+        verify(mConnectableListener, never()).onConnectable(any(), any(), anyInt());
+        assertNull(selected);
+    }
+
 }