Wifi: Add AP wifi technology to ScanResult

This CL adds to ScanResult structure information about the Wifi
technology.

Bug: 143382822
Test: atest com.android.wifi.server
Change-Id: Ibe1d30e2efc4693be22148443b26446b90d89179
diff --git a/api/current.txt b/api/current.txt
index c68c29c..a8dda67 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -29786,6 +29786,7 @@
 
   public class ScanResult implements android.os.Parcelable {
     method public int describeContents();
+    method public int getWifiStandard();
     method public boolean is80211mcResponder();
     method public boolean isPasspointNetwork();
     method public void writeToParcel(android.os.Parcel, int);
@@ -29796,6 +29797,11 @@
     field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
     field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
     field public String SSID;
+    field public static final int WIFI_STANDARD_11AC = 5; // 0x5
+    field public static final int WIFI_STANDARD_11AX = 6; // 0x6
+    field public static final int WIFI_STANDARD_11N = 4; // 0x4
+    field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1
+    field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0
     field public String capabilities;
     field public int centerFreq0;
     field public int centerFreq1;
@@ -29997,11 +30003,6 @@
     field public static final String FREQUENCY_UNITS = "MHz";
     field public static final String LINK_SPEED_UNITS = "Mbps";
     field public static final int LINK_SPEED_UNKNOWN = -1; // 0xffffffff
-    field public static final int WIFI_STANDARD_11AC = 5; // 0x5
-    field public static final int WIFI_STANDARD_11AX = 6; // 0x6
-    field public static final int WIFI_STANDARD_11N = 4; // 0x4
-    field public static final int WIFI_STANDARD_LEGACY = 1; // 0x1
-    field public static final int WIFI_STANDARD_UNKNOWN = 0; // 0x0
   }
 
   public class WifiManager {
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index ac86778..aa895a6 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -16,11 +16,15 @@
 
 package android.net.wifi;
 
+import android.annotation.IntDef;
+import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.annotation.UnsupportedAppUsage;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -223,11 +227,86 @@
     */
     public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
 
-   /**
-    * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
-    * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
-    * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
-    */
+    /**
+     * Wi-Fi unknown standard
+     */
+    public static final int WIFI_STANDARD_UNKNOWN = 0;
+
+    /**
+     * Wi-Fi 802.11a/b/g
+     */
+    public static final int WIFI_STANDARD_LEGACY = 1;
+
+    /**
+     * Wi-Fi 802.11n
+     */
+    public static final int WIFI_STANDARD_11N = 4;
+
+    /**
+     * Wi-Fi 802.11ac
+     */
+    public static final int WIFI_STANDARD_11AC = 5;
+
+    /**
+     * Wi-Fi 802.11ax
+     */
+    public static final int WIFI_STANDARD_11AX = 6;
+
+    /** @hide */
+    @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
+            WIFI_STANDARD_UNKNOWN,
+            WIFI_STANDARD_LEGACY,
+            WIFI_STANDARD_11N,
+            WIFI_STANDARD_11AC,
+            WIFI_STANDARD_11AX
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface WifiStandard{}
+
+    /**
+     * AP wifi standard.
+     */
+    private @WifiStandard int mWifiStandard;
+
+    /**
+     * return the AP wifi standard.
+     */
+    public @WifiStandard int getWifiStandard() {
+        return mWifiStandard;
+    }
+
+    /**
+     * sets the AP wifi standard.
+     * @hide
+     */
+    public void setWifiStandard(@WifiStandard int standard) {
+        mWifiStandard = standard;
+    }
+
+    /**
+     * Convert Wi-Fi standard to string
+     */
+    private static @Nullable String wifiStandardToString(@WifiStandard int standard) {
+        switch(standard) {
+            case WIFI_STANDARD_LEGACY:
+                return "legacy";
+            case WIFI_STANDARD_11N:
+                return "11n";
+            case WIFI_STANDARD_11AC:
+                return "11ac";
+            case WIFI_STANDARD_11AX:
+                return "11ax";
+            case WIFI_STANDARD_UNKNOWN:
+                return "unknown";
+        }
+        return null;
+    }
+
+    /**
+     * AP Channel bandwidth; one of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
+     * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ}
+     * or {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ}.
+     */
     public int channelWidth;
 
     /**
@@ -549,6 +628,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -571,6 +651,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -600,6 +681,7 @@
         this.carrierApEapType = UNSPECIFIED;
         this.carrierName = null;
         this.radioChainInfos = null;
+        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
     }
 
     /** {@hide} */
@@ -641,6 +723,7 @@
             carrierApEapType = source.carrierApEapType;
             carrierName = source.carrierName;
             radioChainInfos = source.radioChainInfos;
+            this.mWifiStandard = source.mWifiStandard;
         }
     }
 
@@ -679,6 +762,7 @@
         sb.append(", ChannelBandwidth: ").append(channelWidth);
         sb.append(", centerFreq0: ").append(centerFreq0);
         sb.append(", centerFreq1: ").append(centerFreq1);
+        sb.append(", standard: ").append(wifiStandardToString(mWifiStandard));
         sb.append(", 80211mcResponder: ");
         sb.append(((flags & FLAG_80211mc_RESPONDER) != 0) ? "is supported" : "is not supported");
         sb.append(", Carrier AP: ").append(isCarrierAp ? "yes" : "no");
@@ -714,6 +798,7 @@
         dest.writeInt(channelWidth);
         dest.writeInt(centerFreq0);
         dest.writeInt(centerFreq1);
+        dest.writeInt(mWifiStandard);
         dest.writeLong(seen);
         dest.writeInt(untrusted ? 1 : 0);
         dest.writeInt(numUsage);
@@ -796,6 +881,7 @@
                                                                fixed with flags below */
                 );
 
