Implement WifiNetworkSpecifier#redact.

This is needed so that if an app files a NetworkRequest or
NetworkCallback with a WifiNetworkSpecifier and null UIDs,
sensitive information is redacted. Otherwise, the request could
match WifiNetworkAgentSpecifier of a connected wifi network, and
thus learn if a network is available that matches the specifier
it constructed.

Bug: 187921303
Test: atest WifiNetworkSpecifierTest#testRedact
Change-Id: Ie0f1b6168854b93a456f33913f34a07ef601140b
diff --git a/framework/java/android/net/wifi/WifiNetworkSpecifier.java b/framework/java/android/net/wifi/WifiNetworkSpecifier.java
index 0b0eaff..17934e0 100644
--- a/framework/java/android/net/wifi/WifiNetworkSpecifier.java
+++ b/framework/java/android/net/wifi/WifiNetworkSpecifier.java
@@ -20,6 +20,7 @@
 
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.SystemApi;
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
 import android.net.MacAddress;
@@ -33,6 +34,8 @@
 import android.text.TextUtils;
 import android.util.Pair;
 
+import com.android.modules.utils.build.SdkLevel;
+
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Objects;
@@ -768,4 +771,14 @@
         // not make much sense!
         return equals(other);
     }
+
+    /** @hide */
+    @Override
+    @SystemApi
+    @Nullable
+    public NetworkSpecifier redact() {
+        if (!SdkLevel.isAtLeastS()) return this;
+
+        return new Builder().setBand(mBand).build();
+    }
 }
diff --git a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
index 87dd8c2..0a24523 100644
--- a/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
+++ b/framework/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
@@ -860,4 +860,30 @@
         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
         assertFalse(specifier1.canBeSatisfiedBy(specifier2));
     }
+
+    /**
+     * Test WifiNetworkSpecifier redaction.
+     */
+    @Test
+    public void testRedact() {
+        WifiConfiguration wifiConfiguration = new WifiConfiguration();
+        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+        wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
+
+        WifiNetworkSpecifier specifier =
+                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
+                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
+                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
+                        ScanResult.WIFI_BAND_5_GHZ,
+                        wifiConfiguration);
+
+        final NetworkSpecifier redacted = specifier.redact();
+        if (SdkLevel.isAtLeastS()) {
+            assertEquals(
+                    new WifiNetworkSpecifier.Builder().setBand(ScanResult.WIFI_BAND_5_GHZ).build(),
+                    redacted);
+        } else {
+            assertTrue(redacted == specifier);
+        }
+    }
 }