Merge "Add bssid field in the ScanResultInfo class." into rvc-dev am: a8782392d4

Change-Id: I3f58467fc4344019f01a3b417d24387fb0e25e5f
diff --git a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
index 17b3ded..c349fa7 100644
--- a/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
+++ b/common/moduleutils/src/android/net/shared/ProvisioningConfiguration.java
@@ -231,7 +231,11 @@
      * InformationElements fields of ScanResult.
      */
     public static class ScanResultInfo {
+        @NonNull
         private final String mSsid;
+        @NonNull
+        private final String mBssid;
+        @NonNull
         private final List<InformationElement> mInformationElements;
 
        /**
@@ -240,6 +244,7 @@
         */
         public static class InformationElement {
             private final int mId;
+            @NonNull
             private final byte[] mPayload;
 
             public InformationElement(int id, @NonNull ByteBuffer payload) {
@@ -257,6 +262,7 @@
            /**
             * Get the specific content of the information element.
             */
+            @NonNull
             public ByteBuffer getPayload() {
                 return ByteBuffer.wrap(mPayload).asReadOnlyBuffer();
             }
@@ -293,6 +299,7 @@
              * Create an instance of {@link InformationElement} based on the contents of the
              * specified {@link InformationElementParcelable}.
              */
+            @Nullable
             public static InformationElement fromStableParcelable(InformationElementParcelable p) {
                 if (p == null) return null;
                 return new InformationElement(p.id,
@@ -300,8 +307,12 @@
             }
         }
 
-        public ScanResultInfo(String ssid, @NonNull List<InformationElement> informationElements) {
+        public ScanResultInfo(@NonNull String ssid, @NonNull String bssid,
+                @NonNull List<InformationElement> informationElements) {
+            Objects.requireNonNull(ssid, "ssid must not be null.");
+            Objects.requireNonNull(bssid, "bssid must not be null.");
             mSsid = ssid;
+            mBssid = bssid;
             mInformationElements =
                     Collections.unmodifiableList(new ArrayList<>(informationElements));
         }
@@ -309,13 +320,23 @@
         /**
          * Get the scanned network name.
          */
+        @NonNull
         public String getSsid() {
             return mSsid;
         }
 
         /**
+         * Get the address of the access point.
+         */
+        @NonNull
+        public String getBssid() {
+            return mBssid;
+        }
+
+        /**
          * Get all information elements found in the beacon.
          */
+        @NonNull
         public List<InformationElement> getInformationElements() {
             return mInformationElements;
         }
@@ -324,6 +345,7 @@
         public String toString() {
             StringBuffer str = new StringBuffer();
             str.append("SSID: ").append(mSsid);
+            str.append(", BSSID: ").append(mBssid);
             str.append(", Information Elements: {");
             for (InformationElement ie : mInformationElements) {
                 str.append("[").append(ie.toString()).append("]");
@@ -338,12 +360,13 @@
             if (!(o instanceof ScanResultInfo)) return false;
             ScanResultInfo other = (ScanResultInfo) o;
             return Objects.equals(mSsid, other.mSsid)
+                    && Objects.equals(mBssid, other.mBssid)
                     && mInformationElements.equals(other.mInformationElements);
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(mSsid, mInformationElements);
+            return Objects.hash(mSsid, mBssid, mInformationElements);
         }
 
         /**
@@ -352,6 +375,7 @@
         public ScanResultInfoParcelable toStableParcelable() {
             final ScanResultInfoParcelable p = new ScanResultInfoParcelable();
             p.ssid = mSsid;
+            p.bssid = mBssid;
             p.informationElements = toParcelableArray(mInformationElements,
                     InformationElement::toStableParcelable, InformationElementParcelable.class);
             return p;
@@ -366,11 +390,10 @@
             final List<InformationElement> ies = new ArrayList<InformationElement>();
             ies.addAll(fromParcelableArray(p.informationElements,
                     InformationElement::fromStableParcelable));
-            return new ScanResultInfo(p.ssid, ies);
+            return new ScanResultInfo(p.ssid, p.bssid, ies);
         }
 
-        private static byte[] convertToByteArray(final ByteBuffer buffer) {
-            if (buffer == null) return null;
+        private static byte[] convertToByteArray(@NonNull final ByteBuffer buffer) {
             final byte[] bytes = new byte[buffer.limit()];
             final ByteBuffer copy = buffer.asReadOnlyBuffer();
             try {
diff --git a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
index 24a0ca2..f7ac167 100644
--- a/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
+++ b/common/networkstackclient/aidl_api/networkstack-aidl-interfaces/current/android/net/ScanResultInfoParcelable.aidl
@@ -18,5 +18,6 @@
 package android.net;
 parcelable ScanResultInfoParcelable {
   String ssid;
+  String bssid;
   android.net.InformationElementParcelable[] informationElements;
 }
diff --git a/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl b/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
index f5f101d..a19729b 100644
--- a/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
+++ b/common/networkstackclient/src/android/net/ScanResultInfoParcelable.aidl
@@ -20,5 +20,6 @@
 
 parcelable ScanResultInfoParcelable {
     String ssid;
+    String bssid;
     InformationElementParcelable[] informationElements;
 }
diff --git a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
index 9f0ef99..ce2efbb 100644
--- a/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
+++ b/tests/integration/src/android/net/ip/IpClientIntegrationTest.java
@@ -234,6 +234,7 @@
             (byte) 0x00, (byte) 0x17, (byte) 0xF2
     };
     private static final byte TEST_VENDOR_SPECIFIC_TYPE = 0x06;
+    private static final String TEST_DEFAULT_BSSID = "00:11:22:33:44:55";
 
     private class Dependencies extends IpClient.Dependencies {
         private boolean mIsDhcpLeaseCacheEnabled;
@@ -1578,7 +1579,7 @@
     }
 
     private ScanResultInfo makeScanResultInfo(final int id, final String ssid,
-            final byte[] oui, final byte type, final byte[] data) {
+            final String bssid, final byte[] oui, final byte type, final byte[] data) {
         final ByteBuffer payload = ByteBuffer.allocate(4 + data.length);
         payload.put(oui);
         payload.put(type);
@@ -1586,13 +1587,14 @@
         payload.flip();
         final ScanResultInfo.InformationElement ie =
                 new ScanResultInfo.InformationElement(id /* IE id */, payload);
-        return new ScanResultInfo(ssid, Collections.singletonList(ie));
+        return new ScanResultInfo(ssid, bssid, Collections.singletonList(ie));
     }
 
     private void doUpstreamHotspotDetectionTest(final int id, final String displayName,
             final String ssid, final byte[] oui, final byte type, final byte[] data)
             throws Exception {
-        final ScanResultInfo info = makeScanResultInfo(id, ssid, oui, type, data);
+        final ScanResultInfo info = makeScanResultInfo(id, ssid, TEST_DEFAULT_BSSID, oui, type,
+                data);
         final long currentTime = System.currentTimeMillis();
         final List<DhcpPacket> sentPackets = performDhcpHandshake(true /* isSuccessLease */,
                 TEST_LEASE_DURATION_S, true /* isDhcpLeaseCacheEnabled */,
diff --git a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
index e9384c8..8a8ff8f 100644
--- a/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
+++ b/tests/unit/src/android/net/shared/ProvisioningConfigurationTest.java
@@ -57,7 +57,8 @@
         final ScanResultInfo.InformationElement ie =
                 new ScanResultInfo.InformationElement(0xdd /* vendor specific IE id */,
                         ByteBuffer.wrap(payload));
-        return new ScanResultInfo(ssid, Collections.singletonList(ie));
+        return new ScanResultInfo(ssid, "01:02:03:04:05:06" /* bssid string */,
+                Collections.singletonList(ie));
     }
 
     @Before