Merge "WifiScanner: Pass the band scanned in ScanData"
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index fc5caf0..acc0518 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -357,11 +357,12 @@
          */
         private int mBucketsScanned;
         /**
-         * Indicates that the scan results received are as a result of a scan of all available
-         * channels. This should only be expected to function for single scans.
+         * Bands scanned. One of the WIFI_BAND values.
+         * Will be {@link #WIFI_BAND_UNSPECIFIED} if the list of channels do not fully cover
+         * any of the bands.
          * {@hide}
          */
-        private boolean mAllChannelsScanned;
+        private int mBandScanned;
         /** all scan results discovered in this scan, sorted by timestamp in ascending order */
         private ScanResult mResults[];
 
@@ -374,12 +375,12 @@
         }
 
         /** {@hide} */
-        public ScanData(int id, int flags, int bucketsScanned, boolean allChannelsScanned,
-                ScanResult[] results) {
+        public ScanData(int id, int flags, int bucketsScanned, int bandScanned,
+                        ScanResult[] results) {
             mId = id;
             mFlags = flags;
             mBucketsScanned = bucketsScanned;
-            mAllChannelsScanned = allChannelsScanned;
+            mBandScanned = bandScanned;
             mResults = results;
         }
 
@@ -387,7 +388,7 @@
             mId = s.mId;
             mFlags = s.mFlags;
             mBucketsScanned = s.mBucketsScanned;
-            mAllChannelsScanned = s.mAllChannelsScanned;
+            mBandScanned = s.mBandScanned;
             mResults = new ScanResult[s.mResults.length];
             for (int i = 0; i < s.mResults.length; i++) {
                 ScanResult result = s.mResults[i];
@@ -410,8 +411,8 @@
         }
 
         /** {@hide} */
-        public boolean isAllChannelsScanned() {
-            return mAllChannelsScanned;
+        public int getBandScanned() {
+            return mBandScanned;
         }
 
         public ScanResult[] getResults() {
@@ -429,7 +430,7 @@
                 dest.writeInt(mId);
                 dest.writeInt(mFlags);
                 dest.writeInt(mBucketsScanned);
-                dest.writeInt(mAllChannelsScanned ? 1 : 0);
+                dest.writeInt(mBandScanned);
                 dest.writeInt(mResults.length);
                 for (int i = 0; i < mResults.length; i++) {
                     ScanResult result = mResults[i];
@@ -447,13 +448,13 @@
                         int id = in.readInt();
                         int flags = in.readInt();
                         int bucketsScanned = in.readInt();
-                        boolean allChannelsScanned = in.readInt() != 0;
+                        int bandScanned = in.readInt();
                         int n = in.readInt();
                         ScanResult results[] = new ScanResult[n];
                         for (int i = 0; i < n; i++) {
                             results[i] = ScanResult.CREATOR.createFromParcel(in);
                         }
-                        return new ScanData(id, flags, bucketsScanned, allChannelsScanned, results);
+                        return new ScanData(id, flags, bucketsScanned, bandScanned, results);
                     }
 
                     public ScanData[] newArray(int size) {
@@ -759,6 +760,7 @@
      *                 Multiple requests should also not share this object.
      * {@hide}
      */
+    @RequiresPermission(Manifest.permission.NETWORK_STACK)
     public void registerScanListener(ScanListener listener) {
         Preconditions.checkNotNull(listener, "listener cannot be null");
         int key = addListener(listener);
diff --git a/wifi/tests/src/android/net/wifi/WifiScannerTest.java b/wifi/tests/src/android/net/wifi/WifiScannerTest.java
index da42dcf..cf1ed8f 100644
--- a/wifi/tests/src/android/net/wifi/WifiScannerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiScannerTest.java
@@ -16,6 +16,7 @@
 
 package android.net.wifi;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -26,6 +27,7 @@
 import android.content.Context;
 import android.net.wifi.WifiScanner.PnoSettings;
 import android.net.wifi.WifiScanner.PnoSettings.PnoNetwork;
+import android.net.wifi.WifiScanner.ScanData;
 import android.net.wifi.WifiScanner.ScanSettings;
 import android.os.Handler;
 import android.os.Parcel;
@@ -203,4 +205,29 @@
         assertNotNull(pnoNetwork.frequencies);
     }
 
+    /**
+     * Verify parcel read/write for ScanData.
+     */
+    @Test
+    public void verifyScanDataParcel() throws Exception {
+        ScanData writeScanData = new ScanData(2, 0, 3,
+                WifiScanner.WIFI_BAND_BOTH_WITH_DFS, new ScanResult[0]);
+
+        ScanData readScanData = parcelWriteRead(writeScanData);
+        assertEquals(writeScanData.getId(), readScanData.getId());
+        assertEquals(writeScanData.getFlags(), readScanData.getFlags());
+        assertEquals(writeScanData.getBucketsScanned(), readScanData.getBucketsScanned());
+        assertEquals(writeScanData.getBandScanned(), readScanData.getBandScanned());
+        assertArrayEquals(writeScanData.getResults(), readScanData.getResults());
+    }
+
+    /**
+     * Write the provided {@link ScanData} to a parcel and deserialize it.
+     */
+    private static ScanData parcelWriteRead(ScanData writeScanData) throws Exception {
+        Parcel parcel = Parcel.obtain();
+        writeScanData.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
+        return ScanData.CREATOR.createFromParcel(parcel);
+    }
 }