+                sr.mWifiStandard = in.readInt();
                 sr.seen = in.readLong();
                 sr.untrusted = in.readInt() != 0;
                 sr.numUsage = in.readInt();
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 9de39ed..86e5122 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -16,7 +16,6 @@
 
 package android.net.wifi;
 
-import android.annotation.IntDef;
 import android.annotation.IntRange;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
@@ -28,8 +27,6 @@
 import android.os.Parcelable;
 import android.text.TextUtils;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
@@ -99,45 +96,9 @@
     private int mRssi;
 
     /**
-     * Wi-Fi unknown standard
-     */
-    public static final int WIFI_STANDARD_UNKNOWN = 0;
-
-    /**
-     * Wi-Fi 802.11a/b/g
-     */
-    public static final int WIFI_STANDARD_LEGACY = 1;
-
-    /**
-     * Wi-Fi 802.11n
-     */
-    public static final int WIFI_STANDARD_11N = 4;
-
-    /**
-     * Wi-Fi 802.11ac
-     */
-    public static final int WIFI_STANDARD_11AC = 5;
-
-    /**
-     * Wi-Fi 802.11ax
-     */
-    public static final int WIFI_STANDARD_11AX = 6;
-
-    /** @hide */
-    @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
-            WIFI_STANDARD_UNKNOWN,
-            WIFI_STANDARD_LEGACY,
-            WIFI_STANDARD_11N,
-            WIFI_STANDARD_11AC,
-            WIFI_STANDARD_11AX
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiStandard{}
-
-    /**
      * Wi-Fi standard for the connection
      */
-    private @WifiStandard int mWifiStandard;
+    private @ScanResult.WifiStandard int mWifiStandard;
 
     /**
      * The unit in which links speeds are expressed.
@@ -422,7 +383,7 @@
      * Sets the Wi-Fi standard
      * @hide
      */
-    public void setWifiStandard(@WifiStandard int wifiStandard) {
+    public void setWifiStandard(@ScanResult.WifiStandard int wifiStandard) {
         mWifiStandard = wifiStandard;
     }
 
@@ -430,7 +391,7 @@
      * Get connection Wi-Fi standard
      * @return the connection Wi-Fi standard
      */
-    public @WifiStandard int getWifiStandard() {
+    public @ScanResult.WifiStandard int getWifiStandard() {
         return mWifiStandard;
     }
 
diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java
index 4973c4c..b5c74d1 100644
--- a/wifi/tests/src/android/net/wifi/ScanResultTest.java
+++ b/wifi/tests/src/android/net/wifi/ScanResultTest.java
@@ -42,6 +42,8 @@
     public static final int TEST_LEVEL = -56;
     public static final int TEST_FREQUENCY = 2412;
     public static final long TEST_TSF = 04660l;
+    public static final @ScanResult.WifiStandard int TEST_WIFI_STANDARD =
+            ScanResult.WIFI_STANDARD_11AC;
 
     /**
      * Setup before tests.
@@ -149,12 +151,14 @@
     @Test
     public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception {
         ScanResult scanResult = createScanResult();
-        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
-                "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
-                "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
-                "80211mcResponder: is not supported, Carrier AP: no, " +
-                "Carrier AP EAP Type: 0, Carrier name: null, " +
-                "Radio Chain Infos: null", scanResult.toString());
+        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+                + "level: -56, frequency: 2412, timestamp: 2480, "
+                + "distance: 0(cm), distanceSd: 0(cm), "
+                + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+                + "standard: 11ac, "
+                + "80211mcResponder: is not supported, Carrier AP: no, "
+                + "Carrier AP EAP Type: 0, Carrier name: null, "
+                + "Radio Chain Infos: null", scanResult.toString());
     }
 
     /**
@@ -170,13 +174,15 @@
         scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
         scanResult.radioChainInfos[1].id = 1;
         scanResult.radioChainInfos[1].level = -54;
-        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, " +
-                "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), distanceSd: 0(cm), " +
-                "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, " +
-                "80211mcResponder: is not supported, Carrier AP: no, " +
-                "Carrier AP EAP Type: 0, Carrier name: null, " +
-                "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, " +
-                "RadioChainInfo: id=1, level=-54]", scanResult.toString());
+        assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+                + "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), "
+                + "distanceSd: 0(cm), "
+                + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+                + "standard: 11ac, "
+                + "80211mcResponder: is not supported, Carrier AP: no, "
+                + "Carrier AP EAP Type: 0, Carrier name: null, "
+                + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
+                + "RadioChainInfo: id=1, level=-54]", scanResult.toString());
     }
 
     /**
@@ -197,6 +203,7 @@
         result.level = TEST_LEVEL;
         result.frequency = TEST_FREQUENCY;
         result.timestamp = TEST_TSF;
+        result.setWifiStandard(TEST_WIFI_STANDARD);
         return result;
     }
 
@@ -207,6 +214,7 @@
         assertEquals(expected.level, actual.level);
         assertEquals(expected.frequency, actual.frequency);
         assertEquals(expected.timestamp, actual.timestamp);
+        assertEquals(expected.getWifiStandard(), actual.getWifiStandard());
         assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos);
         assertArrayEquals(expected.informationElements, actual.informationElements);
     }
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
index b98cdc3..22a5faa 100644
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
@@ -38,7 +38,7 @@
     private static final String TEST_PACKAGE_NAME = "com.test.example";
     private static final String TEST_FQDN = "test.com";
     private static final String TEST_PROVIDER_NAME = "test";
-    private static final int TEST_WIFI_STANDARD = WifiInfo.WIFI_STANDARD_11AC;
+    private static final int TEST_WIFI_STANDARD = ScanResult.WIFI_STANDARD_11AC;
 
     /**
      *  Verify parcel write/read with WifiInfo.