Do not perform RNR scan when no 6Ghz channels supported

Only enable RNR when at least one 6Ghz channel is supported.

Bug: 203616701
Test: atest com.android.server.wifi
Change-Id: Ief7f09d6de48c4556b69f5cccfb625c808e830e0
diff --git a/framework/java/android/net/wifi/WifiScanner.java b/framework/java/android/net/wifi/WifiScanner.java
index 1773200..147c405 100644
--- a/framework/java/android/net/wifi/WifiScanner.java
+++ b/framework/java/android/net/wifi/WifiScanner.java
@@ -181,7 +181,8 @@
      * This constant is used for {@link ScanSettings#setRnrSetting(int)}.
      * <p>
      * Scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR) if the 6Ghz
-     * band is explicitly requested to be scanned. The 6Ghz band is explicitly requested if the
+     * band is explicitly requested to be scanned and the current country code supports scanning
+     * of at least one 6Ghz channel. The 6Ghz band is explicitly requested if the
      * ScanSetting.band parameter is set to one of:
      * <li> {@link #WIFI_BAND_6_GHZ} </li>
      * <li> {@link #WIFI_BAND_24_5_6_GHZ} </li>
@@ -194,7 +195,8 @@
     /**
      * This constant is used for {@link ScanSettings#setRnrSetting(int)}.
      * <p>
-     * Request to scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR).
+     * Request to scan 6Ghz APs co-located with 2.4/5Ghz APs using Reduced Neighbor Report (RNR)
+     * when the current country code supports scanning of at least one 6Ghz channel.
      **/
     public static final int WIFI_RNR_ENABLED = 1;
     /**
diff --git a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
index 2310f1b..29efe33 100644
--- a/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
+++ b/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
@@ -1282,10 +1282,19 @@
             bucketSettings.report_events = WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN;
 
             ChannelCollection channels = mChannelHelper.createChannelCollection();
+            WifiScanner.ChannelSpec[][] available6GhzChannels =
+                    mChannelHelper.getAvailableScanChannels(WifiScanner.WIFI_BAND_6_GHZ);
+            boolean are6GhzChannelsAvailable = available6GhzChannels.length > 0
+                    && available6GhzChannels[0].length > 0;
             List<WifiNative.HiddenNetwork> hiddenNetworkList = new ArrayList<>();
             for (RequestInfo<ScanSettings> entry : mPendingScans) {
                 settings.scanType = mergeScanTypes(settings.scanType, entry.settings.type);
-                settings.enable6GhzRnr = mergeRnrSetting(settings.enable6GhzRnr, entry.settings);
+                if (are6GhzChannelsAvailable) {
+                    settings.enable6GhzRnr = mergeRnrSetting(
+                            settings.enable6GhzRnr, entry.settings);
+                } else {
+                    settings.enable6GhzRnr = false;
+                }
                 channels.addChannels(entry.settings);
                 for (ScanSettings.HiddenNetwork srcNetwork : entry.settings.hiddenNetworks) {
                     WifiNative.HiddenNetwork hiddenNetwork = new WifiNative.HiddenNetwork();
diff --git a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
index a5f8b3c..20c1b3f 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/scanner/WifiScanningServiceTest.java
@@ -152,8 +152,8 @@
     @Mock WifiMetrics.ScanMetrics mScanMetrics;
     @Mock WifiManager mWifiManager;
     @Mock LastCallerInfoManager mLastCallerInfoManager;
-    ChannelHelper mChannelHelper0;
-    ChannelHelper mChannelHelper1;
+    PresetKnownBandsChannelHelper mChannelHelper0;
+    PresetKnownBandsChannelHelper mChannelHelper1;
     TestLooper mLooper;
     WifiScanningServiceImpl mWifiScanningServiceImpl;
 
@@ -883,6 +883,32 @@
     }
 
     /**
+     * Verify that when 6Ghz scanning is not supported, RNR will not get enabled even if RNR
+     * setting is WIFI_RNR_ENABLED.
+     */
+    @Test
+    public void testRnrIsDisabledWhen6GhzChannelsNotAvailable() throws Exception {
+        assumeTrue(SdkLevel.isAtLeastS());
+        mChannelHelper0 = new PresetKnownBandsChannelHelper(
+                new int[]{2412, 2450},
+                new int[]{5160, 5175},
+                new int[]{5600, 5650, 5660},
+                new int[0], // 6Ghz scanning unavailable
+                new int[]{58320, 60480});
+        when(mWifiScannerImpl0.getChannelHelper()).thenReturn(mChannelHelper0);
+        WifiScanner.ScanSettings requestSettings = createRequest(WifiScanner.WIFI_BAND_BOTH, 0,
+                0, 20, WifiScanner.REPORT_EVENT_AFTER_EACH_SCAN);
+        requestSettings.setRnrSetting(WifiScanner.WIFI_RNR_ENABLED);
+        WifiNative.ScanSettings nativeSettings = computeSingleScanNativeSettings(requestSettings);
+        // RNR should not be enabled in the native settings
+        nativeSettings.enable6GhzRnr = false;
+        assertEquals(WifiScanner.WIFI_RNR_ENABLED,
+                requestSettings.getRnrSetting());
+        doSuccessfulSingleScan(requestSettings, nativeSettings,
+                ScanResults.create(0, WifiScanner.WIFI_BAND_BOTH, new int[0]));
+    }
+
+    /**
      * Verify that when WIFI_BAND_ALL is scanned, RNR is disabled when
      * getRnrSetting() returns WIFI_RNR_NOT_NEEDED.
      */